|
|
"use strict";
|
|
|
var __defProp = Object.defineProperty;
|
|
|
var __defProps = Object.defineProperties;
|
|
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
|
var __spreadValues = (a, b) => {
|
|
|
for (var prop in b || (b = {}))
|
|
|
if (__hasOwnProp.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;
|
|
|
};
|
|
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
|
var __publicField = (obj, key, value) => {
|
|
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
|
return value;
|
|
|
};
|
|
|
var require$$0 = require("obsidian");
|
|
|
function _interopDefaultLegacy(e) {
|
|
|
return e && typeof e === "object" && "default" in e ? e : { "default": e };
|
|
|
}
|
|
|
var require$$0__default = /* @__PURE__ */ _interopDefaultLegacy(require$$0);
|
|
|
const MEMOS_VIEW_TYPE = "memos_view";
|
|
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
|
function getAugmentedNamespace(n2) {
|
|
|
if (n2.__esModule)
|
|
|
return n2;
|
|
|
var a = Object.defineProperty({}, "__esModule", { value: true });
|
|
|
Object.keys(n2).forEach(function(k) {
|
|
|
var d = Object.getOwnPropertyDescriptor(n2, k);
|
|
|
Object.defineProperty(a, k, d.get ? d : {
|
|
|
enumerable: true,
|
|
|
get: function() {
|
|
|
return n2[k];
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
return a;
|
|
|
}
|
|
|
var _react_17_0_2_react = { exports: {} };
|
|
|
var react_production_min = {};
|
|
|
/*
|
|
|
object-assign
|
|
|
(c) Sindre Sorhus
|
|
|
@license MIT
|
|
|
*/
|
|
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
|
var hasOwnProperty = 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(n2) {
|
|
|
return test2[n2];
|
|
|
});
|
|
|
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;
|
|
|
}
|
|
|
}
|
|
|
var _objectAssign_4_1_1_objectAssign = 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 (hasOwnProperty.call(from, key)) {
|
|
|
to[key] = from[key];
|
|
|
}
|
|
|
}
|
|
|
if (getOwnPropertySymbols) {
|
|
|
symbols = getOwnPropertySymbols(from);
|
|
|
for (var i = 0; i < symbols.length; i++) {
|
|
|
if (propIsEnumerable.call(from, symbols[i])) {
|
|
|
to[symbols[i]] = from[symbols[i]];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return to;
|
|
|
};
|
|
|
/** @license React v17.0.2
|
|
|
* react.production.min.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.
|
|
|
*/
|
|
|
var l = _objectAssign_4_1_1_objectAssign, n$1 = 60103, p$1 = 60106;
|
|
|
react_production_min.Fragment = 60107;
|
|
|
react_production_min.StrictMode = 60108;
|
|
|
react_production_min.Profiler = 60114;
|
|
|
var q$1 = 60109, r$1 = 60110, t$1 = 60112;
|
|
|
react_production_min.Suspense = 60113;
|
|
|
var u = 60115, v = 60116;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var w = Symbol.for;
|
|
|
n$1 = w("react.element");
|
|
|
p$1 = w("react.portal");
|
|
|
react_production_min.Fragment = w("react.fragment");
|
|
|
react_production_min.StrictMode = w("react.strict_mode");
|
|
|
react_production_min.Profiler = w("react.profiler");
|
|
|
q$1 = w("react.provider");
|
|
|
r$1 = w("react.context");
|
|
|
t$1 = w("react.forward_ref");
|
|
|
react_production_min.Suspense = w("react.suspense");
|
|
|
u = w("react.memo");
|
|
|
v = w("react.lazy");
|
|
|
}
|
|
|
var x = typeof Symbol === "function" && Symbol.iterator;
|
|
|
function y$1(a) {
|
|
|
if (a === null || typeof a !== "object")
|
|
|
return null;
|
|
|
a = x && a[x] || a["@@iterator"];
|
|
|
return typeof a === "function" ? a : null;
|
|
|
}
|
|
|
function z(a) {
|
|
|
for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++)
|
|
|
b += "&args[]=" + encodeURIComponent(arguments[c]);
|
|
|
return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";
|
|
|
}
|
|
|
var A = { isMounted: function() {
|
|
|
return false;
|
|
|
}, enqueueForceUpdate: function() {
|
|
|
}, enqueueReplaceState: function() {
|
|
|
}, enqueueSetState: function() {
|
|
|
} }, B$1 = {};
|
|
|
function C(a, b, c) {
|
|
|
this.props = a;
|
|
|
this.context = b;
|
|
|
this.refs = B$1;
|
|
|
this.updater = c || A;
|
|
|
}
|
|
|
C.prototype.isReactComponent = {};
|
|
|
C.prototype.setState = function(a, b) {
|
|
|
if (typeof a !== "object" && typeof a !== "function" && a != null)
|
|
|
throw Error(z(85));
|
|
|
this.updater.enqueueSetState(this, a, b, "setState");
|
|
|
};
|
|
|
C.prototype.forceUpdate = function(a) {
|
|
|
this.updater.enqueueForceUpdate(this, a, "forceUpdate");
|
|
|
};
|
|
|
function D$1() {
|
|
|
}
|
|
|
D$1.prototype = C.prototype;
|
|
|
function E$1(a, b, c) {
|
|
|
this.props = a;
|
|
|
this.context = b;
|
|
|
this.refs = B$1;
|
|
|
this.updater = c || A;
|
|
|
}
|
|
|
var F$1 = E$1.prototype = new D$1();
|
|
|
F$1.constructor = E$1;
|
|
|
l(F$1, C.prototype);
|
|
|
F$1.isPureReactComponent = true;
|
|
|
var G$1 = { current: null }, H$1 = Object.prototype.hasOwnProperty, I$1 = { key: true, ref: true, __self: true, __source: true };
|
|
|
function J(a, b, c) {
|
|
|
var e, d = {}, k = null, h2 = null;
|
|
|
if (b != null)
|
|
|
for (e in b.ref !== void 0 && (h2 = b.ref), b.key !== void 0 && (k = "" + b.key), b)
|
|
|
H$1.call(b, e) && !I$1.hasOwnProperty(e) && (d[e] = b[e]);
|
|
|
var g2 = arguments.length - 2;
|
|
|
if (g2 === 1)
|
|
|
d.children = c;
|
|
|
else if (1 < g2) {
|
|
|
for (var f2 = Array(g2), m2 = 0; m2 < g2; m2++)
|
|
|
f2[m2] = arguments[m2 + 2];
|
|
|
d.children = f2;
|
|
|
}
|
|
|
if (a && a.defaultProps)
|
|
|
for (e in g2 = a.defaultProps, g2)
|
|
|
d[e] === void 0 && (d[e] = g2[e]);
|
|
|
return { $$typeof: n$1, type: a, key: k, ref: h2, props: d, _owner: G$1.current };
|
|
|
}
|
|
|
function K(a, b) {
|
|
|
return { $$typeof: n$1, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner };
|
|
|
}
|
|
|
function L(a) {
|
|
|
return typeof a === "object" && a !== null && a.$$typeof === n$1;
|
|
|
}
|
|
|
function escape$1(a) {
|
|
|
var b = { "=": "=0", ":": "=2" };
|
|
|
return "$" + a.replace(/[=:]/g, function(a2) {
|
|
|
return b[a2];
|
|
|
});
|
|
|
}
|
|
|
var M$1 = /\/+/g;
|
|
|
function N$1(a, b) {
|
|
|
return typeof a === "object" && a !== null && a.key != null ? escape$1("" + a.key) : b.toString(36);
|
|
|
}
|
|
|
function O$1(a, b, c, e, d) {
|
|
|
var k = typeof a;
|
|
|
if (k === "undefined" || k === "boolean")
|
|
|
a = null;
|
|
|
var h2 = false;
|
|
|
if (a === null)
|
|
|
h2 = true;
|
|
|
else
|
|
|
switch (k) {
|
|
|
case "string":
|
|
|
case "number":
|
|
|
h2 = true;
|
|
|
break;
|
|
|
case "object":
|
|
|
switch (a.$$typeof) {
|
|
|
case n$1:
|
|
|
case p$1:
|
|
|
h2 = true;
|
|
|
}
|
|
|
}
|
|
|
if (h2)
|
|
|
return h2 = a, d = d(h2), a = e === "" ? "." + N$1(h2, 0) : e, Array.isArray(d) ? (c = "", a != null && (c = a.replace(M$1, "$&/") + "/"), O$1(d, b, c, "", function(a2) {
|
|
|
return a2;
|
|
|
})) : d != null && (L(d) && (d = K(d, c + (!d.key || h2 && h2.key === d.key ? "" : ("" + d.key).replace(M$1, "$&/") + "/") + a)), b.push(d)), 1;
|
|
|
h2 = 0;
|
|
|
e = e === "" ? "." : e + ":";
|
|
|
if (Array.isArray(a))
|
|
|
for (var g2 = 0; g2 < a.length; g2++) {
|
|
|
k = a[g2];
|
|
|
var f2 = e + N$1(k, g2);
|
|
|
h2 += O$1(k, b, c, f2, d);
|
|
|
}
|
|
|
else if (f2 = y$1(a), typeof f2 === "function")
|
|
|
for (a = f2.call(a), g2 = 0; !(k = a.next()).done; )
|
|
|
k = k.value, f2 = e + N$1(k, g2++), h2 += O$1(k, b, c, f2, d);
|
|
|
else if (k === "object")
|
|
|
throw b = "" + a, Error(z(31, b === "[object Object]" ? "object with keys {" + Object.keys(a).join(", ") + "}" : b));
|
|
|
return h2;
|
|
|
}
|
|
|
function P$1(a, b, c) {
|
|
|
if (a == null)
|
|
|
return a;
|
|
|
var e = [], d = 0;
|
|
|
O$1(a, e, "", "", function(a2) {
|
|
|
return b.call(c, a2, d++);
|
|
|
});
|
|
|
return e;
|
|
|
}
|
|
|
function Q(a) {
|
|
|
if (a._status === -1) {
|
|
|
var b = a._result;
|
|
|
b = b();
|
|
|
a._status = 0;
|
|
|
a._result = b;
|
|
|
b.then(function(b2) {
|
|
|
a._status === 0 && (b2 = b2.default, a._status = 1, a._result = b2);
|
|
|
}, function(b2) {
|
|
|
a._status === 0 && (a._status = 2, a._result = b2);
|
|
|
});
|
|
|
}
|
|
|
if (a._status === 1)
|
|
|
return a._result;
|
|
|
throw a._result;
|
|
|
}
|
|
|
var R$1 = { current: null };
|
|
|
function S$1() {
|
|
|
var a = R$1.current;
|
|
|
if (a === null)
|
|
|
throw Error(z(321));
|
|
|
return a;
|
|
|
}
|
|
|
var T$1 = { ReactCurrentDispatcher: R$1, ReactCurrentBatchConfig: { transition: 0 }, ReactCurrentOwner: G$1, IsSomeRendererActing: { current: false }, assign: l };
|
|
|
react_production_min.Children = { map: P$1, forEach: function(a, b, c) {
|
|
|
P$1(a, function() {
|
|
|
b.apply(this, arguments);
|
|
|
}, c);
|
|
|
}, count: function(a) {
|
|
|
var b = 0;
|
|
|
P$1(a, function() {
|
|
|
b++;
|
|
|
});
|
|
|
return b;
|
|
|
}, toArray: function(a) {
|
|
|
return P$1(a, function(a2) {
|
|
|
return a2;
|
|
|
}) || [];
|
|
|
}, only: function(a) {
|
|
|
if (!L(a))
|
|
|
throw Error(z(143));
|
|
|
return a;
|
|
|
} };
|
|
|
react_production_min.Component = C;
|
|
|
react_production_min.PureComponent = E$1;
|
|
|
react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = T$1;
|
|
|
react_production_min.cloneElement = function(a, b, c) {
|
|
|
if (a === null || a === void 0)
|
|
|
throw Error(z(267, a));
|
|
|
var e = l({}, a.props), d = a.key, k = a.ref, h2 = a._owner;
|
|
|
if (b != null) {
|
|
|
b.ref !== void 0 && (k = b.ref, h2 = G$1.current);
|
|
|
b.key !== void 0 && (d = "" + b.key);
|
|
|
if (a.type && a.type.defaultProps)
|
|
|
var g2 = a.type.defaultProps;
|
|
|
for (f2 in b)
|
|
|
H$1.call(b, f2) && !I$1.hasOwnProperty(f2) && (e[f2] = b[f2] === void 0 && g2 !== void 0 ? g2[f2] : b[f2]);
|
|
|
}
|
|
|
var f2 = arguments.length - 2;
|
|
|
if (f2 === 1)
|
|
|
e.children = c;
|
|
|
else if (1 < f2) {
|
|
|
g2 = Array(f2);
|
|
|
for (var m2 = 0; m2 < f2; m2++)
|
|
|
g2[m2] = arguments[m2 + 2];
|
|
|
e.children = g2;
|
|
|
}
|
|
|
return {
|
|
|
$$typeof: n$1,
|
|
|
type: a.type,
|
|
|
key: d,
|
|
|
ref: k,
|
|
|
props: e,
|
|
|
_owner: h2
|
|
|
};
|
|
|
};
|
|
|
react_production_min.createContext = function(a, b) {
|
|
|
b === void 0 && (b = null);
|
|
|
a = { $$typeof: r$1, _calculateChangedBits: b, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null };
|
|
|
a.Provider = { $$typeof: q$1, _context: a };
|
|
|
return a.Consumer = a;
|
|
|
};
|
|
|
react_production_min.createElement = J;
|
|
|
react_production_min.createFactory = function(a) {
|
|
|
var b = J.bind(null, a);
|
|
|
b.type = a;
|
|
|
return b;
|
|
|
};
|
|
|
react_production_min.createRef = function() {
|
|
|
return { current: null };
|
|
|
};
|
|
|
react_production_min.forwardRef = function(a) {
|
|
|
return { $$typeof: t$1, render: a };
|
|
|
};
|
|
|
react_production_min.isValidElement = L;
|
|
|
react_production_min.lazy = function(a) {
|
|
|
return { $$typeof: v, _payload: { _status: -1, _result: a }, _init: Q };
|
|
|
};
|
|
|
react_production_min.memo = function(a, b) {
|
|
|
return { $$typeof: u, type: a, compare: b === void 0 ? null : b };
|
|
|
};
|
|
|
react_production_min.useCallback = function(a, b) {
|
|
|
return S$1().useCallback(a, b);
|
|
|
};
|
|
|
react_production_min.useContext = function(a, b) {
|
|
|
return S$1().useContext(a, b);
|
|
|
};
|
|
|
react_production_min.useDebugValue = function() {
|
|
|
};
|
|
|
react_production_min.useEffect = function(a, b) {
|
|
|
return S$1().useEffect(a, b);
|
|
|
};
|
|
|
react_production_min.useImperativeHandle = function(a, b, c) {
|
|
|
return S$1().useImperativeHandle(a, b, c);
|
|
|
};
|
|
|
react_production_min.useLayoutEffect = function(a, b) {
|
|
|
return S$1().useLayoutEffect(a, b);
|
|
|
};
|
|
|
react_production_min.useMemo = function(a, b) {
|
|
|
return S$1().useMemo(a, b);
|
|
|
};
|
|
|
react_production_min.useReducer = function(a, b, c) {
|
|
|
return S$1().useReducer(a, b, c);
|
|
|
};
|
|
|
react_production_min.useRef = function(a) {
|
|
|
return S$1().useRef(a);
|
|
|
};
|
|
|
react_production_min.useState = function(a) {
|
|
|
return S$1().useState(a);
|
|
|
};
|
|
|
react_production_min.version = "17.0.2";
|
|
|
{
|
|
|
_react_17_0_2_react.exports = react_production_min;
|
|
|
}
|
|
|
var React$1 = _react_17_0_2_react.exports;
|
|
|
var _reactDom_17_0_2_reactDom = { exports: {} };
|
|
|
var reactDom_production_min = {};
|
|
|
var _scheduler_0_20_2_scheduler = { exports: {} };
|
|
|
var scheduler_production_min = {};
|
|
|
/** @license React v0.20.2
|
|
|
* scheduler.production.min.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.
|
|
|
*/
|
|
|
(function(exports) {
|
|
|
var f2, g2, h2, k;
|
|
|
if (typeof performance === "object" && typeof performance.now === "function") {
|
|
|
var l2 = performance;
|
|
|
exports.unstable_now = function() {
|
|
|
return l2.now();
|
|
|
};
|
|
|
} else {
|
|
|
var p2 = Date, q2 = p2.now();
|
|
|
exports.unstable_now = function() {
|
|
|
return p2.now() - q2;
|
|
|
};
|
|
|
}
|
|
|
if (typeof window === "undefined" || typeof MessageChannel !== "function") {
|
|
|
var t2 = null, u2 = null, w2 = function() {
|
|
|
if (t2 !== null)
|
|
|
try {
|
|
|
var a = exports.unstable_now();
|
|
|
t2(true, a);
|
|
|
t2 = null;
|
|
|
} catch (b) {
|
|
|
throw setTimeout(w2, 0), b;
|
|
|
}
|
|
|
};
|
|
|
f2 = function(a) {
|
|
|
t2 !== null ? setTimeout(f2, 0, a) : (t2 = a, setTimeout(w2, 0));
|
|
|
};
|
|
|
g2 = function(a, b) {
|
|
|
u2 = setTimeout(a, b);
|
|
|
};
|
|
|
h2 = function() {
|
|
|
clearTimeout(u2);
|
|
|
};
|
|
|
exports.unstable_shouldYield = function() {
|
|
|
return false;
|
|
|
};
|
|
|
k = exports.unstable_forceFrameRate = function() {
|
|
|
};
|
|
|
} else {
|
|
|
var x2 = window.setTimeout, y2 = window.clearTimeout;
|
|
|
if (typeof console !== "undefined") {
|
|
|
var z2 = window.cancelAnimationFrame;
|
|
|
typeof window.requestAnimationFrame !== "function" && console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
|
|
|
typeof z2 !== "function" && console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
|
|
|
}
|
|
|
var A2 = false, B2 = null, C2 = -1, D2 = 5, E2 = 0;
|
|
|
exports.unstable_shouldYield = function() {
|
|
|
return exports.unstable_now() >= E2;
|
|
|
};
|
|
|
k = function() {
|
|
|
};
|
|
|
exports.unstable_forceFrameRate = function(a) {
|
|
|
0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : D2 = 0 < a ? Math.floor(1e3 / a) : 5;
|
|
|
};
|
|
|
var F2 = new MessageChannel(), G2 = F2.port2;
|
|
|
F2.port1.onmessage = function() {
|
|
|
if (B2 !== null) {
|
|
|
var a = exports.unstable_now();
|
|
|
E2 = a + D2;
|
|
|
try {
|
|
|
B2(true, a) ? G2.postMessage(null) : (A2 = false, B2 = null);
|
|
|
} catch (b) {
|
|
|
throw G2.postMessage(null), b;
|
|
|
}
|
|
|
} else
|
|
|
A2 = false;
|
|
|
};
|
|
|
f2 = function(a) {
|
|
|
B2 = a;
|
|
|
A2 || (A2 = true, G2.postMessage(null));
|
|
|
};
|
|
|
g2 = function(a, b) {
|
|
|
C2 = x2(function() {
|
|
|
a(exports.unstable_now());
|
|
|
}, b);
|
|
|
};
|
|
|
h2 = function() {
|
|
|
y2(C2);
|
|
|
C2 = -1;
|
|
|
};
|
|
|
}
|
|
|
function H2(a, b) {
|
|
|
var c = a.length;
|
|
|
a.push(b);
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
var d = c - 1 >>> 1, e = a[d];
|
|
|
if (e !== void 0 && 0 < I2(e, b))
|
|
|
a[d] = b, a[c] = e, c = d;
|
|
|
else
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
function J2(a) {
|
|
|
a = a[0];
|
|
|
return a === void 0 ? null : a;
|
|
|
}
|
|
|
function K2(a) {
|
|
|
var b = a[0];
|
|
|
if (b !== void 0) {
|
|
|
var c = a.pop();
|
|
|
if (c !== b) {
|
|
|
a[0] = c;
|
|
|
a:
|
|
|
for (var d = 0, e = a.length; d < e; ) {
|
|
|
var m2 = 2 * (d + 1) - 1, n2 = a[m2], v2 = m2 + 1, r2 = a[v2];
|
|
|
if (n2 !== void 0 && 0 > I2(n2, c))
|
|
|
r2 !== void 0 && 0 > I2(r2, n2) ? (a[d] = r2, a[v2] = c, d = v2) : (a[d] = n2, a[m2] = c, d = m2);
|
|
|
else if (r2 !== void 0 && 0 > I2(r2, c))
|
|
|
a[d] = r2, a[v2] = c, d = v2;
|
|
|
else
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function I2(a, b) {
|
|
|
var c = a.sortIndex - b.sortIndex;
|
|
|
return c !== 0 ? c : a.id - b.id;
|
|
|
}
|
|
|
var L2 = [], M2 = [], N2 = 1, O2 = null, P2 = 3, Q2 = false, R2 = false, S2 = false;
|
|
|
function T2(a) {
|
|
|
for (var b = J2(M2); b !== null; ) {
|
|
|
if (b.callback === null)
|
|
|
K2(M2);
|
|
|
else if (b.startTime <= a)
|
|
|
K2(M2), b.sortIndex = b.expirationTime, H2(L2, b);
|
|
|
else
|
|
|
break;
|
|
|
b = J2(M2);
|
|
|
}
|
|
|
}
|
|
|
function U2(a) {
|
|
|
S2 = false;
|
|
|
T2(a);
|
|
|
if (!R2)
|
|
|
if (J2(L2) !== null)
|
|
|
R2 = true, f2(V2);
|
|
|
else {
|
|
|
var b = J2(M2);
|
|
|
b !== null && g2(U2, b.startTime - a);
|
|
|
}
|
|
|
}
|
|
|
function V2(a, b) {
|
|
|
R2 = false;
|
|
|
S2 && (S2 = false, h2());
|
|
|
Q2 = true;
|
|
|
var c = P2;
|
|
|
try {
|
|
|
T2(b);
|
|
|
for (O2 = J2(L2); O2 !== null && (!(O2.expirationTime > b) || a && !exports.unstable_shouldYield()); ) {
|
|
|
var d = O2.callback;
|
|
|
if (typeof d === "function") {
|
|
|
O2.callback = null;
|
|
|
P2 = O2.priorityLevel;
|
|
|
var e = d(O2.expirationTime <= b);
|
|
|
b = exports.unstable_now();
|
|
|
typeof e === "function" ? O2.callback = e : O2 === J2(L2) && K2(L2);
|
|
|
T2(b);
|
|
|
} else
|
|
|
K2(L2);
|
|
|
O2 = J2(L2);
|
|
|
}
|
|
|
if (O2 !== null)
|
|
|
var m2 = true;
|
|
|
else {
|
|
|
var n2 = J2(M2);
|
|
|
n2 !== null && g2(U2, n2.startTime - b);
|
|
|
m2 = false;
|
|
|
}
|
|
|
return m2;
|
|
|
} finally {
|
|
|
O2 = null, P2 = c, Q2 = false;
|
|
|
}
|
|
|
}
|
|
|
var W2 = k;
|
|
|
exports.unstable_IdlePriority = 5;
|
|
|
exports.unstable_ImmediatePriority = 1;
|
|
|
exports.unstable_LowPriority = 4;
|
|
|
exports.unstable_NormalPriority = 3;
|
|
|
exports.unstable_Profiling = null;
|
|
|
exports.unstable_UserBlockingPriority = 2;
|
|
|
exports.unstable_cancelCallback = function(a) {
|
|
|
a.callback = null;
|
|
|
};
|
|
|
exports.unstable_continueExecution = function() {
|
|
|
R2 || Q2 || (R2 = true, f2(V2));
|
|
|
};
|
|
|
exports.unstable_getCurrentPriorityLevel = function() {
|
|
|
return P2;
|
|
|
};
|
|
|
exports.unstable_getFirstCallbackNode = function() {
|
|
|
return J2(L2);
|
|
|
};
|
|
|
exports.unstable_next = function(a) {
|
|
|
switch (P2) {
|
|
|
case 1:
|
|
|
case 2:
|
|
|
case 3:
|
|
|
var b = 3;
|
|
|
break;
|
|
|
default:
|
|
|
b = P2;
|
|
|
}
|
|
|
var c = P2;
|
|
|
P2 = b;
|
|
|
try {
|
|
|
return a();
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
exports.unstable_pauseExecution = function() {
|
|
|
};
|
|
|
exports.unstable_requestPaint = W2;
|
|
|
exports.unstable_runWithPriority = function(a, b) {
|
|
|
switch (a) {
|
|
|
case 1:
|
|
|
case 2:
|
|
|
case 3:
|
|
|
case 4:
|
|
|
case 5:
|
|
|
break;
|
|
|
default:
|
|
|
a = 3;
|
|
|
}
|
|
|
var c = P2;
|
|
|
P2 = a;
|
|
|
try {
|
|
|
return b();
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
exports.unstable_scheduleCallback = function(a, b, c) {
|
|
|
var d = exports.unstable_now();
|
|
|
typeof c === "object" && c !== null ? (c = c.delay, c = typeof c === "number" && 0 < c ? d + c : d) : c = d;
|
|
|
switch (a) {
|
|
|
case 1:
|
|
|
var e = -1;
|
|
|
break;
|
|
|
case 2:
|
|
|
e = 250;
|
|
|
break;
|
|
|
case 5:
|
|
|
e = 1073741823;
|
|
|
break;
|
|
|
case 4:
|
|
|
e = 1e4;
|
|
|
break;
|
|
|
default:
|
|
|
e = 5e3;
|
|
|
}
|
|
|
e = c + e;
|
|
|
a = { id: N2++, callback: b, priorityLevel: a, startTime: c, expirationTime: e, sortIndex: -1 };
|
|
|
c > d ? (a.sortIndex = c, H2(M2, a), J2(L2) === null && a === J2(M2) && (S2 ? h2() : S2 = true, g2(U2, c - d))) : (a.sortIndex = e, H2(L2, a), R2 || Q2 || (R2 = true, f2(V2)));
|
|
|
return a;
|
|
|
};
|
|
|
exports.unstable_wrapCallback = function(a) {
|
|
|
var b = P2;
|
|
|
return function() {
|
|
|
var c = P2;
|
|
|
P2 = b;
|
|
|
try {
|
|
|
return a.apply(this, arguments);
|
|
|
} finally {
|
|
|
P2 = c;
|
|
|
}
|
|
|
};
|
|
|
};
|
|
|
})(scheduler_production_min);
|
|
|
{
|
|
|
_scheduler_0_20_2_scheduler.exports = scheduler_production_min;
|
|
|
}
|
|
|
/** @license React v17.0.2
|
|
|
* react-dom.production.min.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.
|
|
|
*/
|
|
|
var aa = _react_17_0_2_react.exports, m$1 = _objectAssign_4_1_1_objectAssign, r = _scheduler_0_20_2_scheduler.exports;
|
|
|
function y(a) {
|
|
|
for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++)
|
|
|
b += "&args[]=" + encodeURIComponent(arguments[c]);
|
|
|
return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";
|
|
|
}
|
|
|
if (!aa)
|
|
|
throw Error(y(227));
|
|
|
var ba = new Set(), ca = {};
|
|
|
function da$1(a, b) {
|
|
|
ea(a, b);
|
|
|
ea(a + "Capture", b);
|
|
|
}
|
|
|
function ea(a, b) {
|
|
|
ca[a] = b;
|
|
|
for (a = 0; a < b.length; a++)
|
|
|
ba.add(b[a]);
|
|
|
}
|
|
|
var fa = !(typeof window === "undefined" || typeof window.document === "undefined" || typeof window.document.createElement === "undefined"), ha = /^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, ia = Object.prototype.hasOwnProperty, ja$1 = {}, ka = {};
|
|
|
function la(a) {
|
|
|
if (ia.call(ka, a))
|
|
|
return true;
|
|
|
if (ia.call(ja$1, a))
|
|
|
return false;
|
|
|
if (ha.test(a))
|
|
|
return ka[a] = true;
|
|
|
ja$1[a] = true;
|
|
|
return false;
|
|
|
}
|
|
|
function ma(a, b, c, d) {
|
|
|
if (c !== null && c.type === 0)
|
|
|
return false;
|
|
|
switch (typeof b) {
|
|
|
case "function":
|
|
|
case "symbol":
|
|
|
return true;
|
|
|
case "boolean":
|
|
|
if (d)
|
|
|
return false;
|
|
|
if (c !== null)
|
|
|
return !c.acceptsBooleans;
|
|
|
a = a.toLowerCase().slice(0, 5);
|
|
|
return a !== "data-" && a !== "aria-";
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function na(a, b, c, d) {
|
|
|
if (b === null || typeof b === "undefined" || ma(a, b, c, d))
|
|
|
return true;
|
|
|
if (d)
|
|
|
return false;
|
|
|
if (c !== null)
|
|
|
switch (c.type) {
|
|
|
case 3:
|
|
|
return !b;
|
|
|
case 4:
|
|
|
return b === false;
|
|
|
case 5:
|
|
|
return isNaN(b);
|
|
|
case 6:
|
|
|
return isNaN(b) || 1 > b;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function B(a, b, c, d, e, f2, g2) {
|
|
|
this.acceptsBooleans = b === 2 || b === 3 || b === 4;
|
|
|
this.attributeName = d;
|
|
|
this.attributeNamespace = e;
|
|
|
this.mustUseProperty = c;
|
|
|
this.propertyName = a;
|
|
|
this.type = b;
|
|
|
this.sanitizeURL = f2;
|
|
|
this.removeEmptyString = g2;
|
|
|
}
|
|
|
var D = {};
|
|
|
"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) {
|
|
|
D[a] = new B(a, 0, false, a, null, false, false);
|
|
|
});
|
|
|
[["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(a) {
|
|
|
var b = a[0];
|
|
|
D[b] = new B(b, 1, false, a[1], null, false, false);
|
|
|
});
|
|
|
["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) {
|
|
|
D[a] = new B(a, 2, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) {
|
|
|
D[a] = new B(a, 2, false, a, 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".split(" ").forEach(function(a) {
|
|
|
D[a] = new B(a, 3, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
["checked", "multiple", "muted", "selected"].forEach(function(a) {
|
|
|
D[a] = new B(a, 3, true, a, null, false, false);
|
|
|
});
|
|
|
["capture", "download"].forEach(function(a) {
|
|
|
D[a] = new B(a, 4, false, a, null, false, false);
|
|
|
});
|
|
|
["cols", "rows", "size", "span"].forEach(function(a) {
|
|
|
D[a] = new B(a, 6, false, a, null, false, false);
|
|
|
});
|
|
|
["rowSpan", "start"].forEach(function(a) {
|
|
|
D[a] = new B(a, 5, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
var oa = /[\-:]([a-z])/g;
|
|
|
function pa(a) {
|
|
|
return a[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".split(" ").forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, null, false, false);
|
|
|
});
|
|
|
"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, "http://www.w3.org/1999/xlink", false, false);
|
|
|
});
|
|
|
["xml:base", "xml:lang", "xml:space"].forEach(function(a) {
|
|
|
var b = a.replace(oa, pa);
|
|
|
D[b] = new B(b, 1, false, a, "http://www.w3.org/XML/1998/namespace", false, false);
|
|
|
});
|
|
|
["tabIndex", "crossOrigin"].forEach(function(a) {
|
|
|
D[a] = new B(a, 1, false, a.toLowerCase(), null, false, false);
|
|
|
});
|
|
|
D.xlinkHref = new B("xlinkHref", 1, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false);
|
|
|
["src", "href", "action", "formAction"].forEach(function(a) {
|
|
|
D[a] = new B(a, 1, false, a.toLowerCase(), null, true, true);
|
|
|
});
|
|
|
function qa(a, b, c, d) {
|
|
|
var e = D.hasOwnProperty(b) ? D[b] : null;
|
|
|
var f2 = e !== null ? e.type === 0 : d ? false : !(2 < b.length) || b[0] !== "o" && b[0] !== "O" || b[1] !== "n" && b[1] !== "N" ? false : true;
|
|
|
f2 || (na(b, c, e, d) && (c = null), d || e === null ? la(b) && (c === null ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = c === null ? e.type === 3 ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, c === null ? a.removeAttribute(b) : (e = e.type, c = e === 3 || e === 4 && c === true ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))));
|
|
|
}
|
|
|
var ra = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, sa = 60103, ta = 60106, ua = 60107, wa = 60108, xa = 60114, ya = 60109, za = 60110, Aa = 60112, Ba = 60113, Ca = 60120, Da = 60115, Ea = 60116, Fa = 60121, Ga = 60128, Ha = 60129, Ia = 60130, Ja = 60131;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var E = Symbol.for;
|
|
|
sa = E("react.element");
|
|
|
ta = E("react.portal");
|
|
|
ua = E("react.fragment");
|
|
|
wa = E("react.strict_mode");
|
|
|
xa = E("react.profiler");
|
|
|
ya = E("react.provider");
|
|
|
za = E("react.context");
|
|
|
Aa = E("react.forward_ref");
|
|
|
Ba = E("react.suspense");
|
|
|
Ca = E("react.suspense_list");
|
|
|
Da = E("react.memo");
|
|
|
Ea = E("react.lazy");
|
|
|
Fa = E("react.block");
|
|
|
E("react.scope");
|
|
|
Ga = E("react.opaque.id");
|
|
|
Ha = E("react.debug_trace_mode");
|
|
|
Ia = E("react.offscreen");
|
|
|
Ja = E("react.legacy_hidden");
|
|
|
}
|
|
|
var Ka = typeof Symbol === "function" && Symbol.iterator;
|
|
|
function La(a) {
|
|
|
if (a === null || typeof a !== "object")
|
|
|
return null;
|
|
|
a = Ka && a[Ka] || a["@@iterator"];
|
|
|
return typeof a === "function" ? a : null;
|
|
|
}
|
|
|
var Ma;
|
|
|
function Na(a) {
|
|
|
if (Ma === void 0)
|
|
|
try {
|
|
|
throw Error();
|
|
|
} catch (c) {
|
|
|
var b = c.stack.trim().match(/\n( *(at )?)/);
|
|
|
Ma = b && b[1] || "";
|
|
|
}
|
|
|
return "\n" + Ma + a;
|
|
|
}
|
|
|
var Oa = false;
|
|
|
function Pa(a, b) {
|
|
|
if (!a || Oa)
|
|
|
return "";
|
|
|
Oa = true;
|
|
|
var c = Error.prepareStackTrace;
|
|
|
Error.prepareStackTrace = void 0;
|
|
|
try {
|
|
|
if (b)
|
|
|
if (b = function() {
|
|
|
throw Error();
|
|
|
}, Object.defineProperty(b.prototype, "props", { set: function() {
|
|
|
throw Error();
|
|
|
} }), typeof Reflect === "object" && Reflect.construct) {
|
|
|
try {
|
|
|
Reflect.construct(b, []);
|
|
|
} catch (k) {
|
|
|
var d = k;
|
|
|
}
|
|
|
Reflect.construct(a, [], b);
|
|
|
} else {
|
|
|
try {
|
|
|
b.call();
|
|
|
} catch (k) {
|
|
|
d = k;
|
|
|
}
|
|
|
a.call(b.prototype);
|
|
|
}
|
|
|
else {
|
|
|
try {
|
|
|
throw Error();
|
|
|
} catch (k) {
|
|
|
d = k;
|
|
|
}
|
|
|
a();
|
|
|
}
|
|
|
} catch (k) {
|
|
|
if (k && d && typeof k.stack === "string") {
|
|
|
for (var e = k.stack.split("\n"), f2 = d.stack.split("\n"), g2 = e.length - 1, h2 = f2.length - 1; 1 <= g2 && 0 <= h2 && e[g2] !== f2[h2]; )
|
|
|
h2--;
|
|
|
for (; 1 <= g2 && 0 <= h2; g2--, h2--)
|
|
|
if (e[g2] !== f2[h2]) {
|
|
|
if (g2 !== 1 || h2 !== 1) {
|
|
|
do
|
|
|
if (g2--, h2--, 0 > h2 || e[g2] !== f2[h2])
|
|
|
return "\n" + e[g2].replace(" at new ", " at ");
|
|
|
while (1 <= g2 && 0 <= h2);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} finally {
|
|
|
Oa = false, Error.prepareStackTrace = c;
|
|
|
}
|
|
|
return (a = a ? a.displayName || a.name : "") ? Na(a) : "";
|
|
|
}
|
|
|
function Qa(a) {
|
|
|
switch (a.tag) {
|
|
|
case 5:
|
|
|
return Na(a.type);
|
|
|
case 16:
|
|
|
return Na("Lazy");
|
|
|
case 13:
|
|
|
return Na("Suspense");
|
|
|
case 19:
|
|
|
return Na("SuspenseList");
|
|
|
case 0:
|
|
|
case 2:
|
|
|
case 15:
|
|
|
return a = Pa(a.type, false), a;
|
|
|
case 11:
|
|
|
return a = Pa(a.type.render, false), a;
|
|
|
case 22:
|
|
|
return a = Pa(a.type._render, false), a;
|
|
|
case 1:
|
|
|
return a = Pa(a.type, true), a;
|
|
|
default:
|
|
|
return "";
|
|
|
}
|
|
|
}
|
|
|
function Ra(a) {
|
|
|
if (a == null)
|
|
|
return null;
|
|
|
if (typeof a === "function")
|
|
|
return a.displayName || a.name || null;
|
|
|
if (typeof a === "string")
|
|
|
return a;
|
|
|
switch (a) {
|
|
|
case ua:
|
|
|
return "Fragment";
|
|
|
case ta:
|
|
|
return "Portal";
|
|
|
case xa:
|
|
|
return "Profiler";
|
|
|
case wa:
|
|
|
return "StrictMode";
|
|
|
case Ba:
|
|
|
return "Suspense";
|
|
|
case Ca:
|
|
|
return "SuspenseList";
|
|
|
}
|
|
|
if (typeof a === "object")
|
|
|
switch (a.$$typeof) {
|
|
|
case za:
|
|
|
return (a.displayName || "Context") + ".Consumer";
|
|
|
case ya:
|
|
|
return (a._context.displayName || "Context") + ".Provider";
|
|
|
case Aa:
|
|
|
var b = a.render;
|
|
|
b = b.displayName || b.name || "";
|
|
|
return a.displayName || (b !== "" ? "ForwardRef(" + b + ")" : "ForwardRef");
|
|
|
case Da:
|
|
|
return Ra(a.type);
|
|
|
case Fa:
|
|
|
return Ra(a._render);
|
|
|
case Ea:
|
|
|
b = a._payload;
|
|
|
a = a._init;
|
|
|
try {
|
|
|
return Ra(a(b));
|
|
|
} catch (c) {
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function Sa(a) {
|
|
|
switch (typeof a) {
|
|
|
case "boolean":
|
|
|
case "number":
|
|
|
case "object":
|
|
|
case "string":
|
|
|
case "undefined":
|
|
|
return a;
|
|
|
default:
|
|
|
return "";
|
|
|
}
|
|
|
}
|
|
|
function Ta(a) {
|
|
|
var b = a.type;
|
|
|
return (a = a.nodeName) && a.toLowerCase() === "input" && (b === "checkbox" || b === "radio");
|
|
|
}
|
|
|
function Ua(a) {
|
|
|
var b = Ta(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b];
|
|
|
if (!a.hasOwnProperty(b) && typeof c !== "undefined" && typeof c.get === "function" && typeof c.set === "function") {
|
|
|
var e = c.get, f2 = c.set;
|
|
|
Object.defineProperty(a, b, { configurable: true, get: function() {
|
|
|
return e.call(this);
|
|
|
}, set: function(a2) {
|
|
|
d = "" + a2;
|
|
|
f2.call(this, a2);
|
|
|
} });
|
|
|
Object.defineProperty(a, b, { enumerable: c.enumerable });
|
|
|
return { getValue: function() {
|
|
|
return d;
|
|
|
}, setValue: function(a2) {
|
|
|
d = "" + a2;
|
|
|
}, stopTracking: function() {
|
|
|
a._valueTracker = null;
|
|
|
delete a[b];
|
|
|
} };
|
|
|
}
|
|
|
}
|
|
|
function Va(a) {
|
|
|
a._valueTracker || (a._valueTracker = Ua(a));
|
|
|
}
|
|
|
function Wa(a) {
|
|
|
if (!a)
|
|
|
return false;
|
|
|
var b = a._valueTracker;
|
|
|
if (!b)
|
|
|
return true;
|
|
|
var c = b.getValue();
|
|
|
var d = "";
|
|
|
a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value);
|
|
|
a = d;
|
|
|
return a !== c ? (b.setValue(a), true) : false;
|
|
|
}
|
|
|
function Xa(a) {
|
|
|
a = a || (typeof document !== "undefined" ? document : void 0);
|
|
|
if (typeof a === "undefined")
|
|
|
return null;
|
|
|
try {
|
|
|
return a.activeElement || a.body;
|
|
|
} catch (b) {
|
|
|
return a.body;
|
|
|
}
|
|
|
}
|
|
|
function Ya(a, b) {
|
|
|
var c = b.checked;
|
|
|
return m$1({}, b, { defaultChecked: void 0, defaultValue: void 0, value: void 0, checked: c != null ? c : a._wrapperState.initialChecked });
|
|
|
}
|
|
|
function Za(a, b) {
|
|
|
var c = b.defaultValue == null ? "" : b.defaultValue, d = b.checked != null ? b.checked : b.defaultChecked;
|
|
|
c = Sa(b.value != null ? b.value : c);
|
|
|
a._wrapperState = { initialChecked: d, initialValue: c, controlled: b.type === "checkbox" || b.type === "radio" ? b.checked != null : b.value != null };
|
|
|
}
|
|
|
function $a(a, b) {
|
|
|
b = b.checked;
|
|
|
b != null && qa(a, "checked", b, false);
|
|
|
}
|
|
|
function ab(a, b) {
|
|
|
$a(a, b);
|
|
|
var c = Sa(b.value), d = b.type;
|
|
|
if (c != null)
|
|
|
if (d === "number") {
|
|
|
if (c === 0 && a.value === "" || a.value != c)
|
|
|
a.value = "" + c;
|
|
|
} else
|
|
|
a.value !== "" + c && (a.value = "" + c);
|
|
|
else if (d === "submit" || d === "reset") {
|
|
|
a.removeAttribute("value");
|
|
|
return;
|
|
|
}
|
|
|
b.hasOwnProperty("value") ? bb(a, b.type, c) : b.hasOwnProperty("defaultValue") && bb(a, b.type, Sa(b.defaultValue));
|
|
|
b.checked == null && b.defaultChecked != null && (a.defaultChecked = !!b.defaultChecked);
|
|
|
}
|
|
|
function cb(a, b, c) {
|
|
|
if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) {
|
|
|
var d = b.type;
|
|
|
if (!(d !== "submit" && d !== "reset" || b.value !== void 0 && b.value !== null))
|
|
|
return;
|
|
|
b = "" + a._wrapperState.initialValue;
|
|
|
c || b === a.value || (a.value = b);
|
|
|
a.defaultValue = b;
|
|
|
}
|
|
|
c = a.name;
|
|
|
c !== "" && (a.name = "");
|
|
|
a.defaultChecked = !!a._wrapperState.initialChecked;
|
|
|
c !== "" && (a.name = c);
|
|
|
}
|
|
|
function bb(a, b, c) {
|
|
|
if (b !== "number" || Xa(a.ownerDocument) !== a)
|
|
|
c == null ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c);
|
|
|
}
|
|
|
function db(a) {
|
|
|
var b = "";
|
|
|
aa.Children.forEach(a, function(a2) {
|
|
|
a2 != null && (b += a2);
|
|
|
});
|
|
|
return b;
|
|
|
}
|
|
|
function eb(a, b) {
|
|
|
a = m$1({ children: void 0 }, b);
|
|
|
if (b = db(b.children))
|
|
|
a.children = b;
|
|
|
return a;
|
|
|
}
|
|
|
function fb(a, b, c, d) {
|
|
|
a = a.options;
|
|
|
if (b) {
|
|
|
b = {};
|
|
|
for (var e = 0; e < c.length; e++)
|
|
|
b["$" + c[e]] = true;
|
|
|
for (c = 0; c < a.length; c++)
|
|
|
e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = true);
|
|
|
} else {
|
|
|
c = "" + Sa(c);
|
|
|
b = null;
|
|
|
for (e = 0; e < a.length; e++) {
|
|
|
if (a[e].value === c) {
|
|
|
a[e].selected = true;
|
|
|
d && (a[e].defaultSelected = true);
|
|
|
return;
|
|
|
}
|
|
|
b !== null || a[e].disabled || (b = a[e]);
|
|
|
}
|
|
|
b !== null && (b.selected = true);
|
|
|
}
|
|
|
}
|
|
|
function gb(a, b) {
|
|
|
if (b.dangerouslySetInnerHTML != null)
|
|
|
throw Error(y(91));
|
|
|
return m$1({}, b, { value: void 0, defaultValue: void 0, children: "" + a._wrapperState.initialValue });
|
|
|
}
|
|
|
function hb(a, b) {
|
|
|
var c = b.value;
|
|
|
if (c == null) {
|
|
|
c = b.children;
|
|
|
b = b.defaultValue;
|
|
|
if (c != null) {
|
|
|
if (b != null)
|
|
|
throw Error(y(92));
|
|
|
if (Array.isArray(c)) {
|
|
|
if (!(1 >= c.length))
|
|
|
throw Error(y(93));
|
|
|
c = c[0];
|
|
|
}
|
|
|
b = c;
|
|
|
}
|
|
|
b == null && (b = "");
|
|
|
c = b;
|
|
|
}
|
|
|
a._wrapperState = { initialValue: Sa(c) };
|
|
|
}
|
|
|
function ib(a, b) {
|
|
|
var c = Sa(b.value), d = Sa(b.defaultValue);
|
|
|
c != null && (c = "" + c, c !== a.value && (a.value = c), b.defaultValue == null && a.defaultValue !== c && (a.defaultValue = c));
|
|
|
d != null && (a.defaultValue = "" + d);
|
|
|
}
|
|
|
function jb(a) {
|
|
|
var b = a.textContent;
|
|
|
b === a._wrapperState.initialValue && b !== "" && b !== null && (a.value = b);
|
|
|
}
|
|
|
var kb = { html: "http://www.w3.org/1999/xhtml", mathml: "http://www.w3.org/1998/Math/MathML", svg: "http://www.w3.org/2000/svg" };
|
|
|
function lb(a) {
|
|
|
switch (a) {
|
|
|
case "svg":
|
|
|
return "http://www.w3.org/2000/svg";
|
|
|
case "math":
|
|
|
return "http://www.w3.org/1998/Math/MathML";
|
|
|
default:
|
|
|
return "http://www.w3.org/1999/xhtml";
|
|
|
}
|
|
|
}
|
|
|
function mb(a, b) {
|
|
|
return a == null || a === "http://www.w3.org/1999/xhtml" ? lb(b) : a === "http://www.w3.org/2000/svg" && b === "foreignObject" ? "http://www.w3.org/1999/xhtml" : a;
|
|
|
}
|
|
|
var nb, ob = function(a) {
|
|
|
return typeof MSApp !== "undefined" && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
|
|
|
MSApp.execUnsafeLocalFunction(function() {
|
|
|
return a(b, c, d, e);
|
|
|
});
|
|
|
} : a;
|
|
|
}(function(a, b) {
|
|
|
if (a.namespaceURI !== kb.svg || "innerHTML" in a)
|
|
|
a.innerHTML = b;
|
|
|
else {
|
|
|
nb = nb || document.createElement("div");
|
|
|
nb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>";
|
|
|
for (b = nb.firstChild; a.firstChild; )
|
|
|
a.removeChild(a.firstChild);
|
|
|
for (; b.firstChild; )
|
|
|
a.appendChild(b.firstChild);
|
|
|
}
|
|
|
});
|
|
|
function pb(a, b) {
|
|
|
if (b) {
|
|
|
var c = a.firstChild;
|
|
|
if (c && c === a.lastChild && c.nodeType === 3) {
|
|
|
c.nodeValue = b;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
a.textContent = b;
|
|
|
}
|
|
|
var qb = {
|
|
|
animationIterationCount: 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
|
|
|
}, rb = ["Webkit", "ms", "Moz", "O"];
|
|
|
Object.keys(qb).forEach(function(a) {
|
|
|
rb.forEach(function(b) {
|
|
|
b = b + a.charAt(0).toUpperCase() + a.substring(1);
|
|
|
qb[b] = qb[a];
|
|
|
});
|
|
|
});
|
|
|
function sb(a, b, c) {
|
|
|
return b == null || typeof b === "boolean" || b === "" ? "" : c || typeof b !== "number" || b === 0 || qb.hasOwnProperty(a) && qb[a] ? ("" + b).trim() : b + "px";
|
|
|
}
|
|
|
function tb(a, b) {
|
|
|
a = a.style;
|
|
|
for (var c in b)
|
|
|
if (b.hasOwnProperty(c)) {
|
|
|
var d = c.indexOf("--") === 0, e = sb(c, b[c], d);
|
|
|
c === "float" && (c = "cssFloat");
|
|
|
d ? a.setProperty(c, e) : a[c] = e;
|
|
|
}
|
|
|
}
|
|
|
var ub = m$1({ menuitem: true }, { 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 });
|
|
|
function vb(a, b) {
|
|
|
if (b) {
|
|
|
if (ub[a] && (b.children != null || b.dangerouslySetInnerHTML != null))
|
|
|
throw Error(y(137, a));
|
|
|
if (b.dangerouslySetInnerHTML != null) {
|
|
|
if (b.children != null)
|
|
|
throw Error(y(60));
|
|
|
if (!(typeof b.dangerouslySetInnerHTML === "object" && "__html" in b.dangerouslySetInnerHTML))
|
|
|
throw Error(y(61));
|
|
|
}
|
|
|
if (b.style != null && typeof b.style !== "object")
|
|
|
throw Error(y(62));
|
|
|
}
|
|
|
}
|
|
|
function wb(a, b) {
|
|
|
if (a.indexOf("-") === -1)
|
|
|
return typeof b.is === "string";
|
|
|
switch (a) {
|
|
|
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;
|
|
|
}
|
|
|
}
|
|
|
function xb(a) {
|
|
|
a = a.target || a.srcElement || window;
|
|
|
a.correspondingUseElement && (a = a.correspondingUseElement);
|
|
|
return a.nodeType === 3 ? a.parentNode : a;
|
|
|
}
|
|
|
var yb = null, zb = null, Ab = null;
|
|
|
function Bb(a) {
|
|
|
if (a = Cb(a)) {
|
|
|
if (typeof yb !== "function")
|
|
|
throw Error(y(280));
|
|
|
var b = a.stateNode;
|
|
|
b && (b = Db(b), yb(a.stateNode, a.type, b));
|
|
|
}
|
|
|
}
|
|
|
function Eb(a) {
|
|
|
zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a;
|
|
|
}
|
|
|
function Fb() {
|
|
|
if (zb) {
|
|
|
var a = zb, b = Ab;
|
|
|
Ab = zb = null;
|
|
|
Bb(a);
|
|
|
if (b)
|
|
|
for (a = 0; a < b.length; a++)
|
|
|
Bb(b[a]);
|
|
|
}
|
|
|
}
|
|
|
function Gb(a, b) {
|
|
|
return a(b);
|
|
|
}
|
|
|
function Hb(a, b, c, d, e) {
|
|
|
return a(b, c, d, e);
|
|
|
}
|
|
|
function Ib() {
|
|
|
}
|
|
|
var Jb = Gb, Kb = false, Lb = false;
|
|
|
function Mb() {
|
|
|
if (zb !== null || Ab !== null)
|
|
|
Ib(), Fb();
|
|
|
}
|
|
|
function Nb(a, b, c) {
|
|
|
if (Lb)
|
|
|
return a(b, c);
|
|
|
Lb = true;
|
|
|
try {
|
|
|
return Jb(a, b, c);
|
|
|
} finally {
|
|
|
Lb = false, Mb();
|
|
|
}
|
|
|
}
|
|
|
function Ob(a, b) {
|
|
|
var c = a.stateNode;
|
|
|
if (c === null)
|
|
|
return null;
|
|
|
var d = Db(c);
|
|
|
if (d === null)
|
|
|
return null;
|
|
|
c = d[b];
|
|
|
a:
|
|
|
switch (b) {
|
|
|
case "onClick":
|
|
|
case "onClickCapture":
|
|
|
case "onDoubleClick":
|
|
|
case "onDoubleClickCapture":
|
|
|
case "onMouseDown":
|
|
|
case "onMouseDownCapture":
|
|
|
case "onMouseMove":
|
|
|
case "onMouseMoveCapture":
|
|
|
case "onMouseUp":
|
|
|
case "onMouseUpCapture":
|
|
|
case "onMouseEnter":
|
|
|
(d = !d.disabled) || (a = a.type, d = !(a === "button" || a === "input" || a === "select" || a === "textarea"));
|
|
|
a = !d;
|
|
|
break a;
|
|
|
default:
|
|
|
a = false;
|
|
|
}
|
|
|
if (a)
|
|
|
return null;
|
|
|
if (c && typeof c !== "function")
|
|
|
throw Error(y(231, b, typeof c));
|
|
|
return c;
|
|
|
}
|
|
|
var Pb = false;
|
|
|
if (fa)
|
|
|
try {
|
|
|
var Qb = {};
|
|
|
Object.defineProperty(Qb, "passive", { get: function() {
|
|
|
Pb = true;
|
|
|
} });
|
|
|
window.addEventListener("test", Qb, Qb);
|
|
|
window.removeEventListener("test", Qb, Qb);
|
|
|
} catch (a) {
|
|
|
Pb = false;
|
|
|
}
|
|
|
function Rb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
var l2 = Array.prototype.slice.call(arguments, 3);
|
|
|
try {
|
|
|
b.apply(c, l2);
|
|
|
} catch (n2) {
|
|
|
this.onError(n2);
|
|
|
}
|
|
|
}
|
|
|
var Sb = false, Tb = null, Ub = false, Vb = null, Wb = { onError: function(a) {
|
|
|
Sb = true;
|
|
|
Tb = a;
|
|
|
} };
|
|
|
function Xb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
Sb = false;
|
|
|
Tb = null;
|
|
|
Rb.apply(Wb, arguments);
|
|
|
}
|
|
|
function Yb(a, b, c, d, e, f2, g2, h2, k) {
|
|
|
Xb.apply(this, arguments);
|
|
|
if (Sb) {
|
|
|
if (Sb) {
|
|
|
var l2 = Tb;
|
|
|
Sb = false;
|
|
|
Tb = null;
|
|
|
} else
|
|
|
throw Error(y(198));
|
|
|
Ub || (Ub = true, Vb = l2);
|
|
|
}
|
|
|
}
|
|
|
function Zb(a) {
|
|
|
var b = a, c = a;
|
|
|
if (a.alternate)
|
|
|
for (; b.return; )
|
|
|
b = b.return;
|
|
|
else {
|
|
|
a = b;
|
|
|
do
|
|
|
b = a, (b.flags & 1026) !== 0 && (c = b.return), a = b.return;
|
|
|
while (a);
|
|
|
}
|
|
|
return b.tag === 3 ? c : null;
|
|
|
}
|
|
|
function $b(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = a.memoizedState;
|
|
|
b === null && (a = a.alternate, a !== null && (b = a.memoizedState));
|
|
|
if (b !== null)
|
|
|
return b.dehydrated;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function ac(a) {
|
|
|
if (Zb(a) !== a)
|
|
|
throw Error(y(188));
|
|
|
}
|
|
|
function bc(a) {
|
|
|
var b = a.alternate;
|
|
|
if (!b) {
|
|
|
b = Zb(a);
|
|
|
if (b === null)
|
|
|
throw Error(y(188));
|
|
|
return b !== a ? null : a;
|
|
|
}
|
|
|
for (var c = a, d = b; ; ) {
|
|
|
var e = c.return;
|
|
|
if (e === null)
|
|
|
break;
|
|
|
var f2 = e.alternate;
|
|
|
if (f2 === null) {
|
|
|
d = e.return;
|
|
|
if (d !== null) {
|
|
|
c = d;
|
|
|
continue;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
if (e.child === f2.child) {
|
|
|
for (f2 = e.child; f2; ) {
|
|
|
if (f2 === c)
|
|
|
return ac(e), a;
|
|
|
if (f2 === d)
|
|
|
return ac(e), b;
|
|
|
f2 = f2.sibling;
|
|
|
}
|
|
|
throw Error(y(188));
|
|
|
}
|
|
|
if (c.return !== d.return)
|
|
|
c = e, d = f2;
|
|
|
else {
|
|
|
for (var g2 = false, h2 = e.child; h2; ) {
|
|
|
if (h2 === c) {
|
|
|
g2 = true;
|
|
|
c = e;
|
|
|
d = f2;
|
|
|
break;
|
|
|
}
|
|
|
if (h2 === d) {
|
|
|
g2 = true;
|
|
|
d = e;
|
|
|
c = f2;
|
|
|
break;
|
|
|
}
|
|
|
h2 = h2.sibling;
|
|
|
}
|
|
|
if (!g2) {
|
|
|
for (h2 = f2.child; h2; ) {
|
|
|
if (h2 === c) {
|
|
|
g2 = true;
|
|
|
c = f2;
|
|
|
d = e;
|
|
|
break;
|
|
|
}
|
|
|
if (h2 === d) {
|
|
|
g2 = true;
|
|
|
d = f2;
|
|
|
c = e;
|
|
|
break;
|
|
|
}
|
|
|
h2 = h2.sibling;
|
|
|
}
|
|
|
if (!g2)
|
|
|
throw Error(y(189));
|
|
|
}
|
|
|
}
|
|
|
if (c.alternate !== d)
|
|
|
throw Error(y(190));
|
|
|
}
|
|
|
if (c.tag !== 3)
|
|
|
throw Error(y(188));
|
|
|
return c.stateNode.current === c ? a : b;
|
|
|
}
|
|
|
function cc(a) {
|
|
|
a = bc(a);
|
|
|
if (!a)
|
|
|
return null;
|
|
|
for (var b = a; ; ) {
|
|
|
if (b.tag === 5 || b.tag === 6)
|
|
|
return b;
|
|
|
if (b.child)
|
|
|
b.child.return = b, b = b.child;
|
|
|
else {
|
|
|
if (b === a)
|
|
|
break;
|
|
|
for (; !b.sibling; ) {
|
|
|
if (!b.return || b.return === a)
|
|
|
return null;
|
|
|
b = b.return;
|
|
|
}
|
|
|
b.sibling.return = b.return;
|
|
|
b = b.sibling;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function dc(a, b) {
|
|
|
for (var c = a.alternate; b !== null; ) {
|
|
|
if (b === a || b === c)
|
|
|
return true;
|
|
|
b = b.return;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
var ec, fc, gc, hc, ic = false, jc = [], kc = null, lc = null, mc = null, nc = new Map(), oc = new Map(), pc = [], qc = "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".split(" ");
|
|
|
function rc(a, b, c, d, e) {
|
|
|
return { blockedOn: a, domEventName: b, eventSystemFlags: c | 16, nativeEvent: e, targetContainers: [d] };
|
|
|
}
|
|
|
function sc(a, b) {
|
|
|
switch (a) {
|
|
|
case "focusin":
|
|
|
case "focusout":
|
|
|
kc = null;
|
|
|
break;
|
|
|
case "dragenter":
|
|
|
case "dragleave":
|
|
|
lc = null;
|
|
|
break;
|
|
|
case "mouseover":
|
|
|
case "mouseout":
|
|
|
mc = null;
|
|
|
break;
|
|
|
case "pointerover":
|
|
|
case "pointerout":
|
|
|
nc.delete(b.pointerId);
|
|
|
break;
|
|
|
case "gotpointercapture":
|
|
|
case "lostpointercapture":
|
|
|
oc.delete(b.pointerId);
|
|
|
}
|
|
|
}
|
|
|
function tc(a, b, c, d, e, f2) {
|
|
|
if (a === null || a.nativeEvent !== f2)
|
|
|
return a = rc(b, c, d, e, f2), b !== null && (b = Cb(b), b !== null && fc(b)), a;
|
|
|
a.eventSystemFlags |= d;
|
|
|
b = a.targetContainers;
|
|
|
e !== null && b.indexOf(e) === -1 && b.push(e);
|
|
|
return a;
|
|
|
}
|
|
|
function uc(a, b, c, d, e) {
|
|
|
switch (b) {
|
|
|
case "focusin":
|
|
|
return kc = tc(kc, a, b, c, d, e), true;
|
|
|
case "dragenter":
|
|
|
return lc = tc(lc, a, b, c, d, e), true;
|
|
|
case "mouseover":
|
|
|
return mc = tc(mc, a, b, c, d, e), true;
|
|
|
case "pointerover":
|
|
|
var f2 = e.pointerId;
|
|
|
nc.set(f2, tc(nc.get(f2) || null, a, b, c, d, e));
|
|
|
return true;
|
|
|
case "gotpointercapture":
|
|
|
return f2 = e.pointerId, oc.set(f2, tc(oc.get(f2) || null, a, b, c, d, e)), true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function vc(a) {
|
|
|
var b = wc(a.target);
|
|
|
if (b !== null) {
|
|
|
var c = Zb(b);
|
|
|
if (c !== null) {
|
|
|
if (b = c.tag, b === 13) {
|
|
|
if (b = $b(c), b !== null) {
|
|
|
a.blockedOn = b;
|
|
|
hc(a.lanePriority, function() {
|
|
|
r.unstable_runWithPriority(a.priority, function() {
|
|
|
gc(c);
|
|
|
});
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
} else if (b === 3 && c.stateNode.hydrate) {
|
|
|
a.blockedOn = c.tag === 3 ? c.stateNode.containerInfo : null;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
a.blockedOn = null;
|
|
|
}
|
|
|
function xc(a) {
|
|
|
if (a.blockedOn !== null)
|
|
|
return false;
|
|
|
for (var b = a.targetContainers; 0 < b.length; ) {
|
|
|
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
|
|
|
if (c !== null)
|
|
|
return b = Cb(c), b !== null && fc(b), a.blockedOn = c, false;
|
|
|
b.shift();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
function zc(a, b, c) {
|
|
|
xc(a) && c.delete(b);
|
|
|
}
|
|
|
function Ac() {
|
|
|
for (ic = false; 0 < jc.length; ) {
|
|
|
var a = jc[0];
|
|
|
if (a.blockedOn !== null) {
|
|
|
a = Cb(a.blockedOn);
|
|
|
a !== null && ec(a);
|
|
|
break;
|
|
|
}
|
|
|
for (var b = a.targetContainers; 0 < b.length; ) {
|
|
|
var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
|
|
|
if (c !== null) {
|
|
|
a.blockedOn = c;
|
|
|
break;
|
|
|
}
|
|
|
b.shift();
|
|
|
}
|
|
|
a.blockedOn === null && jc.shift();
|
|
|
}
|
|
|
kc !== null && xc(kc) && (kc = null);
|
|
|
lc !== null && xc(lc) && (lc = null);
|
|
|
mc !== null && xc(mc) && (mc = null);
|
|
|
nc.forEach(zc);
|
|
|
oc.forEach(zc);
|
|
|
}
|
|
|
function Bc(a, b) {
|
|
|
a.blockedOn === b && (a.blockedOn = null, ic || (ic = true, r.unstable_scheduleCallback(r.unstable_NormalPriority, Ac)));
|
|
|
}
|
|
|
function Cc(a) {
|
|
|
function b(b2) {
|
|
|
return Bc(b2, a);
|
|
|
}
|
|
|
if (0 < jc.length) {
|
|
|
Bc(jc[0], a);
|
|
|
for (var c = 1; c < jc.length; c++) {
|
|
|
var d = jc[c];
|
|
|
d.blockedOn === a && (d.blockedOn = null);
|
|
|
}
|
|
|
}
|
|
|
kc !== null && Bc(kc, a);
|
|
|
lc !== null && Bc(lc, a);
|
|
|
mc !== null && Bc(mc, a);
|
|
|
nc.forEach(b);
|
|
|
oc.forEach(b);
|
|
|
for (c = 0; c < pc.length; c++)
|
|
|
d = pc[c], d.blockedOn === a && (d.blockedOn = null);
|
|
|
for (; 0 < pc.length && (c = pc[0], c.blockedOn === null); )
|
|
|
vc(c), c.blockedOn === null && pc.shift();
|
|
|
}
|
|
|
function Dc(a, b) {
|
|
|
var c = {};
|
|
|
c[a.toLowerCase()] = b.toLowerCase();
|
|
|
c["Webkit" + a] = "webkit" + b;
|
|
|
c["Moz" + a] = "moz" + b;
|
|
|
return c;
|
|
|
}
|
|
|
var Ec = { animationend: Dc("Animation", "AnimationEnd"), animationiteration: Dc("Animation", "AnimationIteration"), animationstart: Dc("Animation", "AnimationStart"), transitionend: Dc("Transition", "TransitionEnd") }, Fc = {}, Gc = {};
|
|
|
fa && (Gc = document.createElement("div").style, "AnimationEvent" in window || (delete Ec.animationend.animation, delete Ec.animationiteration.animation, delete Ec.animationstart.animation), "TransitionEvent" in window || delete Ec.transitionend.transition);
|
|
|
function Hc(a) {
|
|
|
if (Fc[a])
|
|
|
return Fc[a];
|
|
|
if (!Ec[a])
|
|
|
return a;
|
|
|
var b = Ec[a], c;
|
|
|
for (c in b)
|
|
|
if (b.hasOwnProperty(c) && c in Gc)
|
|
|
return Fc[a] = b[c];
|
|
|
return a;
|
|
|
}
|
|
|
var Ic = Hc("animationend"), Jc = Hc("animationiteration"), Kc = Hc("animationstart"), Lc = Hc("transitionend"), Mc = new Map(), Nc = new Map(), Oc = [
|
|
|
"abort",
|
|
|
"abort",
|
|
|
Ic,
|
|
|
"animationEnd",
|
|
|
Jc,
|
|
|
"animationIteration",
|
|
|
Kc,
|
|
|
"animationStart",
|
|
|
"canplay",
|
|
|
"canPlay",
|
|
|
"canplaythrough",
|
|
|
"canPlayThrough",
|
|
|
"durationchange",
|
|
|
"durationChange",
|
|
|
"emptied",
|
|
|
"emptied",
|
|
|
"encrypted",
|
|
|
"encrypted",
|
|
|
"ended",
|
|
|
"ended",
|
|
|
"error",
|
|
|
"error",
|
|
|
"gotpointercapture",
|
|
|
"gotPointerCapture",
|
|
|
"load",
|
|
|
"load",
|
|
|
"loadeddata",
|
|
|
"loadedData",
|
|
|
"loadedmetadata",
|
|
|
"loadedMetadata",
|
|
|
"loadstart",
|
|
|
"loadStart",
|
|
|
"lostpointercapture",
|
|
|
"lostPointerCapture",
|
|
|
"playing",
|
|
|
"playing",
|
|
|
"progress",
|
|
|
"progress",
|
|
|
"seeking",
|
|
|
"seeking",
|
|
|
"stalled",
|
|
|
"stalled",
|
|
|
"suspend",
|
|
|
"suspend",
|
|
|
"timeupdate",
|
|
|
"timeUpdate",
|
|
|
Lc,
|
|
|
"transitionEnd",
|
|
|
"waiting",
|
|
|
"waiting"
|
|
|
];
|
|
|
function Pc(a, b) {
|
|
|
for (var c = 0; c < a.length; c += 2) {
|
|
|
var d = a[c], e = a[c + 1];
|
|
|
e = "on" + (e[0].toUpperCase() + e.slice(1));
|
|
|
Nc.set(d, b);
|
|
|
Mc.set(d, e);
|
|
|
da$1(e, [d]);
|
|
|
}
|
|
|
}
|
|
|
var Qc = r.unstable_now;
|
|
|
Qc();
|
|
|
var F = 8;
|
|
|
function Rc(a) {
|
|
|
if ((1 & a) !== 0)
|
|
|
return F = 15, 1;
|
|
|
if ((2 & a) !== 0)
|
|
|
return F = 14, 2;
|
|
|
if ((4 & a) !== 0)
|
|
|
return F = 13, 4;
|
|
|
var b = 24 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 12, b;
|
|
|
if ((a & 32) !== 0)
|
|
|
return F = 11, 32;
|
|
|
b = 192 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 10, b;
|
|
|
if ((a & 256) !== 0)
|
|
|
return F = 9, 256;
|
|
|
b = 3584 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 8, b;
|
|
|
if ((a & 4096) !== 0)
|
|
|
return F = 7, 4096;
|
|
|
b = 4186112 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 6, b;
|
|
|
b = 62914560 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 5, b;
|
|
|
if (a & 67108864)
|
|
|
return F = 4, 67108864;
|
|
|
if ((a & 134217728) !== 0)
|
|
|
return F = 3, 134217728;
|
|
|
b = 805306368 & a;
|
|
|
if (b !== 0)
|
|
|
return F = 2, b;
|
|
|
if ((1073741824 & a) !== 0)
|
|
|
return F = 1, 1073741824;
|
|
|
F = 8;
|
|
|
return a;
|
|
|
}
|
|
|
function Sc(a) {
|
|
|
switch (a) {
|
|
|
case 99:
|
|
|
return 15;
|
|
|
case 98:
|
|
|
return 10;
|
|
|
case 97:
|
|
|
case 96:
|
|
|
return 8;
|
|
|
case 95:
|
|
|
return 2;
|
|
|
default:
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
function Tc(a) {
|
|
|
switch (a) {
|
|
|
case 15:
|
|
|
case 14:
|
|
|
return 99;
|
|
|
case 13:
|
|
|
case 12:
|
|
|
case 11:
|
|
|
case 10:
|
|
|
return 98;
|
|
|
case 9:
|
|
|
case 8:
|
|
|
case 7:
|
|
|
case 6:
|
|
|
case 4:
|
|
|
case 5:
|
|
|
return 97;
|
|
|
case 3:
|
|
|
case 2:
|
|
|
case 1:
|
|
|
return 95;
|
|
|
case 0:
|
|
|
return 90;
|
|
|
default:
|
|
|
throw Error(y(358, a));
|
|
|
}
|
|
|
}
|
|
|
function Uc(a, b) {
|
|
|
var c = a.pendingLanes;
|
|
|
if (c === 0)
|
|
|
return F = 0;
|
|
|
var d = 0, e = 0, f2 = a.expiredLanes, g2 = a.suspendedLanes, h2 = a.pingedLanes;
|
|
|
if (f2 !== 0)
|
|
|
d = f2, e = F = 15;
|
|
|
else if (f2 = c & 134217727, f2 !== 0) {
|
|
|
var k = f2 & ~g2;
|
|
|
k !== 0 ? (d = Rc(k), e = F) : (h2 &= f2, h2 !== 0 && (d = Rc(h2), e = F));
|
|
|
} else
|
|
|
f2 = c & ~g2, f2 !== 0 ? (d = Rc(f2), e = F) : h2 !== 0 && (d = Rc(h2), e = F);
|
|
|
if (d === 0)
|
|
|
return 0;
|
|
|
d = 31 - Vc(d);
|
|
|
d = c & ((0 > d ? 0 : 1 << d) << 1) - 1;
|
|
|
if (b !== 0 && b !== d && (b & g2) === 0) {
|
|
|
Rc(b);
|
|
|
if (e <= F)
|
|
|
return b;
|
|
|
F = e;
|
|
|
}
|
|
|
b = a.entangledLanes;
|
|
|
if (b !== 0)
|
|
|
for (a = a.entanglements, b &= d; 0 < b; )
|
|
|
c = 31 - Vc(b), e = 1 << c, d |= a[c], b &= ~e;
|
|
|
return d;
|
|
|
}
|
|
|
function Wc(a) {
|
|
|
a = a.pendingLanes & -1073741825;
|
|
|
return a !== 0 ? a : a & 1073741824 ? 1073741824 : 0;
|
|
|
}
|
|
|
function Xc(a, b) {
|
|
|
switch (a) {
|
|
|
case 15:
|
|
|
return 1;
|
|
|
case 14:
|
|
|
return 2;
|
|
|
case 12:
|
|
|
return a = Yc(24 & ~b), a === 0 ? Xc(10, b) : a;
|
|
|
case 10:
|
|
|
return a = Yc(192 & ~b), a === 0 ? Xc(8, b) : a;
|
|
|
case 8:
|
|
|
return a = Yc(3584 & ~b), a === 0 && (a = Yc(4186112 & ~b), a === 0 && (a = 512)), a;
|
|
|
case 2:
|
|
|
return b = Yc(805306368 & ~b), b === 0 && (b = 268435456), b;
|
|
|
}
|
|
|
throw Error(y(358, a));
|
|
|
}
|
|
|
function Yc(a) {
|
|
|
return a & -a;
|
|
|
}
|
|
|
function Zc(a) {
|
|
|
for (var b = [], c = 0; 31 > c; c++)
|
|
|
b.push(a);
|
|
|
return b;
|
|
|
}
|
|
|
function $c(a, b, c) {
|
|
|
a.pendingLanes |= b;
|
|
|
var d = b - 1;
|
|
|
a.suspendedLanes &= d;
|
|
|
a.pingedLanes &= d;
|
|
|
a = a.eventTimes;
|
|
|
b = 31 - Vc(b);
|
|
|
a[b] = c;
|
|
|
}
|
|
|
var Vc = Math.clz32 ? Math.clz32 : ad, bd = Math.log, cd = Math.LN2;
|
|
|
function ad(a) {
|
|
|
return a === 0 ? 32 : 31 - (bd(a) / cd | 0) | 0;
|
|
|
}
|
|
|
var dd = r.unstable_UserBlockingPriority, ed = r.unstable_runWithPriority, fd = true;
|
|
|
function gd(a, b, c, d) {
|
|
|
Kb || Ib();
|
|
|
var e = hd, f2 = Kb;
|
|
|
Kb = true;
|
|
|
try {
|
|
|
Hb(e, a, b, c, d);
|
|
|
} finally {
|
|
|
(Kb = f2) || Mb();
|
|
|
}
|
|
|
}
|
|
|
function id$2(a, b, c, d) {
|
|
|
ed(dd, hd.bind(null, a, b, c, d));
|
|
|
}
|
|
|
function hd(a, b, c, d) {
|
|
|
if (fd) {
|
|
|
var e;
|
|
|
if ((e = (b & 4) === 0) && 0 < jc.length && -1 < qc.indexOf(a))
|
|
|
a = rc(null, a, b, c, d), jc.push(a);
|
|
|
else {
|
|
|
var f2 = yc(a, b, c, d);
|
|
|
if (f2 === null)
|
|
|
e && sc(a, d);
|
|
|
else {
|
|
|
if (e) {
|
|
|
if (-1 < qc.indexOf(a)) {
|
|
|
a = rc(f2, a, b, c, d);
|
|
|
jc.push(a);
|
|
|
return;
|
|
|
}
|
|
|
if (uc(f2, a, b, c, d))
|
|
|
return;
|
|
|
sc(a, d);
|
|
|
}
|
|
|
jd(a, b, d, null, c);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
function yc(a, b, c, d) {
|
|
|
var e = xb(d);
|
|
|
e = wc(e);
|
|
|
if (e !== null) {
|
|
|
var f2 = Zb(e);
|
|
|
if (f2 === null)
|
|
|
e = null;
|
|
|
else {
|
|
|
var g2 = f2.tag;
|
|
|
if (g2 === 13) {
|
|
|
e = $b(f2);
|
|
|
if (e !== null)
|
|
|
return e;
|
|
|
e = null;
|
|
|
} else if (g2 === 3) {
|
|
|
if (f2.stateNode.hydrate)
|
|
|
return f2.tag === 3 ? f2.stateNode.containerInfo : null;
|
|
|
e = null;
|
|
|
} else
|
|
|
f2 !== e && (e = null);
|
|
|
}
|
|
|
}
|
|
|
jd(a, b, d, e, c);
|
|
|
return null;
|
|
|
}
|
|
|
var kd = null, ld = null, md = null;
|
|
|
function nd() {
|
|
|
if (md)
|
|
|
return md;
|
|
|
var a, b = ld, c = b.length, d, e = "value" in kd ? kd.value : kd.textContent, f2 = e.length;
|
|
|
for (a = 0; a < c && b[a] === e[a]; a++)
|
|
|
;
|
|
|
var g2 = c - a;
|
|
|
for (d = 1; d <= g2 && b[c - d] === e[f2 - d]; d++)
|
|
|
;
|
|
|
return md = e.slice(a, 1 < d ? 1 - d : void 0);
|
|
|
}
|
|
|
function od(a) {
|
|
|
var b = a.keyCode;
|
|
|
"charCode" in a ? (a = a.charCode, a === 0 && b === 13 && (a = 13)) : a = b;
|
|
|
a === 10 && (a = 13);
|
|
|
return 32 <= a || a === 13 ? a : 0;
|
|
|
}
|
|
|
function pd() {
|
|
|
return true;
|
|
|
}
|
|
|
function qd() {
|
|
|
return false;
|
|
|
}
|
|
|
function rd(a) {
|
|
|
function b(b2, d, e, f2, g2) {
|
|
|
this._reactName = b2;
|
|
|
this._targetInst = e;
|
|
|
this.type = d;
|
|
|
this.nativeEvent = f2;
|
|
|
this.target = g2;
|
|
|
this.currentTarget = null;
|
|
|
for (var c in a)
|
|
|
a.hasOwnProperty(c) && (b2 = a[c], this[c] = b2 ? b2(f2) : f2[c]);
|
|
|
this.isDefaultPrevented = (f2.defaultPrevented != null ? f2.defaultPrevented : f2.returnValue === false) ? pd : qd;
|
|
|
this.isPropagationStopped = qd;
|
|
|
return this;
|
|
|
}
|
|
|
m$1(b.prototype, { preventDefault: function() {
|
|
|
this.defaultPrevented = true;
|
|
|
var a2 = this.nativeEvent;
|
|
|
a2 && (a2.preventDefault ? a2.preventDefault() : typeof a2.returnValue !== "unknown" && (a2.returnValue = false), this.isDefaultPrevented = pd);
|
|
|
}, stopPropagation: function() {
|
|
|
var a2 = this.nativeEvent;
|
|
|
a2 && (a2.stopPropagation ? a2.stopPropagation() : typeof a2.cancelBubble !== "unknown" && (a2.cancelBubble = true), this.isPropagationStopped = pd);
|
|
|
}, persist: function() {
|
|
|
}, isPersistent: pd });
|
|
|
return b;
|
|
|
}
|
|
|
var sd = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(a) {
|
|
|
return a.timeStamp || Date.now();
|
|
|
}, defaultPrevented: 0, isTrusted: 0 }, td = rd(sd), ud = m$1({}, sd, { view: 0, detail: 0 }), vd = rd(ud), wd, xd, yd, Ad = m$1({}, ud, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: zd, button: 0, buttons: 0, relatedTarget: function(a) {
|
|
|
return a.relatedTarget === void 0 ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget;
|
|
|
}, movementX: function(a) {
|
|
|
if ("movementX" in a)
|
|
|
return a.movementX;
|
|
|
a !== yd && (yd && a.type === "mousemove" ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a);
|
|
|
return wd;
|
|
|
}, movementY: function(a) {
|
|
|
return "movementY" in a ? a.movementY : xd;
|
|
|
} }), Bd = rd(Ad), Cd = m$1({}, Ad, { dataTransfer: 0 }), Dd = rd(Cd), Ed = m$1({}, ud, { relatedTarget: 0 }), Fd = rd(Ed), Gd = m$1({}, sd, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), Hd = rd(Gd), Id = m$1({}, sd, { clipboardData: function(a) {
|
|
|
return "clipboardData" in a ? a.clipboardData : window.clipboardData;
|
|
|
} }), Jd = rd(Id), Kd = m$1({}, sd, { data: 0 }), Ld = rd(Kd), Md = {
|
|
|
Esc: "Escape",
|
|
|
Spacebar: " ",
|
|
|
Left: "ArrowLeft",
|
|
|
Up: "ArrowUp",
|
|
|
Right: "ArrowRight",
|
|
|
Down: "ArrowDown",
|
|
|
Del: "Delete",
|
|
|
Win: "OS",
|
|
|
Menu: "ContextMenu",
|
|
|
Apps: "ContextMenu",
|
|
|
Scroll: "ScrollLock",
|
|
|
MozPrintableKey: "Unidentified"
|
|
|
}, Nd = {
|
|
|
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"
|
|
|
}, Od = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" };
|
|
|
function Pd(a) {
|
|
|
var b = this.nativeEvent;
|
|
|
return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : false;
|
|
|
}
|
|
|
function zd() {
|
|
|
return Pd;
|
|
|
}
|
|
|
var Qd = m$1({}, ud, { key: function(a) {
|
|
|
if (a.key) {
|
|
|
var b = Md[a.key] || a.key;
|
|
|
if (b !== "Unidentified")
|
|
|
return b;
|
|
|
}
|
|
|
return a.type === "keypress" ? (a = od(a), a === 13 ? "Enter" : String.fromCharCode(a)) : a.type === "keydown" || a.type === "keyup" ? Nd[a.keyCode] || "Unidentified" : "";
|
|
|
}, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: zd, charCode: function(a) {
|
|
|
return a.type === "keypress" ? od(a) : 0;
|
|
|
}, keyCode: function(a) {
|
|
|
return a.type === "keydown" || a.type === "keyup" ? a.keyCode : 0;
|
|
|
}, which: function(a) {
|
|
|
return a.type === "keypress" ? od(a) : a.type === "keydown" || a.type === "keyup" ? a.keyCode : 0;
|
|
|
} }), Rd = rd(Qd), Sd = m$1({}, Ad, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), Td = rd(Sd), Ud = m$1({}, ud, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: zd }), Vd = rd(Ud), Wd = m$1({}, sd, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), Xd = rd(Wd), Yd = m$1({}, Ad, {
|
|
|
deltaX: function(a) {
|
|
|
return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0;
|
|
|
},
|
|
|
deltaY: function(a) {
|
|
|
return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0;
|
|
|
},
|
|
|
deltaZ: 0,
|
|
|
deltaMode: 0
|
|
|
}), Zd = rd(Yd), $d = [9, 13, 27, 32], ae = fa && "CompositionEvent" in window, be = null;
|
|
|
fa && "documentMode" in document && (be = document.documentMode);
|
|
|
var ce = fa && "TextEvent" in window && !be, de$1 = fa && (!ae || be && 8 < be && 11 >= be), ee = String.fromCharCode(32), fe = false;
|
|
|
function ge(a, b) {
|
|
|
switch (a) {
|
|
|
case "keyup":
|
|
|
return $d.indexOf(b.keyCode) !== -1;
|
|
|
case "keydown":
|
|
|
return b.keyCode !== 229;
|
|
|
case "keypress":
|
|
|
case "mousedown":
|
|
|
case "focusout":
|
|
|
return true;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function he(a) {
|
|
|
a = a.detail;
|
|
|
return typeof a === "object" && "data" in a ? a.data : null;
|
|
|
}
|
|
|
var ie = false;
|
|
|
function je(a, b) {
|
|
|
switch (a) {
|
|
|
case "compositionend":
|
|
|
return he(b);
|
|
|
case "keypress":
|
|
|
if (b.which !== 32)
|
|
|
return null;
|
|
|
fe = true;
|
|
|
return ee;
|
|
|
case "textInput":
|
|
|
return a = b.data, a === ee && fe ? null : a;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
function ke(a, b) {
|
|
|
if (ie)
|
|
|
return a === "compositionend" || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = false, a) : null;
|
|
|
switch (a) {
|
|
|
case "paste":
|
|
|
return null;
|
|
|
case "keypress":
|
|
|
if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
|
|
|
if (b.char && 1 < b.char.length)
|
|
|
return b.char;
|
|
|
if (b.which)
|
|
|
return String.fromCharCode(b.which);
|
|
|
}
|
|
|
return null;
|
|
|
case "compositionend":
|
|
|
return de$1 && b.locale !== "ko" ? null : b.data;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
var le = { 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 me(a) {
|
|
|
var b = a && a.nodeName && a.nodeName.toLowerCase();
|
|
|
return b === "input" ? !!le[a.type] : b === "textarea" ? true : false;
|
|
|
}
|
|
|
function ne(a, b, c, d) {
|
|
|
Eb(d);
|
|
|
b = oe(b, "onChange");
|
|
|
0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({ event: c, listeners: b }));
|
|
|
}
|
|
|
var pe = null, qe = null;
|
|
|
function re(a) {
|
|
|
se(a, 0);
|
|
|
}
|
|
|
function te(a) {
|
|
|
var b = ue(a);
|
|
|
if (Wa(b))
|
|
|
return a;
|
|
|
}
|
|
|
function ve(a, b) {
|
|
|
if (a === "change")
|
|
|
return b;
|
|
|
}
|
|
|
var we = false;
|
|
|
if (fa) {
|
|
|
var xe;
|
|
|
if (fa) {
|
|
|
var ye = "oninput" in document;
|
|
|
if (!ye) {
|
|
|
var ze = document.createElement("div");
|
|
|
ze.setAttribute("oninput", "return;");
|
|
|
ye = typeof ze.oninput === "function";
|
|
|
}
|
|
|
xe = ye;
|
|
|
} else
|
|
|
xe = false;
|
|
|
we = xe && (!document.documentMode || 9 < document.documentMode);
|
|
|
}
|
|
|
function Ae() {
|
|
|
pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null);
|
|
|
}
|
|
|
function Be(a) {
|
|
|
if (a.propertyName === "value" && te(qe)) {
|
|
|
var b = [];
|
|
|
ne(b, qe, a, xb(a));
|
|
|
a = re;
|
|
|
if (Kb)
|
|
|
a(b);
|
|
|
else {
|
|
|
Kb = true;
|
|
|
try {
|
|
|
Gb(a, b);
|
|
|
} finally {
|
|
|
Kb = false, Mb();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
function Ce(a, b, c) {
|
|
|
a === "focusin" ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : a === "focusout" && Ae();
|
|
|
}
|
|
|
function De(a) {
|
|
|
if (a === "selectionchange" || a === "keyup" || a === "keydown")
|
|
|
return te(qe);
|
|
|
}
|
|
|
function Ee(a, b) {
|
|
|
if (a === "click")
|
|
|
return te(b);
|
|
|
}
|
|
|
function Fe(a, b) {
|
|
|
if (a === "input" || a === "change")
|
|
|
return te(b);
|
|
|
}
|
|
|
function Ge(a, b) {
|
|
|
return a === b && (a !== 0 || 1 / a === 1 / b) || a !== a && b !== b;
|
|
|
}
|
|
|
var He = typeof Object.is === "function" ? Object.is : Ge, Ie = Object.prototype.hasOwnProperty;
|
|
|
function Je(a, b) {
|
|
|
if (He(a, b))
|
|
|
return true;
|
|
|
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null)
|
|
|
return false;
|
|
|
var c = Object.keys(a), d = Object.keys(b);
|
|
|
if (c.length !== d.length)
|
|
|
return false;
|
|
|
for (d = 0; d < c.length; d++)
|
|
|
if (!Ie.call(b, c[d]) || !He(a[c[d]], b[c[d]]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
function Ke(a) {
|
|
|
for (; a && a.firstChild; )
|
|
|
a = a.firstChild;
|
|
|
return a;
|
|
|
}
|
|
|
function Le(a, b) {
|
|
|
var c = Ke(a);
|
|
|
a = 0;
|
|
|
for (var d; c; ) {
|
|
|
if (c.nodeType === 3) {
|
|
|
d = a + c.textContent.length;
|
|
|
if (a <= b && d >= b)
|
|
|
return { node: c, offset: b - a };
|
|
|
a = d;
|
|
|
}
|
|
|
a: {
|
|
|
for (; c; ) {
|
|
|
if (c.nextSibling) {
|
|
|
c = c.nextSibling;
|
|
|
break a;
|
|
|
}
|
|
|
c = c.parentNode;
|
|
|
}
|
|
|
c = void 0;
|
|
|
}
|
|
|
c = Ke(c);
|
|
|
}
|
|
|
}
|
|
|
function Me(a, b) {
|
|
|
return a && b ? a === b ? true : a && a.nodeType === 3 ? false : b && b.nodeType === 3 ? Me(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : false : false;
|
|
|
}
|
|
|
function Ne() {
|
|
|
for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement; ) {
|
|
|
try {
|
|
|
var c = typeof b.contentWindow.location.href === "string";
|
|
|
} catch (d) {
|
|
|
c = false;
|
|
|
}
|
|
|
if (c)
|
|
|
a = b.contentWindow;
|
|
|
else
|
|
|
break;
|
|
|
b = Xa(a.document);
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
function Oe(a) {
|
|
|
var b = a && a.nodeName && a.nodeName.toLowerCase();
|
|
|
return b && (b === "input" && (a.type === "text" || a.type === "search" || a.type === "tel" || a.type === "url" || a.type === "password") || b === "textarea" || a.contentEditable === "true");
|
|
|
}
|
|
|
var Pe = fa && "documentMode" in document && 11 >= document.documentMode, Qe = null, Re = null, Se = null, Te = false;
|
|
|
function Ue(a, b, c) {
|
|
|
var d = c.window === c ? c.document : c.nodeType === 9 ? c : c.ownerDocument;
|
|
|
Te || Qe == null || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Oe(d) ? d = { start: d.selectionStart, end: d.selectionEnd } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = { anchorNode: d.anchorNode, anchorOffset: d.anchorOffset, focusNode: d.focusNode, focusOffset: d.focusOffset }), Se && Je(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({ event: b, listeners: d }), b.target = Qe)));
|
|
|
}
|
|
|
Pc("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "), 0);
|
|
|
Pc("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "), 1);
|
|
|
Pc(Oc, 2);
|
|
|
for (var Ve = "change selectionchange textInput compositionstart compositionend compositionupdate".split(" "), We = 0; We < Ve.length; We++)
|
|
|
Nc.set(Ve[We], 0);
|
|
|
ea("onMouseEnter", ["mouseout", "mouseover"]);
|
|
|
ea("onMouseLeave", ["mouseout", "mouseover"]);
|
|
|
ea("onPointerEnter", ["pointerout", "pointerover"]);
|
|
|
ea("onPointerLeave", ["pointerout", "pointerover"]);
|
|
|
da$1("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
|
|
|
da$1("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
|
|
|
da$1("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
|
|
|
da$1("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
|
|
|
da$1("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
|
|
|
da$1("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
|
|
|
var Xe = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), Ye = new Set("cancel close invalid load scroll toggle".split(" ").concat(Xe));
|
|
|
function Ze(a, b, c) {
|
|
|
var d = a.type || "unknown-event";
|
|
|
a.currentTarget = c;
|
|
|
Yb(d, b, void 0, a);
|
|
|
a.currentTarget = null;
|
|
|
}
|
|
|
function se(a, b) {
|
|
|
b = (b & 4) !== 0;
|
|
|
for (var c = 0; c < a.length; c++) {
|
|
|
var d = a[c], e = d.event;
|
|
|
d = d.listeners;
|
|
|
a: {
|
|
|
var f2 = void 0;
|
|
|
if (b)
|
|
|
for (var g2 = d.length - 1; 0 <= g2; g2--) {
|
|
|
var h2 = d[g2], k = h2.instance, l2 = h2.currentTarget;
|
|
|
h2 = h2.listener;
|
|
|
if (k !== f2 && e.isPropagationStopped())
|
|
|
break a;
|
|
|
Ze(e, h2, l2);
|
|
|
f2 = k;
|
|
|
}
|
|
|
else
|
|
|
for (g2 = 0; g2 < d.length; g2++) {
|
|
|
h2 = d[g2];
|
|
|
k = h2.instance;
|
|
|
l2 = h2.currentTarget;
|
|
|
h2 = h2.listener;
|
|
|
if (k !== f2 && e.isPropagationStopped())
|
|
|
break a;
|
|
|
Ze(e, h2, l2);
|
|
|
f2 = k;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (Ub)
|
|
|
throw a = Vb, Ub = false, Vb = null, a;
|
|
|
}
|
|
|
function G(a, b) {
|
|
|
var c = $e(b), d = a + "__bubble";
|
|
|
c.has(d) || (af(b, a, 2, false), c.add(d));
|
|
|
}
|
|
|
var bf = "_reactListening" + Math.random().toString(36).slice(2);
|
|
|
function cf(a) {
|
|
|
a[bf] || (a[bf] = true, ba.forEach(function(b) {
|
|
|
Ye.has(b) || df(b, false, a, null);
|
|
|
df(b, true, a, null);
|
|
|
}));
|
|
|
}
|
|
|
function df(a, b, c, d) {
|
|
|
var e = 4 < arguments.length && arguments[4] !== void 0 ? arguments[4] : 0, f2 = c;
|
|
|
a === "selectionchange" && c.nodeType !== 9 && (f2 = c.ownerDocument);
|
|
|
if (d !== null && !b && Ye.has(a)) {
|
|
|
if (a !== "scroll")
|
|
|
return;
|
|
|
e |= 2;
|
|
|
f2 = d;
|
|
|
}
|
|
|
var g2 = $e(f2), h2 = a + "__" + (b ? "capture" : "bubble");
|
|
|
g2.has(h2) || (b && (e |= 4), af(f2, a, e, b), g2.add(h2));
|
|
|
}
|
|
|
function af(a, b, c, d) {
|
|
|
var e = Nc.get(b);
|
|
|
switch (e === void 0 ? 2 : e) {
|
|
|
case 0:
|
|
|
e = gd;
|
|
|
break;
|
|
|
case 1:
|
|
|
e = id$2;
|
|
|
break;
|
|
|
default:
|
|
|
e = hd;
|
|
|
}
|
|
|
c = e.bind(null, b, c, a);
|
|
|
e = void 0;
|
|
|
!Pb || b !== "touchstart" && b !== "touchmove" && b !== "wheel" || (e = true);
|
|
|
d ? e !== void 0 ? a.addEventListener(b, c, { capture: true, passive: e }) : a.addEventListener(b, c, true) : e !== void 0 ? a.addEventListener(b, c, { passive: e }) : a.addEventListener(b, c, false);
|
|
|
}
|
|
|
function jd(a, b, c, d, e) {
|
|
|
var f2 = d;
|
|
|
if ((b & 1) === 0 && (b & 2) === 0 && d !== null)
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
if (d === null)
|
|
|
return;
|
|
|
var g2 = d.tag;
|
|
|
if (g2 === 3 || g2 === 4) {
|
|
|
var h2 = d.stateNode.containerInfo;
|
|
|
if (h2 === e || h2.nodeType === 8 && h2.parentNode === e)
|
|
|
break;
|
|
|
if (g2 === 4)
|
|
|
for (g2 = d.return; g2 !== null; ) {
|
|
|
var k = g2.tag;
|
|
|
if (k === 3 || k === 4) {
|
|
|
if (k = g2.stateNode.containerInfo, k === e || k.nodeType === 8 && k.parentNode === e)
|
|
|
return;
|
|
|
}
|
|
|
g2 = g2.return;
|
|
|
}
|
|
|
for (; h2 !== null; ) {
|
|
|
g2 = wc(h2);
|
|
|
if (g2 === null)
|
|
|
return;
|
|
|
k = g2.tag;
|
|
|
if (k === 5 || k === 6) {
|
|
|
d = f2 = g2;
|
|
|
continue a;
|
|
|
}
|
|
|
h2 = h2.parentNode;
|
|
|
}
|
|
|
}
|
|
|
d = d.return;
|
|
|
}
|
|
|
Nb(function() {
|
|
|
var d2 = f2, e2 = xb(c), g3 = [];
|
|
|
a: {
|
|
|
var h3 = Mc.get(a);
|
|
|
if (h3 !== void 0) {
|
|
|
var k2 = td, x2 = a;
|
|
|
switch (a) {
|
|
|
case "keypress":
|
|
|
if (od(c) === 0)
|
|
|
break a;
|
|
|
case "keydown":
|
|
|
case "keyup":
|
|
|
k2 = Rd;
|
|
|
break;
|
|
|
case "focusin":
|
|
|
x2 = "focus";
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "focusout":
|
|
|
x2 = "blur";
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "beforeblur":
|
|
|
case "afterblur":
|
|
|
k2 = Fd;
|
|
|
break;
|
|
|
case "click":
|
|
|
if (c.button === 2)
|
|
|
break a;
|
|
|
case "auxclick":
|
|
|
case "dblclick":
|
|
|
case "mousedown":
|
|
|
case "mousemove":
|
|
|
case "mouseup":
|
|
|
case "mouseout":
|
|
|
case "mouseover":
|
|
|
case "contextmenu":
|
|
|
k2 = Bd;
|
|
|
break;
|
|
|
case "drag":
|
|
|
case "dragend":
|
|
|
case "dragenter":
|
|
|
case "dragexit":
|
|
|
case "dragleave":
|
|
|
case "dragover":
|
|
|
case "dragstart":
|
|
|
case "drop":
|
|
|
k2 = Dd;
|
|
|
break;
|
|
|
case "touchcancel":
|
|
|
case "touchend":
|
|
|
case "touchmove":
|
|
|
case "touchstart":
|
|
|
k2 = Vd;
|
|
|
break;
|
|
|
case Ic:
|
|
|
case Jc:
|
|
|
case Kc:
|
|
|
k2 = Hd;
|
|
|
break;
|
|
|
case Lc:
|
|
|
k2 = Xd;
|
|
|
break;
|
|
|
case "scroll":
|
|
|
k2 = vd;
|
|
|
break;
|
|
|
case "wheel":
|
|
|
k2 = Zd;
|
|
|
break;
|
|
|
case "copy":
|
|
|
case "cut":
|
|
|
case "paste":
|
|
|
k2 = Jd;
|
|
|
break;
|
|
|
case "gotpointercapture":
|
|
|
case "lostpointercapture":
|
|
|
case "pointercancel":
|
|
|
case "pointerdown":
|
|
|
case "pointermove":
|
|
|
case "pointerout":
|
|
|
case "pointerover":
|
|
|
case "pointerup":
|
|
|
k2 = Td;
|
|
|
}
|
|
|
var w2 = (b & 4) !== 0, z2 = !w2 && a === "scroll", u2 = w2 ? h3 !== null ? h3 + "Capture" : null : h3;
|
|
|
w2 = [];
|
|
|
for (var t2 = d2, q2; t2 !== null; ) {
|
|
|
q2 = t2;
|
|
|
var v2 = q2.stateNode;
|
|
|
q2.tag === 5 && v2 !== null && (q2 = v2, u2 !== null && (v2 = Ob(t2, u2), v2 != null && w2.push(ef(t2, v2, q2))));
|
|
|
if (z2)
|
|
|
break;
|
|
|
t2 = t2.return;
|
|
|
}
|
|
|
0 < w2.length && (h3 = new k2(h3, x2, null, c, e2), g3.push({ event: h3, listeners: w2 }));
|
|
|
}
|
|
|
}
|
|
|
if ((b & 7) === 0) {
|
|
|
a: {
|
|
|
h3 = a === "mouseover" || a === "pointerover";
|
|
|
k2 = a === "mouseout" || a === "pointerout";
|
|
|
if (h3 && (b & 16) === 0 && (x2 = c.relatedTarget || c.fromElement) && (wc(x2) || x2[ff]))
|
|
|
break a;
|
|
|
if (k2 || h3) {
|
|
|
h3 = e2.window === e2 ? e2 : (h3 = e2.ownerDocument) ? h3.defaultView || h3.parentWindow : window;
|
|
|
if (k2) {
|
|
|
if (x2 = c.relatedTarget || c.toElement, k2 = d2, x2 = x2 ? wc(x2) : null, x2 !== null && (z2 = Zb(x2), x2 !== z2 || x2.tag !== 5 && x2.tag !== 6))
|
|
|
x2 = null;
|
|
|
} else
|
|
|
k2 = null, x2 = d2;
|
|
|
if (k2 !== x2) {
|
|
|
w2 = Bd;
|
|
|
v2 = "onMouseLeave";
|
|
|
u2 = "onMouseEnter";
|
|
|
t2 = "mouse";
|
|
|
if (a === "pointerout" || a === "pointerover")
|
|
|
w2 = Td, v2 = "onPointerLeave", u2 = "onPointerEnter", t2 = "pointer";
|
|
|
z2 = k2 == null ? h3 : ue(k2);
|
|
|
q2 = x2 == null ? h3 : ue(x2);
|
|
|
h3 = new w2(v2, t2 + "leave", k2, c, e2);
|
|
|
h3.target = z2;
|
|
|
h3.relatedTarget = q2;
|
|
|
v2 = null;
|
|
|
wc(e2) === d2 && (w2 = new w2(u2, t2 + "enter", x2, c, e2), w2.target = q2, w2.relatedTarget = z2, v2 = w2);
|
|
|
z2 = v2;
|
|
|
if (k2 && x2)
|
|
|
b: {
|
|
|
w2 = k2;
|
|
|
u2 = x2;
|
|
|
t2 = 0;
|
|
|
for (q2 = w2; q2; q2 = gf(q2))
|
|
|
t2++;
|
|
|
q2 = 0;
|
|
|
for (v2 = u2; v2; v2 = gf(v2))
|
|
|
q2++;
|
|
|
for (; 0 < t2 - q2; )
|
|
|
w2 = gf(w2), t2--;
|
|
|
for (; 0 < q2 - t2; )
|
|
|
u2 = gf(u2), q2--;
|
|
|
for (; t2--; ) {
|
|
|
if (w2 === u2 || u2 !== null && w2 === u2.alternate)
|
|
|
break b;
|
|
|
w2 = gf(w2);
|
|
|
u2 = gf(u2);
|
|
|
}
|
|
|
w2 = null;
|
|
|
}
|
|
|
else
|
|
|
w2 = null;
|
|
|
k2 !== null && hf(g3, h3, k2, w2, false);
|
|
|
x2 !== null && z2 !== null && hf(g3, z2, x2, w2, true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
a: {
|
|
|
h3 = d2 ? ue(d2) : window;
|
|
|
k2 = h3.nodeName && h3.nodeName.toLowerCase();
|
|
|
if (k2 === "select" || k2 === "input" && h3.type === "file")
|
|
|
var J2 = ve;
|
|
|
else if (me(h3))
|
|
|
if (we)
|
|
|
J2 = Fe;
|
|
|
else {
|
|
|
J2 = De;
|
|
|
var K2 = Ce;
|
|
|
}
|
|
|
else
|
|
|
(k2 = h3.nodeName) && k2.toLowerCase() === "input" && (h3.type === "checkbox" || h3.type === "radio") && (J2 = Ee);
|
|
|
if (J2 && (J2 = J2(a, d2))) {
|
|
|
ne(g3, J2, c, e2);
|
|
|
break a;
|
|
|
}
|
|
|
K2 && K2(a, h3, d2);
|
|
|
a === "focusout" && (K2 = h3._wrapperState) && K2.controlled && h3.type === "number" && bb(h3, "number", h3.value);
|
|
|
}
|
|
|
K2 = d2 ? ue(d2) : window;
|
|
|
switch (a) {
|
|
|
case "focusin":
|
|
|
if (me(K2) || K2.contentEditable === "true")
|
|
|
Qe = K2, Re = d2, Se = null;
|
|
|
break;
|
|
|
case "focusout":
|
|
|
Se = Re = Qe = null;
|
|
|
break;
|
|
|
case "mousedown":
|
|
|
Te = true;
|
|
|
break;
|
|
|
case "contextmenu":
|
|
|
case "mouseup":
|
|
|
case "dragend":
|
|
|
Te = false;
|
|
|
Ue(g3, c, e2);
|
|
|
break;
|
|
|
case "selectionchange":
|
|
|
if (Pe)
|
|
|
break;
|
|
|
case "keydown":
|
|
|
case "keyup":
|
|
|
Ue(g3, c, e2);
|
|
|
}
|
|
|
var Q2;
|
|
|
if (ae)
|
|
|
b: {
|
|
|
switch (a) {
|
|
|
case "compositionstart":
|
|
|
var L2 = "onCompositionStart";
|
|
|
break b;
|
|
|
case "compositionend":
|
|
|
L2 = "onCompositionEnd";
|
|
|
break b;
|
|
|
case "compositionupdate":
|
|
|
L2 = "onCompositionUpdate";
|
|
|
break b;
|
|
|
}
|
|
|
L2 = void 0;
|
|
|
}
|
|
|
else
|
|
|
ie ? ge(a, c) && (L2 = "onCompositionEnd") : a === "keydown" && c.keyCode === 229 && (L2 = "onCompositionStart");
|
|
|
L2 && (de$1 && c.locale !== "ko" && (ie || L2 !== "onCompositionStart" ? L2 === "onCompositionEnd" && ie && (Q2 = nd()) : (kd = e2, ld = "value" in kd ? kd.value : kd.textContent, ie = true)), K2 = oe(d2, L2), 0 < K2.length && (L2 = new Ld(L2, a, null, c, e2), g3.push({ event: L2, listeners: K2 }), Q2 ? L2.data = Q2 : (Q2 = he(c), Q2 !== null && (L2.data = Q2))));
|
|
|
if (Q2 = ce ? je(a, c) : ke(a, c))
|
|
|
d2 = oe(d2, "onBeforeInput"), 0 < d2.length && (e2 = new Ld("onBeforeInput", "beforeinput", null, c, e2), g3.push({ event: e2, listeners: d2 }), e2.data = Q2);
|
|
|
}
|
|
|
se(g3, b);
|
|
|
});
|
|
|
}
|
|
|
function ef(a, b, c) {
|
|
|
return { instance: a, listener: b, currentTarget: c };
|
|
|
}
|
|
|
function oe(a, b) {
|
|
|
for (var c = b + "Capture", d = []; a !== null; ) {
|
|
|
var e = a, f2 = e.stateNode;
|
|
|
e.tag === 5 && f2 !== null && (e = f2, f2 = Ob(a, c), f2 != null && d.unshift(ef(a, f2, e)), f2 = Ob(a, b), f2 != null && d.push(ef(a, f2, e)));
|
|
|
a = a.return;
|
|
|
}
|
|
|
return d;
|
|
|
}
|
|
|
function gf(a) {
|
|
|
if (a === null)
|
|
|
return null;
|
|
|
do
|
|
|
a = a.return;
|
|
|
while (a && a.tag !== 5);
|
|
|
return a ? a : null;
|
|
|
}
|
|
|
function hf(a, b, c, d, e) {
|
|
|
for (var f2 = b._reactName, g2 = []; c !== null && c !== d; ) {
|
|
|
var h2 = c, k = h2.alternate, l2 = h2.stateNode;
|
|
|
if (k !== null && k === d)
|
|
|
break;
|
|
|
h2.tag === 5 && l2 !== null && (h2 = l2, e ? (k = Ob(c, f2), k != null && g2.unshift(ef(c, k, h2))) : e || (k = Ob(c, f2), k != null && g2.push(ef(c, k, h2))));
|
|
|
c = c.return;
|
|
|
}
|
|
|
g2.length !== 0 && a.push({ event: b, listeners: g2 });
|
|
|
}
|
|
|
function jf() {
|
|
|
}
|
|
|
var kf = null, lf = null;
|
|
|
function mf(a, b) {
|
|
|
switch (a) {
|
|
|
case "button":
|
|
|
case "input":
|
|
|
case "select":
|
|
|
case "textarea":
|
|
|
return !!b.autoFocus;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function nf(a, b) {
|
|
|
return a === "textarea" || a === "option" || a === "noscript" || typeof b.children === "string" || typeof b.children === "number" || typeof b.dangerouslySetInnerHTML === "object" && b.dangerouslySetInnerHTML !== null && b.dangerouslySetInnerHTML.__html != null;
|
|
|
}
|
|
|
var of = typeof setTimeout === "function" ? setTimeout : void 0, pf = typeof clearTimeout === "function" ? clearTimeout : void 0;
|
|
|
function qf(a) {
|
|
|
a.nodeType === 1 ? a.textContent = "" : a.nodeType === 9 && (a = a.body, a != null && (a.textContent = ""));
|
|
|
}
|
|
|
function rf(a) {
|
|
|
for (; a != null; a = a.nextSibling) {
|
|
|
var b = a.nodeType;
|
|
|
if (b === 1 || b === 3)
|
|
|
break;
|
|
|
}
|
|
|
return a;
|
|
|
}
|
|
|
function sf(a) {
|
|
|
a = a.previousSibling;
|
|
|
for (var b = 0; a; ) {
|
|
|
if (a.nodeType === 8) {
|
|
|
var c = a.data;
|
|
|
if (c === "$" || c === "$!" || c === "$?") {
|
|
|
if (b === 0)
|
|
|
return a;
|
|
|
b--;
|
|
|
} else
|
|
|
c === "/$" && b++;
|
|
|
}
|
|
|
a = a.previousSibling;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var tf = 0;
|
|
|
function uf(a) {
|
|
|
return { $$typeof: Ga, toString: a, valueOf: a };
|
|
|
}
|
|
|
var vf = Math.random().toString(36).slice(2), wf = "__reactFiber$" + vf, xf = "__reactProps$" + vf, ff = "__reactContainer$" + vf, yf = "__reactEvents$" + vf;
|
|
|
function wc(a) {
|
|
|
var b = a[wf];
|
|
|
if (b)
|
|
|
return b;
|
|
|
for (var c = a.parentNode; c; ) {
|
|
|
if (b = c[ff] || c[wf]) {
|
|
|
c = b.alternate;
|
|
|
if (b.child !== null || c !== null && c.child !== null)
|
|
|
for (a = sf(a); a !== null; ) {
|
|
|
if (c = a[wf])
|
|
|
return c;
|
|
|
a = sf(a);
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
a = c;
|
|
|
c = a.parentNode;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function Cb(a) {
|
|
|
a = a[wf] || a[ff];
|
|
|
return !a || a.tag !== 5 && a.tag !== 6 && a.tag !== 13 && a.tag !== 3 ? null : a;
|
|
|
}
|
|
|
function ue(a) {
|
|
|
if (a.tag === 5 || a.tag === 6)
|
|
|
return a.stateNode;
|
|
|
throw Error(y(33));
|
|
|
}
|
|
|
function Db(a) {
|
|
|
return a[xf] || null;
|
|
|
}
|
|
|
function $e(a) {
|
|
|
var b = a[yf];
|
|
|
b === void 0 && (b = a[yf] = new Set());
|
|
|
return b;
|
|
|
}
|
|
|
var zf = [], Af = -1;
|
|
|
function Bf(a) {
|
|
|
return { current: a };
|
|
|
}
|
|
|
function H(a) {
|
|
|
0 > Af || (a.current = zf[Af], zf[Af] = null, Af--);
|
|
|
}
|
|
|
function I(a, b) {
|
|
|
Af++;
|
|
|
zf[Af] = a.current;
|
|
|
a.current = b;
|
|
|
}
|
|
|
var Cf = {}, M = Bf(Cf), N = Bf(false), Df = Cf;
|
|
|
function Ef(a, b) {
|
|
|
var c = a.type.contextTypes;
|
|
|
if (!c)
|
|
|
return Cf;
|
|
|
var d = a.stateNode;
|
|
|
if (d && d.__reactInternalMemoizedUnmaskedChildContext === b)
|
|
|
return d.__reactInternalMemoizedMaskedChildContext;
|
|
|
var e = {}, f2;
|
|
|
for (f2 in c)
|
|
|
e[f2] = b[f2];
|
|
|
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e);
|
|
|
return e;
|
|
|
}
|
|
|
function Ff(a) {
|
|
|
a = a.childContextTypes;
|
|
|
return a !== null && a !== void 0;
|
|
|
}
|
|
|
function Gf() {
|
|
|
H(N);
|
|
|
H(M);
|
|
|
}
|
|
|
function Hf(a, b, c) {
|
|
|
if (M.current !== Cf)
|
|
|
throw Error(y(168));
|
|
|
I(M, b);
|
|
|
I(N, c);
|
|
|
}
|
|
|
function If(a, b, c) {
|
|
|
var d = a.stateNode;
|
|
|
a = b.childContextTypes;
|
|
|
if (typeof d.getChildContext !== "function")
|
|
|
return c;
|
|
|
d = d.getChildContext();
|
|
|
for (var e in d)
|
|
|
if (!(e in a))
|
|
|
throw Error(y(108, Ra(b) || "Unknown", e));
|
|
|
return m$1({}, c, d);
|
|
|
}
|
|
|
function Jf(a) {
|
|
|
a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Cf;
|
|
|
Df = M.current;
|
|
|
I(M, a);
|
|
|
I(N, N.current);
|
|
|
return true;
|
|
|
}
|
|
|
function Kf(a, b, c) {
|
|
|
var d = a.stateNode;
|
|
|
if (!d)
|
|
|
throw Error(y(169));
|
|
|
c ? (a = If(a, b, Df), d.__reactInternalMemoizedMergedChildContext = a, H(N), H(M), I(M, a)) : H(N);
|
|
|
I(N, c);
|
|
|
}
|
|
|
var Lf = null, Mf = null, Nf = r.unstable_runWithPriority, Of = r.unstable_scheduleCallback, Pf = r.unstable_cancelCallback, Qf = r.unstable_shouldYield, Rf = r.unstable_requestPaint, Sf = r.unstable_now, Tf = r.unstable_getCurrentPriorityLevel, Uf = r.unstable_ImmediatePriority, Vf = r.unstable_UserBlockingPriority, Wf = r.unstable_NormalPriority, Xf = r.unstable_LowPriority, Yf = r.unstable_IdlePriority, Zf = {}, $f = Rf !== void 0 ? Rf : function() {
|
|
|
}, ag = null, bg = null, cg = false, dg = Sf(), O = 1e4 > dg ? Sf : function() {
|
|
|
return Sf() - dg;
|
|
|
};
|
|
|
function eg() {
|
|
|
switch (Tf()) {
|
|
|
case Uf:
|
|
|
return 99;
|
|
|
case Vf:
|
|
|
return 98;
|
|
|
case Wf:
|
|
|
return 97;
|
|
|
case Xf:
|
|
|
return 96;
|
|
|
case Yf:
|
|
|
return 95;
|
|
|
default:
|
|
|
throw Error(y(332));
|
|
|
}
|
|
|
}
|
|
|
function fg(a) {
|
|
|
switch (a) {
|
|
|
case 99:
|
|
|
return Uf;
|
|
|
case 98:
|
|
|
return Vf;
|
|
|
case 97:
|
|
|
return Wf;
|
|
|
case 96:
|
|
|
return Xf;
|
|
|
case 95:
|
|
|
return Yf;
|
|
|
default:
|
|
|
throw Error(y(332));
|
|
|
}
|
|
|
}
|
|
|
function gg(a, b) {
|
|
|
a = fg(a);
|
|
|
return Nf(a, b);
|
|
|
}
|
|
|
function hg(a, b, c) {
|
|
|
a = fg(a);
|
|
|
return Of(a, b, c);
|
|
|
}
|
|
|
function ig() {
|
|
|
if (bg !== null) {
|
|
|
var a = bg;
|
|
|
bg = null;
|
|
|
Pf(a);
|
|
|
}
|
|
|
jg();
|
|
|
}
|
|
|
function jg() {
|
|
|
if (!cg && ag !== null) {
|
|
|
cg = true;
|
|
|
var a = 0;
|
|
|
try {
|
|
|
var b = ag;
|
|
|
gg(99, function() {
|
|
|
for (; a < b.length; a++) {
|
|
|
var c = b[a];
|
|
|
do
|
|
|
c = c(true);
|
|
|
while (c !== null);
|
|
|
}
|
|
|
});
|
|
|
ag = null;
|
|
|
} catch (c) {
|
|
|
throw ag !== null && (ag = ag.slice(a + 1)), Of(Uf, ig), c;
|
|
|
} finally {
|
|
|
cg = false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var kg = ra.ReactCurrentBatchConfig;
|
|
|
function lg(a, b) {
|
|
|
if (a && a.defaultProps) {
|
|
|
b = m$1({}, b);
|
|
|
a = a.defaultProps;
|
|
|
for (var c in a)
|
|
|
b[c] === void 0 && (b[c] = a[c]);
|
|
|
return b;
|
|
|
}
|
|
|
return b;
|
|
|
}
|
|
|
var mg = Bf(null), ng = null, og = null, pg = null;
|
|
|
function qg() {
|
|
|
pg = og = ng = null;
|
|
|
}
|
|
|
function rg(a) {
|
|
|
var b = mg.current;
|
|
|
H(mg);
|
|
|
a.type._context._currentValue = b;
|
|
|
}
|
|
|
function sg(a, b) {
|
|
|
for (; a !== null; ) {
|
|
|
var c = a.alternate;
|
|
|
if ((a.childLanes & b) === b)
|
|
|
if (c === null || (c.childLanes & b) === b)
|
|
|
break;
|
|
|
else
|
|
|
c.childLanes |= b;
|
|
|
else
|
|
|
a.childLanes |= b, c !== null && (c.childLanes |= b);
|
|
|
a = a.return;
|
|
|
}
|
|
|
}
|
|
|
function tg(a, b) {
|
|
|
ng = a;
|
|
|
pg = og = null;
|
|
|
a = a.dependencies;
|
|
|
a !== null && a.firstContext !== null && ((a.lanes & b) !== 0 && (ug = true), a.firstContext = null);
|
|
|
}
|
|
|
function vg(a, b) {
|
|
|
if (pg !== a && b !== false && b !== 0) {
|
|
|
if (typeof b !== "number" || b === 1073741823)
|
|
|
pg = a, b = 1073741823;
|
|
|
b = { context: a, observedBits: b, next: null };
|
|
|
if (og === null) {
|
|
|
if (ng === null)
|
|
|
throw Error(y(308));
|
|
|
og = b;
|
|
|
ng.dependencies = { lanes: 0, firstContext: b, responders: null };
|
|
|
} else
|
|
|
og = og.next = b;
|
|
|
}
|
|
|
return a._currentValue;
|
|
|
}
|
|
|
var wg = false;
|
|
|
function xg(a) {
|
|
|
a.updateQueue = { baseState: a.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null }, effects: null };
|
|
|
}
|
|
|
function yg(a, b) {
|
|
|
a = a.updateQueue;
|
|
|
b.updateQueue === a && (b.updateQueue = { baseState: a.baseState, firstBaseUpdate: a.firstBaseUpdate, lastBaseUpdate: a.lastBaseUpdate, shared: a.shared, effects: a.effects });
|
|
|
}
|
|
|
function zg(a, b) {
|
|
|
return { eventTime: a, lane: b, tag: 0, payload: null, callback: null, next: null };
|
|
|
}
|
|
|
function Ag(a, b) {
|
|
|
a = a.updateQueue;
|
|
|
if (a !== null) {
|
|
|
a = a.shared;
|
|
|
var c = a.pending;
|
|
|
c === null ? b.next = b : (b.next = c.next, c.next = b);
|
|
|
a.pending = b;
|
|
|
}
|
|
|
}
|
|
|
function Bg(a, b) {
|
|
|
var c = a.updateQueue, d = a.alternate;
|
|
|
if (d !== null && (d = d.updateQueue, c === d)) {
|
|
|
var e = null, f2 = null;
|
|
|
c = c.firstBaseUpdate;
|
|
|
if (c !== null) {
|
|
|
do {
|
|
|
var g2 = { eventTime: c.eventTime, lane: c.lane, tag: c.tag, payload: c.payload, callback: c.callback, next: null };
|
|
|
f2 === null ? e = f2 = g2 : f2 = f2.next = g2;
|
|
|
c = c.next;
|
|
|
} while (c !== null);
|
|
|
f2 === null ? e = f2 = b : f2 = f2.next = b;
|
|
|
} else
|
|
|
e = f2 = b;
|
|
|
c = { baseState: d.baseState, firstBaseUpdate: e, lastBaseUpdate: f2, shared: d.shared, effects: d.effects };
|
|
|
a.updateQueue = c;
|
|
|
return;
|
|
|
}
|
|
|
a = c.lastBaseUpdate;
|
|
|
a === null ? c.firstBaseUpdate = b : a.next = b;
|
|
|
c.lastBaseUpdate = b;
|
|
|
}
|
|
|
function Cg(a, b, c, d) {
|
|
|
var e = a.updateQueue;
|
|
|
wg = false;
|
|
|
var f2 = e.firstBaseUpdate, g2 = e.lastBaseUpdate, h2 = e.shared.pending;
|
|
|
if (h2 !== null) {
|
|
|
e.shared.pending = null;
|
|
|
var k = h2, l2 = k.next;
|
|
|
k.next = null;
|
|
|
g2 === null ? f2 = l2 : g2.next = l2;
|
|
|
g2 = k;
|
|
|
var n2 = a.alternate;
|
|
|
if (n2 !== null) {
|
|
|
n2 = n2.updateQueue;
|
|
|
var A2 = n2.lastBaseUpdate;
|
|
|
A2 !== g2 && (A2 === null ? n2.firstBaseUpdate = l2 : A2.next = l2, n2.lastBaseUpdate = k);
|
|
|
}
|
|
|
}
|
|
|
if (f2 !== null) {
|
|
|
A2 = e.baseState;
|
|
|
g2 = 0;
|
|
|
n2 = l2 = k = null;
|
|
|
do {
|
|
|
h2 = f2.lane;
|
|
|
var p2 = f2.eventTime;
|
|
|
if ((d & h2) === h2) {
|
|
|
n2 !== null && (n2 = n2.next = {
|
|
|
eventTime: p2,
|
|
|
lane: 0,
|
|
|
tag: f2.tag,
|
|
|
payload: f2.payload,
|
|
|
callback: f2.callback,
|
|
|
next: null
|
|
|
});
|
|
|
a: {
|
|
|
var C2 = a, x2 = f2;
|
|
|
h2 = b;
|
|
|
p2 = c;
|
|
|
switch (x2.tag) {
|
|
|
case 1:
|
|
|
C2 = x2.payload;
|
|
|
if (typeof C2 === "function") {
|
|
|
A2 = C2.call(p2, A2, h2);
|
|
|
break a;
|
|
|
}
|
|
|
A2 = C2;
|
|
|
break a;
|
|
|
case 3:
|
|
|
C2.flags = C2.flags & -4097 | 64;
|
|
|
case 0:
|
|
|
C2 = x2.payload;
|
|
|
h2 = typeof C2 === "function" ? C2.call(p2, A2, h2) : C2;
|
|
|
if (h2 === null || h2 === void 0)
|
|
|
break a;
|
|
|
A2 = m$1({}, A2, h2);
|
|
|
break a;
|
|
|
case 2:
|
|
|
wg = true;
|
|
|
}
|
|
|
}
|
|
|
f2.callback !== null && (a.flags |= 32, h2 = e.effects, h2 === null ? e.effects = [f2] : h2.push(f2));
|
|
|
} else
|
|
|
p2 = { eventTime: p2, lane: h2, tag: f2.tag, payload: f2.payload, callback: f2.callback, next: null }, n2 === null ? (l2 = n2 = p2, k = A2) : n2 = n2.next = p2, g2 |= h2;
|
|
|
f2 = f2.next;
|
|
|
if (f2 === null)
|
|
|
if (h2 = e.shared.pending, h2 === null)
|
|
|
break;
|
|
|
else
|
|
|
f2 = h2.next, h2.next = null, e.lastBaseUpdate = h2, e.shared.pending = null;
|
|
|
} while (1);
|
|
|
n2 === null && (k = A2);
|
|
|
e.baseState = k;
|
|
|
e.firstBaseUpdate = l2;
|
|
|
e.lastBaseUpdate = n2;
|
|
|
Dg |= g2;
|
|
|
a.lanes = g2;
|
|
|
a.memoizedState = A2;
|
|
|
}
|
|
|
}
|
|
|
function Eg(a, b, c) {
|
|
|
a = b.effects;
|
|
|
b.effects = null;
|
|
|
if (a !== null)
|
|
|
for (b = 0; b < a.length; b++) {
|
|
|
var d = a[b], e = d.callback;
|
|
|
if (e !== null) {
|
|
|
d.callback = null;
|
|
|
d = c;
|
|
|
if (typeof e !== "function")
|
|
|
throw Error(y(191, e));
|
|
|
e.call(d);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var Fg = new aa.Component().refs;
|
|
|
function Gg(a, b, c, d) {
|
|
|
b = a.memoizedState;
|
|
|
c = c(d, b);
|
|
|
c = c === null || c === void 0 ? b : m$1({}, b, c);
|
|
|
a.memoizedState = c;
|
|
|
a.lanes === 0 && (a.updateQueue.baseState = c);
|
|
|
}
|
|
|
var Kg = { isMounted: function(a) {
|
|
|
return (a = a._reactInternals) ? Zb(a) === a : false;
|
|
|
}, enqueueSetState: function(a, b, c) {
|
|
|
a = a._reactInternals;
|
|
|
var d = Hg(), e = Ig(a), f2 = zg(d, e);
|
|
|
f2.payload = b;
|
|
|
c !== void 0 && c !== null && (f2.callback = c);
|
|
|
Ag(a, f2);
|
|
|
Jg(a, e, d);
|
|
|
}, enqueueReplaceState: function(a, b, c) {
|
|
|
a = a._reactInternals;
|
|
|
var d = Hg(), e = Ig(a), f2 = zg(d, e);
|
|
|
f2.tag = 1;
|
|
|
f2.payload = b;
|
|
|
c !== void 0 && c !== null && (f2.callback = c);
|
|
|
Ag(a, f2);
|
|
|
Jg(a, e, d);
|
|
|
}, enqueueForceUpdate: function(a, b) {
|
|
|
a = a._reactInternals;
|
|
|
var c = Hg(), d = Ig(a), e = zg(c, d);
|
|
|
e.tag = 2;
|
|
|
b !== void 0 && b !== null && (e.callback = b);
|
|
|
Ag(a, e);
|
|
|
Jg(a, d, c);
|
|
|
} };
|
|
|
function Lg(a, b, c, d, e, f2, g2) {
|
|
|
a = a.stateNode;
|
|
|
return typeof a.shouldComponentUpdate === "function" ? a.shouldComponentUpdate(d, f2, g2) : b.prototype && b.prototype.isPureReactComponent ? !Je(c, d) || !Je(e, f2) : true;
|
|
|
}
|
|
|
function Mg(a, b, c) {
|
|
|
var d = false, e = Cf;
|
|
|
var f2 = b.contextType;
|
|
|
typeof f2 === "object" && f2 !== null ? f2 = vg(f2) : (e = Ff(b) ? Df : M.current, d = b.contextTypes, f2 = (d = d !== null && d !== void 0) ? Ef(a, e) : Cf);
|
|
|
b = new b(c, f2);
|
|
|
a.memoizedState = b.state !== null && b.state !== void 0 ? b.state : null;
|
|
|
b.updater = Kg;
|
|
|
a.stateNode = b;
|
|
|
b._reactInternals = a;
|
|
|
d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f2);
|
|
|
return b;
|
|
|
}
|
|
|
function Ng(a, b, c, d) {
|
|
|
a = b.state;
|
|
|
typeof b.componentWillReceiveProps === "function" && b.componentWillReceiveProps(c, d);
|
|
|
typeof b.UNSAFE_componentWillReceiveProps === "function" && b.UNSAFE_componentWillReceiveProps(c, d);
|
|
|
b.state !== a && Kg.enqueueReplaceState(b, b.state, null);
|
|
|
}
|
|
|
function Og(a, b, c, d) {
|
|
|
var e = a.stateNode;
|
|
|
e.props = c;
|
|
|
e.state = a.memoizedState;
|
|
|
e.refs = Fg;
|
|
|
xg(a);
|
|
|
var f2 = b.contextType;
|
|
|
typeof f2 === "object" && f2 !== null ? e.context = vg(f2) : (f2 = Ff(b) ? Df : M.current, e.context = Ef(a, f2));
|
|
|
Cg(a, c, e, d);
|
|
|
e.state = a.memoizedState;
|
|
|
f2 = b.getDerivedStateFromProps;
|
|
|
typeof f2 === "function" && (Gg(a, b, f2, c), e.state = a.memoizedState);
|
|
|
typeof b.getDerivedStateFromProps === "function" || typeof e.getSnapshotBeforeUpdate === "function" || typeof e.UNSAFE_componentWillMount !== "function" && typeof e.componentWillMount !== "function" || (b = e.state, typeof e.componentWillMount === "function" && e.componentWillMount(), typeof e.UNSAFE_componentWillMount === "function" && e.UNSAFE_componentWillMount(), b !== e.state && Kg.enqueueReplaceState(e, e.state, null), Cg(a, c, e, d), e.state = a.memoizedState);
|
|
|
typeof e.componentDidMount === "function" && (a.flags |= 4);
|
|
|
}
|
|
|
var Pg = Array.isArray;
|
|
|
function Qg(a, b, c) {
|
|
|
a = c.ref;
|
|
|
if (a !== null && typeof a !== "function" && typeof a !== "object") {
|
|
|
if (c._owner) {
|
|
|
c = c._owner;
|
|
|
if (c) {
|
|
|
if (c.tag !== 1)
|
|
|
throw Error(y(309));
|
|
|
var d = c.stateNode;
|
|
|
}
|
|
|
if (!d)
|
|
|
throw Error(y(147, a));
|
|
|
var e = "" + a;
|
|
|
if (b !== null && b.ref !== null && typeof b.ref === "function" && b.ref._stringRef === e)
|
|
|
return b.ref;
|
|
|
b = function(a2) {
|
|
|
var b2 = d.refs;
|
|
|
b2 === Fg && (b2 = d.refs = {});
|
|
|
a2 === null ? delete b2[e] : b2[e] = a2;
|
|
|
};
|
|
|
b._stringRef = e;
|
|
|
return b;
|
|
|
}
|
|
|
if (typeof a !== "string")
|
|
|
throw Error(y(284));
|
|
|
if (!c._owner)
|
|
|
throw Error(y(290, a));
|
|
|
}
|
|
|
return a;
|
|
|
}
|
|
|
function Rg(a, b) {
|
|
|
if (a.type !== "textarea")
|
|
|
throw Error(y(31, Object.prototype.toString.call(b) === "[object Object]" ? "object with keys {" + Object.keys(b).join(", ") + "}" : b));
|
|
|
}
|
|
|
function Sg(a) {
|
|
|
function b(b2, c2) {
|
|
|
if (a) {
|
|
|
var d2 = b2.lastEffect;
|
|
|
d2 !== null ? (d2.nextEffect = c2, b2.lastEffect = c2) : b2.firstEffect = b2.lastEffect = c2;
|
|
|
c2.nextEffect = null;
|
|
|
c2.flags = 8;
|
|
|
}
|
|
|
}
|
|
|
function c(c2, d2) {
|
|
|
if (!a)
|
|
|
return null;
|
|
|
for (; d2 !== null; )
|
|
|
b(c2, d2), d2 = d2.sibling;
|
|
|
return null;
|
|
|
}
|
|
|
function d(a2, b2) {
|
|
|
for (a2 = new Map(); b2 !== null; )
|
|
|
b2.key !== null ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling;
|
|
|
return a2;
|
|
|
}
|
|
|
function e(a2, b2) {
|
|
|
a2 = Tg(a2, b2);
|
|
|
a2.index = 0;
|
|
|
a2.sibling = null;
|
|
|
return a2;
|
|
|
}
|
|
|
function f2(b2, c2, d2) {
|
|
|
b2.index = d2;
|
|
|
if (!a)
|
|
|
return c2;
|
|
|
d2 = b2.alternate;
|
|
|
if (d2 !== null)
|
|
|
return d2 = d2.index, d2 < c2 ? (b2.flags = 2, c2) : d2;
|
|
|
b2.flags = 2;
|
|
|
return c2;
|
|
|
}
|
|
|
function g2(b2) {
|
|
|
a && b2.alternate === null && (b2.flags = 2);
|
|
|
return b2;
|
|
|
}
|
|
|
function h2(a2, b2, c2, d2) {
|
|
|
if (b2 === null || b2.tag !== 6)
|
|
|
return b2 = Ug(c2, a2.mode, d2), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function k(a2, b2, c2, d2) {
|
|
|
if (b2 !== null && b2.elementType === c2.type)
|
|
|
return d2 = e(b2, c2.props), d2.ref = Qg(a2, b2, c2), d2.return = a2, d2;
|
|
|
d2 = Vg(c2.type, c2.key, c2.props, null, a2.mode, d2);
|
|
|
d2.ref = Qg(a2, b2, c2);
|
|
|
d2.return = a2;
|
|
|
return d2;
|
|
|
}
|
|
|
function l2(a2, b2, c2, d2) {
|
|
|
if (b2 === null || b2.tag !== 4 || b2.stateNode.containerInfo !== c2.containerInfo || b2.stateNode.implementation !== c2.implementation)
|
|
|
return b2 = Wg(c2, a2.mode, d2), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2.children || []);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function n2(a2, b2, c2, d2, f3) {
|
|
|
if (b2 === null || b2.tag !== 7)
|
|
|
return b2 = Xg(c2, a2.mode, d2, f3), b2.return = a2, b2;
|
|
|
b2 = e(b2, c2);
|
|
|
b2.return = a2;
|
|
|
return b2;
|
|
|
}
|
|
|
function A2(a2, b2, c2) {
|
|
|
if (typeof b2 === "string" || typeof b2 === "number")
|
|
|
return b2 = Ug("" + b2, a2.mode, c2), b2.return = a2, b2;
|
|
|
if (typeof b2 === "object" && b2 !== null) {
|
|
|
switch (b2.$$typeof) {
|
|
|
case sa:
|
|
|
return c2 = Vg(b2.type, b2.key, b2.props, null, a2.mode, c2), c2.ref = Qg(a2, null, b2), c2.return = a2, c2;
|
|
|
case ta:
|
|
|
return b2 = Wg(b2, a2.mode, c2), b2.return = a2, b2;
|
|
|
}
|
|
|
if (Pg(b2) || La(b2))
|
|
|
return b2 = Xg(b2, a2.mode, c2, null), b2.return = a2, b2;
|
|
|
Rg(a2, b2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function p2(a2, b2, c2, d2) {
|
|
|
var e2 = b2 !== null ? b2.key : null;
|
|
|
if (typeof c2 === "string" || typeof c2 === "number")
|
|
|
return e2 !== null ? null : h2(a2, b2, "" + c2, d2);
|
|
|
if (typeof c2 === "object" && c2 !== null) {
|
|
|
switch (c2.$$typeof) {
|
|
|
case sa:
|
|
|
return c2.key === e2 ? c2.type === ua ? n2(a2, b2, c2.props.children, d2, e2) : k(a2, b2, c2, d2) : null;
|
|
|
case ta:
|
|
|
return c2.key === e2 ? l2(a2, b2, c2, d2) : null;
|
|
|
}
|
|
|
if (Pg(c2) || La(c2))
|
|
|
return e2 !== null ? null : n2(a2, b2, c2, d2, null);
|
|
|
Rg(a2, c2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function C2(a2, b2, c2, d2, e2) {
|
|
|
if (typeof d2 === "string" || typeof d2 === "number")
|
|
|
return a2 = a2.get(c2) || null, h2(b2, a2, "" + d2, e2);
|
|
|
if (typeof d2 === "object" && d2 !== null) {
|
|
|
switch (d2.$$typeof) {
|
|
|
case sa:
|
|
|
return a2 = a2.get(d2.key === null ? c2 : d2.key) || null, d2.type === ua ? n2(b2, a2, d2.props.children, e2, d2.key) : k(b2, a2, d2, e2);
|
|
|
case ta:
|
|
|
return a2 = a2.get(d2.key === null ? c2 : d2.key) || null, l2(b2, a2, d2, e2);
|
|
|
}
|
|
|
if (Pg(d2) || La(d2))
|
|
|
return a2 = a2.get(c2) || null, n2(b2, a2, d2, e2, null);
|
|
|
Rg(b2, d2);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function x2(e2, g3, h3, k2) {
|
|
|
for (var l3 = null, t2 = null, u2 = g3, z2 = g3 = 0, q2 = null; u2 !== null && z2 < h3.length; z2++) {
|
|
|
u2.index > z2 ? (q2 = u2, u2 = null) : q2 = u2.sibling;
|
|
|
var n3 = p2(e2, u2, h3[z2], k2);
|
|
|
if (n3 === null) {
|
|
|
u2 === null && (u2 = q2);
|
|
|
break;
|
|
|
}
|
|
|
a && u2 && n3.alternate === null && b(e2, u2);
|
|
|
g3 = f2(n3, g3, z2);
|
|
|
t2 === null ? l3 = n3 : t2.sibling = n3;
|
|
|
t2 = n3;
|
|
|
u2 = q2;
|
|
|
}
|
|
|
if (z2 === h3.length)
|
|
|
return c(e2, u2), l3;
|
|
|
if (u2 === null) {
|
|
|
for (; z2 < h3.length; z2++)
|
|
|
u2 = A2(e2, h3[z2], k2), u2 !== null && (g3 = f2(u2, g3, z2), t2 === null ? l3 = u2 : t2.sibling = u2, t2 = u2);
|
|
|
return l3;
|
|
|
}
|
|
|
for (u2 = d(e2, u2); z2 < h3.length; z2++)
|
|
|
q2 = C2(u2, e2, z2, h3[z2], k2), q2 !== null && (a && q2.alternate !== null && u2.delete(q2.key === null ? z2 : q2.key), g3 = f2(q2, g3, z2), t2 === null ? l3 = q2 : t2.sibling = q2, t2 = q2);
|
|
|
a && u2.forEach(function(a2) {
|
|
|
return b(e2, a2);
|
|
|
});
|
|
|
return l3;
|
|
|
}
|
|
|
function w2(e2, g3, h3, k2) {
|
|
|
var l3 = La(h3);
|
|
|
if (typeof l3 !== "function")
|
|
|
throw Error(y(150));
|
|
|
h3 = l3.call(h3);
|
|
|
if (h3 == null)
|
|
|
throw Error(y(151));
|
|
|
for (var t2 = l3 = null, u2 = g3, z2 = g3 = 0, q2 = null, n3 = h3.next(); u2 !== null && !n3.done; z2++, n3 = h3.next()) {
|
|
|
u2.index > z2 ? (q2 = u2, u2 = null) : q2 = u2.sibling;
|
|
|
var w3 = p2(e2, u2, n3.value, k2);
|
|
|
if (w3 === null) {
|
|
|
u2 === null && (u2 = q2);
|
|
|
break;
|
|
|
}
|
|
|
a && u2 && w3.alternate === null && b(e2, u2);
|
|
|
g3 = f2(w3, g3, z2);
|
|
|
t2 === null ? l3 = w3 : t2.sibling = w3;
|
|
|
t2 = w3;
|
|
|
u2 = q2;
|
|
|
}
|
|
|
if (n3.done)
|
|
|
return c(e2, u2), l3;
|
|
|
if (u2 === null) {
|
|
|
for (; !n3.done; z2++, n3 = h3.next())
|
|
|
n3 = A2(e2, n3.value, k2), n3 !== null && (g3 = f2(n3, g3, z2), t2 === null ? l3 = n3 : t2.sibling = n3, t2 = n3);
|
|
|
return l3;
|
|
|
}
|
|
|
for (u2 = d(e2, u2); !n3.done; z2++, n3 = h3.next())
|
|
|
n3 = C2(u2, e2, z2, n3.value, k2), n3 !== null && (a && n3.alternate !== null && u2.delete(n3.key === null ? z2 : n3.key), g3 = f2(n3, g3, z2), t2 === null ? l3 = n3 : t2.sibling = n3, t2 = n3);
|
|
|
a && u2.forEach(function(a2) {
|
|
|
return b(e2, a2);
|
|
|
});
|
|
|
return l3;
|
|
|
}
|
|
|
return function(a2, d2, f3, h3) {
|
|
|
var k2 = typeof f3 === "object" && f3 !== null && f3.type === ua && f3.key === null;
|
|
|
k2 && (f3 = f3.props.children);
|
|
|
var l3 = typeof f3 === "object" && f3 !== null;
|
|
|
if (l3)
|
|
|
switch (f3.$$typeof) {
|
|
|
case sa:
|
|
|
a: {
|
|
|
l3 = f3.key;
|
|
|
for (k2 = d2; k2 !== null; ) {
|
|
|
if (k2.key === l3) {
|
|
|
switch (k2.tag) {
|
|
|
case 7:
|
|
|
if (f3.type === ua) {
|
|
|
c(a2, k2.sibling);
|
|
|
d2 = e(k2, f3.props.children);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
if (k2.elementType === f3.type) {
|
|
|
c(a2, k2.sibling);
|
|
|
d2 = e(k2, f3.props);
|
|
|
d2.ref = Qg(a2, k2, f3);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
c(a2, k2);
|
|
|
break;
|
|
|
} else
|
|
|
b(a2, k2);
|
|
|
k2 = k2.sibling;
|
|
|
}
|
|
|
f3.type === ua ? (d2 = Xg(f3.props.children, a2.mode, h3, f3.key), d2.return = a2, a2 = d2) : (h3 = Vg(f3.type, f3.key, f3.props, null, a2.mode, h3), h3.ref = Qg(a2, d2, f3), h3.return = a2, a2 = h3);
|
|
|
}
|
|
|
return g2(a2);
|
|
|
case ta:
|
|
|
a: {
|
|
|
for (k2 = f3.key; d2 !== null; ) {
|
|
|
if (d2.key === k2)
|
|
|
if (d2.tag === 4 && d2.stateNode.containerInfo === f3.containerInfo && d2.stateNode.implementation === f3.implementation) {
|
|
|
c(a2, d2.sibling);
|
|
|
d2 = e(d2, f3.children || []);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
break a;
|
|
|
} else {
|
|
|
c(a2, d2);
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
b(a2, d2);
|
|
|
d2 = d2.sibling;
|
|
|
}
|
|
|
d2 = Wg(f3, a2.mode, h3);
|
|
|
d2.return = a2;
|
|
|
a2 = d2;
|
|
|
}
|
|
|
return g2(a2);
|
|
|
}
|
|
|
if (typeof f3 === "string" || typeof f3 === "number")
|
|
|
return f3 = "" + f3, d2 !== null && d2.tag === 6 ? (c(a2, d2.sibling), d2 = e(d2, f3), d2.return = a2, a2 = d2) : (c(a2, d2), d2 = Ug(f3, a2.mode, h3), d2.return = a2, a2 = d2), g2(a2);
|
|
|
if (Pg(f3))
|
|
|
return x2(a2, d2, f3, h3);
|
|
|
if (La(f3))
|
|
|
return w2(a2, d2, f3, h3);
|
|
|
l3 && Rg(a2, f3);
|
|
|
if (typeof f3 === "undefined" && !k2)
|
|
|
switch (a2.tag) {
|
|
|
case 1:
|
|
|
case 22:
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
throw Error(y(152, Ra(a2.type) || "Component"));
|
|
|
}
|
|
|
return c(a2, d2);
|
|
|
};
|
|
|
}
|
|
|
var Yg = Sg(true), Zg = Sg(false), $g = {}, ah = Bf($g), bh = Bf($g), ch = Bf($g);
|
|
|
function dh(a) {
|
|
|
if (a === $g)
|
|
|
throw Error(y(174));
|
|
|
return a;
|
|
|
}
|
|
|
function eh(a, b) {
|
|
|
I(ch, b);
|
|
|
I(bh, a);
|
|
|
I(ah, $g);
|
|
|
a = b.nodeType;
|
|
|
switch (a) {
|
|
|
case 9:
|
|
|
case 11:
|
|
|
b = (b = b.documentElement) ? b.namespaceURI : mb(null, "");
|
|
|
break;
|
|
|
default:
|
|
|
a = a === 8 ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = mb(b, a);
|
|
|
}
|
|
|
H(ah);
|
|
|
I(ah, b);
|
|
|
}
|
|
|
function fh() {
|
|
|
H(ah);
|
|
|
H(bh);
|
|
|
H(ch);
|
|
|
}
|
|
|
function gh(a) {
|
|
|
dh(ch.current);
|
|
|
var b = dh(ah.current);
|
|
|
var c = mb(b, a.type);
|
|
|
b !== c && (I(bh, a), I(ah, c));
|
|
|
}
|
|
|
function hh(a) {
|
|
|
bh.current === a && (H(ah), H(bh));
|
|
|
}
|
|
|
var P = Bf(0);
|
|
|
function ih(a) {
|
|
|
for (var b = a; b !== null; ) {
|
|
|
if (b.tag === 13) {
|
|
|
var c = b.memoizedState;
|
|
|
if (c !== null && (c = c.dehydrated, c === null || c.data === "$?" || c.data === "$!"))
|
|
|
return b;
|
|
|
} else if (b.tag === 19 && b.memoizedProps.revealOrder !== void 0) {
|
|
|
if ((b.flags & 64) !== 0)
|
|
|
return b;
|
|
|
} else if (b.child !== null) {
|
|
|
b.child.return = b;
|
|
|
b = b.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (b === a)
|
|
|
break;
|
|
|
for (; b.sibling === null; ) {
|
|
|
if (b.return === null || b.return === a)
|
|
|
return null;
|
|
|
b = b.return;
|
|
|
}
|
|
|
b.sibling.return = b.return;
|
|
|
b = b.sibling;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var jh = null, kh = null, lh = false;
|
|
|
function mh(a, b) {
|
|
|
var c = nh(5, null, null, 0);
|
|
|
c.elementType = "DELETED";
|
|
|
c.type = "DELETED";
|
|
|
c.stateNode = b;
|
|
|
c.return = a;
|
|
|
c.flags = 8;
|
|
|
a.lastEffect !== null ? (a.lastEffect.nextEffect = c, a.lastEffect = c) : a.firstEffect = a.lastEffect = c;
|
|
|
}
|
|
|
function oh(a, b) {
|
|
|
switch (a.tag) {
|
|
|
case 5:
|
|
|
var c = a.type;
|
|
|
b = b.nodeType !== 1 || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b;
|
|
|
return b !== null ? (a.stateNode = b, true) : false;
|
|
|
case 6:
|
|
|
return b = a.pendingProps === "" || b.nodeType !== 3 ? null : b, b !== null ? (a.stateNode = b, true) : false;
|
|
|
case 13:
|
|
|
return false;
|
|
|
default:
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function ph(a) {
|
|
|
if (lh) {
|
|
|
var b = kh;
|
|
|
if (b) {
|
|
|
var c = b;
|
|
|
if (!oh(a, b)) {
|
|
|
b = rf(c.nextSibling);
|
|
|
if (!b || !oh(a, b)) {
|
|
|
a.flags = a.flags & -1025 | 2;
|
|
|
lh = false;
|
|
|
jh = a;
|
|
|
return;
|
|
|
}
|
|
|
mh(jh, c);
|
|
|
}
|
|
|
jh = a;
|
|
|
kh = rf(b.firstChild);
|
|
|
} else
|
|
|
a.flags = a.flags & -1025 | 2, lh = false, jh = a;
|
|
|
}
|
|
|
}
|
|
|
function qh(a) {
|
|
|
for (a = a.return; a !== null && a.tag !== 5 && a.tag !== 3 && a.tag !== 13; )
|
|
|
a = a.return;
|
|
|
jh = a;
|
|
|
}
|
|
|
function rh(a) {
|
|
|
if (a !== jh)
|
|
|
return false;
|
|
|
if (!lh)
|
|
|
return qh(a), lh = true, false;
|
|
|
var b = a.type;
|
|
|
if (a.tag !== 5 || b !== "head" && b !== "body" && !nf(b, a.memoizedProps))
|
|
|
for (b = kh; b; )
|
|
|
mh(a, b), b = rf(b.nextSibling);
|
|
|
qh(a);
|
|
|
if (a.tag === 13) {
|
|
|
a = a.memoizedState;
|
|
|
a = a !== null ? a.dehydrated : null;
|
|
|
if (!a)
|
|
|
throw Error(y(317));
|
|
|
a: {
|
|
|
a = a.nextSibling;
|
|
|
for (b = 0; a; ) {
|
|
|
if (a.nodeType === 8) {
|
|
|
var c = a.data;
|
|
|
if (c === "/$") {
|
|
|
if (b === 0) {
|
|
|
kh = rf(a.nextSibling);
|
|
|
break a;
|
|
|
}
|
|
|
b--;
|
|
|
} else
|
|
|
c !== "$" && c !== "$!" && c !== "$?" || b++;
|
|
|
}
|
|
|
a = a.nextSibling;
|
|
|
}
|
|
|
kh = null;
|
|
|
}
|
|
|
} else
|
|
|
kh = jh ? rf(a.stateNode.nextSibling) : null;
|
|
|
return true;
|
|
|
}
|
|
|
function sh() {
|
|
|
kh = jh = null;
|
|
|
lh = false;
|
|
|
}
|
|
|
var th = [];
|
|
|
function uh() {
|
|
|
for (var a = 0; a < th.length; a++)
|
|
|
th[a]._workInProgressVersionPrimary = null;
|
|
|
th.length = 0;
|
|
|
}
|
|
|
var vh = ra.ReactCurrentDispatcher, wh = ra.ReactCurrentBatchConfig, xh = 0, R = null, S = null, T = null, yh = false, zh = false;
|
|
|
function Ah() {
|
|
|
throw Error(y(321));
|
|
|
}
|
|
|
function Bh(a, b) {
|
|
|
if (b === null)
|
|
|
return false;
|
|
|
for (var c = 0; c < b.length && c < a.length; c++)
|
|
|
if (!He(a[c], b[c]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
function Ch(a, b, c, d, e, f2) {
|
|
|
xh = f2;
|
|
|
R = b;
|
|
|
b.memoizedState = null;
|
|
|
b.updateQueue = null;
|
|
|
b.lanes = 0;
|
|
|
vh.current = a === null || a.memoizedState === null ? Dh : Eh;
|
|
|
a = c(d, e);
|
|
|
if (zh) {
|
|
|
f2 = 0;
|
|
|
do {
|
|
|
zh = false;
|
|
|
if (!(25 > f2))
|
|
|
throw Error(y(301));
|
|
|
f2 += 1;
|
|
|
T = S = null;
|
|
|
b.updateQueue = null;
|
|
|
vh.current = Fh;
|
|
|
a = c(d, e);
|
|
|
} while (zh);
|
|
|
}
|
|
|
vh.current = Gh;
|
|
|
b = S !== null && S.next !== null;
|
|
|
xh = 0;
|
|
|
T = S = R = null;
|
|
|
yh = false;
|
|
|
if (b)
|
|
|
throw Error(y(300));
|
|
|
return a;
|
|
|
}
|
|
|
function Hh() {
|
|
|
var a = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null };
|
|
|
T === null ? R.memoizedState = T = a : T = T.next = a;
|
|
|
return T;
|
|
|
}
|
|
|
function Ih() {
|
|
|
if (S === null) {
|
|
|
var a = R.alternate;
|
|
|
a = a !== null ? a.memoizedState : null;
|
|
|
} else
|
|
|
a = S.next;
|
|
|
var b = T === null ? R.memoizedState : T.next;
|
|
|
if (b !== null)
|
|
|
T = b, S = a;
|
|
|
else {
|
|
|
if (a === null)
|
|
|
throw Error(y(310));
|
|
|
S = a;
|
|
|
a = { memoizedState: S.memoizedState, baseState: S.baseState, baseQueue: S.baseQueue, queue: S.queue, next: null };
|
|
|
T === null ? R.memoizedState = T = a : T = T.next = a;
|
|
|
}
|
|
|
return T;
|
|
|
}
|
|
|
function Jh(a, b) {
|
|
|
return typeof b === "function" ? b(a) : b;
|
|
|
}
|
|
|
function Kh(a) {
|
|
|
var b = Ih(), c = b.queue;
|
|
|
if (c === null)
|
|
|
throw Error(y(311));
|
|
|
c.lastRenderedReducer = a;
|
|
|
var d = S, e = d.baseQueue, f2 = c.pending;
|
|
|
if (f2 !== null) {
|
|
|
if (e !== null) {
|
|
|
var g2 = e.next;
|
|
|
e.next = f2.next;
|
|
|
f2.next = g2;
|
|
|
}
|
|
|
d.baseQueue = e = f2;
|
|
|
c.pending = null;
|
|
|
}
|
|
|
if (e !== null) {
|
|
|
e = e.next;
|
|
|
d = d.baseState;
|
|
|
var h2 = g2 = f2 = null, k = e;
|
|
|
do {
|
|
|
var l2 = k.lane;
|
|
|
if ((xh & l2) === l2)
|
|
|
h2 !== null && (h2 = h2.next = { lane: 0, action: k.action, eagerReducer: k.eagerReducer, eagerState: k.eagerState, next: null }), d = k.eagerReducer === a ? k.eagerState : a(d, k.action);
|
|
|
else {
|
|
|
var n2 = {
|
|
|
lane: l2,
|
|
|
action: k.action,
|
|
|
eagerReducer: k.eagerReducer,
|
|
|
eagerState: k.eagerState,
|
|
|
next: null
|
|
|
};
|
|
|
h2 === null ? (g2 = h2 = n2, f2 = d) : h2 = h2.next = n2;
|
|
|
R.lanes |= l2;
|
|
|
Dg |= l2;
|
|
|
}
|
|
|
k = k.next;
|
|
|
} while (k !== null && k !== e);
|
|
|
h2 === null ? f2 = d : h2.next = g2;
|
|
|
He(d, b.memoizedState) || (ug = true);
|
|
|
b.memoizedState = d;
|
|
|
b.baseState = f2;
|
|
|
b.baseQueue = h2;
|
|
|
c.lastRenderedState = d;
|
|
|
}
|
|
|
return [b.memoizedState, c.dispatch];
|
|
|
}
|
|
|
function Lh(a) {
|
|
|
var b = Ih(), c = b.queue;
|
|
|
if (c === null)
|
|
|
throw Error(y(311));
|
|
|
c.lastRenderedReducer = a;
|
|
|
var d = c.dispatch, e = c.pending, f2 = b.memoizedState;
|
|
|
if (e !== null) {
|
|
|
c.pending = null;
|
|
|
var g2 = e = e.next;
|
|
|
do
|
|
|
f2 = a(f2, g2.action), g2 = g2.next;
|
|
|
while (g2 !== e);
|
|
|
He(f2, b.memoizedState) || (ug = true);
|
|
|
b.memoizedState = f2;
|
|
|
b.baseQueue === null && (b.baseState = f2);
|
|
|
c.lastRenderedState = f2;
|
|
|
}
|
|
|
return [f2, d];
|
|
|
}
|
|
|
function Mh(a, b, c) {
|
|
|
var d = b._getVersion;
|
|
|
d = d(b._source);
|
|
|
var e = b._workInProgressVersionPrimary;
|
|
|
if (e !== null)
|
|
|
a = e === d;
|
|
|
else if (a = a.mutableReadLanes, a = (xh & a) === a)
|
|
|
b._workInProgressVersionPrimary = d, th.push(b);
|
|
|
if (a)
|
|
|
return c(b._source);
|
|
|
th.push(b);
|
|
|
throw Error(y(350));
|
|
|
}
|
|
|
function Nh(a, b, c, d) {
|
|
|
var e = U;
|
|
|
if (e === null)
|
|
|
throw Error(y(349));
|
|
|
var f2 = b._getVersion, g2 = f2(b._source), h2 = vh.current, k = h2.useState(function() {
|
|
|
return Mh(e, b, c);
|
|
|
}), l2 = k[1], n2 = k[0];
|
|
|
k = T;
|
|
|
var A2 = a.memoizedState, p2 = A2.refs, C2 = p2.getSnapshot, x2 = A2.source;
|
|
|
A2 = A2.subscribe;
|
|
|
var w2 = R;
|
|
|
a.memoizedState = { refs: p2, source: b, subscribe: d };
|
|
|
h2.useEffect(function() {
|
|
|
p2.getSnapshot = c;
|
|
|
p2.setSnapshot = l2;
|
|
|
var a2 = f2(b._source);
|
|
|
if (!He(g2, a2)) {
|
|
|
a2 = c(b._source);
|
|
|
He(n2, a2) || (l2(a2), a2 = Ig(w2), e.mutableReadLanes |= a2 & e.pendingLanes);
|
|
|
a2 = e.mutableReadLanes;
|
|
|
e.entangledLanes |= a2;
|
|
|
for (var d2 = e.entanglements, h3 = a2; 0 < h3; ) {
|
|
|
var k2 = 31 - Vc(h3), v2 = 1 << k2;
|
|
|
d2[k2] |= a2;
|
|
|
h3 &= ~v2;
|
|
|
}
|
|
|
}
|
|
|
}, [c, b, d]);
|
|
|
h2.useEffect(function() {
|
|
|
return d(b._source, function() {
|
|
|
var a2 = p2.getSnapshot, c2 = p2.setSnapshot;
|
|
|
try {
|
|
|
c2(a2(b._source));
|
|
|
var d2 = Ig(w2);
|
|
|
e.mutableReadLanes |= d2 & e.pendingLanes;
|
|
|
} catch (q2) {
|
|
|
c2(function() {
|
|
|
throw q2;
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}, [b, d]);
|
|
|
He(C2, c) && He(x2, b) && He(A2, d) || (a = { pending: null, dispatch: null, lastRenderedReducer: Jh, lastRenderedState: n2 }, a.dispatch = l2 = Oh.bind(null, R, a), k.queue = a, k.baseQueue = null, n2 = Mh(e, b, c), k.memoizedState = k.baseState = n2);
|
|
|
return n2;
|
|
|
}
|
|
|
function Ph(a, b, c) {
|
|
|
var d = Ih();
|
|
|
return Nh(d, a, b, c);
|
|
|
}
|
|
|
function Qh(a) {
|
|
|
var b = Hh();
|
|
|
typeof a === "function" && (a = a());
|
|
|
b.memoizedState = b.baseState = a;
|
|
|
a = b.queue = { pending: null, dispatch: null, lastRenderedReducer: Jh, lastRenderedState: a };
|
|
|
a = a.dispatch = Oh.bind(null, R, a);
|
|
|
return [b.memoizedState, a];
|
|
|
}
|
|
|
function Rh(a, b, c, d) {
|
|
|
a = { tag: a, create: b, destroy: c, deps: d, next: null };
|
|
|
b = R.updateQueue;
|
|
|
b === null ? (b = { lastEffect: null }, R.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, c === null ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a));
|
|
|
return a;
|
|
|
}
|
|
|
function Sh(a) {
|
|
|
var b = Hh();
|
|
|
a = { current: a };
|
|
|
return b.memoizedState = a;
|
|
|
}
|
|
|
function Th() {
|
|
|
return Ih().memoizedState;
|
|
|
}
|
|
|
function Uh(a, b, c, d) {
|
|
|
var e = Hh();
|
|
|
R.flags |= a;
|
|
|
e.memoizedState = Rh(1 | b, c, void 0, d === void 0 ? null : d);
|
|
|
}
|
|
|
function Vh(a, b, c, d) {
|
|
|
var e = Ih();
|
|
|
d = d === void 0 ? null : d;
|
|
|
var f2 = void 0;
|
|
|
if (S !== null) {
|
|
|
var g2 = S.memoizedState;
|
|
|
f2 = g2.destroy;
|
|
|
if (d !== null && Bh(d, g2.deps)) {
|
|
|
Rh(b, c, f2, d);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
R.flags |= a;
|
|
|
e.memoizedState = Rh(1 | b, c, f2, d);
|
|
|
}
|
|
|
function Wh(a, b) {
|
|
|
return Uh(516, 4, a, b);
|
|
|
}
|
|
|
function Xh(a, b) {
|
|
|
return Vh(516, 4, a, b);
|
|
|
}
|
|
|
function Yh(a, b) {
|
|
|
return Vh(4, 2, a, b);
|
|
|
}
|
|
|
function Zh(a, b) {
|
|
|
if (typeof b === "function")
|
|
|
return a = a(), b(a), function() {
|
|
|
b(null);
|
|
|
};
|
|
|
if (b !== null && b !== void 0)
|
|
|
return a = a(), b.current = a, function() {
|
|
|
b.current = null;
|
|
|
};
|
|
|
}
|
|
|
function $h(a, b, c) {
|
|
|
c = c !== null && c !== void 0 ? c.concat([a]) : null;
|
|
|
return Vh(4, 2, Zh.bind(null, b, a), c);
|
|
|
}
|
|
|
function ai() {
|
|
|
}
|
|
|
function bi(a, b) {
|
|
|
var c = Ih();
|
|
|
b = b === void 0 ? null : b;
|
|
|
var d = c.memoizedState;
|
|
|
if (d !== null && b !== null && Bh(b, d[1]))
|
|
|
return d[0];
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}
|
|
|
function ci(a, b) {
|
|
|
var c = Ih();
|
|
|
b = b === void 0 ? null : b;
|
|
|
var d = c.memoizedState;
|
|
|
if (d !== null && b !== null && Bh(b, d[1]))
|
|
|
return d[0];
|
|
|
a = a();
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}
|
|
|
function di(a, b) {
|
|
|
var c = eg();
|
|
|
gg(98 > c ? 98 : c, function() {
|
|
|
a(true);
|
|
|
});
|
|
|
gg(97 < c ? 97 : c, function() {
|
|
|
var c2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
a(false), b();
|
|
|
} finally {
|
|
|
wh.transition = c2;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
function Oh(a, b, c) {
|
|
|
var d = Hg(), e = Ig(a), f2 = { lane: e, action: c, eagerReducer: null, eagerState: null, next: null }, g2 = b.pending;
|
|
|
g2 === null ? f2.next = f2 : (f2.next = g2.next, g2.next = f2);
|
|
|
b.pending = f2;
|
|
|
g2 = a.alternate;
|
|
|
if (a === R || g2 !== null && g2 === R)
|
|
|
zh = yh = true;
|
|
|
else {
|
|
|
if (a.lanes === 0 && (g2 === null || g2.lanes === 0) && (g2 = b.lastRenderedReducer, g2 !== null))
|
|
|
try {
|
|
|
var h2 = b.lastRenderedState, k = g2(h2, c);
|
|
|
f2.eagerReducer = g2;
|
|
|
f2.eagerState = k;
|
|
|
if (He(k, h2))
|
|
|
return;
|
|
|
} catch (l2) {
|
|
|
} finally {
|
|
|
}
|
|
|
Jg(a, e, d);
|
|
|
}
|
|
|
}
|
|
|
var Gh = { readContext: vg, useCallback: Ah, useContext: Ah, useEffect: Ah, useImperativeHandle: Ah, useLayoutEffect: Ah, useMemo: Ah, useReducer: Ah, useRef: Ah, useState: Ah, useDebugValue: Ah, useDeferredValue: Ah, useTransition: Ah, useMutableSource: Ah, useOpaqueIdentifier: Ah, unstable_isNewReconciler: false }, Dh = { readContext: vg, useCallback: function(a, b) {
|
|
|
Hh().memoizedState = [a, b === void 0 ? null : b];
|
|
|
return a;
|
|
|
}, useContext: vg, useEffect: Wh, useImperativeHandle: function(a, b, c) {
|
|
|
c = c !== null && c !== void 0 ? c.concat([a]) : null;
|
|
|
return Uh(4, 2, Zh.bind(null, b, a), c);
|
|
|
}, useLayoutEffect: function(a, b) {
|
|
|
return Uh(4, 2, a, b);
|
|
|
}, useMemo: function(a, b) {
|
|
|
var c = Hh();
|
|
|
b = b === void 0 ? null : b;
|
|
|
a = a();
|
|
|
c.memoizedState = [a, b];
|
|
|
return a;
|
|
|
}, useReducer: function(a, b, c) {
|
|
|
var d = Hh();
|
|
|
b = c !== void 0 ? c(b) : b;
|
|
|
d.memoizedState = d.baseState = b;
|
|
|
a = d.queue = { pending: null, dispatch: null, lastRenderedReducer: a, lastRenderedState: b };
|
|
|
a = a.dispatch = Oh.bind(null, R, a);
|
|
|
return [d.memoizedState, a];
|
|
|
}, useRef: Sh, useState: Qh, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Qh(a), c = b[0], d = b[1];
|
|
|
Wh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Qh(false), b = a[0];
|
|
|
a = di.bind(null, a[1]);
|
|
|
Sh(a);
|
|
|
return [a, b];
|
|
|
}, useMutableSource: function(a, b, c) {
|
|
|
var d = Hh();
|
|
|
d.memoizedState = { refs: { getSnapshot: b, setSnapshot: null }, source: a, subscribe: c };
|
|
|
return Nh(d, a, b, c);
|
|
|
}, useOpaqueIdentifier: function() {
|
|
|
if (lh) {
|
|
|
var a = false, b = uf(function() {
|
|
|
a || (a = true, c("r:" + (tf++).toString(36)));
|
|
|
throw Error(y(355));
|
|
|
}), c = Qh(b)[1];
|
|
|
(R.mode & 2) === 0 && (R.flags |= 516, Rh(5, function() {
|
|
|
c("r:" + (tf++).toString(36));
|
|
|
}, void 0, null));
|
|
|
return b;
|
|
|
}
|
|
|
b = "r:" + (tf++).toString(36);
|
|
|
Qh(b);
|
|
|
return b;
|
|
|
}, unstable_isNewReconciler: false }, Eh = { readContext: vg, useCallback: bi, useContext: vg, useEffect: Xh, useImperativeHandle: $h, useLayoutEffect: Yh, useMemo: ci, useReducer: Kh, useRef: Th, useState: function() {
|
|
|
return Kh(Jh);
|
|
|
}, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Kh(Jh), c = b[0], d = b[1];
|
|
|
Xh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Kh(Jh)[0];
|
|
|
return [
|
|
|
Th().current,
|
|
|
a
|
|
|
];
|
|
|
}, useMutableSource: Ph, useOpaqueIdentifier: function() {
|
|
|
return Kh(Jh)[0];
|
|
|
}, unstable_isNewReconciler: false }, Fh = { readContext: vg, useCallback: bi, useContext: vg, useEffect: Xh, useImperativeHandle: $h, useLayoutEffect: Yh, useMemo: ci, useReducer: Lh, useRef: Th, useState: function() {
|
|
|
return Lh(Jh);
|
|
|
}, useDebugValue: ai, useDeferredValue: function(a) {
|
|
|
var b = Lh(Jh), c = b[0], d = b[1];
|
|
|
Xh(function() {
|
|
|
var b2 = wh.transition;
|
|
|
wh.transition = 1;
|
|
|
try {
|
|
|
d(a);
|
|
|
} finally {
|
|
|
wh.transition = b2;
|
|
|
}
|
|
|
}, [a]);
|
|
|
return c;
|
|
|
}, useTransition: function() {
|
|
|
var a = Lh(Jh)[0];
|
|
|
return [
|
|
|
Th().current,
|
|
|
a
|
|
|
];
|
|
|
}, useMutableSource: Ph, useOpaqueIdentifier: function() {
|
|
|
return Lh(Jh)[0];
|
|
|
}, unstable_isNewReconciler: false }, ei = ra.ReactCurrentOwner, ug = false;
|
|
|
function fi(a, b, c, d) {
|
|
|
b.child = a === null ? Zg(b, null, c, d) : Yg(b, a.child, c, d);
|
|
|
}
|
|
|
function gi(a, b, c, d, e) {
|
|
|
c = c.render;
|
|
|
var f2 = b.ref;
|
|
|
tg(b, e);
|
|
|
d = Ch(a, b, c, d, f2, e);
|
|
|
if (a !== null && !ug)
|
|
|
return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi$1(a, b, e);
|
|
|
b.flags |= 1;
|
|
|
fi(a, b, d, e);
|
|
|
return b.child;
|
|
|
}
|
|
|
function ii(a, b, c, d, e, f2) {
|
|
|
if (a === null) {
|
|
|
var g2 = c.type;
|
|
|
if (typeof g2 === "function" && !ji(g2) && g2.defaultProps === void 0 && c.compare === null && c.defaultProps === void 0)
|
|
|
return b.tag = 15, b.type = g2, ki(a, b, g2, d, e, f2);
|
|
|
a = Vg(c.type, null, d, b, b.mode, f2);
|
|
|
a.ref = b.ref;
|
|
|
a.return = b;
|
|
|
return b.child = a;
|
|
|
}
|
|
|
g2 = a.child;
|
|
|
if ((e & f2) === 0 && (e = g2.memoizedProps, c = c.compare, c = c !== null ? c : Je, c(e, d) && a.ref === b.ref))
|
|
|
return hi$1(a, b, f2);
|
|
|
b.flags |= 1;
|
|
|
a = Tg(g2, d);
|
|
|
a.ref = b.ref;
|
|
|
a.return = b;
|
|
|
return b.child = a;
|
|
|
}
|
|
|
function ki(a, b, c, d, e, f2) {
|
|
|
if (a !== null && Je(a.memoizedProps, d) && a.ref === b.ref)
|
|
|
if (ug = false, (f2 & e) !== 0)
|
|
|
(a.flags & 16384) !== 0 && (ug = true);
|
|
|
else
|
|
|
return b.lanes = a.lanes, hi$1(a, b, f2);
|
|
|
return li(a, b, c, d, f2);
|
|
|
}
|
|
|
function mi(a, b, c) {
|
|
|
var d = b.pendingProps, e = d.children, f2 = a !== null ? a.memoizedState : null;
|
|
|
if (d.mode === "hidden" || d.mode === "unstable-defer-without-hiding")
|
|
|
if ((b.mode & 4) === 0)
|
|
|
b.memoizedState = { baseLanes: 0 }, ni(b, c);
|
|
|
else if ((c & 1073741824) !== 0)
|
|
|
b.memoizedState = { baseLanes: 0 }, ni(b, f2 !== null ? f2.baseLanes : c);
|
|
|
else
|
|
|
return a = f2 !== null ? f2.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = { baseLanes: a }, ni(b, a), null;
|
|
|
else
|
|
|
f2 !== null ? (d = f2.baseLanes | c, b.memoizedState = null) : d = c, ni(b, d);
|
|
|
fi(a, b, e, c);
|
|
|
return b.child;
|
|
|
}
|
|
|
function oi(a, b) {
|
|
|
var c = b.ref;
|
|
|
if (a === null && c !== null || a !== null && a.ref !== c)
|
|
|
b.flags |= 128;
|
|
|
}
|
|
|
function li(a, b, c, d, e) {
|
|
|
var f2 = Ff(c) ? Df : M.current;
|
|
|
f2 = Ef(b, f2);
|
|
|
tg(b, e);
|
|
|
c = Ch(a, b, c, d, f2, e);
|
|
|
if (a !== null && !ug)
|
|
|
return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi$1(a, b, e);
|
|
|
b.flags |= 1;
|
|
|
fi(a, b, c, e);
|
|
|
return b.child;
|
|
|
}
|
|
|
function pi(a, b, c, d, e) {
|
|
|
if (Ff(c)) {
|
|
|
var f2 = true;
|
|
|
Jf(b);
|
|
|
} else
|
|
|
f2 = false;
|
|
|
tg(b, e);
|
|
|
if (b.stateNode === null)
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2), Mg(b, c, d), Og(b, c, d, e), d = true;
|
|
|
else if (a === null) {
|
|
|
var g2 = b.stateNode, h2 = b.memoizedProps;
|
|
|
g2.props = h2;
|
|
|
var k = g2.context, l2 = c.contextType;
|
|
|
typeof l2 === "object" && l2 !== null ? l2 = vg(l2) : (l2 = Ff(c) ? Df : M.current, l2 = Ef(b, l2));
|
|
|
var n2 = c.getDerivedStateFromProps, A2 = typeof n2 === "function" || typeof g2.getSnapshotBeforeUpdate === "function";
|
|
|
A2 || typeof g2.UNSAFE_componentWillReceiveProps !== "function" && typeof g2.componentWillReceiveProps !== "function" || (h2 !== d || k !== l2) && Ng(b, g2, d, l2);
|
|
|
wg = false;
|
|
|
var p2 = b.memoizedState;
|
|
|
g2.state = p2;
|
|
|
Cg(b, d, g2, e);
|
|
|
k = b.memoizedState;
|
|
|
h2 !== d || p2 !== k || N.current || wg ? (typeof n2 === "function" && (Gg(b, c, n2, d), k = b.memoizedState), (h2 = wg || Lg(b, c, h2, d, p2, k, l2)) ? (A2 || typeof g2.UNSAFE_componentWillMount !== "function" && typeof g2.componentWillMount !== "function" || (typeof g2.componentWillMount === "function" && g2.componentWillMount(), typeof g2.UNSAFE_componentWillMount === "function" && g2.UNSAFE_componentWillMount()), typeof g2.componentDidMount === "function" && (b.flags |= 4)) : (typeof g2.componentDidMount === "function" && (b.flags |= 4), b.memoizedProps = d, b.memoizedState = k), g2.props = d, g2.state = k, g2.context = l2, d = h2) : (typeof g2.componentDidMount === "function" && (b.flags |= 4), d = false);
|
|
|
} else {
|
|
|
g2 = b.stateNode;
|
|
|
yg(a, b);
|
|
|
h2 = b.memoizedProps;
|
|
|
l2 = b.type === b.elementType ? h2 : lg(b.type, h2);
|
|
|
g2.props = l2;
|
|
|
A2 = b.pendingProps;
|
|
|
p2 = g2.context;
|
|
|
k = c.contextType;
|
|
|
typeof k === "object" && k !== null ? k = vg(k) : (k = Ff(c) ? Df : M.current, k = Ef(b, k));
|
|
|
var C2 = c.getDerivedStateFromProps;
|
|
|
(n2 = typeof C2 === "function" || typeof g2.getSnapshotBeforeUpdate === "function") || typeof g2.UNSAFE_componentWillReceiveProps !== "function" && typeof g2.componentWillReceiveProps !== "function" || (h2 !== A2 || p2 !== k) && Ng(b, g2, d, k);
|
|
|
wg = false;
|
|
|
p2 = b.memoizedState;
|
|
|
g2.state = p2;
|
|
|
Cg(b, d, g2, e);
|
|
|
var x2 = b.memoizedState;
|
|
|
h2 !== A2 || p2 !== x2 || N.current || wg ? (typeof C2 === "function" && (Gg(b, c, C2, d), x2 = b.memoizedState), (l2 = wg || Lg(b, c, l2, d, p2, x2, k)) ? (n2 || typeof g2.UNSAFE_componentWillUpdate !== "function" && typeof g2.componentWillUpdate !== "function" || (typeof g2.componentWillUpdate === "function" && g2.componentWillUpdate(d, x2, k), typeof g2.UNSAFE_componentWillUpdate === "function" && g2.UNSAFE_componentWillUpdate(d, x2, k)), typeof g2.componentDidUpdate === "function" && (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate === "function" && (b.flags |= 256)) : (typeof g2.componentDidUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 256), b.memoizedProps = d, b.memoizedState = x2), g2.props = d, g2.state = x2, g2.context = k, d = l2) : (typeof g2.componentDidUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 4), typeof g2.getSnapshotBeforeUpdate !== "function" || h2 === a.memoizedProps && p2 === a.memoizedState || (b.flags |= 256), d = false);
|
|
|
}
|
|
|
return qi(a, b, c, d, f2, e);
|
|
|
}
|
|
|
function qi(a, b, c, d, e, f2) {
|
|
|
oi(a, b);
|
|
|
var g2 = (b.flags & 64) !== 0;
|
|
|
if (!d && !g2)
|
|
|
return e && Kf(b, c, false), hi$1(a, b, f2);
|
|
|
d = b.stateNode;
|
|
|
ei.current = b;
|
|
|
var h2 = g2 && typeof c.getDerivedStateFromError !== "function" ? null : d.render();
|
|
|
b.flags |= 1;
|
|
|
a !== null && g2 ? (b.child = Yg(b, a.child, null, f2), b.child = Yg(b, null, h2, f2)) : fi(a, b, h2, f2);
|
|
|
b.memoizedState = d.state;
|
|
|
e && Kf(b, c, true);
|
|
|
return b.child;
|
|
|
}
|
|
|
function ri(a) {
|
|
|
var b = a.stateNode;
|
|
|
b.pendingContext ? Hf(a, b.pendingContext, b.pendingContext !== b.context) : b.context && Hf(a, b.context, false);
|
|
|
eh(a, b.containerInfo);
|
|
|
}
|
|
|
var si = { dehydrated: null, retryLane: 0 };
|
|
|
function ti(a, b, c) {
|
|
|
var d = b.pendingProps, e = P.current, f2 = false, g2;
|
|
|
(g2 = (b.flags & 64) !== 0) || (g2 = a !== null && a.memoizedState === null ? false : (e & 2) !== 0);
|
|
|
g2 ? (f2 = true, b.flags &= -65) : a !== null && a.memoizedState === null || d.fallback === void 0 || d.unstable_avoidThisFallback === true || (e |= 1);
|
|
|
I(P, e & 1);
|
|
|
if (a === null) {
|
|
|
d.fallback !== void 0 && ph(b);
|
|
|
a = d.children;
|
|
|
e = d.fallback;
|
|
|
if (f2)
|
|
|
return a = ui(b, a, e, c), b.child.memoizedState = { baseLanes: c }, b.memoizedState = si, a;
|
|
|
if (typeof d.unstable_expectedLoadTime === "number")
|
|
|
return a = ui(b, a, e, c), b.child.memoizedState = { baseLanes: c }, b.memoizedState = si, b.lanes = 33554432, a;
|
|
|
c = vi({ mode: "visible", children: a }, b.mode, c, null);
|
|
|
c.return = b;
|
|
|
return b.child = c;
|
|
|
}
|
|
|
if (a.memoizedState !== null) {
|
|
|
if (f2)
|
|
|
return d = wi(a, b, d.children, d.fallback, c), f2 = b.child, e = a.child.memoizedState, f2.memoizedState = e === null ? { baseLanes: c } : { baseLanes: e.baseLanes | c }, f2.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
|
|
|
c = xi(a, b, d.children, c);
|
|
|
b.memoizedState = null;
|
|
|
return c;
|
|
|
}
|
|
|
if (f2)
|
|
|
return d = wi(a, b, d.children, d.fallback, c), f2 = b.child, e = a.child.memoizedState, f2.memoizedState = e === null ? { baseLanes: c } : { baseLanes: e.baseLanes | c }, f2.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
|
|
|
c = xi(a, b, d.children, c);
|
|
|
b.memoizedState = null;
|
|
|
return c;
|
|
|
}
|
|
|
function ui(a, b, c, d) {
|
|
|
var e = a.mode, f2 = a.child;
|
|
|
b = { mode: "hidden", children: b };
|
|
|
(e & 2) === 0 && f2 !== null ? (f2.childLanes = 0, f2.pendingProps = b) : f2 = vi(b, e, 0, null);
|
|
|
c = Xg(c, e, d, null);
|
|
|
f2.return = a;
|
|
|
c.return = a;
|
|
|
f2.sibling = c;
|
|
|
a.child = f2;
|
|
|
return c;
|
|
|
}
|
|
|
function xi(a, b, c, d) {
|
|
|
var e = a.child;
|
|
|
a = e.sibling;
|
|
|
c = Tg(e, { mode: "visible", children: c });
|
|
|
(b.mode & 2) === 0 && (c.lanes = d);
|
|
|
c.return = b;
|
|
|
c.sibling = null;
|
|
|
a !== null && (a.nextEffect = null, a.flags = 8, b.firstEffect = b.lastEffect = a);
|
|
|
return b.child = c;
|
|
|
}
|
|
|
function wi(a, b, c, d, e) {
|
|
|
var f2 = b.mode, g2 = a.child;
|
|
|
a = g2.sibling;
|
|
|
var h2 = { mode: "hidden", children: c };
|
|
|
(f2 & 2) === 0 && b.child !== g2 ? (c = b.child, c.childLanes = 0, c.pendingProps = h2, g2 = c.lastEffect, g2 !== null ? (b.firstEffect = c.firstEffect, b.lastEffect = g2, g2.nextEffect = null) : b.firstEffect = b.lastEffect = null) : c = Tg(g2, h2);
|
|
|
a !== null ? d = Tg(a, d) : (d = Xg(d, f2, e, null), d.flags |= 2);
|
|
|
d.return = b;
|
|
|
c.return = b;
|
|
|
c.sibling = d;
|
|
|
b.child = c;
|
|
|
return d;
|
|
|
}
|
|
|
function yi(a, b) {
|
|
|
a.lanes |= b;
|
|
|
var c = a.alternate;
|
|
|
c !== null && (c.lanes |= b);
|
|
|
sg(a.return, b);
|
|
|
}
|
|
|
function zi(a, b, c, d, e, f2) {
|
|
|
var g2 = a.memoizedState;
|
|
|
g2 === null ? a.memoizedState = { isBackwards: b, rendering: null, renderingStartTime: 0, last: d, tail: c, tailMode: e, lastEffect: f2 } : (g2.isBackwards = b, g2.rendering = null, g2.renderingStartTime = 0, g2.last = d, g2.tail = c, g2.tailMode = e, g2.lastEffect = f2);
|
|
|
}
|
|
|
function Ai(a, b, c) {
|
|
|
var d = b.pendingProps, e = d.revealOrder, f2 = d.tail;
|
|
|
fi(a, b, d.children, c);
|
|
|
d = P.current;
|
|
|
if ((d & 2) !== 0)
|
|
|
d = d & 1 | 2, b.flags |= 64;
|
|
|
else {
|
|
|
if (a !== null && (a.flags & 64) !== 0)
|
|
|
a:
|
|
|
for (a = b.child; a !== null; ) {
|
|
|
if (a.tag === 13)
|
|
|
a.memoizedState !== null && yi(a, c);
|
|
|
else if (a.tag === 19)
|
|
|
yi(a, c);
|
|
|
else if (a.child !== null) {
|
|
|
a.child.return = a;
|
|
|
a = a.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (a === b)
|
|
|
break a;
|
|
|
for (; a.sibling === null; ) {
|
|
|
if (a.return === null || a.return === b)
|
|
|
break a;
|
|
|
a = a.return;
|
|
|
}
|
|
|
a.sibling.return = a.return;
|
|
|
a = a.sibling;
|
|
|
}
|
|
|
d &= 1;
|
|
|
}
|
|
|
I(P, d);
|
|
|
if ((b.mode & 2) === 0)
|
|
|
b.memoizedState = null;
|
|
|
else
|
|
|
switch (e) {
|
|
|
case "forwards":
|
|
|
c = b.child;
|
|
|
for (e = null; c !== null; )
|
|
|
a = c.alternate, a !== null && ih(a) === null && (e = c), c = c.sibling;
|
|
|
c = e;
|
|
|
c === null ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null);
|
|
|
zi(b, false, e, c, f2, b.lastEffect);
|
|
|
break;
|
|
|
case "backwards":
|
|
|
c = null;
|
|
|
e = b.child;
|
|
|
for (b.child = null; e !== null; ) {
|
|
|
a = e.alternate;
|
|
|
if (a !== null && ih(a) === null) {
|
|
|
b.child = e;
|
|
|
break;
|
|
|
}
|
|
|
a = e.sibling;
|
|
|
e.sibling = c;
|
|
|
c = e;
|
|
|
e = a;
|
|
|
}
|
|
|
zi(b, true, c, null, f2, b.lastEffect);
|
|
|
break;
|
|
|
case "together":
|
|
|
zi(b, false, null, null, void 0, b.lastEffect);
|
|
|
break;
|
|
|
default:
|
|
|
b.memoizedState = null;
|
|
|
}
|
|
|
return b.child;
|
|
|
}
|
|
|
function hi$1(a, b, c) {
|
|
|
a !== null && (b.dependencies = a.dependencies);
|
|
|
Dg |= b.lanes;
|
|
|
if ((c & b.childLanes) !== 0) {
|
|
|
if (a !== null && b.child !== a.child)
|
|
|
throw Error(y(153));
|
|
|
if (b.child !== null) {
|
|
|
a = b.child;
|
|
|
c = Tg(a, a.pendingProps);
|
|
|
b.child = c;
|
|
|
for (c.return = b; a.sibling !== null; )
|
|
|
a = a.sibling, c = c.sibling = Tg(a, a.pendingProps), c.return = b;
|
|
|
c.sibling = null;
|
|
|
}
|
|
|
return b.child;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
var Bi, Ci, Di, Ei;
|
|
|
Bi = function(a, b) {
|
|
|
for (var c = b.child; c !== null; ) {
|
|
|
if (c.tag === 5 || c.tag === 6)
|
|
|
a.appendChild(c.stateNode);
|
|
|
else if (c.tag !== 4 && c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === b)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === b)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
};
|
|
|
Ci = function() {
|
|
|
};
|
|
|
Di = function(a, b, c, d) {
|
|
|
var e = a.memoizedProps;
|
|
|
if (e !== d) {
|
|
|
a = b.stateNode;
|
|
|
dh(ah.current);
|
|
|
var f2 = null;
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
e = Ya(a, e);
|
|
|
d = Ya(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "option":
|
|
|
e = eb(a, e);
|
|
|
d = eb(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "select":
|
|
|
e = m$1({}, e, { value: void 0 });
|
|
|
d = m$1({}, d, { value: void 0 });
|
|
|
f2 = [];
|
|
|
break;
|
|
|
case "textarea":
|
|
|
e = gb(a, e);
|
|
|
d = gb(a, d);
|
|
|
f2 = [];
|
|
|
break;
|
|
|
default:
|
|
|
typeof e.onClick !== "function" && typeof d.onClick === "function" && (a.onclick = jf);
|
|
|
}
|
|
|
vb(c, d);
|
|
|
var g2;
|
|
|
c = null;
|
|
|
for (l2 in e)
|
|
|
if (!d.hasOwnProperty(l2) && e.hasOwnProperty(l2) && e[l2] != null)
|
|
|
if (l2 === "style") {
|
|
|
var h2 = e[l2];
|
|
|
for (g2 in h2)
|
|
|
h2.hasOwnProperty(g2) && (c || (c = {}), c[g2] = "");
|
|
|
} else
|
|
|
l2 !== "dangerouslySetInnerHTML" && l2 !== "children" && l2 !== "suppressContentEditableWarning" && l2 !== "suppressHydrationWarning" && l2 !== "autoFocus" && (ca.hasOwnProperty(l2) ? f2 || (f2 = []) : (f2 = f2 || []).push(l2, null));
|
|
|
for (l2 in d) {
|
|
|
var k = d[l2];
|
|
|
h2 = e != null ? e[l2] : void 0;
|
|
|
if (d.hasOwnProperty(l2) && k !== h2 && (k != null || h2 != null))
|
|
|
if (l2 === "style")
|
|
|
if (h2) {
|
|
|
for (g2 in h2)
|
|
|
!h2.hasOwnProperty(g2) || k && k.hasOwnProperty(g2) || (c || (c = {}), c[g2] = "");
|
|
|
for (g2 in k)
|
|
|
k.hasOwnProperty(g2) && h2[g2] !== k[g2] && (c || (c = {}), c[g2] = k[g2]);
|
|
|
} else
|
|
|
c || (f2 || (f2 = []), f2.push(l2, c)), c = k;
|
|
|
else
|
|
|
l2 === "dangerouslySetInnerHTML" ? (k = k ? k.__html : void 0, h2 = h2 ? h2.__html : void 0, k != null && h2 !== k && (f2 = f2 || []).push(l2, k)) : l2 === "children" ? typeof k !== "string" && typeof k !== "number" || (f2 = f2 || []).push(l2, "" + k) : l2 !== "suppressContentEditableWarning" && l2 !== "suppressHydrationWarning" && (ca.hasOwnProperty(l2) ? (k != null && l2 === "onScroll" && G("scroll", a), f2 || h2 === k || (f2 = [])) : typeof k === "object" && k !== null && k.$$typeof === Ga ? k.toString() : (f2 = f2 || []).push(l2, k));
|
|
|
}
|
|
|
c && (f2 = f2 || []).push("style", c);
|
|
|
var l2 = f2;
|
|
|
if (b.updateQueue = l2)
|
|
|
b.flags |= 4;
|
|
|
}
|
|
|
};
|
|
|
Ei = function(a, b, c, d) {
|
|
|
c !== d && (b.flags |= 4);
|
|
|
};
|
|
|
function Fi(a, b) {
|
|
|
if (!lh)
|
|
|
switch (a.tailMode) {
|
|
|
case "hidden":
|
|
|
b = a.tail;
|
|
|
for (var c = null; b !== null; )
|
|
|
b.alternate !== null && (c = b), b = b.sibling;
|
|
|
c === null ? a.tail = null : c.sibling = null;
|
|
|
break;
|
|
|
case "collapsed":
|
|
|
c = a.tail;
|
|
|
for (var d = null; c !== null; )
|
|
|
c.alternate !== null && (d = c), c = c.sibling;
|
|
|
d === null ? b || a.tail === null ? a.tail = null : a.tail.sibling = null : d.sibling = null;
|
|
|
}
|
|
|
}
|
|
|
function Gi(a, b, c) {
|
|
|
var d = b.pendingProps;
|
|
|
switch (b.tag) {
|
|
|
case 2:
|
|
|
case 16:
|
|
|
case 15:
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 7:
|
|
|
case 8:
|
|
|
case 12:
|
|
|
case 9:
|
|
|
case 14:
|
|
|
return null;
|
|
|
case 1:
|
|
|
return Ff(b.type) && Gf(), null;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
d = b.stateNode;
|
|
|
d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null);
|
|
|
if (a === null || a.child === null)
|
|
|
rh(b) ? b.flags |= 4 : d.hydrate || (b.flags |= 256);
|
|
|
Ci(b);
|
|
|
return null;
|
|
|
case 5:
|
|
|
hh(b);
|
|
|
var e = dh(ch.current);
|
|
|
c = b.type;
|
|
|
if (a !== null && b.stateNode != null)
|
|
|
Di(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 128);
|
|
|
else {
|
|
|
if (!d) {
|
|
|
if (b.stateNode === null)
|
|
|
throw Error(y(166));
|
|
|
return null;
|
|
|
}
|
|
|
a = dh(ah.current);
|
|
|
if (rh(b)) {
|
|
|
d = b.stateNode;
|
|
|
c = b.type;
|
|
|
var f2 = b.memoizedProps;
|
|
|
d[wf] = b;
|
|
|
d[xf] = f2;
|
|
|
switch (c) {
|
|
|
case "dialog":
|
|
|
G("cancel", d);
|
|
|
G("close", d);
|
|
|
break;
|
|
|
case "iframe":
|
|
|
case "object":
|
|
|
case "embed":
|
|
|
G("load", d);
|
|
|
break;
|
|
|
case "video":
|
|
|
case "audio":
|
|
|
for (a = 0; a < Xe.length; a++)
|
|
|
G(Xe[a], d);
|
|
|
break;
|
|
|
case "source":
|
|
|
G("error", d);
|
|
|
break;
|
|
|
case "img":
|
|
|
case "image":
|
|
|
case "link":
|
|
|
G("error", d);
|
|
|
G("load", d);
|
|
|
break;
|
|
|
case "details":
|
|
|
G("toggle", d);
|
|
|
break;
|
|
|
case "input":
|
|
|
Za(d, f2);
|
|
|
G("invalid", d);
|
|
|
break;
|
|
|
case "select":
|
|
|
d._wrapperState = { wasMultiple: !!f2.multiple };
|
|
|
G("invalid", d);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
hb(d, f2), G("invalid", d);
|
|
|
}
|
|
|
vb(c, f2);
|
|
|
a = null;
|
|
|
for (var g2 in f2)
|
|
|
f2.hasOwnProperty(g2) && (e = f2[g2], g2 === "children" ? typeof e === "string" ? d.textContent !== e && (a = ["children", e]) : typeof e === "number" && d.textContent !== "" + e && (a = ["children", "" + e]) : ca.hasOwnProperty(g2) && e != null && g2 === "onScroll" && G("scroll", d));
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
Va(d);
|
|
|
cb(d, f2, true);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
Va(d);
|
|
|
jb(d);
|
|
|
break;
|
|
|
case "select":
|
|
|
case "option":
|
|
|
break;
|
|
|
default:
|
|
|
typeof f2.onClick === "function" && (d.onclick = jf);
|
|
|
}
|
|
|
d = a;
|
|
|
b.updateQueue = d;
|
|
|
d !== null && (b.flags |= 4);
|
|
|
} else {
|
|
|
g2 = e.nodeType === 9 ? e : e.ownerDocument;
|
|
|
a === kb.html && (a = lb(c));
|
|
|
a === kb.html ? c === "script" ? (a = g2.createElement("div"), a.innerHTML = "<script><\/script>", a = a.removeChild(a.firstChild)) : typeof d.is === "string" ? a = g2.createElement(c, { is: d.is }) : (a = g2.createElement(c), c === "select" && (g2 = a, d.multiple ? g2.multiple = true : d.size && (g2.size = d.size))) : a = g2.createElementNS(a, c);
|
|
|
a[wf] = b;
|
|
|
a[xf] = d;
|
|
|
Bi(a, b, false, false);
|
|
|
b.stateNode = a;
|
|
|
g2 = wb(c, d);
|
|
|
switch (c) {
|
|
|
case "dialog":
|
|
|
G("cancel", a);
|
|
|
G("close", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "iframe":
|
|
|
case "object":
|
|
|
case "embed":
|
|
|
G("load", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "video":
|
|
|
case "audio":
|
|
|
for (e = 0; e < Xe.length; e++)
|
|
|
G(Xe[e], a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "source":
|
|
|
G("error", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "img":
|
|
|
case "image":
|
|
|
case "link":
|
|
|
G("error", a);
|
|
|
G("load", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "details":
|
|
|
G("toggle", a);
|
|
|
e = d;
|
|
|
break;
|
|
|
case "input":
|
|
|
Za(a, d);
|
|
|
e = Ya(a, d);
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
case "option":
|
|
|
e = eb(a, d);
|
|
|
break;
|
|
|
case "select":
|
|
|
a._wrapperState = { wasMultiple: !!d.multiple };
|
|
|
e = m$1({}, d, { value: void 0 });
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
hb(a, d);
|
|
|
e = gb(a, d);
|
|
|
G("invalid", a);
|
|
|
break;
|
|
|
default:
|
|
|
e = d;
|
|
|
}
|
|
|
vb(c, e);
|
|
|
var h2 = e;
|
|
|
for (f2 in h2)
|
|
|
if (h2.hasOwnProperty(f2)) {
|
|
|
var k = h2[f2];
|
|
|
f2 === "style" ? tb(a, k) : f2 === "dangerouslySetInnerHTML" ? (k = k ? k.__html : void 0, k != null && ob(a, k)) : f2 === "children" ? typeof k === "string" ? (c !== "textarea" || k !== "") && pb(a, k) : typeof k === "number" && pb(a, "" + k) : f2 !== "suppressContentEditableWarning" && f2 !== "suppressHydrationWarning" && f2 !== "autoFocus" && (ca.hasOwnProperty(f2) ? k != null && f2 === "onScroll" && G("scroll", a) : k != null && qa(a, f2, k, g2));
|
|
|
}
|
|
|
switch (c) {
|
|
|
case "input":
|
|
|
Va(a);
|
|
|
cb(a, d, false);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
Va(a);
|
|
|
jb(a);
|
|
|
break;
|
|
|
case "option":
|
|
|
d.value != null && a.setAttribute("value", "" + Sa(d.value));
|
|
|
break;
|
|
|
case "select":
|
|
|
a.multiple = !!d.multiple;
|
|
|
f2 = d.value;
|
|
|
f2 != null ? fb(a, !!d.multiple, f2, false) : d.defaultValue != null && fb(a, !!d.multiple, d.defaultValue, true);
|
|
|
break;
|
|
|
default:
|
|
|
typeof e.onClick === "function" && (a.onclick = jf);
|
|
|
}
|
|
|
mf(c, d) && (b.flags |= 4);
|
|
|
}
|
|
|
b.ref !== null && (b.flags |= 128);
|
|
|
}
|
|
|
return null;
|
|
|
case 6:
|
|
|
if (a && b.stateNode != null)
|
|
|
Ei(a, b, a.memoizedProps, d);
|
|
|
else {
|
|
|
if (typeof d !== "string" && b.stateNode === null)
|
|
|
throw Error(y(166));
|
|
|
c = dh(ch.current);
|
|
|
dh(ah.current);
|
|
|
rh(b) ? (d = b.stateNode, c = b.memoizedProps, d[wf] = b, d.nodeValue !== c && (b.flags |= 4)) : (d = (c.nodeType === 9 ? c : c.ownerDocument).createTextNode(d), d[wf] = b, b.stateNode = d);
|
|
|
}
|
|
|
return null;
|
|
|
case 13:
|
|
|
H(P);
|
|
|
d = b.memoizedState;
|
|
|
if ((b.flags & 64) !== 0)
|
|
|
return b.lanes = c, b;
|
|
|
d = d !== null;
|
|
|
c = false;
|
|
|
a === null ? b.memoizedProps.fallback !== void 0 && rh(b) : c = a.memoizedState !== null;
|
|
|
if (d && !c && (b.mode & 2) !== 0)
|
|
|
if (a === null && b.memoizedProps.unstable_avoidThisFallback !== true || (P.current & 1) !== 0)
|
|
|
V === 0 && (V = 3);
|
|
|
else {
|
|
|
if (V === 0 || V === 3)
|
|
|
V = 4;
|
|
|
U === null || (Dg & 134217727) === 0 && (Hi & 134217727) === 0 || Ii(U, W);
|
|
|
}
|
|
|
if (d || c)
|
|
|
b.flags |= 4;
|
|
|
return null;
|
|
|
case 4:
|
|
|
return fh(), Ci(b), a === null && cf(b.stateNode.containerInfo), null;
|
|
|
case 10:
|
|
|
return rg(b), null;
|
|
|
case 17:
|
|
|
return Ff(b.type) && Gf(), null;
|
|
|
case 19:
|
|
|
H(P);
|
|
|
d = b.memoizedState;
|
|
|
if (d === null)
|
|
|
return null;
|
|
|
f2 = (b.flags & 64) !== 0;
|
|
|
g2 = d.rendering;
|
|
|
if (g2 === null)
|
|
|
if (f2)
|
|
|
Fi(d, false);
|
|
|
else {
|
|
|
if (V !== 0 || a !== null && (a.flags & 64) !== 0)
|
|
|
for (a = b.child; a !== null; ) {
|
|
|
g2 = ih(a);
|
|
|
if (g2 !== null) {
|
|
|
b.flags |= 64;
|
|
|
Fi(d, false);
|
|
|
f2 = g2.updateQueue;
|
|
|
f2 !== null && (b.updateQueue = f2, b.flags |= 4);
|
|
|
d.lastEffect === null && (b.firstEffect = null);
|
|
|
b.lastEffect = d.lastEffect;
|
|
|
d = c;
|
|
|
for (c = b.child; c !== null; )
|
|
|
f2 = c, a = d, f2.flags &= 2, f2.nextEffect = null, f2.firstEffect = null, f2.lastEffect = null, g2 = f2.alternate, g2 === null ? (f2.childLanes = 0, f2.lanes = a, f2.child = null, f2.memoizedProps = null, f2.memoizedState = null, f2.updateQueue = null, f2.dependencies = null, f2.stateNode = null) : (f2.childLanes = g2.childLanes, f2.lanes = g2.lanes, f2.child = g2.child, f2.memoizedProps = g2.memoizedProps, f2.memoizedState = g2.memoizedState, f2.updateQueue = g2.updateQueue, f2.type = g2.type, a = g2.dependencies, f2.dependencies = a === null ? null : { lanes: a.lanes, firstContext: a.firstContext }), c = c.sibling;
|
|
|
I(P, P.current & 1 | 2);
|
|
|
return b.child;
|
|
|
}
|
|
|
a = a.sibling;
|
|
|
}
|
|
|
d.tail !== null && O() > Ji && (b.flags |= 64, f2 = true, Fi(d, false), b.lanes = 33554432);
|
|
|
}
|
|
|
else {
|
|
|
if (!f2)
|
|
|
if (a = ih(g2), a !== null) {
|
|
|
if (b.flags |= 64, f2 = true, c = a.updateQueue, c !== null && (b.updateQueue = c, b.flags |= 4), Fi(d, true), d.tail === null && d.tailMode === "hidden" && !g2.alternate && !lh)
|
|
|
return b = b.lastEffect = d.lastEffect, b !== null && (b.nextEffect = null), null;
|
|
|
} else
|
|
|
2 * O() - d.renderingStartTime > Ji && c !== 1073741824 && (b.flags |= 64, f2 = true, Fi(d, false), b.lanes = 33554432);
|
|
|
d.isBackwards ? (g2.sibling = b.child, b.child = g2) : (c = d.last, c !== null ? c.sibling = g2 : b.child = g2, d.last = g2);
|
|
|
}
|
|
|
return d.tail !== null ? (c = d.tail, d.rendering = c, d.tail = c.sibling, d.lastEffect = b.lastEffect, d.renderingStartTime = O(), c.sibling = null, b = P.current, I(P, f2 ? b & 1 | 2 : b & 1), c) : null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return Ki(), a !== null && a.memoizedState !== null !== (b.memoizedState !== null) && d.mode !== "unstable-defer-without-hiding" && (b.flags |= 4), null;
|
|
|
}
|
|
|
throw Error(y(156, b.tag));
|
|
|
}
|
|
|
function Li(a) {
|
|
|
switch (a.tag) {
|
|
|
case 1:
|
|
|
Ff(a.type) && Gf();
|
|
|
var b = a.flags;
|
|
|
return b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
b = a.flags;
|
|
|
if ((b & 64) !== 0)
|
|
|
throw Error(y(285));
|
|
|
a.flags = b & -4097 | 64;
|
|
|
return a;
|
|
|
case 5:
|
|
|
return hh(a), null;
|
|
|
case 13:
|
|
|
return H(P), b = a.flags, b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
|
|
|
case 19:
|
|
|
return H(P), null;
|
|
|
case 4:
|
|
|
return fh(), null;
|
|
|
case 10:
|
|
|
return rg(a), null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return Ki(), null;
|
|
|
default:
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
function Mi(a, b) {
|
|
|
try {
|
|
|
var c = "", d = b;
|
|
|
do
|
|
|
c += Qa(d), d = d.return;
|
|
|
while (d);
|
|
|
var e = c;
|
|
|
} catch (f2) {
|
|
|
e = "\nError generating stack: " + f2.message + "\n" + f2.stack;
|
|
|
}
|
|
|
return { value: a, source: b, stack: e };
|
|
|
}
|
|
|
function Ni(a, b) {
|
|
|
try {
|
|
|
console.error(b.value);
|
|
|
} catch (c) {
|
|
|
setTimeout(function() {
|
|
|
throw c;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
var Oi = typeof WeakMap === "function" ? WeakMap : Map;
|
|
|
function Pi(a, b, c) {
|
|
|
c = zg(-1, c);
|
|
|
c.tag = 3;
|
|
|
c.payload = { element: null };
|
|
|
var d = b.value;
|
|
|
c.callback = function() {
|
|
|
Qi || (Qi = true, Ri = d);
|
|
|
Ni(a, b);
|
|
|
};
|
|
|
return c;
|
|
|
}
|
|
|
function Si(a, b, c) {
|
|
|
c = zg(-1, c);
|
|
|
c.tag = 3;
|
|
|
var d = a.type.getDerivedStateFromError;
|
|
|
if (typeof d === "function") {
|
|
|
var e = b.value;
|
|
|
c.payload = function() {
|
|
|
Ni(a, b);
|
|
|
return d(e);
|
|
|
};
|
|
|
}
|
|
|
var f2 = a.stateNode;
|
|
|
f2 !== null && typeof f2.componentDidCatch === "function" && (c.callback = function() {
|
|
|
typeof d !== "function" && (Ti === null ? Ti = new Set([this]) : Ti.add(this), Ni(a, b));
|
|
|
var c2 = b.stack;
|
|
|
this.componentDidCatch(b.value, { componentStack: c2 !== null ? c2 : "" });
|
|
|
});
|
|
|
return c;
|
|
|
}
|
|
|
var Ui = typeof WeakSet === "function" ? WeakSet : Set;
|
|
|
function Vi(a) {
|
|
|
var b = a.ref;
|
|
|
if (b !== null)
|
|
|
if (typeof b === "function")
|
|
|
try {
|
|
|
b(null);
|
|
|
} catch (c) {
|
|
|
Wi(a, c);
|
|
|
}
|
|
|
else
|
|
|
b.current = null;
|
|
|
}
|
|
|
function Xi(a, b) {
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
return;
|
|
|
case 1:
|
|
|
if (b.flags & 256 && a !== null) {
|
|
|
var c = a.memoizedProps, d = a.memoizedState;
|
|
|
a = b.stateNode;
|
|
|
b = a.getSnapshotBeforeUpdate(b.elementType === b.type ? c : lg(b.type, c), d);
|
|
|
a.__reactInternalSnapshotBeforeUpdate = b;
|
|
|
}
|
|
|
return;
|
|
|
case 3:
|
|
|
b.flags & 256 && qf(b.stateNode.containerInfo);
|
|
|
return;
|
|
|
case 5:
|
|
|
case 6:
|
|
|
case 4:
|
|
|
case 17:
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function Yi(a, b, c) {
|
|
|
switch (c.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
b = c.updateQueue;
|
|
|
b = b !== null ? b.lastEffect : null;
|
|
|
if (b !== null) {
|
|
|
a = b = b.next;
|
|
|
do {
|
|
|
if ((a.tag & 3) === 3) {
|
|
|
var d = a.create;
|
|
|
a.destroy = d();
|
|
|
}
|
|
|
a = a.next;
|
|
|
} while (a !== b);
|
|
|
}
|
|
|
b = c.updateQueue;
|
|
|
b = b !== null ? b.lastEffect : null;
|
|
|
if (b !== null) {
|
|
|
a = b = b.next;
|
|
|
do {
|
|
|
var e = a;
|
|
|
d = e.next;
|
|
|
e = e.tag;
|
|
|
(e & 4) !== 0 && (e & 1) !== 0 && (Zi(c, a), $i(c, a));
|
|
|
a = d;
|
|
|
} while (a !== b);
|
|
|
}
|
|
|
return;
|
|
|
case 1:
|
|
|
a = c.stateNode;
|
|
|
c.flags & 4 && (b === null ? a.componentDidMount() : (d = c.elementType === c.type ? b.memoizedProps : lg(c.type, b.memoizedProps), a.componentDidUpdate(d, b.memoizedState, a.__reactInternalSnapshotBeforeUpdate)));
|
|
|
b = c.updateQueue;
|
|
|
b !== null && Eg(c, b, a);
|
|
|
return;
|
|
|
case 3:
|
|
|
b = c.updateQueue;
|
|
|
if (b !== null) {
|
|
|
a = null;
|
|
|
if (c.child !== null)
|
|
|
switch (c.child.tag) {
|
|
|
case 5:
|
|
|
a = c.child.stateNode;
|
|
|
break;
|
|
|
case 1:
|
|
|
a = c.child.stateNode;
|
|
|
}
|
|
|
Eg(c, b, a);
|
|
|
}
|
|
|
return;
|
|
|
case 5:
|
|
|
a = c.stateNode;
|
|
|
b === null && c.flags & 4 && mf(c.type, c.memoizedProps) && a.focus();
|
|
|
return;
|
|
|
case 6:
|
|
|
return;
|
|
|
case 4:
|
|
|
return;
|
|
|
case 12:
|
|
|
return;
|
|
|
case 13:
|
|
|
c.memoizedState === null && (c = c.alternate, c !== null && (c = c.memoizedState, c !== null && (c = c.dehydrated, c !== null && Cc(c))));
|
|
|
return;
|
|
|
case 19:
|
|
|
case 17:
|
|
|
case 20:
|
|
|
case 21:
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function aj(a, b) {
|
|
|
for (var c = a; ; ) {
|
|
|
if (c.tag === 5) {
|
|
|
var d = c.stateNode;
|
|
|
if (b)
|
|
|
d = d.style, typeof d.setProperty === "function" ? d.setProperty("display", "none", "important") : d.display = "none";
|
|
|
else {
|
|
|
d = c.stateNode;
|
|
|
var e = c.memoizedProps.style;
|
|
|
e = e !== void 0 && e !== null && e.hasOwnProperty("display") ? e.display : null;
|
|
|
d.style.display = sb("display", e);
|
|
|
}
|
|
|
} else if (c.tag === 6)
|
|
|
c.stateNode.nodeValue = b ? "" : c.memoizedProps;
|
|
|
else if ((c.tag !== 23 && c.tag !== 24 || c.memoizedState === null || c === a) && c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === a)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === a)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
}
|
|
|
function bj(a, b) {
|
|
|
if (Mf && typeof Mf.onCommitFiberUnmount === "function")
|
|
|
try {
|
|
|
Mf.onCommitFiberUnmount(Lf, b);
|
|
|
} catch (f2) {
|
|
|
}
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 14:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
a = b.updateQueue;
|
|
|
if (a !== null && (a = a.lastEffect, a !== null)) {
|
|
|
var c = a = a.next;
|
|
|
do {
|
|
|
var d = c, e = d.destroy;
|
|
|
d = d.tag;
|
|
|
if (e !== void 0)
|
|
|
if ((d & 4) !== 0)
|
|
|
Zi(b, c);
|
|
|
else {
|
|
|
d = b;
|
|
|
try {
|
|
|
e();
|
|
|
} catch (f2) {
|
|
|
Wi(d, f2);
|
|
|
}
|
|
|
}
|
|
|
c = c.next;
|
|
|
} while (c !== a);
|
|
|
}
|
|
|
break;
|
|
|
case 1:
|
|
|
Vi(b);
|
|
|
a = b.stateNode;
|
|
|
if (typeof a.componentWillUnmount === "function")
|
|
|
try {
|
|
|
a.props = b.memoizedProps, a.state = b.memoizedState, a.componentWillUnmount();
|
|
|
} catch (f2) {
|
|
|
Wi(b, f2);
|
|
|
}
|
|
|
break;
|
|
|
case 5:
|
|
|
Vi(b);
|
|
|
break;
|
|
|
case 4:
|
|
|
cj(a, b);
|
|
|
}
|
|
|
}
|
|
|
function dj(a) {
|
|
|
a.alternate = null;
|
|
|
a.child = null;
|
|
|
a.dependencies = null;
|
|
|
a.firstEffect = null;
|
|
|
a.lastEffect = null;
|
|
|
a.memoizedProps = null;
|
|
|
a.memoizedState = null;
|
|
|
a.pendingProps = null;
|
|
|
a.return = null;
|
|
|
a.updateQueue = null;
|
|
|
}
|
|
|
function ej(a) {
|
|
|
return a.tag === 5 || a.tag === 3 || a.tag === 4;
|
|
|
}
|
|
|
function fj(a) {
|
|
|
a: {
|
|
|
for (var b = a.return; b !== null; ) {
|
|
|
if (ej(b))
|
|
|
break a;
|
|
|
b = b.return;
|
|
|
}
|
|
|
throw Error(y(160));
|
|
|
}
|
|
|
var c = b;
|
|
|
b = c.stateNode;
|
|
|
switch (c.tag) {
|
|
|
case 5:
|
|
|
var d = false;
|
|
|
break;
|
|
|
case 3:
|
|
|
b = b.containerInfo;
|
|
|
d = true;
|
|
|
break;
|
|
|
case 4:
|
|
|
b = b.containerInfo;
|
|
|
d = true;
|
|
|
break;
|
|
|
default:
|
|
|
throw Error(y(161));
|
|
|
}
|
|
|
c.flags & 16 && (pb(b, ""), c.flags &= -17);
|
|
|
a:
|
|
|
b:
|
|
|
for (c = a; ; ) {
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || ej(c.return)) {
|
|
|
c = null;
|
|
|
break a;
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
for (c = c.sibling; c.tag !== 5 && c.tag !== 6 && c.tag !== 18; ) {
|
|
|
if (c.flags & 2)
|
|
|
continue b;
|
|
|
if (c.child === null || c.tag === 4)
|
|
|
continue b;
|
|
|
else
|
|
|
c.child.return = c, c = c.child;
|
|
|
}
|
|
|
if (!(c.flags & 2)) {
|
|
|
c = c.stateNode;
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
d ? gj(a, c, b) : hj(a, c, b);
|
|
|
}
|
|
|
function gj(a, b, c) {
|
|
|
var d = a.tag, e = d === 5 || d === 6;
|
|
|
if (e)
|
|
|
a = e ? a.stateNode : a.stateNode.instance, b ? c.nodeType === 8 ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (c.nodeType === 8 ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, c !== null && c !== void 0 || b.onclick !== null || (b.onclick = jf));
|
|
|
else if (d !== 4 && (a = a.child, a !== null))
|
|
|
for (gj(a, b, c), a = a.sibling; a !== null; )
|
|
|
gj(a, b, c), a = a.sibling;
|
|
|
}
|
|
|
function hj(a, b, c) {
|
|
|
var d = a.tag, e = d === 5 || d === 6;
|
|
|
if (e)
|
|
|
a = e ? a.stateNode : a.stateNode.instance, b ? c.insertBefore(a, b) : c.appendChild(a);
|
|
|
else if (d !== 4 && (a = a.child, a !== null))
|
|
|
for (hj(a, b, c), a = a.sibling; a !== null; )
|
|
|
hj(a, b, c), a = a.sibling;
|
|
|
}
|
|
|
function cj(a, b) {
|
|
|
for (var c = b, d = false, e, f2; ; ) {
|
|
|
if (!d) {
|
|
|
d = c.return;
|
|
|
a:
|
|
|
for (; ; ) {
|
|
|
if (d === null)
|
|
|
throw Error(y(160));
|
|
|
e = d.stateNode;
|
|
|
switch (d.tag) {
|
|
|
case 5:
|
|
|
f2 = false;
|
|
|
break a;
|
|
|
case 3:
|
|
|
e = e.containerInfo;
|
|
|
f2 = true;
|
|
|
break a;
|
|
|
case 4:
|
|
|
e = e.containerInfo;
|
|
|
f2 = true;
|
|
|
break a;
|
|
|
}
|
|
|
d = d.return;
|
|
|
}
|
|
|
d = true;
|
|
|
}
|
|
|
if (c.tag === 5 || c.tag === 6) {
|
|
|
a:
|
|
|
for (var g2 = a, h2 = c, k = h2; ; )
|
|
|
if (bj(g2, k), k.child !== null && k.tag !== 4)
|
|
|
k.child.return = k, k = k.child;
|
|
|
else {
|
|
|
if (k === h2)
|
|
|
break a;
|
|
|
for (; k.sibling === null; ) {
|
|
|
if (k.return === null || k.return === h2)
|
|
|
break a;
|
|
|
k = k.return;
|
|
|
}
|
|
|
k.sibling.return = k.return;
|
|
|
k = k.sibling;
|
|
|
}
|
|
|
f2 ? (g2 = e, h2 = c.stateNode, g2.nodeType === 8 ? g2.parentNode.removeChild(h2) : g2.removeChild(h2)) : e.removeChild(c.stateNode);
|
|
|
} else if (c.tag === 4) {
|
|
|
if (c.child !== null) {
|
|
|
e = c.stateNode.containerInfo;
|
|
|
f2 = true;
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
} else if (bj(a, c), c.child !== null) {
|
|
|
c.child.return = c;
|
|
|
c = c.child;
|
|
|
continue;
|
|
|
}
|
|
|
if (c === b)
|
|
|
break;
|
|
|
for (; c.sibling === null; ) {
|
|
|
if (c.return === null || c.return === b)
|
|
|
return;
|
|
|
c = c.return;
|
|
|
c.tag === 4 && (d = false);
|
|
|
}
|
|
|
c.sibling.return = c.return;
|
|
|
c = c.sibling;
|
|
|
}
|
|
|
}
|
|
|
function ij(a, b) {
|
|
|
switch (b.tag) {
|
|
|
case 0:
|
|
|
case 11:
|
|
|
case 14:
|
|
|
case 15:
|
|
|
case 22:
|
|
|
var c = b.updateQueue;
|
|
|
c = c !== null ? c.lastEffect : null;
|
|
|
if (c !== null) {
|
|
|
var d = c = c.next;
|
|
|
do
|
|
|
(d.tag & 3) === 3 && (a = d.destroy, d.destroy = void 0, a !== void 0 && a()), d = d.next;
|
|
|
while (d !== c);
|
|
|
}
|
|
|
return;
|
|
|
case 1:
|
|
|
return;
|
|
|
case 5:
|
|
|
c = b.stateNode;
|
|
|
if (c != null) {
|
|
|
d = b.memoizedProps;
|
|
|
var e = a !== null ? a.memoizedProps : d;
|
|
|
a = b.type;
|
|
|
var f2 = b.updateQueue;
|
|
|
b.updateQueue = null;
|
|
|
if (f2 !== null) {
|
|
|
c[xf] = d;
|
|
|
a === "input" && d.type === "radio" && d.name != null && $a(c, d);
|
|
|
wb(a, e);
|
|
|
b = wb(a, d);
|
|
|
for (e = 0; e < f2.length; e += 2) {
|
|
|
var g2 = f2[e], h2 = f2[e + 1];
|
|
|
g2 === "style" ? tb(c, h2) : g2 === "dangerouslySetInnerHTML" ? ob(c, h2) : g2 === "children" ? pb(c, h2) : qa(c, g2, h2, b);
|
|
|
}
|
|
|
switch (a) {
|
|
|
case "input":
|
|
|
ab(c, d);
|
|
|
break;
|
|
|
case "textarea":
|
|
|
ib(c, d);
|
|
|
break;
|
|
|
case "select":
|
|
|
a = c._wrapperState.wasMultiple, c._wrapperState.wasMultiple = !!d.multiple, f2 = d.value, f2 != null ? fb(c, !!d.multiple, f2, false) : a !== !!d.multiple && (d.defaultValue != null ? fb(c, !!d.multiple, d.defaultValue, true) : fb(c, !!d.multiple, d.multiple ? [] : "", false));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return;
|
|
|
case 6:
|
|
|
if (b.stateNode === null)
|
|
|
throw Error(y(162));
|
|
|
b.stateNode.nodeValue = b.memoizedProps;
|
|
|
return;
|
|
|
case 3:
|
|
|
c = b.stateNode;
|
|
|
c.hydrate && (c.hydrate = false, Cc(c.containerInfo));
|
|
|
return;
|
|
|
case 12:
|
|
|
return;
|
|
|
case 13:
|
|
|
b.memoizedState !== null && (jj = O(), aj(b.child, true));
|
|
|
kj(b);
|
|
|
return;
|
|
|
case 19:
|
|
|
kj(b);
|
|
|
return;
|
|
|
case 17:
|
|
|
return;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
aj(b, b.memoizedState !== null);
|
|
|
return;
|
|
|
}
|
|
|
throw Error(y(163));
|
|
|
}
|
|
|
function kj(a) {
|
|
|
var b = a.updateQueue;
|
|
|
if (b !== null) {
|
|
|
a.updateQueue = null;
|
|
|
var c = a.stateNode;
|
|
|
c === null && (c = a.stateNode = new Ui());
|
|
|
b.forEach(function(b2) {
|
|
|
var d = lj.bind(null, a, b2);
|
|
|
c.has(b2) || (c.add(b2), b2.then(d, d));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function mj(a, b) {
|
|
|
return a !== null && (a = a.memoizedState, a === null || a.dehydrated !== null) ? (b = b.memoizedState, b !== null && b.dehydrated === null) : false;
|
|
|
}
|
|
|
var nj = Math.ceil, oj = ra.ReactCurrentDispatcher, pj = ra.ReactCurrentOwner, X = 0, U = null, Y = null, W = 0, qj = 0, rj = Bf(0), V = 0, sj = null, tj = 0, Dg = 0, Hi = 0, uj = 0, vj = null, jj = 0, Ji = Infinity;
|
|
|
function wj() {
|
|
|
Ji = O() + 500;
|
|
|
}
|
|
|
var Z = null, Qi = false, Ri = null, Ti = null, xj = false, yj = null, zj = 90, Aj = [], Bj = [], Cj = null, Dj = 0, Ej = null, Fj = -1, Gj = 0, Hj = 0, Ij = null, Jj = false;
|
|
|
function Hg() {
|
|
|
return (X & 48) !== 0 ? O() : Fj !== -1 ? Fj : Fj = O();
|
|
|
}
|
|
|
function Ig(a) {
|
|
|
a = a.mode;
|
|
|
if ((a & 2) === 0)
|
|
|
return 1;
|
|
|
if ((a & 4) === 0)
|
|
|
return eg() === 99 ? 1 : 2;
|
|
|
Gj === 0 && (Gj = tj);
|
|
|
if (kg.transition !== 0) {
|
|
|
Hj !== 0 && (Hj = vj !== null ? vj.pendingLanes : 0);
|
|
|
a = Gj;
|
|
|
var b = 4186112 & ~Hj;
|
|
|
b &= -b;
|
|
|
b === 0 && (a = 4186112 & ~a, b = a & -a, b === 0 && (b = 8192));
|
|
|
return b;
|
|
|
}
|
|
|
a = eg();
|
|
|
(X & 4) !== 0 && a === 98 ? a = Xc(12, Gj) : (a = Sc(a), a = Xc(a, Gj));
|
|
|
return a;
|
|
|
}
|
|
|
function Jg(a, b, c) {
|
|
|
if (50 < Dj)
|
|
|
throw Dj = 0, Ej = null, Error(y(185));
|
|
|
a = Kj(a, b);
|
|
|
if (a === null)
|
|
|
return null;
|
|
|
$c(a, b, c);
|
|
|
a === U && (Hi |= b, V === 4 && Ii(a, W));
|
|
|
var d = eg();
|
|
|
b === 1 ? (X & 8) !== 0 && (X & 48) === 0 ? Lj(a) : (Mj(a, c), X === 0 && (wj(), ig())) : ((X & 4) === 0 || d !== 98 && d !== 99 || (Cj === null ? Cj = new Set([a]) : Cj.add(a)), Mj(a, c));
|
|
|
vj = a;
|
|
|
}
|
|
|
function Kj(a, b) {
|
|
|
a.lanes |= b;
|
|
|
var c = a.alternate;
|
|
|
c !== null && (c.lanes |= b);
|
|
|
c = a;
|
|
|
for (a = a.return; a !== null; )
|
|
|
a.childLanes |= b, c = a.alternate, c !== null && (c.childLanes |= b), c = a, a = a.return;
|
|
|
return c.tag === 3 ? c.stateNode : null;
|
|
|
}
|
|
|
function Mj(a, b) {
|
|
|
for (var c = a.callbackNode, d = a.suspendedLanes, e = a.pingedLanes, f2 = a.expirationTimes, g2 = a.pendingLanes; 0 < g2; ) {
|
|
|
var h2 = 31 - Vc(g2), k = 1 << h2, l2 = f2[h2];
|
|
|
if (l2 === -1) {
|
|
|
if ((k & d) === 0 || (k & e) !== 0) {
|
|
|
l2 = b;
|
|
|
Rc(k);
|
|
|
var n2 = F;
|
|
|
f2[h2] = 10 <= n2 ? l2 + 250 : 6 <= n2 ? l2 + 5e3 : -1;
|
|
|
}
|
|
|
} else
|
|
|
l2 <= b && (a.expiredLanes |= k);
|
|
|
g2 &= ~k;
|
|
|
}
|
|
|
d = Uc(a, a === U ? W : 0);
|
|
|
b = F;
|
|
|
if (d === 0)
|
|
|
c !== null && (c !== Zf && Pf(c), a.callbackNode = null, a.callbackPriority = 0);
|
|
|
else {
|
|
|
if (c !== null) {
|
|
|
if (a.callbackPriority === b)
|
|
|
return;
|
|
|
c !== Zf && Pf(c);
|
|
|
}
|
|
|
b === 15 ? (c = Lj.bind(null, a), ag === null ? (ag = [c], bg = Of(Uf, jg)) : ag.push(c), c = Zf) : b === 14 ? c = hg(99, Lj.bind(null, a)) : (c = Tc(b), c = hg(c, Nj.bind(null, a)));
|
|
|
a.callbackPriority = b;
|
|
|
a.callbackNode = c;
|
|
|
}
|
|
|
}
|
|
|
function Nj(a) {
|
|
|
Fj = -1;
|
|
|
Hj = Gj = 0;
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
var b = a.callbackNode;
|
|
|
if (Oj() && a.callbackNode !== b)
|
|
|
return null;
|
|
|
var c = Uc(a, a === U ? W : 0);
|
|
|
if (c === 0)
|
|
|
return null;
|
|
|
var d = c;
|
|
|
var e = X;
|
|
|
X |= 16;
|
|
|
var f2 = Pj();
|
|
|
if (U !== a || W !== d)
|
|
|
wj(), Qj(a, d);
|
|
|
do
|
|
|
try {
|
|
|
Rj();
|
|
|
break;
|
|
|
} catch (h2) {
|
|
|
Sj(a, h2);
|
|
|
}
|
|
|
while (1);
|
|
|
qg();
|
|
|
oj.current = f2;
|
|
|
X = e;
|
|
|
Y !== null ? d = 0 : (U = null, W = 0, d = V);
|
|
|
if ((tj & Hi) !== 0)
|
|
|
Qj(a, 0);
|
|
|
else if (d !== 0) {
|
|
|
d === 2 && (X |= 64, a.hydrate && (a.hydrate = false, qf(a.containerInfo)), c = Wc(a), c !== 0 && (d = Tj(a, c)));
|
|
|
if (d === 1)
|
|
|
throw b = sj, Qj(a, 0), Ii(a, c), Mj(a, O()), b;
|
|
|
a.finishedWork = a.current.alternate;
|
|
|
a.finishedLanes = c;
|
|
|
switch (d) {
|
|
|
case 0:
|
|
|
case 1:
|
|
|
throw Error(y(345));
|
|
|
case 2:
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 3:
|
|
|
Ii(a, c);
|
|
|
if ((c & 62914560) === c && (d = jj + 500 - O(), 10 < d)) {
|
|
|
if (Uc(a, 0) !== 0)
|
|
|
break;
|
|
|
e = a.suspendedLanes;
|
|
|
if ((e & c) !== c) {
|
|
|
Hg();
|
|
|
a.pingedLanes |= a.suspendedLanes & e;
|
|
|
break;
|
|
|
}
|
|
|
a.timeoutHandle = of(Uj.bind(null, a), d);
|
|
|
break;
|
|
|
}
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 4:
|
|
|
Ii(a, c);
|
|
|
if ((c & 4186112) === c)
|
|
|
break;
|
|
|
d = a.eventTimes;
|
|
|
for (e = -1; 0 < c; ) {
|
|
|
var g2 = 31 - Vc(c);
|
|
|
f2 = 1 << g2;
|
|
|
g2 = d[g2];
|
|
|
g2 > e && (e = g2);
|
|
|
c &= ~f2;
|
|
|
}
|
|
|
c = e;
|
|
|
c = O() - c;
|
|
|
c = (120 > c ? 120 : 480 > c ? 480 : 1080 > c ? 1080 : 1920 > c ? 1920 : 3e3 > c ? 3e3 : 4320 > c ? 4320 : 1960 * nj(c / 1960)) - c;
|
|
|
if (10 < c) {
|
|
|
a.timeoutHandle = of(Uj.bind(null, a), c);
|
|
|
break;
|
|
|
}
|
|
|
Uj(a);
|
|
|
break;
|
|
|
case 5:
|
|
|
Uj(a);
|
|
|
break;
|
|
|
default:
|
|
|
throw Error(y(329));
|
|
|
}
|
|
|
}
|
|
|
Mj(a, O());
|
|
|
return a.callbackNode === b ? Nj.bind(null, a) : null;
|
|
|
}
|
|
|
function Ii(a, b) {
|
|
|
b &= ~uj;
|
|
|
b &= ~Hi;
|
|
|
a.suspendedLanes |= b;
|
|
|
a.pingedLanes &= ~b;
|
|
|
for (a = a.expirationTimes; 0 < b; ) {
|
|
|
var c = 31 - Vc(b), d = 1 << c;
|
|
|
a[c] = -1;
|
|
|
b &= ~d;
|
|
|
}
|
|
|
}
|
|
|
function Lj(a) {
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
Oj();
|
|
|
if (a === U && (a.expiredLanes & W) !== 0) {
|
|
|
var b = W;
|
|
|
var c = Tj(a, b);
|
|
|
(tj & Hi) !== 0 && (b = Uc(a, b), c = Tj(a, b));
|
|
|
} else
|
|
|
b = Uc(a, 0), c = Tj(a, b);
|
|
|
a.tag !== 0 && c === 2 && (X |= 64, a.hydrate && (a.hydrate = false, qf(a.containerInfo)), b = Wc(a), b !== 0 && (c = Tj(a, b)));
|
|
|
if (c === 1)
|
|
|
throw c = sj, Qj(a, 0), Ii(a, b), Mj(a, O()), c;
|
|
|
a.finishedWork = a.current.alternate;
|
|
|
a.finishedLanes = b;
|
|
|
Uj(a);
|
|
|
Mj(a, O());
|
|
|
return null;
|
|
|
}
|
|
|
function Vj() {
|
|
|
if (Cj !== null) {
|
|
|
var a = Cj;
|
|
|
Cj = null;
|
|
|
a.forEach(function(a2) {
|
|
|
a2.expiredLanes |= 24 & a2.pendingLanes;
|
|
|
Mj(a2, O());
|
|
|
});
|
|
|
}
|
|
|
ig();
|
|
|
}
|
|
|
function Wj(a, b) {
|
|
|
var c = X;
|
|
|
X |= 1;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
}
|
|
|
function Xj(a, b) {
|
|
|
var c = X;
|
|
|
X &= -2;
|
|
|
X |= 8;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
}
|
|
|
function ni(a, b) {
|
|
|
I(rj, qj);
|
|
|
qj |= b;
|
|
|
tj |= b;
|
|
|
}
|
|
|
function Ki() {
|
|
|
qj = rj.current;
|
|
|
H(rj);
|
|
|
}
|
|
|
function Qj(a, b) {
|
|
|
a.finishedWork = null;
|
|
|
a.finishedLanes = 0;
|
|
|
var c = a.timeoutHandle;
|
|
|
c !== -1 && (a.timeoutHandle = -1, pf(c));
|
|
|
if (Y !== null)
|
|
|
for (c = Y.return; c !== null; ) {
|
|
|
var d = c;
|
|
|
switch (d.tag) {
|
|
|
case 1:
|
|
|
d = d.type.childContextTypes;
|
|
|
d !== null && d !== void 0 && Gf();
|
|
|
break;
|
|
|
case 3:
|
|
|
fh();
|
|
|
H(N);
|
|
|
H(M);
|
|
|
uh();
|
|
|
break;
|
|
|
case 5:
|
|
|
hh(d);
|
|
|
break;
|
|
|
case 4:
|
|
|
fh();
|
|
|
break;
|
|
|
case 13:
|
|
|
H(P);
|
|
|
break;
|
|
|
case 19:
|
|
|
H(P);
|
|
|
break;
|
|
|
case 10:
|
|
|
rg(d);
|
|
|
break;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
Ki();
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
U = a;
|
|
|
Y = Tg(a.current, null);
|
|
|
W = qj = tj = b;
|
|
|
V = 0;
|
|
|
sj = null;
|
|
|
uj = Hi = Dg = 0;
|
|
|
}
|
|
|
function Sj(a, b) {
|
|
|
do {
|
|
|
var c = Y;
|
|
|
try {
|
|
|
qg();
|
|
|
vh.current = Gh;
|
|
|
if (yh) {
|
|
|
for (var d = R.memoizedState; d !== null; ) {
|
|
|
var e = d.queue;
|
|
|
e !== null && (e.pending = null);
|
|
|
d = d.next;
|
|
|
}
|
|
|
yh = false;
|
|
|
}
|
|
|
xh = 0;
|
|
|
T = S = R = null;
|
|
|
zh = false;
|
|
|
pj.current = null;
|
|
|
if (c === null || c.return === null) {
|
|
|
V = 1;
|
|
|
sj = b;
|
|
|
Y = null;
|
|
|
break;
|
|
|
}
|
|
|
a: {
|
|
|
var f2 = a, g2 = c.return, h2 = c, k = b;
|
|
|
b = W;
|
|
|
h2.flags |= 2048;
|
|
|
h2.firstEffect = h2.lastEffect = null;
|
|
|
if (k !== null && typeof k === "object" && typeof k.then === "function") {
|
|
|
var l2 = k;
|
|
|
if ((h2.mode & 2) === 0) {
|
|
|
var n2 = h2.alternate;
|
|
|
n2 ? (h2.updateQueue = n2.updateQueue, h2.memoizedState = n2.memoizedState, h2.lanes = n2.lanes) : (h2.updateQueue = null, h2.memoizedState = null);
|
|
|
}
|
|
|
var A2 = (P.current & 1) !== 0, p2 = g2;
|
|
|
do {
|
|
|
var C2;
|
|
|
if (C2 = p2.tag === 13) {
|
|
|
var x2 = p2.memoizedState;
|
|
|
if (x2 !== null)
|
|
|
C2 = x2.dehydrated !== null ? true : false;
|
|
|
else {
|
|
|
var w2 = p2.memoizedProps;
|
|
|
C2 = w2.fallback === void 0 ? false : w2.unstable_avoidThisFallback !== true ? true : A2 ? false : true;
|
|
|
}
|
|
|
}
|
|
|
if (C2) {
|
|
|
var z2 = p2.updateQueue;
|
|
|
if (z2 === null) {
|
|
|
var u2 = new Set();
|
|
|
u2.add(l2);
|
|
|
p2.updateQueue = u2;
|
|
|
} else
|
|
|
z2.add(l2);
|
|
|
if ((p2.mode & 2) === 0) {
|
|
|
p2.flags |= 64;
|
|
|
h2.flags |= 16384;
|
|
|
h2.flags &= -2981;
|
|
|
if (h2.tag === 1)
|
|
|
if (h2.alternate === null)
|
|
|
h2.tag = 17;
|
|
|
else {
|
|
|
var t2 = zg(-1, 1);
|
|
|
t2.tag = 2;
|
|
|
Ag(h2, t2);
|
|
|
}
|
|
|
h2.lanes |= 1;
|
|
|
break a;
|
|
|
}
|
|
|
k = void 0;
|
|
|
h2 = b;
|
|
|
var q2 = f2.pingCache;
|
|
|
q2 === null ? (q2 = f2.pingCache = new Oi(), k = new Set(), q2.set(l2, k)) : (k = q2.get(l2), k === void 0 && (k = new Set(), q2.set(l2, k)));
|
|
|
if (!k.has(h2)) {
|
|
|
k.add(h2);
|
|
|
var v2 = Yj.bind(null, f2, l2, h2);
|
|
|
l2.then(v2, v2);
|
|
|
}
|
|
|
p2.flags |= 4096;
|
|
|
p2.lanes = b;
|
|
|
break a;
|
|
|
}
|
|
|
p2 = p2.return;
|
|
|
} while (p2 !== null);
|
|
|
k = Error((Ra(h2.type) || "A React component") + " suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.");
|
|
|
}
|
|
|
V !== 5 && (V = 2);
|
|
|
k = Mi(k, h2);
|
|
|
p2 = g2;
|
|
|
do {
|
|
|
switch (p2.tag) {
|
|
|
case 3:
|
|
|
f2 = k;
|
|
|
p2.flags |= 4096;
|
|
|
b &= -b;
|
|
|
p2.lanes |= b;
|
|
|
var J2 = Pi(p2, f2, b);
|
|
|
Bg(p2, J2);
|
|
|
break a;
|
|
|
case 1:
|
|
|
f2 = k;
|
|
|
var K2 = p2.type, Q2 = p2.stateNode;
|
|
|
if ((p2.flags & 64) === 0 && (typeof K2.getDerivedStateFromError === "function" || Q2 !== null && typeof Q2.componentDidCatch === "function" && (Ti === null || !Ti.has(Q2)))) {
|
|
|
p2.flags |= 4096;
|
|
|
b &= -b;
|
|
|
p2.lanes |= b;
|
|
|
var L2 = Si(p2, f2, b);
|
|
|
Bg(p2, L2);
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
p2 = p2.return;
|
|
|
} while (p2 !== null);
|
|
|
}
|
|
|
Zj(c);
|
|
|
} catch (va) {
|
|
|
b = va;
|
|
|
Y === c && c !== null && (Y = c = c.return);
|
|
|
continue;
|
|
|
}
|
|
|
break;
|
|
|
} while (1);
|
|
|
}
|
|
|
function Pj() {
|
|
|
var a = oj.current;
|
|
|
oj.current = Gh;
|
|
|
return a === null ? Gh : a;
|
|
|
}
|
|
|
function Tj(a, b) {
|
|
|
var c = X;
|
|
|
X |= 16;
|
|
|
var d = Pj();
|
|
|
U === a && W === b || Qj(a, b);
|
|
|
do
|
|
|
try {
|
|
|
ak();
|
|
|
break;
|
|
|
} catch (e) {
|
|
|
Sj(a, e);
|
|
|
}
|
|
|
while (1);
|
|
|
qg();
|
|
|
X = c;
|
|
|
oj.current = d;
|
|
|
if (Y !== null)
|
|
|
throw Error(y(261));
|
|
|
U = null;
|
|
|
W = 0;
|
|
|
return V;
|
|
|
}
|
|
|
function ak() {
|
|
|
for (; Y !== null; )
|
|
|
bk(Y);
|
|
|
}
|
|
|
function Rj() {
|
|
|
for (; Y !== null && !Qf(); )
|
|
|
bk(Y);
|
|
|
}
|
|
|
function bk(a) {
|
|
|
var b = ck(a.alternate, a, qj);
|
|
|
a.memoizedProps = a.pendingProps;
|
|
|
b === null ? Zj(a) : Y = b;
|
|
|
pj.current = null;
|
|
|
}
|
|
|
function Zj(a) {
|
|
|
var b = a;
|
|
|
do {
|
|
|
var c = b.alternate;
|
|
|
a = b.return;
|
|
|
if ((b.flags & 2048) === 0) {
|
|
|
c = Gi(c, b, qj);
|
|
|
if (c !== null) {
|
|
|
Y = c;
|
|
|
return;
|
|
|
}
|
|
|
c = b;
|
|
|
if (c.tag !== 24 && c.tag !== 23 || c.memoizedState === null || (qj & 1073741824) !== 0 || (c.mode & 4) === 0) {
|
|
|
for (var d = 0, e = c.child; e !== null; )
|
|
|
d |= e.lanes | e.childLanes, e = e.sibling;
|
|
|
c.childLanes = d;
|
|
|
}
|
|
|
a !== null && (a.flags & 2048) === 0 && (a.firstEffect === null && (a.firstEffect = b.firstEffect), b.lastEffect !== null && (a.lastEffect !== null && (a.lastEffect.nextEffect = b.firstEffect), a.lastEffect = b.lastEffect), 1 < b.flags && (a.lastEffect !== null ? a.lastEffect.nextEffect = b : a.firstEffect = b, a.lastEffect = b));
|
|
|
} else {
|
|
|
c = Li(b);
|
|
|
if (c !== null) {
|
|
|
c.flags &= 2047;
|
|
|
Y = c;
|
|
|
return;
|
|
|
}
|
|
|
a !== null && (a.firstEffect = a.lastEffect = null, a.flags |= 2048);
|
|
|
}
|
|
|
b = b.sibling;
|
|
|
if (b !== null) {
|
|
|
Y = b;
|
|
|
return;
|
|
|
}
|
|
|
Y = b = a;
|
|
|
} while (b !== null);
|
|
|
V === 0 && (V = 5);
|
|
|
}
|
|
|
function Uj(a) {
|
|
|
var b = eg();
|
|
|
gg(99, dk.bind(null, a, b));
|
|
|
return null;
|
|
|
}
|
|
|
function dk(a, b) {
|
|
|
do
|
|
|
Oj();
|
|
|
while (yj !== null);
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(327));
|
|
|
var c = a.finishedWork;
|
|
|
if (c === null)
|
|
|
return null;
|
|
|
a.finishedWork = null;
|
|
|
a.finishedLanes = 0;
|
|
|
if (c === a.current)
|
|
|
throw Error(y(177));
|
|
|
a.callbackNode = null;
|
|
|
var d = c.lanes | c.childLanes, e = d, f2 = a.pendingLanes & ~e;
|
|
|
a.pendingLanes = e;
|
|
|
a.suspendedLanes = 0;
|
|
|
a.pingedLanes = 0;
|
|
|
a.expiredLanes &= e;
|
|
|
a.mutableReadLanes &= e;
|
|
|
a.entangledLanes &= e;
|
|
|
e = a.entanglements;
|
|
|
for (var g2 = a.eventTimes, h2 = a.expirationTimes; 0 < f2; ) {
|
|
|
var k = 31 - Vc(f2), l2 = 1 << k;
|
|
|
e[k] = 0;
|
|
|
g2[k] = -1;
|
|
|
h2[k] = -1;
|
|
|
f2 &= ~l2;
|
|
|
}
|
|
|
Cj !== null && (d & 24) === 0 && Cj.has(a) && Cj.delete(a);
|
|
|
a === U && (Y = U = null, W = 0);
|
|
|
1 < c.flags ? c.lastEffect !== null ? (c.lastEffect.nextEffect = c, d = c.firstEffect) : d = c : d = c.firstEffect;
|
|
|
if (d !== null) {
|
|
|
e = X;
|
|
|
X |= 32;
|
|
|
pj.current = null;
|
|
|
kf = fd;
|
|
|
g2 = Ne();
|
|
|
if (Oe(g2)) {
|
|
|
if ("selectionStart" in g2)
|
|
|
h2 = { start: g2.selectionStart, end: g2.selectionEnd };
|
|
|
else
|
|
|
a:
|
|
|
if (h2 = (h2 = g2.ownerDocument) && h2.defaultView || window, (l2 = h2.getSelection && h2.getSelection()) && l2.rangeCount !== 0) {
|
|
|
h2 = l2.anchorNode;
|
|
|
f2 = l2.anchorOffset;
|
|
|
k = l2.focusNode;
|
|
|
l2 = l2.focusOffset;
|
|
|
try {
|
|
|
h2.nodeType, k.nodeType;
|
|
|
} catch (va) {
|
|
|
h2 = null;
|
|
|
break a;
|
|
|
}
|
|
|
var n2 = 0, A2 = -1, p2 = -1, C2 = 0, x2 = 0, w2 = g2, z2 = null;
|
|
|
b:
|
|
|
for (; ; ) {
|
|
|
for (var u2; ; ) {
|
|
|
w2 !== h2 || f2 !== 0 && w2.nodeType !== 3 || (A2 = n2 + f2);
|
|
|
w2 !== k || l2 !== 0 && w2.nodeType !== 3 || (p2 = n2 + l2);
|
|
|
w2.nodeType === 3 && (n2 += w2.nodeValue.length);
|
|
|
if ((u2 = w2.firstChild) === null)
|
|
|
break;
|
|
|
z2 = w2;
|
|
|
w2 = u2;
|
|
|
}
|
|
|
for (; ; ) {
|
|
|
if (w2 === g2)
|
|
|
break b;
|
|
|
z2 === h2 && ++C2 === f2 && (A2 = n2);
|
|
|
z2 === k && ++x2 === l2 && (p2 = n2);
|
|
|
if ((u2 = w2.nextSibling) !== null)
|
|
|
break;
|
|
|
w2 = z2;
|
|
|
z2 = w2.parentNode;
|
|
|
}
|
|
|
w2 = u2;
|
|
|
}
|
|
|
h2 = A2 === -1 || p2 === -1 ? null : { start: A2, end: p2 };
|
|
|
} else
|
|
|
h2 = null;
|
|
|
h2 = h2 || { start: 0, end: 0 };
|
|
|
} else
|
|
|
h2 = null;
|
|
|
lf = { focusedElem: g2, selectionRange: h2 };
|
|
|
fd = false;
|
|
|
Ij = null;
|
|
|
Jj = false;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
ek();
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
Ij = null;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
for (g2 = a; Z !== null; ) {
|
|
|
var t2 = Z.flags;
|
|
|
t2 & 16 && pb(Z.stateNode, "");
|
|
|
if (t2 & 128) {
|
|
|
var q2 = Z.alternate;
|
|
|
if (q2 !== null) {
|
|
|
var v2 = q2.ref;
|
|
|
v2 !== null && (typeof v2 === "function" ? v2(null) : v2.current = null);
|
|
|
}
|
|
|
}
|
|
|
switch (t2 & 1038) {
|
|
|
case 2:
|
|
|
fj(Z);
|
|
|
Z.flags &= -3;
|
|
|
break;
|
|
|
case 6:
|
|
|
fj(Z);
|
|
|
Z.flags &= -3;
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 1024:
|
|
|
Z.flags &= -1025;
|
|
|
break;
|
|
|
case 1028:
|
|
|
Z.flags &= -1025;
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 4:
|
|
|
ij(Z.alternate, Z);
|
|
|
break;
|
|
|
case 8:
|
|
|
h2 = Z;
|
|
|
cj(g2, h2);
|
|
|
var J2 = h2.alternate;
|
|
|
dj(h2);
|
|
|
J2 !== null && dj(J2);
|
|
|
}
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
v2 = lf;
|
|
|
q2 = Ne();
|
|
|
t2 = v2.focusedElem;
|
|
|
g2 = v2.selectionRange;
|
|
|
if (q2 !== t2 && t2 && t2.ownerDocument && Me(t2.ownerDocument.documentElement, t2)) {
|
|
|
g2 !== null && Oe(t2) && (q2 = g2.start, v2 = g2.end, v2 === void 0 && (v2 = q2), "selectionStart" in t2 ? (t2.selectionStart = q2, t2.selectionEnd = Math.min(v2, t2.value.length)) : (v2 = (q2 = t2.ownerDocument || document) && q2.defaultView || window, v2.getSelection && (v2 = v2.getSelection(), h2 = t2.textContent.length, J2 = Math.min(g2.start, h2), g2 = g2.end === void 0 ? J2 : Math.min(g2.end, h2), !v2.extend && J2 > g2 && (h2 = g2, g2 = J2, J2 = h2), h2 = Le(t2, J2), f2 = Le(t2, g2), h2 && f2 && (v2.rangeCount !== 1 || v2.anchorNode !== h2.node || v2.anchorOffset !== h2.offset || v2.focusNode !== f2.node || v2.focusOffset !== f2.offset) && (q2 = q2.createRange(), q2.setStart(h2.node, h2.offset), v2.removeAllRanges(), J2 > g2 ? (v2.addRange(q2), v2.extend(f2.node, f2.offset)) : (q2.setEnd(f2.node, f2.offset), v2.addRange(q2))))));
|
|
|
q2 = [];
|
|
|
for (v2 = t2; v2 = v2.parentNode; )
|
|
|
v2.nodeType === 1 && q2.push({ element: v2, left: v2.scrollLeft, top: v2.scrollTop });
|
|
|
typeof t2.focus === "function" && t2.focus();
|
|
|
for (t2 = 0; t2 < q2.length; t2++)
|
|
|
v2 = q2[t2], v2.element.scrollLeft = v2.left, v2.element.scrollTop = v2.top;
|
|
|
}
|
|
|
fd = !!kf;
|
|
|
lf = kf = null;
|
|
|
a.current = c;
|
|
|
Z = d;
|
|
|
do
|
|
|
try {
|
|
|
for (t2 = a; Z !== null; ) {
|
|
|
var K2 = Z.flags;
|
|
|
K2 & 36 && Yi(t2, Z.alternate, Z);
|
|
|
if (K2 & 128) {
|
|
|
q2 = void 0;
|
|
|
var Q2 = Z.ref;
|
|
|
if (Q2 !== null) {
|
|
|
var L2 = Z.stateNode;
|
|
|
switch (Z.tag) {
|
|
|
case 5:
|
|
|
q2 = L2;
|
|
|
break;
|
|
|
default:
|
|
|
q2 = L2;
|
|
|
}
|
|
|
typeof Q2 === "function" ? Q2(q2) : Q2.current = q2;
|
|
|
}
|
|
|
}
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
} catch (va) {
|
|
|
if (Z === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(Z, va);
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
while (Z !== null);
|
|
|
Z = null;
|
|
|
$f();
|
|
|
X = e;
|
|
|
} else
|
|
|
a.current = c;
|
|
|
if (xj)
|
|
|
xj = false, yj = a, zj = b;
|
|
|
else
|
|
|
for (Z = d; Z !== null; )
|
|
|
b = Z.nextEffect, Z.nextEffect = null, Z.flags & 8 && (K2 = Z, K2.sibling = null, K2.stateNode = null), Z = b;
|
|
|
d = a.pendingLanes;
|
|
|
d === 0 && (Ti = null);
|
|
|
d === 1 ? a === Ej ? Dj++ : (Dj = 0, Ej = a) : Dj = 0;
|
|
|
c = c.stateNode;
|
|
|
if (Mf && typeof Mf.onCommitFiberRoot === "function")
|
|
|
try {
|
|
|
Mf.onCommitFiberRoot(Lf, c, void 0, (c.current.flags & 64) === 64);
|
|
|
} catch (va) {
|
|
|
}
|
|
|
Mj(a, O());
|
|
|
if (Qi)
|
|
|
throw Qi = false, a = Ri, Ri = null, a;
|
|
|
if ((X & 8) !== 0)
|
|
|
return null;
|
|
|
ig();
|
|
|
return null;
|
|
|
}
|
|
|
function ek() {
|
|
|
for (; Z !== null; ) {
|
|
|
var a = Z.alternate;
|
|
|
Jj || Ij === null || ((Z.flags & 8) !== 0 ? dc(Z, Ij) && (Jj = true) : Z.tag === 13 && mj(a, Z) && dc(Z, Ij) && (Jj = true));
|
|
|
var b = Z.flags;
|
|
|
(b & 256) !== 0 && Xi(a, Z);
|
|
|
(b & 512) === 0 || xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
Z = Z.nextEffect;
|
|
|
}
|
|
|
}
|
|
|
function Oj() {
|
|
|
if (zj !== 90) {
|
|
|
var a = 97 < zj ? 97 : zj;
|
|
|
zj = 90;
|
|
|
return gg(a, fk);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function $i(a, b) {
|
|
|
Aj.push(b, a);
|
|
|
xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
}
|
|
|
function Zi(a, b) {
|
|
|
Bj.push(b, a);
|
|
|
xj || (xj = true, hg(97, function() {
|
|
|
Oj();
|
|
|
return null;
|
|
|
}));
|
|
|
}
|
|
|
function fk() {
|
|
|
if (yj === null)
|
|
|
return false;
|
|
|
var a = yj;
|
|
|
yj = null;
|
|
|
if ((X & 48) !== 0)
|
|
|
throw Error(y(331));
|
|
|
var b = X;
|
|
|
X |= 32;
|
|
|
var c = Bj;
|
|
|
Bj = [];
|
|
|
for (var d = 0; d < c.length; d += 2) {
|
|
|
var e = c[d], f2 = c[d + 1], g2 = e.destroy;
|
|
|
e.destroy = void 0;
|
|
|
if (typeof g2 === "function")
|
|
|
try {
|
|
|
g2();
|
|
|
} catch (k) {
|
|
|
if (f2 === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(f2, k);
|
|
|
}
|
|
|
}
|
|
|
c = Aj;
|
|
|
Aj = [];
|
|
|
for (d = 0; d < c.length; d += 2) {
|
|
|
e = c[d];
|
|
|
f2 = c[d + 1];
|
|
|
try {
|
|
|
var h2 = e.create;
|
|
|
e.destroy = h2();
|
|
|
} catch (k) {
|
|
|
if (f2 === null)
|
|
|
throw Error(y(330));
|
|
|
Wi(f2, k);
|
|
|
}
|
|
|
}
|
|
|
for (h2 = a.current.firstEffect; h2 !== null; )
|
|
|
a = h2.nextEffect, h2.nextEffect = null, h2.flags & 8 && (h2.sibling = null, h2.stateNode = null), h2 = a;
|
|
|
X = b;
|
|
|
ig();
|
|
|
return true;
|
|
|
}
|
|
|
function gk(a, b, c) {
|
|
|
b = Mi(c, b);
|
|
|
b = Pi(a, b, 1);
|
|
|
Ag(a, b);
|
|
|
b = Hg();
|
|
|
a = Kj(a, 1);
|
|
|
a !== null && ($c(a, 1, b), Mj(a, b));
|
|
|
}
|
|
|
function Wi(a, b) {
|
|
|
if (a.tag === 3)
|
|
|
gk(a, a, b);
|
|
|
else
|
|
|
for (var c = a.return; c !== null; ) {
|
|
|
if (c.tag === 3) {
|
|
|
gk(c, a, b);
|
|
|
break;
|
|
|
} else if (c.tag === 1) {
|
|
|
var d = c.stateNode;
|
|
|
if (typeof c.type.getDerivedStateFromError === "function" || typeof d.componentDidCatch === "function" && (Ti === null || !Ti.has(d))) {
|
|
|
a = Mi(b, a);
|
|
|
var e = Si(c, a, 1);
|
|
|
Ag(c, e);
|
|
|
e = Hg();
|
|
|
c = Kj(c, 1);
|
|
|
if (c !== null)
|
|
|
$c(c, 1, e), Mj(c, e);
|
|
|
else if (typeof d.componentDidCatch === "function" && (Ti === null || !Ti.has(d)))
|
|
|
try {
|
|
|
d.componentDidCatch(b, a);
|
|
|
} catch (f2) {
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
c = c.return;
|
|
|
}
|
|
|
}
|
|
|
function Yj(a, b, c) {
|
|
|
var d = a.pingCache;
|
|
|
d !== null && d.delete(b);
|
|
|
b = Hg();
|
|
|
a.pingedLanes |= a.suspendedLanes & c;
|
|
|
U === a && (W & c) === c && (V === 4 || V === 3 && (W & 62914560) === W && 500 > O() - jj ? Qj(a, 0) : uj |= c);
|
|
|
Mj(a, b);
|
|
|
}
|
|
|
function lj(a, b) {
|
|
|
var c = a.stateNode;
|
|
|
c !== null && c.delete(b);
|
|
|
b = 0;
|
|
|
b === 0 && (b = a.mode, (b & 2) === 0 ? b = 1 : (b & 4) === 0 ? b = eg() === 99 ? 1 : 2 : (Gj === 0 && (Gj = tj), b = Yc(62914560 & ~Gj), b === 0 && (b = 4194304)));
|
|
|
c = Hg();
|
|
|
a = Kj(a, b);
|
|
|
a !== null && ($c(a, b, c), Mj(a, c));
|
|
|
}
|
|
|
var ck;
|
|
|
ck = function(a, b, c) {
|
|
|
var d = b.lanes;
|
|
|
if (a !== null)
|
|
|
if (a.memoizedProps !== b.pendingProps || N.current)
|
|
|
ug = true;
|
|
|
else if ((c & d) !== 0)
|
|
|
ug = (a.flags & 16384) !== 0 ? true : false;
|
|
|
else {
|
|
|
ug = false;
|
|
|
switch (b.tag) {
|
|
|
case 3:
|
|
|
ri(b);
|
|
|
sh();
|
|
|
break;
|
|
|
case 5:
|
|
|
gh(b);
|
|
|
break;
|
|
|
case 1:
|
|
|
Ff(b.type) && Jf(b);
|
|
|
break;
|
|
|
case 4:
|
|
|
eh(b, b.stateNode.containerInfo);
|
|
|
break;
|
|
|
case 10:
|
|
|
d = b.memoizedProps.value;
|
|
|
var e = b.type._context;
|
|
|
I(mg, e._currentValue);
|
|
|
e._currentValue = d;
|
|
|
break;
|
|
|
case 13:
|
|
|
if (b.memoizedState !== null) {
|
|
|
if ((c & b.child.childLanes) !== 0)
|
|
|
return ti(a, b, c);
|
|
|
I(P, P.current & 1);
|
|
|
b = hi$1(a, b, c);
|
|
|
return b !== null ? b.sibling : null;
|
|
|
}
|
|
|
I(P, P.current & 1);
|
|
|
break;
|
|
|
case 19:
|
|
|
d = (c & b.childLanes) !== 0;
|
|
|
if ((a.flags & 64) !== 0) {
|
|
|
if (d)
|
|
|
return Ai(a, b, c);
|
|
|
b.flags |= 64;
|
|
|
}
|
|
|
e = b.memoizedState;
|
|
|
e !== null && (e.rendering = null, e.tail = null, e.lastEffect = null);
|
|
|
I(P, P.current);
|
|
|
if (d)
|
|
|
break;
|
|
|
else
|
|
|
return null;
|
|
|
case 23:
|
|
|
case 24:
|
|
|
return b.lanes = 0, mi(a, b, c);
|
|
|
}
|
|
|
return hi$1(a, b, c);
|
|
|
}
|
|
|
else
|
|
|
ug = false;
|
|
|
b.lanes = 0;
|
|
|
switch (b.tag) {
|
|
|
case 2:
|
|
|
d = b.type;
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2);
|
|
|
a = b.pendingProps;
|
|
|
e = Ef(b, M.current);
|
|
|
tg(b, c);
|
|
|
e = Ch(null, b, d, a, e, c);
|
|
|
b.flags |= 1;
|
|
|
if (typeof e === "object" && e !== null && typeof e.render === "function" && e.$$typeof === void 0) {
|
|
|
b.tag = 1;
|
|
|
b.memoizedState = null;
|
|
|
b.updateQueue = null;
|
|
|
if (Ff(d)) {
|
|
|
var f2 = true;
|
|
|
Jf(b);
|
|
|
} else
|
|
|
f2 = false;
|
|
|
b.memoizedState = e.state !== null && e.state !== void 0 ? e.state : null;
|
|
|
xg(b);
|
|
|
var g2 = d.getDerivedStateFromProps;
|
|
|
typeof g2 === "function" && Gg(b, d, g2, a);
|
|
|
e.updater = Kg;
|
|
|
b.stateNode = e;
|
|
|
e._reactInternals = b;
|
|
|
Og(b, d, a, c);
|
|
|
b = qi(null, b, d, true, f2, c);
|
|
|
} else
|
|
|
b.tag = 0, fi(null, b, e, c), b = b.child;
|
|
|
return b;
|
|
|
case 16:
|
|
|
e = b.elementType;
|
|
|
a: {
|
|
|
a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2);
|
|
|
a = b.pendingProps;
|
|
|
f2 = e._init;
|
|
|
e = f2(e._payload);
|
|
|
b.type = e;
|
|
|
f2 = b.tag = hk(e);
|
|
|
a = lg(e, a);
|
|
|
switch (f2) {
|
|
|
case 0:
|
|
|
b = li(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 1:
|
|
|
b = pi(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 11:
|
|
|
b = gi(null, b, e, a, c);
|
|
|
break a;
|
|
|
case 14:
|
|
|
b = ii(null, b, e, lg(e.type, a), d, c);
|
|
|
break a;
|
|
|
}
|
|
|
throw Error(y(306, e, ""));
|
|
|
}
|
|
|
return b;
|
|
|
case 0:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), li(a, b, d, e, c);
|
|
|
case 1:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), pi(a, b, d, e, c);
|
|
|
case 3:
|
|
|
ri(b);
|
|
|
d = b.updateQueue;
|
|
|
if (a === null || d === null)
|
|
|
throw Error(y(282));
|
|
|
d = b.pendingProps;
|
|
|
e = b.memoizedState;
|
|
|
e = e !== null ? e.element : null;
|
|
|
yg(a, b);
|
|
|
Cg(b, d, null, c);
|
|
|
d = b.memoizedState.element;
|
|
|
if (d === e)
|
|
|
sh(), b = hi$1(a, b, c);
|
|
|
else {
|
|
|
e = b.stateNode;
|
|
|
if (f2 = e.hydrate)
|
|
|
kh = rf(b.stateNode.containerInfo.firstChild), jh = b, f2 = lh = true;
|
|
|
if (f2) {
|
|
|
a = e.mutableSourceEagerHydrationData;
|
|
|
if (a != null)
|
|
|
for (e = 0; e < a.length; e += 2)
|
|
|
f2 = a[e], f2._workInProgressVersionPrimary = a[e + 1], th.push(f2);
|
|
|
c = Zg(b, null, d, c);
|
|
|
for (b.child = c; c; )
|
|
|
c.flags = c.flags & -3 | 1024, c = c.sibling;
|
|
|
} else
|
|
|
fi(a, b, d, c), sh();
|
|
|
b = b.child;
|
|
|
}
|
|
|
return b;
|
|
|
case 5:
|
|
|
return gh(b), a === null && ph(b), d = b.type, e = b.pendingProps, f2 = a !== null ? a.memoizedProps : null, g2 = e.children, nf(d, e) ? g2 = null : f2 !== null && nf(d, f2) && (b.flags |= 16), oi(a, b), fi(a, b, g2, c), b.child;
|
|
|
case 6:
|
|
|
return a === null && ph(b), null;
|
|
|
case 13:
|
|
|
return ti(a, b, c);
|
|
|
case 4:
|
|
|
return eh(b, b.stateNode.containerInfo), d = b.pendingProps, a === null ? b.child = Yg(b, null, d, c) : fi(a, b, d, c), b.child;
|
|
|
case 11:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), gi(a, b, d, e, c);
|
|
|
case 7:
|
|
|
return fi(a, b, b.pendingProps, c), b.child;
|
|
|
case 8:
|
|
|
return fi(a, b, b.pendingProps.children, c), b.child;
|
|
|
case 12:
|
|
|
return fi(a, b, b.pendingProps.children, c), b.child;
|
|
|
case 10:
|
|
|
a: {
|
|
|
d = b.type._context;
|
|
|
e = b.pendingProps;
|
|
|
g2 = b.memoizedProps;
|
|
|
f2 = e.value;
|
|
|
var h2 = b.type._context;
|
|
|
I(mg, h2._currentValue);
|
|
|
h2._currentValue = f2;
|
|
|
if (g2 !== null)
|
|
|
if (h2 = g2.value, f2 = He(h2, f2) ? 0 : (typeof d._calculateChangedBits === "function" ? d._calculateChangedBits(h2, f2) : 1073741823) | 0, f2 === 0) {
|
|
|
if (g2.children === e.children && !N.current) {
|
|
|
b = hi$1(a, b, c);
|
|
|
break a;
|
|
|
}
|
|
|
} else
|
|
|
for (h2 = b.child, h2 !== null && (h2.return = b); h2 !== null; ) {
|
|
|
var k = h2.dependencies;
|
|
|
if (k !== null) {
|
|
|
g2 = h2.child;
|
|
|
for (var l2 = k.firstContext; l2 !== null; ) {
|
|
|
if (l2.context === d && (l2.observedBits & f2) !== 0) {
|
|
|
h2.tag === 1 && (l2 = zg(-1, c & -c), l2.tag = 2, Ag(h2, l2));
|
|
|
h2.lanes |= c;
|
|
|
l2 = h2.alternate;
|
|
|
l2 !== null && (l2.lanes |= c);
|
|
|
sg(h2.return, c);
|
|
|
k.lanes |= c;
|
|
|
break;
|
|
|
}
|
|
|
l2 = l2.next;
|
|
|
}
|
|
|
} else
|
|
|
g2 = h2.tag === 10 ? h2.type === b.type ? null : h2.child : h2.child;
|
|
|
if (g2 !== null)
|
|
|
g2.return = h2;
|
|
|
else
|
|
|
for (g2 = h2; g2 !== null; ) {
|
|
|
if (g2 === b) {
|
|
|
g2 = null;
|
|
|
break;
|
|
|
}
|
|
|
h2 = g2.sibling;
|
|
|
if (h2 !== null) {
|
|
|
h2.return = g2.return;
|
|
|
g2 = h2;
|
|
|
break;
|
|
|
}
|
|
|
g2 = g2.return;
|
|
|
}
|
|
|
h2 = g2;
|
|
|
}
|
|
|
fi(a, b, e.children, c);
|
|
|
b = b.child;
|
|
|
}
|
|
|
return b;
|
|
|
case 9:
|
|
|
return e = b.type, f2 = b.pendingProps, d = f2.children, tg(b, c), e = vg(e, f2.unstable_observedBits), d = d(e), b.flags |= 1, fi(a, b, d, c), b.child;
|
|
|
case 14:
|
|
|
return e = b.type, f2 = lg(e, b.pendingProps), f2 = lg(e.type, f2), ii(a, b, e, f2, d, c);
|
|
|
case 15:
|
|
|
return ki(a, b, b.type, b.pendingProps, d, c);
|
|
|
case 17:
|
|
|
return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), a !== null && (a.alternate = null, b.alternate = null, b.flags |= 2), b.tag = 1, Ff(d) ? (a = true, Jf(b)) : a = false, tg(b, c), Mg(b, d, e), Og(b, d, e, c), qi(null, b, d, true, a, c);
|
|
|
case 19:
|
|
|
return Ai(a, b, c);
|
|
|
case 23:
|
|
|
return mi(a, b, c);
|
|
|
case 24:
|
|
|
return mi(a, b, c);
|
|
|
}
|
|
|
throw Error(y(156, b.tag));
|
|
|
};
|
|
|
function ik(a, b, c, d) {
|
|
|
this.tag = a;
|
|
|
this.key = c;
|
|
|
this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
|
|
|
this.index = 0;
|
|
|
this.ref = null;
|
|
|
this.pendingProps = b;
|
|
|
this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
|
|
|
this.mode = d;
|
|
|
this.flags = 0;
|
|
|
this.lastEffect = this.firstEffect = this.nextEffect = null;
|
|
|
this.childLanes = this.lanes = 0;
|
|
|
this.alternate = null;
|
|
|
}
|
|
|
function nh(a, b, c, d) {
|
|
|
return new ik(a, b, c, d);
|
|
|
}
|
|
|
function ji(a) {
|
|
|
a = a.prototype;
|
|
|
return !(!a || !a.isReactComponent);
|
|
|
}
|
|
|
function hk(a) {
|
|
|
if (typeof a === "function")
|
|
|
return ji(a) ? 1 : 0;
|
|
|
if (a !== void 0 && a !== null) {
|
|
|
a = a.$$typeof;
|
|
|
if (a === Aa)
|
|
|
return 11;
|
|
|
if (a === Da)
|
|
|
return 14;
|
|
|
}
|
|
|
return 2;
|
|
|
}
|
|
|
function Tg(a, b) {
|
|
|
var c = a.alternate;
|
|
|
c === null ? (c = nh(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.nextEffect = null, c.firstEffect = null, c.lastEffect = null);
|
|
|
c.childLanes = a.childLanes;
|
|
|
c.lanes = a.lanes;
|
|
|
c.child = a.child;
|
|
|
c.memoizedProps = a.memoizedProps;
|
|
|
c.memoizedState = a.memoizedState;
|
|
|
c.updateQueue = a.updateQueue;
|
|
|
b = a.dependencies;
|
|
|
c.dependencies = b === null ? null : { lanes: b.lanes, firstContext: b.firstContext };
|
|
|
c.sibling = a.sibling;
|
|
|
c.index = a.index;
|
|
|
c.ref = a.ref;
|
|
|
return c;
|
|
|
}
|
|
|
function Vg(a, b, c, d, e, f2) {
|
|
|
var g2 = 2;
|
|
|
d = a;
|
|
|
if (typeof a === "function")
|
|
|
ji(a) && (g2 = 1);
|
|
|
else if (typeof a === "string")
|
|
|
g2 = 5;
|
|
|
else
|
|
|
a:
|
|
|
switch (a) {
|
|
|
case ua:
|
|
|
return Xg(c.children, e, f2, b);
|
|
|
case Ha:
|
|
|
g2 = 8;
|
|
|
e |= 16;
|
|
|
break;
|
|
|
case wa:
|
|
|
g2 = 8;
|
|
|
e |= 1;
|
|
|
break;
|
|
|
case xa:
|
|
|
return a = nh(12, c, b, e | 8), a.elementType = xa, a.type = xa, a.lanes = f2, a;
|
|
|
case Ba:
|
|
|
return a = nh(13, c, b, e), a.type = Ba, a.elementType = Ba, a.lanes = f2, a;
|
|
|
case Ca:
|
|
|
return a = nh(19, c, b, e), a.elementType = Ca, a.lanes = f2, a;
|
|
|
case Ia:
|
|
|
return vi(c, e, f2, b);
|
|
|
case Ja:
|
|
|
return a = nh(24, c, b, e), a.elementType = Ja, a.lanes = f2, a;
|
|
|
default:
|
|
|
if (typeof a === "object" && a !== null)
|
|
|
switch (a.$$typeof) {
|
|
|
case ya:
|
|
|
g2 = 10;
|
|
|
break a;
|
|
|
case za:
|
|
|
g2 = 9;
|
|
|
break a;
|
|
|
case Aa:
|
|
|
g2 = 11;
|
|
|
break a;
|
|
|
case Da:
|
|
|
g2 = 14;
|
|
|
break a;
|
|
|
case Ea:
|
|
|
g2 = 16;
|
|
|
d = null;
|
|
|
break a;
|
|
|
case Fa:
|
|
|
g2 = 22;
|
|
|
break a;
|
|
|
}
|
|
|
throw Error(y(130, a == null ? a : typeof a, ""));
|
|
|
}
|
|
|
b = nh(g2, c, b, e);
|
|
|
b.elementType = a;
|
|
|
b.type = d;
|
|
|
b.lanes = f2;
|
|
|
return b;
|
|
|
}
|
|
|
function Xg(a, b, c, d) {
|
|
|
a = nh(7, a, d, b);
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function vi(a, b, c, d) {
|
|
|
a = nh(23, a, d, b);
|
|
|
a.elementType = Ia;
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function Ug(a, b, c) {
|
|
|
a = nh(6, a, null, b);
|
|
|
a.lanes = c;
|
|
|
return a;
|
|
|
}
|
|
|
function Wg(a, b, c) {
|
|
|
b = nh(4, a.children !== null ? a.children : [], a.key, b);
|
|
|
b.lanes = c;
|
|
|
b.stateNode = { containerInfo: a.containerInfo, pendingChildren: null, implementation: a.implementation };
|
|
|
return b;
|
|
|
}
|
|
|
function jk(a, b, c) {
|
|
|
this.tag = b;
|
|
|
this.containerInfo = a;
|
|
|
this.finishedWork = this.pingCache = this.current = this.pendingChildren = null;
|
|
|
this.timeoutHandle = -1;
|
|
|
this.pendingContext = this.context = null;
|
|
|
this.hydrate = c;
|
|
|
this.callbackNode = null;
|
|
|
this.callbackPriority = 0;
|
|
|
this.eventTimes = Zc(0);
|
|
|
this.expirationTimes = Zc(-1);
|
|
|
this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
|
|
|
this.entanglements = Zc(0);
|
|
|
this.mutableSourceEagerHydrationData = null;
|
|
|
}
|
|
|
function kk(a, b, c) {
|
|
|
var d = 3 < arguments.length && arguments[3] !== void 0 ? arguments[3] : null;
|
|
|
return { $$typeof: ta, key: d == null ? null : "" + d, children: a, containerInfo: b, implementation: c };
|
|
|
}
|
|
|
function lk(a, b, c, d) {
|
|
|
var e = b.current, f2 = Hg(), g2 = Ig(e);
|
|
|
a:
|
|
|
if (c) {
|
|
|
c = c._reactInternals;
|
|
|
b: {
|
|
|
if (Zb(c) !== c || c.tag !== 1)
|
|
|
throw Error(y(170));
|
|
|
var h2 = c;
|
|
|
do {
|
|
|
switch (h2.tag) {
|
|
|
case 3:
|
|
|
h2 = h2.stateNode.context;
|
|
|
break b;
|
|
|
case 1:
|
|
|
if (Ff(h2.type)) {
|
|
|
h2 = h2.stateNode.__reactInternalMemoizedMergedChildContext;
|
|
|
break b;
|
|
|
}
|
|
|
}
|
|
|
h2 = h2.return;
|
|
|
} while (h2 !== null);
|
|
|
throw Error(y(171));
|
|
|
}
|
|
|
if (c.tag === 1) {
|
|
|
var k = c.type;
|
|
|
if (Ff(k)) {
|
|
|
c = If(c, k, h2);
|
|
|
break a;
|
|
|
}
|
|
|
}
|
|
|
c = h2;
|
|
|
} else
|
|
|
c = Cf;
|
|
|
b.context === null ? b.context = c : b.pendingContext = c;
|
|
|
b = zg(f2, g2);
|
|
|
b.payload = { element: a };
|
|
|
d = d === void 0 ? null : d;
|
|
|
d !== null && (b.callback = d);
|
|
|
Ag(e, b);
|
|
|
Jg(e, g2, f2);
|
|
|
return g2;
|
|
|
}
|
|
|
function mk(a) {
|
|
|
a = a.current;
|
|
|
if (!a.child)
|
|
|
return null;
|
|
|
switch (a.child.tag) {
|
|
|
case 5:
|
|
|
return a.child.stateNode;
|
|
|
default:
|
|
|
return a.child.stateNode;
|
|
|
}
|
|
|
}
|
|
|
function nk(a, b) {
|
|
|
a = a.memoizedState;
|
|
|
if (a !== null && a.dehydrated !== null) {
|
|
|
var c = a.retryLane;
|
|
|
a.retryLane = c !== 0 && c < b ? c : b;
|
|
|
}
|
|
|
}
|
|
|
function ok(a, b) {
|
|
|
nk(a, b);
|
|
|
(a = a.alternate) && nk(a, b);
|
|
|
}
|
|
|
function pk() {
|
|
|
return null;
|
|
|
}
|
|
|
function qk(a, b, c) {
|
|
|
var d = c != null && c.hydrationOptions != null && c.hydrationOptions.mutableSources || null;
|
|
|
c = new jk(a, b, c != null && c.hydrate === true);
|
|
|
b = nh(3, null, null, b === 2 ? 7 : b === 1 ? 3 : 0);
|
|
|
c.current = b;
|
|
|
b.stateNode = c;
|
|
|
xg(b);
|
|
|
a[ff] = c.current;
|
|
|
cf(a.nodeType === 8 ? a.parentNode : a);
|
|
|
if (d)
|
|
|
for (a = 0; a < d.length; a++) {
|
|
|
b = d[a];
|
|
|
var e = b._getVersion;
|
|
|
e = e(b._source);
|
|
|
c.mutableSourceEagerHydrationData == null ? c.mutableSourceEagerHydrationData = [b, e] : c.mutableSourceEagerHydrationData.push(b, e);
|
|
|
}
|
|
|
this._internalRoot = c;
|
|
|
}
|
|
|
qk.prototype.render = function(a) {
|
|
|
lk(a, this._internalRoot, null, null);
|
|
|
};
|
|
|
qk.prototype.unmount = function() {
|
|
|
var a = this._internalRoot, b = a.containerInfo;
|
|
|
lk(null, a, null, function() {
|
|
|
b[ff] = null;
|
|
|
});
|
|
|
};
|
|
|
function rk(a) {
|
|
|
return !(!a || a.nodeType !== 1 && a.nodeType !== 9 && a.nodeType !== 11 && (a.nodeType !== 8 || a.nodeValue !== " react-mount-point-unstable "));
|
|
|
}
|
|
|
function sk(a, b) {
|
|
|
b || (b = a ? a.nodeType === 9 ? a.documentElement : a.firstChild : null, b = !(!b || b.nodeType !== 1 || !b.hasAttribute("data-reactroot")));
|
|
|
if (!b)
|
|
|
for (var c; c = a.lastChild; )
|
|
|
a.removeChild(c);
|
|
|
return new qk(a, 0, b ? { hydrate: true } : void 0);
|
|
|
}
|
|
|
function tk(a, b, c, d, e) {
|
|
|
var f2 = c._reactRootContainer;
|
|
|
if (f2) {
|
|
|
var g2 = f2._internalRoot;
|
|
|
if (typeof e === "function") {
|
|
|
var h2 = e;
|
|
|
e = function() {
|
|
|
var a2 = mk(g2);
|
|
|
h2.call(a2);
|
|
|
};
|
|
|
}
|
|
|
lk(b, g2, a, e);
|
|
|
} else {
|
|
|
f2 = c._reactRootContainer = sk(c, d);
|
|
|
g2 = f2._internalRoot;
|
|
|
if (typeof e === "function") {
|
|
|
var k = e;
|
|
|
e = function() {
|
|
|
var a2 = mk(g2);
|
|
|
k.call(a2);
|
|
|
};
|
|
|
}
|
|
|
Xj(function() {
|
|
|
lk(b, g2, a, e);
|
|
|
});
|
|
|
}
|
|
|
return mk(g2);
|
|
|
}
|
|
|
ec = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg();
|
|
|
Jg(a, 4, b);
|
|
|
ok(a, 4);
|
|
|
}
|
|
|
};
|
|
|
fc = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg();
|
|
|
Jg(a, 67108864, b);
|
|
|
ok(a, 67108864);
|
|
|
}
|
|
|
};
|
|
|
gc = function(a) {
|
|
|
if (a.tag === 13) {
|
|
|
var b = Hg(), c = Ig(a);
|
|
|
Jg(a, c, b);
|
|
|
ok(a, c);
|
|
|
}
|
|
|
};
|
|
|
hc = function(a, b) {
|
|
|
return b();
|
|
|
};
|
|
|
yb = function(a, b, c) {
|
|
|
switch (b) {
|
|
|
case "input":
|
|
|
ab(a, c);
|
|
|
b = c.name;
|
|
|
if (c.type === "radio" && b != null) {
|
|
|
for (c = a; c.parentNode; )
|
|
|
c = c.parentNode;
|
|
|
c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]');
|
|
|
for (b = 0; b < c.length; b++) {
|
|
|
var d = c[b];
|
|
|
if (d !== a && d.form === a.form) {
|
|
|
var e = Db(d);
|
|
|
if (!e)
|
|
|
throw Error(y(90));
|
|
|
Wa(d);
|
|
|
ab(d, e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case "textarea":
|
|
|
ib(a, c);
|
|
|
break;
|
|
|
case "select":
|
|
|
b = c.value, b != null && fb(a, !!c.multiple, b, false);
|
|
|
}
|
|
|
};
|
|
|
Gb = Wj;
|
|
|
Hb = function(a, b, c, d, e) {
|
|
|
var f2 = X;
|
|
|
X |= 4;
|
|
|
try {
|
|
|
return gg(98, a.bind(null, b, c, d, e));
|
|
|
} finally {
|
|
|
X = f2, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
};
|
|
|
Ib = function() {
|
|
|
(X & 49) === 0 && (Vj(), Oj());
|
|
|
};
|
|
|
Jb = function(a, b) {
|
|
|
var c = X;
|
|
|
X |= 2;
|
|
|
try {
|
|
|
return a(b);
|
|
|
} finally {
|
|
|
X = c, X === 0 && (wj(), ig());
|
|
|
}
|
|
|
};
|
|
|
function uk(a, b) {
|
|
|
var c = 2 < arguments.length && arguments[2] !== void 0 ? arguments[2] : null;
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return kk(a, b, null, c);
|
|
|
}
|
|
|
var vk = { Events: [Cb, ue, Db, Eb, Fb, Oj, { current: false }] }, wk = { findFiberByHostInstance: wc, bundleType: 0, version: "17.0.2", rendererPackageName: "react-dom" };
|
|
|
var xk = { bundleType: wk.bundleType, version: wk.version, rendererPackageName: wk.rendererPackageName, rendererConfig: wk.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ra.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) {
|
|
|
a = cc(a);
|
|
|
return a === null ? null : a.stateNode;
|
|
|
}, findFiberByHostInstance: wk.findFiberByHostInstance || pk, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null };
|
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined") {
|
|
|
var yk = __REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
|
if (!yk.isDisabled && yk.supportsFiber)
|
|
|
try {
|
|
|
Lf = yk.inject(xk), Mf = yk;
|
|
|
} catch (a) {
|
|
|
}
|
|
|
}
|
|
|
reactDom_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = vk;
|
|
|
reactDom_production_min.createPortal = uk;
|
|
|
reactDom_production_min.findDOMNode = function(a) {
|
|
|
if (a == null)
|
|
|
return null;
|
|
|
if (a.nodeType === 1)
|
|
|
return a;
|
|
|
var b = a._reactInternals;
|
|
|
if (b === void 0) {
|
|
|
if (typeof a.render === "function")
|
|
|
throw Error(y(188));
|
|
|
throw Error(y(268, Object.keys(a)));
|
|
|
}
|
|
|
a = cc(b);
|
|
|
a = a === null ? null : a.stateNode;
|
|
|
return a;
|
|
|
};
|
|
|
reactDom_production_min.flushSync = function(a, b) {
|
|
|
var c = X;
|
|
|
if ((c & 48) !== 0)
|
|
|
return a(b);
|
|
|
X |= 1;
|
|
|
try {
|
|
|
if (a)
|
|
|
return gg(99, a.bind(null, b));
|
|
|
} finally {
|
|
|
X = c, ig();
|
|
|
}
|
|
|
};
|
|
|
reactDom_production_min.hydrate = function(a, b, c) {
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return tk(null, a, b, true, c);
|
|
|
};
|
|
|
reactDom_production_min.render = function(a, b, c) {
|
|
|
if (!rk(b))
|
|
|
throw Error(y(200));
|
|
|
return tk(null, a, b, false, c);
|
|
|
};
|
|
|
reactDom_production_min.unmountComponentAtNode = function(a) {
|
|
|
if (!rk(a))
|
|
|
throw Error(y(40));
|
|
|
return a._reactRootContainer ? (Xj(function() {
|
|
|
tk(null, null, a, false, function() {
|
|
|
a._reactRootContainer = null;
|
|
|
a[ff] = null;
|
|
|
});
|
|
|
}), true) : false;
|
|
|
};
|
|
|
reactDom_production_min.unstable_batchedUpdates = Wj;
|
|
|
reactDom_production_min.unstable_createPortal = function(a, b) {
|
|
|
return uk(a, b, 2 < arguments.length && arguments[2] !== void 0 ? arguments[2] : null);
|
|
|
};
|
|
|
reactDom_production_min.unstable_renderSubtreeIntoContainer = function(a, b, c, d) {
|
|
|
if (!rk(c))
|
|
|
throw Error(y(200));
|
|
|
if (a == null || a._reactInternals === void 0)
|
|
|
throw Error(y(38));
|
|
|
return tk(a, b, c, false, d);
|
|
|
};
|
|
|
reactDom_production_min.version = "17.0.2";
|
|
|
function checkDCE() {
|
|
|
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") {
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
|
|
|
} catch (err) {
|
|
|
console.error(err);
|
|
|
}
|
|
|
}
|
|
|
{
|
|
|
checkDCE();
|
|
|
_reactDom_17_0_2_reactDom.exports = reactDom_production_min;
|
|
|
}
|
|
|
var ReactDOM$1 = _reactDom_17_0_2_reactDom.exports;
|
|
|
function combineReducers(reducers) {
|
|
|
const reducerKeys = Object.keys(reducers);
|
|
|
const finalReducersObj = {};
|
|
|
for (const key of reducerKeys) {
|
|
|
if (typeof reducers[key] === "function") {
|
|
|
finalReducersObj[key] = reducers[key];
|
|
|
}
|
|
|
}
|
|
|
return (state = {}, action) => {
|
|
|
let hasChanged = false;
|
|
|
const nextState = {};
|
|
|
for (const key of reducerKeys) {
|
|
|
const prevStateForKey = state[key];
|
|
|
const nextStateForKey = finalReducersObj[key](prevStateForKey, action);
|
|
|
nextState[key] = nextStateForKey;
|
|
|
hasChanged = hasChanged || nextStateForKey !== prevStateForKey;
|
|
|
}
|
|
|
return hasChanged ? nextState : state;
|
|
|
};
|
|
|
}
|
|
|
function createStore(preloadedState, reducer2) {
|
|
|
const listeners = [];
|
|
|
let currentState = preloadedState;
|
|
|
const dispatch = (action) => {
|
|
|
const nextState = reducer2(currentState, action);
|
|
|
const prevState = currentState;
|
|
|
currentState = nextState;
|
|
|
for (const cb2 of listeners) {
|
|
|
cb2(currentState, prevState);
|
|
|
}
|
|
|
};
|
|
|
const subscribe = (listener) => {
|
|
|
let isSubscribed = true;
|
|
|
listeners.push(listener);
|
|
|
return () => {
|
|
|
if (!isSubscribed) {
|
|
|
return;
|
|
|
}
|
|
|
const index = listeners.indexOf(listener);
|
|
|
listeners.splice(index, 1);
|
|
|
isSubscribed = false;
|
|
|
};
|
|
|
};
|
|
|
const getState = () => {
|
|
|
return currentState;
|
|
|
};
|
|
|
return {
|
|
|
dispatch,
|
|
|
getState,
|
|
|
subscribe
|
|
|
};
|
|
|
}
|
|
|
function reducer$5(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_MARK_MEMO_ID": {
|
|
|
if (action.payload.markMemoId === state.markMemoId) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
markMemoId: action.payload.markMemoId
|
|
|
});
|
|
|
}
|
|
|
case "SET_EDIT_MEMO_ID": {
|
|
|
if (action.payload.editMemoId === state.editMemoId) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
editMemoId: action.payload.editMemoId
|
|
|
});
|
|
|
}
|
|
|
case "SET_MOBILE_VIEW": {
|
|
|
if (action.payload.isMobileView === state.isMobileView) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
isMobileView: action.payload.isMobileView
|
|
|
});
|
|
|
}
|
|
|
case "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW": {
|
|
|
if (action.payload.showSiderbarInMobileView === state.showSiderbarInMobileView) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
showSiderbarInMobileView: action.payload.showSiderbarInMobileView
|
|
|
});
|
|
|
}
|
|
|
case "SET_APP_SETTING": {
|
|
|
return __spreadValues(__spreadValues({}, state), action.payload);
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$5 = {
|
|
|
markMemoId: "",
|
|
|
editMemoId: "",
|
|
|
shouldSplitMemoWord: true,
|
|
|
shouldHideImageUrl: true,
|
|
|
shouldUseMarkdownParser: true,
|
|
|
useTinyUndoHistoryCache: false,
|
|
|
isMobileView: false,
|
|
|
showSiderbarInMobileView: false
|
|
|
};
|
|
|
function reducer$4(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_LOCATION": {
|
|
|
return action.payload;
|
|
|
}
|
|
|
case "SET_PATHNAME": {
|
|
|
if (action.payload.pathname === state.pathname) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
pathname: action.payload.pathname
|
|
|
});
|
|
|
}
|
|
|
case "SET_HASH": {
|
|
|
if (action.payload.hash === state.hash) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
hash: action.payload.hash
|
|
|
});
|
|
|
}
|
|
|
case "SET_QUERY": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadValues({}, action.payload)
|
|
|
});
|
|
|
}
|
|
|
case "SET_TAG_QUERY": {
|
|
|
if (action.payload.tag === state.query.tag) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
tag: action.payload.tag
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_DURATION_QUERY": {
|
|
|
if (action.payload.duration === state.query.duration) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
duration: __spreadValues(__spreadValues({}, state.query.duration), action.payload.duration)
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_TYPE": {
|
|
|
if (action.payload.type === state.query.type) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
type: action.payload.type
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_TEXT": {
|
|
|
if (action.payload.text === state.query.text) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
text: action.payload.text
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
case "SET_QUERY_FILTER": {
|
|
|
if (action.payload === state.query.filter) {
|
|
|
return state;
|
|
|
}
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
query: __spreadProps(__spreadValues({}, state.query), {
|
|
|
filter: action.payload
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$4 = {
|
|
|
pathname: "/",
|
|
|
hash: "",
|
|
|
query: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
type: "",
|
|
|
text: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
};
|
|
|
var utils;
|
|
|
(function(utils2) {
|
|
|
function getNowTimeStamp() {
|
|
|
return parseInt(require$$0.moment().format("x"));
|
|
|
}
|
|
|
utils2.getNowTimeStamp = getNowTimeStamp;
|
|
|
function getOSVersion() {
|
|
|
const appVersion = navigator.userAgent;
|
|
|
let detectedOS = "Unknown";
|
|
|
if (appVersion.indexOf("Win") != -1) {
|
|
|
detectedOS = "Windows";
|
|
|
} else if (appVersion.indexOf("Mac") != -1) {
|
|
|
detectedOS = "MacOS";
|
|
|
} else if (appVersion.indexOf("Linux") != -1) {
|
|
|
detectedOS = "Linux";
|
|
|
}
|
|
|
return detectedOS;
|
|
|
}
|
|
|
utils2.getOSVersion = getOSVersion;
|
|
|
function getTimeStampByDate(t2) {
|
|
|
if (typeof t2 === "string") {
|
|
|
t2 = t2.replaceAll("-", "/");
|
|
|
}
|
|
|
return new Date(t2).getTime();
|
|
|
}
|
|
|
utils2.getTimeStampByDate = getTimeStampByDate;
|
|
|
function getDateStampByDate(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
|
|
|
}
|
|
|
utils2.getDateStampByDate = getDateStampByDate;
|
|
|
function getDateString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const year = d.getFullYear();
|
|
|
const month = d.getMonth() + 1;
|
|
|
const date = d.getDate();
|
|
|
return `${year}/${month}/${date}`;
|
|
|
}
|
|
|
utils2.getDateString = getDateString;
|
|
|
function getTimeString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const hours = d.getHours();
|
|
|
const mins = d.getMinutes();
|
|
|
const hoursStr = hours < 10 ? "0" + hours : hours;
|
|
|
const minsStr = mins < 10 ? "0" + mins : mins;
|
|
|
return `${hoursStr}:${minsStr}`;
|
|
|
}
|
|
|
utils2.getTimeString = getTimeString;
|
|
|
function getDateTimeString(t2) {
|
|
|
const d = new Date(getTimeStampByDate(t2));
|
|
|
const year = d.getFullYear();
|
|
|
const month = d.getMonth() + 1;
|
|
|
const date = d.getDate();
|
|
|
const hours = d.getHours();
|
|
|
const mins = d.getMinutes();
|
|
|
const monthStr = month < 10 ? "0" + month : month;
|
|
|
const dateStr = date < 10 ? "0" + date : date;
|
|
|
const hoursStr = hours < 10 ? "0" + hours : hours;
|
|
|
const minsStr = mins < 10 ? "0" + mins : mins;
|
|
|
const secsStr = "00";
|
|
|
return `${year}/${monthStr}/${dateStr} ${hoursStr}:${minsStr}:${secsStr}`;
|
|
|
}
|
|
|
utils2.getDateTimeString = getDateTimeString;
|
|
|
function dedupe(data) {
|
|
|
return Array.from(new Set(data));
|
|
|
}
|
|
|
utils2.dedupe = dedupe;
|
|
|
function dedupeObjectWithId(data) {
|
|
|
const idSet = new Set();
|
|
|
const result = [];
|
|
|
for (const d of data) {
|
|
|
if (!idSet.has(d.id)) {
|
|
|
idSet.add(d.id);
|
|
|
result.push(d);
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
utils2.dedupeObjectWithId = dedupeObjectWithId;
|
|
|
function debounce2(fn2, delay3) {
|
|
|
let timer = null;
|
|
|
return () => {
|
|
|
if (timer) {
|
|
|
clearTimeout(timer);
|
|
|
timer = setTimeout(fn2, delay3);
|
|
|
} else {
|
|
|
timer = setTimeout(fn2, delay3);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
utils2.debounce = debounce2;
|
|
|
function throttle(fn2, delay3) {
|
|
|
let valid = true;
|
|
|
return () => {
|
|
|
if (!valid) {
|
|
|
return false;
|
|
|
}
|
|
|
valid = false;
|
|
|
setTimeout(() => {
|
|
|
fn2();
|
|
|
valid = true;
|
|
|
}, delay3);
|
|
|
};
|
|
|
}
|
|
|
utils2.throttle = throttle;
|
|
|
function transformObjectToParamsString(object) {
|
|
|
const params = [];
|
|
|
const keys = Object.keys(object).sort();
|
|
|
for (const key of keys) {
|
|
|
const val = object[key];
|
|
|
if (val) {
|
|
|
if (typeof val === "object") {
|
|
|
params.push(...transformObjectToParamsString(val).split("&"));
|
|
|
} else {
|
|
|
params.push(`${key}=${val}`);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return params.join("&");
|
|
|
}
|
|
|
utils2.transformObjectToParamsString = transformObjectToParamsString;
|
|
|
function transformParamsStringToObject(paramsString) {
|
|
|
const object = {};
|
|
|
const params = paramsString.split("&");
|
|
|
for (const p2 of params) {
|
|
|
const [key, val] = p2.split("=");
|
|
|
if (key && val) {
|
|
|
object[key] = val;
|
|
|
}
|
|
|
}
|
|
|
return object;
|
|
|
}
|
|
|
utils2.transformParamsStringToObject = transformParamsStringToObject;
|
|
|
function filterObjectNullKeys(object) {
|
|
|
if (!object) {
|
|
|
return {};
|
|
|
}
|
|
|
const finalObject = {};
|
|
|
const keys = Object.keys(object).sort();
|
|
|
for (const key of keys) {
|
|
|
const val = object[key];
|
|
|
if (typeof val === "object") {
|
|
|
const temp = filterObjectNullKeys(JSON.parse(JSON.stringify(val)));
|
|
|
if (temp && Object.keys(temp).length > 0) {
|
|
|
finalObject[key] = temp;
|
|
|
}
|
|
|
} else {
|
|
|
if (val) {
|
|
|
finalObject[key] = val;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return finalObject;
|
|
|
}
|
|
|
utils2.filterObjectNullKeys = filterObjectNullKeys;
|
|
|
async function copyTextToClipboard(text) {
|
|
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
|
try {
|
|
|
await navigator.clipboard.writeText(text);
|
|
|
} catch (error2) {
|
|
|
console.warn("Copy to clipboard failed.", error2);
|
|
|
}
|
|
|
} else {
|
|
|
console.warn("Copy to clipboard failed, methods not supports.");
|
|
|
}
|
|
|
}
|
|
|
utils2.copyTextToClipboard = copyTextToClipboard;
|
|
|
function getImageSize(src) {
|
|
|
return new Promise((resolve) => {
|
|
|
const imgEl = new Image();
|
|
|
imgEl.onload = () => {
|
|
|
const { width, height } = imgEl;
|
|
|
if (width > 0 && height > 0) {
|
|
|
resolve({ width, height });
|
|
|
} else {
|
|
|
resolve({ width: 0, height: 0 });
|
|
|
}
|
|
|
};
|
|
|
imgEl.onerror = () => {
|
|
|
resolve({ width: 0, height: 0 });
|
|
|
};
|
|
|
imgEl.className = "hidden";
|
|
|
imgEl.src = src;
|
|
|
document.body.appendChild(imgEl);
|
|
|
imgEl.remove();
|
|
|
});
|
|
|
}
|
|
|
utils2.getImageSize = getImageSize;
|
|
|
})(utils || (utils = {}));
|
|
|
var utils$1 = utils;
|
|
|
function reducer$3(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_MEMOS": {
|
|
|
const memos = utils$1.dedupeObjectWithId(action.payload.memos.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos: [...memos]
|
|
|
});
|
|
|
}
|
|
|
case "SET_TAGS": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
tags: action.payload.tags
|
|
|
});
|
|
|
}
|
|
|
case "INSERT_MEMO": {
|
|
|
const memos = utils$1.dedupeObjectWithId([action.payload.memo, ...state.memos].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos
|
|
|
});
|
|
|
}
|
|
|
case "DELETE_MEMO_BY_ID": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos: [...state.memos].filter((memo2) => memo2.id !== action.payload.id)
|
|
|
});
|
|
|
}
|
|
|
case "EDIT_MEMO": {
|
|
|
const memos = state.memos.map((m2) => {
|
|
|
if (m2.id === action.payload.id) {
|
|
|
return __spreadValues(__spreadValues({}, m2), action.payload);
|
|
|
} else {
|
|
|
return m2;
|
|
|
}
|
|
|
});
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
memos
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$3 = {
|
|
|
memos: [],
|
|
|
tags: []
|
|
|
};
|
|
|
function reducer$2(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SIGN_IN": {
|
|
|
return {
|
|
|
user: action.payload.user
|
|
|
};
|
|
|
}
|
|
|
case "SIGN_OUT": {
|
|
|
return {
|
|
|
user: null
|
|
|
};
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$2 = { user: null };
|
|
|
function reducer$1(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_QUERIES": {
|
|
|
const queries = utils$1.dedupeObjectWithId(action.payload.queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => {
|
|
|
var _a, _b;
|
|
|
return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0);
|
|
|
}));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
case "INSERT_QUERY": {
|
|
|
const queries = utils$1.dedupeObjectWithId([action.payload.query, ...state.queries].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)));
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
case "DELETE_QUERY_BY_ID": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries: [...state.queries].filter((query) => query.id !== action.payload.id)
|
|
|
});
|
|
|
}
|
|
|
case "UPDATE_QUERY": {
|
|
|
const queries = state.queries.map((m2) => {
|
|
|
if (m2.id === action.payload.id) {
|
|
|
return __spreadValues(__spreadValues({}, m2), action.payload);
|
|
|
} else {
|
|
|
return m2;
|
|
|
}
|
|
|
});
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
queries
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState$1 = {
|
|
|
queries: []
|
|
|
};
|
|
|
var main$1 = {};
|
|
|
Object.defineProperty(main$1, "__esModule", { value: true });
|
|
|
var obsidian = require$$0__default["default"];
|
|
|
const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD";
|
|
|
const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww";
|
|
|
const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM";
|
|
|
const DEFAULT_QUARTERLY_NOTE_FORMAT = "YYYY-[Q]Q";
|
|
|
const DEFAULT_YEARLY_NOTE_FORMAT = "YYYY";
|
|
|
function shouldUsePeriodicNotesSettings(periodicity) {
|
|
|
var _a, _b;
|
|
|
const periodicNotes = window.app.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a[periodicity]) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function getDailyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
try {
|
|
|
const { internalPlugins, plugins } = window.app;
|
|
|
if (shouldUsePeriodicNotesSettings("daily")) {
|
|
|
const { format: format3, folder: folder2, template: template2 } = ((_b = (_a = plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.daily) || {};
|
|
|
return {
|
|
|
format: format3 || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
folder: (folder2 == null ? void 0 : folder2.trim()) || "",
|
|
|
template: (template2 == null ? void 0 : template2.trim()) || ""
|
|
|
};
|
|
|
}
|
|
|
const { folder, format: format2, template } = ((_d = (_c = internalPlugins.getPluginById("daily-notes")) == null ? void 0 : _c.instance) == null ? void 0 : _d.options) || {};
|
|
|
return {
|
|
|
format: format2 || DEFAULT_DAILY_NOTE_FORMAT,
|
|
|
folder: (folder == null ? void 0 : folder.trim()) || "",
|
|
|
template: (template == null ? void 0 : template.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom daily note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getWeeklyNoteSettings() {
|
|
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
|
try {
|
|
|
const pluginManager = window.app.plugins;
|
|
|
const calendarSettings = (_a = pluginManager.getPlugin("calendar")) == null ? void 0 : _a.options;
|
|
|
const periodicNotesSettings = (_c = (_b = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _b.settings) == null ? void 0 : _c.weekly;
|
|
|
if (shouldUsePeriodicNotesSettings("weekly")) {
|
|
|
return {
|
|
|
format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
folder: ((_d = periodicNotesSettings.folder) == null ? void 0 : _d.trim()) || "",
|
|
|
template: ((_e = periodicNotesSettings.template) == null ? void 0 : _e.trim()) || ""
|
|
|
};
|
|
|
}
|
|
|
const settings = calendarSettings || {};
|
|
|
return {
|
|
|
format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT,
|
|
|
folder: ((_f = settings.weeklyNoteFolder) == null ? void 0 : _f.trim()) || "",
|
|
|
template: ((_g = settings.weeklyNoteTemplate) == null ? void 0 : _g.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom weekly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getMonthlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("monthly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.monthly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom monthly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getQuarterlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("quarterly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.quarterly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_QUARTERLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom quarterly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function getYearlyNoteSettings() {
|
|
|
var _a, _b, _c, _d;
|
|
|
const pluginManager = window.app.plugins;
|
|
|
try {
|
|
|
const settings = shouldUsePeriodicNotesSettings("yearly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.yearly) || {};
|
|
|
return {
|
|
|
format: settings.format || DEFAULT_YEARLY_NOTE_FORMAT,
|
|
|
folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "",
|
|
|
template: ((_d = settings.template) == null ? void 0 : _d.trim()) || ""
|
|
|
};
|
|
|
} catch (err) {
|
|
|
console.info("No custom yearly note settings found!", err);
|
|
|
}
|
|
|
}
|
|
|
function join(...partSegments) {
|
|
|
let parts = [];
|
|
|
for (let i = 0, l2 = partSegments.length; i < l2; i++) {
|
|
|
parts = parts.concat(partSegments[i].split("/"));
|
|
|
}
|
|
|
const newParts = [];
|
|
|
for (let i = 0, l2 = parts.length; i < l2; i++) {
|
|
|
const part = parts[i];
|
|
|
if (!part || part === ".")
|
|
|
continue;
|
|
|
else
|
|
|
newParts.push(part);
|
|
|
}
|
|
|
if (parts[0] === "")
|
|
|
newParts.unshift("");
|
|
|
return newParts.join("/");
|
|
|
}
|
|
|
function basename(fullPath) {
|
|
|
let base = fullPath.substring(fullPath.lastIndexOf("/") + 1);
|
|
|
if (base.lastIndexOf(".") != -1)
|
|
|
base = base.substring(0, base.lastIndexOf("."));
|
|
|
return base;
|
|
|
}
|
|
|
async function ensureFolderExists(path) {
|
|
|
const dirs = path.replace(/\\/g, "/").split("/");
|
|
|
dirs.pop();
|
|
|
if (dirs.length) {
|
|
|
const dir = join(...dirs);
|
|
|
if (!window.app.vault.getAbstractFileByPath(dir)) {
|
|
|
await window.app.vault.createFolder(dir);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function getNotePath(directory, filename) {
|
|
|
if (!filename.endsWith(".md")) {
|
|
|
filename += ".md";
|
|
|
}
|
|
|
const path = obsidian.normalizePath(join(directory, filename));
|
|
|
await ensureFolderExists(path);
|
|
|
return path;
|
|
|
}
|
|
|
async function getTemplateInfo(template) {
|
|
|
const { metadataCache, vault } = window.app;
|
|
|
const templatePath = obsidian.normalizePath(template);
|
|
|
if (templatePath === "/") {
|
|
|
return Promise.resolve(["", null]);
|
|
|
}
|
|
|
try {
|
|
|
const templateFile = metadataCache.getFirstLinkpathDest(templatePath, "");
|
|
|
const contents = await vault.cachedRead(templateFile);
|
|
|
const IFoldInfo = window.app.foldManager.load(templateFile);
|
|
|
return [contents, IFoldInfo];
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to read the daily note template '${templatePath}'`, err);
|
|
|
new obsidian.Notice("Failed to read the daily note template");
|
|
|
return ["", null];
|
|
|
}
|
|
|
}
|
|
|
function getDateUID(date, granularity = "day") {
|
|
|
const ts = date.clone().startOf(granularity).format();
|
|
|
return `${granularity}-${ts}`;
|
|
|
}
|
|
|
function removeEscapedCharacters(format2) {
|
|
|
return format2.replace(/\[[^\]]*\]/g, "");
|
|
|
}
|
|
|
function isFormatAmbiguous(format2, granularity) {
|
|
|
if (granularity === "week") {
|
|
|
const cleanFormat = removeEscapedCharacters(format2);
|
|
|
return /w{1,2}/i.test(cleanFormat) && (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat));
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function getDateFromFile(file, granularity) {
|
|
|
return getDateFromFilename(file.basename, granularity);
|
|
|
}
|
|
|
function getDateFromPath(path, granularity) {
|
|
|
return getDateFromFilename(basename(path), granularity);
|
|
|
}
|
|
|
function getDateFromFilename(filename, granularity) {
|
|
|
const getSettings = {
|
|
|
day: getDailyNoteSettings,
|
|
|
week: getWeeklyNoteSettings,
|
|
|
month: getMonthlyNoteSettings,
|
|
|
quarter: getQuarterlyNoteSettings,
|
|
|
year: getYearlyNoteSettings
|
|
|
};
|
|
|
const format2 = getSettings[granularity]().format.split("/").pop();
|
|
|
const noteDate = window.moment(filename, format2, true);
|
|
|
if (!noteDate.isValid()) {
|
|
|
return null;
|
|
|
}
|
|
|
if (isFormatAmbiguous(format2, granularity)) {
|
|
|
if (granularity === "week") {
|
|
|
const cleanFormat = removeEscapedCharacters(format2);
|
|
|
if (/w{1,2}/i.test(cleanFormat)) {
|
|
|
return window.moment(filename, format2.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return noteDate;
|
|
|
}
|
|
|
class DailyNotesFolderMissingError$1 extends Error {
|
|
|
}
|
|
|
async function createDailyNote(date) {
|
|
|
const app2 = window.app;
|
|
|
const { vault } = app2;
|
|
|
const moment = window.moment;
|
|
|
const { template, format: format2, folder } = getDailyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_23, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format2)).replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format2)));
|
|
|
app2.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getDailyNote(date, dailyNotes) {
|
|
|
var _a;
|
|
|
return (_a = dailyNotes[getDateUID(date, "day")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllDailyNotes() {
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getDailyNoteSettings();
|
|
|
const dailyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!dailyNotesFolder) {
|
|
|
throw new DailyNotesFolderMissingError$1("Failed to find daily notes folder");
|
|
|
}
|
|
|
const dailyNotes = {};
|
|
|
obsidian.Vault.recurseChildren(dailyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "day");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "day");
|
|
|
dailyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return dailyNotes;
|
|
|
}
|
|
|
class WeeklyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
function getDaysOfWeek() {
|
|
|
const { moment } = window;
|
|
|
let weekStart = moment.localeData()._week.dow;
|
|
|
const daysOfWeek = [
|
|
|
"sunday",
|
|
|
"monday",
|
|
|
"tuesday",
|
|
|
"wednesday",
|
|
|
"thursday",
|
|
|
"friday",
|
|
|
"saturday"
|
|
|
];
|
|
|
while (weekStart) {
|
|
|
daysOfWeek.push(daysOfWeek.shift());
|
|
|
weekStart--;
|
|
|
}
|
|
|
return daysOfWeek;
|
|
|
}
|
|
|
function getDayOfWeekNumericalValue(dayOfWeekName) {
|
|
|
return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase());
|
|
|
}
|
|
|
async function createWeeklyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getWeeklyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_23, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_23, dayOfWeek, momentFormat) => {
|
|
|
const day = getDayOfWeekNumericalValue(dayOfWeek);
|
|
|
return date.weekday(day).format(momentFormat.trim());
|
|
|
}));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getWeeklyNote(date, weeklyNotes) {
|
|
|
var _a;
|
|
|
return (_a = weeklyNotes[getDateUID(date, "week")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllWeeklyNotes() {
|
|
|
const weeklyNotes = {};
|
|
|
if (!appHasWeeklyNotesPluginLoaded()) {
|
|
|
return weeklyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getWeeklyNoteSettings();
|
|
|
const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!weeklyNotesFolder) {
|
|
|
throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(weeklyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "week");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "week");
|
|
|
weeklyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return weeklyNotes;
|
|
|
}
|
|
|
class MonthlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createMonthlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getMonthlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_23, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getMonthlyNote(date, monthlyNotes) {
|
|
|
var _a;
|
|
|
return (_a = monthlyNotes[getDateUID(date, "month")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllMonthlyNotes() {
|
|
|
const monthlyNotes = {};
|
|
|
if (!appHasMonthlyNotesPluginLoaded()) {
|
|
|
return monthlyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getMonthlyNoteSettings();
|
|
|
const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!monthlyNotesFolder) {
|
|
|
throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(monthlyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "month");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "month");
|
|
|
monthlyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return monthlyNotes;
|
|
|
}
|
|
|
class QuarterlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createQuarterlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getQuarterlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_23, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getQuarterlyNote(date, quarterly) {
|
|
|
var _a;
|
|
|
return (_a = quarterly[getDateUID(date, "quarter")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllQuarterlyNotes() {
|
|
|
const quarterly = {};
|
|
|
if (!appHasQuarterlyNotesPluginLoaded()) {
|
|
|
return quarterly;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getQuarterlyNoteSettings();
|
|
|
const quarterlyFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!quarterlyFolder) {
|
|
|
throw new QuarterlyNotesFolderMissingError("Failed to find quarterly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(quarterlyFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "quarter");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "quarter");
|
|
|
quarterly[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return quarterly;
|
|
|
}
|
|
|
class YearlyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function createYearlyNote(date) {
|
|
|
const { vault } = window.app;
|
|
|
const { template, format: format2, folder } = getYearlyNoteSettings();
|
|
|
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
|
|
|
const filename = date.format(format2);
|
|
|
const normalizedPath = await getNotePath(folder, filename);
|
|
|
try {
|
|
|
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_23, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
|
|
|
const now = window.moment();
|
|
|
const currentDate = date.clone().set({
|
|
|
hour: now.get("hour"),
|
|
|
minute: now.get("minute"),
|
|
|
second: now.get("second")
|
|
|
});
|
|
|
if (calc) {
|
|
|
currentDate.add(parseInt(timeDelta, 10), unit);
|
|
|
}
|
|
|
if (momentFormat) {
|
|
|
return currentDate.format(momentFormat.substring(1).trim());
|
|
|
}
|
|
|
return currentDate.format(format2);
|
|
|
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
|
|
|
window.app.foldManager.save(createdFile, IFoldInfo);
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${normalizedPath}'`, err);
|
|
|
new obsidian.Notice("Unable to create new file.");
|
|
|
}
|
|
|
}
|
|
|
function getYearlyNote(date, yearlyNotes) {
|
|
|
var _a;
|
|
|
return (_a = yearlyNotes[getDateUID(date, "year")]) != null ? _a : null;
|
|
|
}
|
|
|
function getAllYearlyNotes() {
|
|
|
const yearlyNotes = {};
|
|
|
if (!appHasYearlyNotesPluginLoaded()) {
|
|
|
return yearlyNotes;
|
|
|
}
|
|
|
const { vault } = window.app;
|
|
|
const { folder } = getYearlyNoteSettings();
|
|
|
const yearlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
|
|
|
if (!yearlyNotesFolder) {
|
|
|
throw new YearlyNotesFolderMissingError("Failed to find yearly notes folder");
|
|
|
}
|
|
|
obsidian.Vault.recurseChildren(yearlyNotesFolder, (note) => {
|
|
|
if (note instanceof obsidian.TFile) {
|
|
|
const date = getDateFromFile(note, "year");
|
|
|
if (date) {
|
|
|
const dateString = getDateUID(date, "year");
|
|
|
yearlyNotes[dateString] = note;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return yearlyNotes;
|
|
|
}
|
|
|
function appHasDailyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const dailyNotesPlugin = app2.internalPlugins.plugins["daily-notes"];
|
|
|
if (dailyNotesPlugin && dailyNotesPlugin.enabled) {
|
|
|
return true;
|
|
|
}
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.daily) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasWeeklyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
if (app2.plugins.getPlugin("calendar")) {
|
|
|
return true;
|
|
|
}
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.weekly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasMonthlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.monthly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasQuarterlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.quarterly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function appHasYearlyNotesPluginLoaded() {
|
|
|
var _a, _b;
|
|
|
const { app: app2 } = window;
|
|
|
const periodicNotes = app2.plugins.getPlugin("periodic-notes");
|
|
|
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.yearly) == null ? void 0 : _b.enabled);
|
|
|
}
|
|
|
function getPeriodicNoteSettings(granularity) {
|
|
|
const getSettings = {
|
|
|
day: getDailyNoteSettings,
|
|
|
week: getWeeklyNoteSettings,
|
|
|
month: getMonthlyNoteSettings,
|
|
|
quarter: getQuarterlyNoteSettings,
|
|
|
year: getYearlyNoteSettings
|
|
|
}[granularity];
|
|
|
return getSettings();
|
|
|
}
|
|
|
function createPeriodicNote(granularity, date) {
|
|
|
const createFn = {
|
|
|
day: createDailyNote,
|
|
|
month: createMonthlyNote,
|
|
|
week: createWeeklyNote
|
|
|
};
|
|
|
return createFn[granularity](date);
|
|
|
}
|
|
|
main$1.DEFAULT_DAILY_NOTE_FORMAT = DEFAULT_DAILY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_MONTHLY_NOTE_FORMAT = DEFAULT_MONTHLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_QUARTERLY_NOTE_FORMAT = DEFAULT_QUARTERLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_WEEKLY_NOTE_FORMAT = DEFAULT_WEEKLY_NOTE_FORMAT;
|
|
|
main$1.DEFAULT_YEARLY_NOTE_FORMAT = DEFAULT_YEARLY_NOTE_FORMAT;
|
|
|
var appHasDailyNotesPluginLoaded_1 = main$1.appHasDailyNotesPluginLoaded = appHasDailyNotesPluginLoaded;
|
|
|
main$1.appHasMonthlyNotesPluginLoaded = appHasMonthlyNotesPluginLoaded;
|
|
|
main$1.appHasQuarterlyNotesPluginLoaded = appHasQuarterlyNotesPluginLoaded;
|
|
|
main$1.appHasWeeklyNotesPluginLoaded = appHasWeeklyNotesPluginLoaded;
|
|
|
main$1.appHasYearlyNotesPluginLoaded = appHasYearlyNotesPluginLoaded;
|
|
|
var createDailyNote_1 = main$1.createDailyNote = createDailyNote;
|
|
|
main$1.createMonthlyNote = createMonthlyNote;
|
|
|
main$1.createPeriodicNote = createPeriodicNote;
|
|
|
main$1.createQuarterlyNote = createQuarterlyNote;
|
|
|
main$1.createWeeklyNote = createWeeklyNote;
|
|
|
main$1.createYearlyNote = createYearlyNote;
|
|
|
var getAllDailyNotes_1 = main$1.getAllDailyNotes = getAllDailyNotes;
|
|
|
main$1.getAllMonthlyNotes = getAllMonthlyNotes;
|
|
|
main$1.getAllQuarterlyNotes = getAllQuarterlyNotes;
|
|
|
main$1.getAllWeeklyNotes = getAllWeeklyNotes;
|
|
|
main$1.getAllYearlyNotes = getAllYearlyNotes;
|
|
|
var getDailyNote_1 = main$1.getDailyNote = getDailyNote;
|
|
|
var getDailyNoteSettings_1 = main$1.getDailyNoteSettings = getDailyNoteSettings;
|
|
|
var getDateFromFile_1 = main$1.getDateFromFile = getDateFromFile;
|
|
|
main$1.getDateFromPath = getDateFromPath;
|
|
|
main$1.getDateUID = getDateUID;
|
|
|
main$1.getMonthlyNote = getMonthlyNote;
|
|
|
main$1.getMonthlyNoteSettings = getMonthlyNoteSettings;
|
|
|
main$1.getPeriodicNoteSettings = getPeriodicNoteSettings;
|
|
|
main$1.getQuarterlyNote = getQuarterlyNote;
|
|
|
main$1.getQuarterlyNoteSettings = getQuarterlyNoteSettings;
|
|
|
main$1.getTemplateInfo = getTemplateInfo;
|
|
|
main$1.getWeeklyNote = getWeeklyNote;
|
|
|
main$1.getWeeklyNoteSettings = getWeeklyNoteSettings;
|
|
|
main$1.getYearlyNote = getYearlyNote;
|
|
|
main$1.getYearlyNoteSettings = getYearlyNoteSettings;
|
|
|
function reducer(state, action) {
|
|
|
switch (action.type) {
|
|
|
case "SET_DAILYNOTES": {
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
dailyNotes
|
|
|
});
|
|
|
}
|
|
|
case "SET_APP": {
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
app: action.payload.app
|
|
|
});
|
|
|
}
|
|
|
default: {
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const defaultState = {
|
|
|
dailyNotes: null,
|
|
|
app: null
|
|
|
};
|
|
|
const appStore = createStore({
|
|
|
globalState: defaultState$5,
|
|
|
locationState: defaultState$4,
|
|
|
memoState: defaultState$3,
|
|
|
userState: defaultState$2,
|
|
|
queryState: defaultState$1,
|
|
|
dailyNotesState: defaultState
|
|
|
}, combineReducers({
|
|
|
globalState: reducer$5,
|
|
|
locationState: reducer$4,
|
|
|
memoState: reducer$3,
|
|
|
userState: reducer$2,
|
|
|
queryState: reducer$1,
|
|
|
dailyNotesState: reducer
|
|
|
}));
|
|
|
const appContext = _react_17_0_2_react.exports.createContext(appStore.getState());
|
|
|
class DailyNotesService {
|
|
|
getState() {
|
|
|
return appStore.getState().dailyNotesState;
|
|
|
}
|
|
|
getApp(app2) {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_APP",
|
|
|
payload: {
|
|
|
app: app2
|
|
|
}
|
|
|
});
|
|
|
return app2;
|
|
|
}
|
|
|
async getMyAllDailyNotes() {
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
appStore.dispatch({
|
|
|
type: "SET_DAILYNOTES",
|
|
|
payload: {
|
|
|
dailyNotes
|
|
|
}
|
|
|
});
|
|
|
return dailyNotes;
|
|
|
}
|
|
|
async getDailyNoteByMemo(date) {
|
|
|
const { dailyNotes } = this.getState();
|
|
|
const dailyNote = getDailyNote_1(date, dailyNotes);
|
|
|
return dailyNote;
|
|
|
}
|
|
|
}
|
|
|
const dailyNotesService = new DailyNotesService();
|
|
|
var storage;
|
|
|
(function(storage2) {
|
|
|
function get2(keys) {
|
|
|
const data = {};
|
|
|
for (const key of keys) {
|
|
|
try {
|
|
|
const stringifyValue = localStorage.getItem(key);
|
|
|
if (stringifyValue !== null) {
|
|
|
const val = JSON.parse(stringifyValue);
|
|
|
data[key] = val;
|
|
|
}
|
|
|
} catch (error2) {
|
|
|
console.error("Get storage failed in ", key, error2);
|
|
|
}
|
|
|
}
|
|
|
return data;
|
|
|
}
|
|
|
storage2.get = get2;
|
|
|
function set(data) {
|
|
|
for (const key in data) {
|
|
|
try {
|
|
|
const stringifyValue = JSON.stringify(data[key]);
|
|
|
localStorage.setItem(key, stringifyValue);
|
|
|
} catch (error2) {
|
|
|
console.error("Save storage failed in ", key, error2);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
storage2.set = set;
|
|
|
function remove2(keys) {
|
|
|
for (const key of keys) {
|
|
|
try {
|
|
|
localStorage.removeItem(key);
|
|
|
} catch (error2) {
|
|
|
console.error("Remove storage failed in ", key, error2);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
storage2.remove = remove2;
|
|
|
function emitStorageChangedEvent() {
|
|
|
var _a;
|
|
|
const iframeEl = document.createElement("iframe");
|
|
|
iframeEl.style.display = "none";
|
|
|
document.body.appendChild(iframeEl);
|
|
|
(_a = iframeEl.contentWindow) == null ? void 0 : _a.localStorage.setItem("t", Date.now().toString());
|
|
|
iframeEl.remove();
|
|
|
}
|
|
|
storage2.emitStorageChangedEvent = emitStorageChangedEvent;
|
|
|
})(storage || (storage = {}));
|
|
|
class GlobalStateService {
|
|
|
constructor() {
|
|
|
__publicField(this, "getState", () => {
|
|
|
return appStore.getState().globalState;
|
|
|
});
|
|
|
__publicField(this, "setEditMemoId", (editMemoId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_EDIT_MEMO_ID",
|
|
|
payload: {
|
|
|
editMemoId
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMarkMemoId", (markMemoId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MARK_MEMO_ID",
|
|
|
payload: {
|
|
|
markMemoId
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setIsMobileView", (isMobileView) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MOBILE_VIEW",
|
|
|
payload: {
|
|
|
isMobileView
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setShowSiderbarInMobileView", (showSiderbarInMobileView) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW",
|
|
|
payload: {
|
|
|
showSiderbarInMobileView
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setAppSetting", (appSetting) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_APP_SETTING",
|
|
|
payload: appSetting
|
|
|
});
|
|
|
storage.set(appSetting);
|
|
|
});
|
|
|
var _a, _b, _c, _d;
|
|
|
const cachedSetting = storage.get([
|
|
|
"shouldSplitMemoWord",
|
|
|
"shouldHideImageUrl",
|
|
|
"shouldUseMarkdownParser",
|
|
|
"useTinyUndoHistoryCache"
|
|
|
]);
|
|
|
const defaultAppSetting = {
|
|
|
shouldSplitMemoWord: (_a = cachedSetting.shouldSplitMemoWord) != null ? _a : true,
|
|
|
shouldHideImageUrl: (_b = cachedSetting.shouldHideImageUrl) != null ? _b : true,
|
|
|
shouldUseMarkdownParser: (_c = cachedSetting.shouldUseMarkdownParser) != null ? _c : true,
|
|
|
useTinyUndoHistoryCache: (_d = cachedSetting.useTinyUndoHistoryCache) != null ? _d : false
|
|
|
};
|
|
|
this.setAppSetting(defaultAppSetting);
|
|
|
}
|
|
|
}
|
|
|
const globalStateService = new GlobalStateService();
|
|
|
class LocationService {
|
|
|
constructor() {
|
|
|
__publicField(this, "updateStateWithLocation", () => {
|
|
|
var _a, _b, _c, _d, _e, _f;
|
|
|
const { pathname, search: search2, hash: hash2 } = window.location;
|
|
|
const urlParams = new URLSearchParams(search2);
|
|
|
const state = {
|
|
|
pathname: "/",
|
|
|
hash: "",
|
|
|
query: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
text: "",
|
|
|
type: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
};
|
|
|
state.query.tag = (_a = urlParams.get("tag")) != null ? _a : "";
|
|
|
state.query.type = (_b = urlParams.get("type")) != null ? _b : "";
|
|
|
state.query.text = (_c = urlParams.get("text")) != null ? _c : "";
|
|
|
state.query.filter = (_d = urlParams.get("filter")) != null ? _d : "";
|
|
|
const from = parseInt((_e = urlParams.get("from")) != null ? _e : "0");
|
|
|
const to = parseInt((_f = urlParams.get("to")) != null ? _f : "0");
|
|
|
if (to > from && to !== 0) {
|
|
|
state.query.duration = {
|
|
|
from,
|
|
|
to
|
|
|
};
|
|
|
}
|
|
|
state.hash = hash2;
|
|
|
state.pathname = this.getValidPathname(pathname);
|
|
|
appStore.dispatch({
|
|
|
type: "SET_LOCATION",
|
|
|
payload: state
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "getState", () => {
|
|
|
return appStore.getState().locationState;
|
|
|
});
|
|
|
__publicField(this, "clearQuery", () => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY",
|
|
|
payload: {
|
|
|
tag: "",
|
|
|
duration: null,
|
|
|
text: "",
|
|
|
type: "",
|
|
|
filter: ""
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setQuery", (query) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY",
|
|
|
payload: query
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setHash", (hash2) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_HASH",
|
|
|
payload: {
|
|
|
hash: hash2
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setPathname", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "pushHistory", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "replaceHistory", (pathname) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_PATHNAME",
|
|
|
payload: {
|
|
|
pathname
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMemoTypeQuery", (type = "") => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TYPE",
|
|
|
payload: {
|
|
|
type
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setMemoFilter", (filterId) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERY_FILTER",
|
|
|
payload: filterId
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setTextQuery", (text) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TEXT",
|
|
|
payload: {
|
|
|
text
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setTagQuery", (tag2) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TAG_QUERY",
|
|
|
payload: {
|
|
|
tag: tag2
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "setFromAndToQuery", (from, to) => {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_DURATION_QUERY",
|
|
|
payload: {
|
|
|
duration: { from, to }
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
__publicField(this, "getValidPathname", (pathname) => {
|
|
|
if (["/", "/recycle", "/setting"].includes(pathname)) {
|
|
|
return pathname;
|
|
|
} else {
|
|
|
return "/";
|
|
|
}
|
|
|
});
|
|
|
this.updateStateWithLocation();
|
|
|
window.onpopstate = () => {
|
|
|
this.updateStateWithLocation();
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
const locationService = new LocationService();
|
|
|
async function changeMemo(memoid, originalContent, content, memoType) {
|
|
|
const { dailyNotes } = dailyNotesService.getState();
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const timeString = memoid.slice(0, 11) + "00";
|
|
|
const idString = parseInt(memoid.slice(14));
|
|
|
const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS");
|
|
|
const dailyNote = getDailyNote_1(changeDate, dailyNotes);
|
|
|
const fileContent = await vault.read(dailyNote);
|
|
|
const fileLines = getAllLinesFromFile$9(fileContent);
|
|
|
const removeEnter = content.replace(/\n/g, "<br>");
|
|
|
const originalLine = fileLines[idString];
|
|
|
const newLine = fileLines[idString].replace(originalContent, removeEnter);
|
|
|
const newFileContent = fileContent.replace(originalLine, newLine);
|
|
|
await vault.modify(dailyNote, newFileContent);
|
|
|
return {
|
|
|
id: memoid,
|
|
|
content: removeEnter,
|
|
|
deletedAt: "",
|
|
|
createdAt: changeDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: changeDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
memoType
|
|
|
};
|
|
|
}
|
|
|
function getDailyNotePath() {
|
|
|
const dailyNotesSetting = getDailyNoteSettings_1();
|
|
|
const dailyNotePath = dailyNotesSetting.folder;
|
|
|
return dailyNotePath;
|
|
|
}
|
|
|
const getAllLinesFromFile$9 = (cache) => cache.split(/\r?\n/);
|
|
|
const findQuery = async () => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const queryList2 = [];
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$8(fileContents);
|
|
|
if (fileLines && fileLines.length != 0) {
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
if (fileLines[i] === "")
|
|
|
continue;
|
|
|
const createdDateString = getCreatedDateFromLine(fileLines[i]);
|
|
|
const createdDate = require$$0.moment(createdDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
const id2 = createdDateString + getIDFromLine$1(fileLines[i]);
|
|
|
const querystring = getStringFromLine(fileLines[i]);
|
|
|
const title = getTitleFromLine(fileLines[i]);
|
|
|
let pinnedDate;
|
|
|
if (/^(.+)pinnedAt(.+)$/.test(fileLines[i])) {
|
|
|
pinnedDate = require$$0.moment(getPinnedDateFromLine$1(fileLines[i]), "YYYYMMDDHHmmss");
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: pinnedDate.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
} else if (/^(.+)\[\](.+)?$/.test(fileLines[i])) {
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring: "",
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
} else {
|
|
|
queryList2.push({
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return queryList2;
|
|
|
};
|
|
|
const getAllLinesFromFile$8 = (cache) => cache.split(/\r?\n/);
|
|
|
const getCreatedDateFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getIDFromLine$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const getStringFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)?\])/.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
const getTitleFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])/.exec(line)) == null ? void 0 : _a[3];
|
|
|
};
|
|
|
const getPinnedDateFromLine$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14}))/.exec(line)) == null ? void 0 : _a[7];
|
|
|
};
|
|
|
const createObsidianQuery = async (title, querystring) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$7(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const createdDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const id2 = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createQueryInFile(queryFile, fileContents, id2, title, querystring);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const queryFilePath = require$$0.normalizePath(absolutePath);
|
|
|
const file = await createQueryFile(queryFilePath);
|
|
|
const fileContents = await vault.read(file);
|
|
|
const date = require$$0.moment();
|
|
|
const createdDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const updatedDate = createdDate;
|
|
|
const id2 = date.format("YYYYMMDDHHmmss") + 1;
|
|
|
await createQueryInFile(file, fileContents, id2, title, querystring);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: createdDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
};
|
|
|
const createQueryInFile = async (file, fileContent, id2, title, queryString) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let newContent;
|
|
|
if (fileContent === "") {
|
|
|
newContent = id2 + " " + title + " " + queryString;
|
|
|
} else {
|
|
|
newContent = fileContent + "\n" + id2 + " " + title + " " + queryString;
|
|
|
}
|
|
|
await vault.modify(file, newContent);
|
|
|
return true;
|
|
|
};
|
|
|
const createQueryFile = async (path) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
try {
|
|
|
const createdFile = await vault.create(path, "");
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${path}'`, err);
|
|
|
new require$$0.Notice("Unable to create new file.");
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$7 = (cache) => cache.split(/\r?\n/);
|
|
|
class DailyNotesFolderMissingError extends Error {
|
|
|
}
|
|
|
async function getRemainingTasks(note) {
|
|
|
if (!note) {
|
|
|
return 0;
|
|
|
}
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let fileContents = await vault.read(note);
|
|
|
const matchLength = (fileContents.match(/(-|\*) (\[ \]\s)?((\<time\>)?\d{1,2}\:\d{2})?/g) || []).length;
|
|
|
const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "g");
|
|
|
const processEntriesHeader = (fileContents.match(re2) || []).length;
|
|
|
fileContents = null;
|
|
|
if (processEntriesHeader) {
|
|
|
return matchLength;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
async function getTasksFromDailyNote(dailyNote, dailyEvents) {
|
|
|
if (!dailyNote) {
|
|
|
return [];
|
|
|
}
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const Tasks = await getRemainingTasks(dailyNote);
|
|
|
if (Tasks) {
|
|
|
let fileContents = await vault.read(dailyNote);
|
|
|
let fileLines = getAllLinesFromFile$6(fileContents);
|
|
|
const startDate = getDateFromFile_1(dailyNote, "day");
|
|
|
const endDate = getDateFromFile_1(dailyNote, "day");
|
|
|
let processHeaderFound = false;
|
|
|
let memoType;
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
const line = fileLines[i];
|
|
|
if (line.length === 0)
|
|
|
continue;
|
|
|
if (processHeaderFound == false && lineContainsParseBelowToken(line)) {
|
|
|
processHeaderFound = true;
|
|
|
}
|
|
|
if (processHeaderFound == true && !lineContainsParseBelowToken(line) && /^#{1,} /g.test(line)) {
|
|
|
processHeaderFound = false;
|
|
|
}
|
|
|
if (lineContainsTime(line) && processHeaderFound) {
|
|
|
startDate.hours(parseInt(extractHourFromBulletLine(line)));
|
|
|
startDate.minutes(parseInt(extractMinFromBulletLine(line)));
|
|
|
endDate.hours(parseInt(extractHourFromBulletLine(line)));
|
|
|
if (parseInt(extractHourFromBulletLine(line)) > 22) {
|
|
|
endDate.minutes(parseInt(extractMinFromBulletLine(line)));
|
|
|
} else {
|
|
|
endDate.minutes(parseInt(extractMinFromBulletLine(line)));
|
|
|
}
|
|
|
if (/^\s*[-*]\s(\[(.{1})\])\s/g.test(line)) {
|
|
|
const memoTaskType = extractMemoTaskTypeFromLine(line);
|
|
|
if (memoTaskType === " ") {
|
|
|
memoType = "TASK-TODO";
|
|
|
} else if (memoTaskType === "x" || memoTaskType === "X") {
|
|
|
memoType = "TASK-DONE";
|
|
|
} else {
|
|
|
memoType = "TASK-" + memoTaskType;
|
|
|
}
|
|
|
} else {
|
|
|
memoType = "JOURNAL";
|
|
|
}
|
|
|
const rawText = extractTextFromTodoLine(line);
|
|
|
dailyEvents.push({
|
|
|
id: startDate.format("YYYYMMDDHHmmSS") + i,
|
|
|
content: rawText,
|
|
|
user_id: 1,
|
|
|
createdAt: startDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: endDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
memoType
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
async function getMemos() {
|
|
|
const events = [];
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const { folder } = getDailyNoteSettings_1();
|
|
|
const dailyNotesFolder = vault.getAbstractFileByPath(require$$0.normalizePath(folder));
|
|
|
if (!dailyNotesFolder) {
|
|
|
throw new DailyNotesFolderMissingError("Failed to find daily notes folder");
|
|
|
}
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
await getTasksFromDailyNote(dailyNotes[string], events);
|
|
|
}
|
|
|
}
|
|
|
return events;
|
|
|
}
|
|
|
const getAllLinesFromFile$6 = (cache) => cache.split(/\r?\n/);
|
|
|
const lineContainsTime = (line) => {
|
|
|
return /^\s*[\-\*]\s(\[(.{1})\]\s)?(\<time\>)?\d{1,2}\:\d{2}(.*)$/.test(line);
|
|
|
};
|
|
|
const lineContainsParseBelowToken = (line) => {
|
|
|
if (ProcessEntriesBelow === "") {
|
|
|
return true;
|
|
|
}
|
|
|
const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "");
|
|
|
return re2.test(line);
|
|
|
};
|
|
|
const extractTextFromTodoLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(.{1})\]\s?)?(\<time\>)?((\d{1,2})\:(\d{2}))?(\<\/time\>)?\s?(.*)$/.exec(line)) == null ? void 0 : _a[8];
|
|
|
};
|
|
|
const extractHourFromBulletLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(.{1})\]\s?)?(\<time\>)?(\d{1,2})\:(\d{2})(.*)$/.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
const extractMinFromBulletLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(.{1})\]\s?)?(\<time\>)?(\d{1,2})\:(\d{2})(.*)$/.exec(line)) == null ? void 0 : _a[5];
|
|
|
};
|
|
|
const extractMemoTaskTypeFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(.{1})\])\s(.*)$/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const updateObsidianQuery = async (queryId, title, queryString) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile$5(fileContents);
|
|
|
let lineID;
|
|
|
if (/^\d{1,3}$/.test(queryId)) {
|
|
|
lineID = queryId;
|
|
|
} else {
|
|
|
lineID = getIDFromLine(queryId);
|
|
|
}
|
|
|
const lineNum = parseInt(lineID) - 1;
|
|
|
if (fileLines && fileLines.length != 0) {
|
|
|
const oldContent = fileLines[lineNum];
|
|
|
const date = require$$0.moment();
|
|
|
const updatedDateString = date.format("YYYYMMDDHHmmss");
|
|
|
const updatedDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const newLineNum = lineNum + 1;
|
|
|
const id2 = updatedDateString + newLineNum;
|
|
|
if (/^(.+)pinnedAt(.+)$/.test(oldContent)) {
|
|
|
const pinnedString = getPinnedStringFromLine(oldContent);
|
|
|
const pinnedDateString = getPinnedDateFromLine(oldContent);
|
|
|
const newContent = id2 + " " + title + " " + queryString + " " + pinnedString;
|
|
|
const pinnedAtDate = require$$0.moment(pinnedDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss");
|
|
|
const newFileContents = fileContents.replace(oldContent, newContent);
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: updatedDate,
|
|
|
id: id2,
|
|
|
pinnedAt: pinnedAtDate,
|
|
|
querystring: queryString,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const newContent = id2 + " " + title + " " + queryString;
|
|
|
const newFileContents = fileContents.replace(oldContent, newContent);
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
return [
|
|
|
{
|
|
|
createdAt: updatedDate,
|
|
|
id: id2,
|
|
|
pinnedAt: "",
|
|
|
querystring: queryString,
|
|
|
title,
|
|
|
updatedAt: updatedDate,
|
|
|
userId: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$5 = (cache) => cache.split(/\r?\n/);
|
|
|
const getIDFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const getPinnedStringFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[6];
|
|
|
};
|
|
|
const getPinnedDateFromLine = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[7];
|
|
|
};
|
|
|
async function escapeRegExp(text) {
|
|
|
return await text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
|
}
|
|
|
function getLinesInString(input) {
|
|
|
const lines = [];
|
|
|
let tempString = input;
|
|
|
while (tempString.contains("\n")) {
|
|
|
const lineEndIndex = tempString.indexOf("\n");
|
|
|
lines.push(tempString.slice(0, lineEndIndex));
|
|
|
tempString = tempString.slice(lineEndIndex + 1);
|
|
|
}
|
|
|
lines.push(tempString);
|
|
|
return lines;
|
|
|
}
|
|
|
async function waitForInsert(MemoContent, isList2) {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const removeEnter = MemoContent.replace(/\n/g, "<br>");
|
|
|
const date = require$$0.moment();
|
|
|
const timeHour = date.format("HH");
|
|
|
const timeMinute = date.format("mm");
|
|
|
let newEvent;
|
|
|
let lineNum;
|
|
|
if (isList2) {
|
|
|
newEvent = `- [ ] ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter;
|
|
|
} else {
|
|
|
newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter;
|
|
|
}
|
|
|
const dailyNotes = await getAllDailyNotes_1();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
if (!existingFile) {
|
|
|
const file = await createDailyNote_1(date);
|
|
|
await dailyNotesService.getMyAllDailyNotes();
|
|
|
const fileContents = await vault.read(file);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents);
|
|
|
await vault.modify(file, newFileContent.content);
|
|
|
if (newFileContent.posNum === -1) {
|
|
|
const allLines = getAllLinesFromFile$4(newFileContent.content);
|
|
|
lineNum = allLines.length + 1;
|
|
|
} else {
|
|
|
lineNum = newFileContent.posNum + 1;
|
|
|
}
|
|
|
if (isList2) {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "TASK-TODO"
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "JOURNAL"
|
|
|
};
|
|
|
}
|
|
|
} else {
|
|
|
const fileContents = await vault.read(existingFile);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents);
|
|
|
await vault.modify(existingFile, newFileContent.content);
|
|
|
if (newFileContent.posNum === -1) {
|
|
|
const allLines = getAllLinesFromFile$4(newFileContent.content);
|
|
|
lineNum = allLines.length + 1;
|
|
|
} else {
|
|
|
lineNum = newFileContent.posNum + 1;
|
|
|
}
|
|
|
if (isList2) {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "TODO-Blank"
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
id: date.format("YYYYMMDDHHmm") + "00" + lineNum,
|
|
|
content: MemoContent,
|
|
|
deletedAt: "",
|
|
|
createdAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
updatedAt: date.format("YYYY/MM/DD HH:mm:ss"),
|
|
|
memoType: "JOURNAL"
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function insertAfterHandler(targetString, formatted, fileContent) {
|
|
|
const targetRegex = new RegExp(`s*${await escapeRegExp(targetString)}s*`);
|
|
|
const fileContentLines = getLinesInString(fileContent);
|
|
|
const targetPosition = fileContentLines.findIndex((line) => targetRegex.test(line));
|
|
|
const targetNotFound = targetPosition === -1;
|
|
|
if (targetNotFound) {
|
|
|
console.log("unable to find insert after line in file.");
|
|
|
}
|
|
|
const nextHeaderPositionAfterTargetPosition = fileContentLines.slice(targetPosition + 1).findIndex((line) => /^#+ |---/.test(line));
|
|
|
const foundNextHeader = nextHeaderPositionAfterTargetPosition !== -1;
|
|
|
if (foundNextHeader) {
|
|
|
let endOfSectionIndex;
|
|
|
for (let i = nextHeaderPositionAfterTargetPosition + targetPosition; i > targetPosition; i--) {
|
|
|
const lineIsNewline = /^[\s\n ]*$/.test(fileContentLines[i]);
|
|
|
if (!lineIsNewline) {
|
|
|
endOfSectionIndex = i;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!endOfSectionIndex)
|
|
|
endOfSectionIndex = targetPosition;
|
|
|
return await insertTextAfterPositionInBody(formatted, fileContent, endOfSectionIndex, foundNextHeader);
|
|
|
} else {
|
|
|
return await insertTextAfterPositionInBody(formatted, fileContent, fileContentLines.length - 1, foundNextHeader);
|
|
|
}
|
|
|
}
|
|
|
async function insertTextAfterPositionInBody(text, body, pos, found) {
|
|
|
if (pos === -1) {
|
|
|
return {
|
|
|
content: `${body}
|
|
|
${text}`,
|
|
|
posNum: -1
|
|
|
};
|
|
|
}
|
|
|
const splitContent = body.split("\n");
|
|
|
if (found) {
|
|
|
const pre = splitContent.slice(0, pos + 1).join("\n");
|
|
|
const post = splitContent.slice(pos + 1).join("\n");
|
|
|
return {
|
|
|
content: `${pre}
|
|
|
${text}
|
|
|
${post}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
} else {
|
|
|
const pre = splitContent.slice(0, pos + 1).join("\n");
|
|
|
const post = splitContent.slice(pos + 1).join("\n");
|
|
|
if (/[\s\S]*?/g.test(post)) {
|
|
|
return {
|
|
|
content: `${pre}
|
|
|
${text}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
content: `${pre}${text}
|
|
|
${post}`,
|
|
|
posNum: pos
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$4 = (cache) => cache.split(/\r?\n/);
|
|
|
async function restoreDeletedMemo(deletedMemoid) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(deletedMemoid)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(deletedMemoid.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
const newDeletefileContents = fileContents.replace(line, "");
|
|
|
await vault.modify(deleteFile, newDeletefileContents);
|
|
|
if (/^- (.+)$/.test(line)) {
|
|
|
const id2 = extractIDfromText(line);
|
|
|
const date = require$$0.moment(id2, "YYYYMMDDHHmmss");
|
|
|
const timeHour = date.format("HH");
|
|
|
const timeMinute = date.format("mm");
|
|
|
const newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + extractContentfromText$1(line);
|
|
|
const dailyNotes = await getAllDailyNotes_1();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
if (!existingFile) {
|
|
|
const file = await createDailyNote_1(date);
|
|
|
const fileContents2 = await vault.read(file);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2);
|
|
|
await vault.modify(file, newFileContent.content);
|
|
|
return [
|
|
|
{
|
|
|
deletedAt: ""
|
|
|
}
|
|
|
];
|
|
|
} else {
|
|
|
const fileContents2 = await vault.read(existingFile);
|
|
|
const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2);
|
|
|
await vault.modify(existingFile, newFileContent.content);
|
|
|
return [
|
|
|
{
|
|
|
deletedAt: ""
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function deleteForever(deletedMemoid) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(deletedMemoid)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(deletedMemoid.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
if (/^- (.+)$/.test(line)) {
|
|
|
const newFileContent = fileContents.replace(line, "");
|
|
|
await vault.modify(deleteFile, newFileContent);
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async function getDeletedMemos() {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deletedMemos = [];
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(deleteFile);
|
|
|
let fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return deletedMemos;
|
|
|
} else {
|
|
|
for (let i = 0; i < fileLines.length; i++) {
|
|
|
const line = fileLines[i];
|
|
|
if (!/- /.test(line)) {
|
|
|
continue;
|
|
|
} else {
|
|
|
const id2 = extractIDfromText(line);
|
|
|
const timeString = id2.slice(0, 13);
|
|
|
const createdDate = require$$0.moment(timeString, "YYYYMMDDHHmmss");
|
|
|
const deletedDateID = extractDeleteDatefromText(fileLines[i]);
|
|
|
const deletedDate = require$$0.moment(deletedDateID.slice(0, 13), "YYYYMMDDHHmmss");
|
|
|
const content = extractContentfromText$1(fileLines[i]);
|
|
|
deletedMemos.push({
|
|
|
id: deletedDateID,
|
|
|
content,
|
|
|
user_id: 1,
|
|
|
createdAt: createdDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
updatedAt: createdDate.format("YYYY/MM/DD HH:mm:SS"),
|
|
|
deletedAt: deletedDate
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
return deletedMemos;
|
|
|
}
|
|
|
const sendMemoToDelete = async (memoContent) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/delete.md";
|
|
|
const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (deleteFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(deleteFile);
|
|
|
const fileLines = getAllLinesFromFile$3(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const deleteDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createDeleteMemoInFile(deleteFile, fileContents, memoContent, deleteDateID);
|
|
|
return deleteDate;
|
|
|
} else {
|
|
|
const deleteFilePath = require$$0.normalizePath(absolutePath);
|
|
|
const file = await createdeleteFile(deleteFilePath);
|
|
|
const date = require$$0.moment();
|
|
|
const deleteDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
const lineNum = 1;
|
|
|
const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
await createDeleteMemoInFile(file, "", memoContent, deleteDateID);
|
|
|
return deleteDate;
|
|
|
}
|
|
|
};
|
|
|
const createDeleteMemoInFile = async (file, fileContent, memoContent, deleteDate) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
let newContent;
|
|
|
if (fileContent === "") {
|
|
|
newContent = memoContent + " deletedAt: " + deleteDate;
|
|
|
} else {
|
|
|
newContent = fileContent + "\n" + memoContent + " deletedAt: " + deleteDate;
|
|
|
}
|
|
|
await vault.modify(file, newContent);
|
|
|
return true;
|
|
|
};
|
|
|
const createdeleteFile = async (path) => {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
try {
|
|
|
const createdFile = await vault.create(path, "");
|
|
|
return createdFile;
|
|
|
} catch (err) {
|
|
|
console.error(`Failed to create file: '${path}'`, err);
|
|
|
new require$$0.Notice("Unable to create new file.");
|
|
|
}
|
|
|
};
|
|
|
const getAllLinesFromFile$3 = (cache) => cache.split(/\r?\n/);
|
|
|
const extractIDfromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d{14})(\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const extractContentfromText$1 = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[2];
|
|
|
};
|
|
|
const extractDeleteDatefromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[4];
|
|
|
};
|
|
|
async function obHideMemo(memoid) {
|
|
|
const { dailyNotes } = dailyNotesService.getState();
|
|
|
if (/\d{14,}/.test(memoid)) {
|
|
|
const { vault } = appStore.getState().dailyNotesState.app;
|
|
|
const timeString = memoid.slice(0, 13);
|
|
|
const idString = parseInt(memoid.slice(14));
|
|
|
const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS");
|
|
|
const dailyNote = getDailyNote_1(changeDate, dailyNotes);
|
|
|
const fileContent = await vault.read(dailyNote);
|
|
|
const fileLines = getAllLinesFromFile$2(fileContent);
|
|
|
const content = extractContentfromText(fileLines[idString]);
|
|
|
const originalLine = "- " + memoid + " " + content;
|
|
|
const newLine = fileLines[idString];
|
|
|
const newFileContent = fileContent.replace(newLine, "");
|
|
|
await vault.modify(dailyNote, newFileContent);
|
|
|
const deleteDate = await sendMemoToDelete(originalLine);
|
|
|
return deleteDate;
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$2 = (cache) => cache.split(/\r?\n/);
|
|
|
const extractContentfromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^\s*[\-\*]\s(\[(\s|x|X|\\|\-|\>|D|\?|\/|\+|R|\!|i|B|P|C)\]\s?)?(\<time\>)?((\d{1,2})\:(\d{2}))?(\<\/time\>)?\s?(.*)$/.exec(line)) == null ? void 0 : _a[8];
|
|
|
};
|
|
|
async function deleteQueryForever(queryID) {
|
|
|
const { vault, metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(queryID)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
let fileContents = await vault.read(queryFile);
|
|
|
let fileLines = getAllLinesFromFile$1(fileContents);
|
|
|
if (fileLines.length === 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
const lineNum = parseInt(queryID.slice(14));
|
|
|
const line = fileLines[lineNum - 1];
|
|
|
if (/^\d{14,}(.+)$/.test(line)) {
|
|
|
const newFileContent = fileContents.replace(line, "");
|
|
|
await vault.modify(queryFile, newFileContent);
|
|
|
}
|
|
|
}
|
|
|
fileLines = null;
|
|
|
fileContents = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const getAllLinesFromFile$1 = (cache) => cache.split(/\r?\n/);
|
|
|
const pinQueryInFile = async (queryID) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
if (/\d{14,}/.test(queryID)) {
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile(fileContents);
|
|
|
const date = require$$0.moment();
|
|
|
const originalLineNum = parseInt(queryID.slice(14));
|
|
|
const originalContent = fileLines[originalLineNum - 1];
|
|
|
const pinnedAtDate = date.format("YYYY/MM/DD HH:mm:ss");
|
|
|
let lineNum;
|
|
|
if (fileLines.length === 1 && fileLines[0] === "") {
|
|
|
lineNum = 1;
|
|
|
} else {
|
|
|
lineNum = fileLines.length + 1;
|
|
|
}
|
|
|
const pinnedAtDateID = date.format("YYYYMMDDHHmmss") + lineNum;
|
|
|
const newQuery = originalContent + " pinnedAt: " + pinnedAtDateID;
|
|
|
const newContent = fileContents.replace(originalContent, newQuery);
|
|
|
await vault.modify(queryFile, newContent);
|
|
|
return pinnedAtDate;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const unpinQueryInFile = async (queryID) => {
|
|
|
const { metadataCache, vault } = appStore.getState().dailyNotesState.app;
|
|
|
const filePath = getDailyNotePath();
|
|
|
const absolutePath = filePath + "/query.md";
|
|
|
const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath);
|
|
|
if (queryFile instanceof require$$0.TFile) {
|
|
|
const fileContents = await vault.read(queryFile);
|
|
|
const fileLines = getAllLinesFromFile(fileContents);
|
|
|
const originalLineNum = parseInt(queryID.slice(14));
|
|
|
const originalContent = fileLines[originalLineNum - 1];
|
|
|
const pinnedAtString = extractPinnedAtfromText(originalContent);
|
|
|
const newFileContents = fileContents.replace(pinnedAtString, "");
|
|
|
await vault.modify(queryFile, newFileContents);
|
|
|
}
|
|
|
return;
|
|
|
};
|
|
|
const getAllLinesFromFile = (cache) => cache.split(/\r?\n/);
|
|
|
const extractPinnedAtfromText = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])(\spinnedAt\: (\d{14,}))$/.exec(line)) == null ? void 0 : _a[6];
|
|
|
};
|
|
|
var api;
|
|
|
(function(api2) {
|
|
|
function getUserInfo() {
|
|
|
}
|
|
|
api2.getUserInfo = getUserInfo;
|
|
|
function checkUsernameUsable(username) {
|
|
|
}
|
|
|
api2.checkUsernameUsable = checkUsernameUsable;
|
|
|
function checkPasswordValid(password) {
|
|
|
}
|
|
|
api2.checkPasswordValid = checkPasswordValid;
|
|
|
function updateUserinfo(userinfo) {
|
|
|
}
|
|
|
api2.updateUserinfo = updateUserinfo;
|
|
|
async function getMyMemos() {
|
|
|
return await getMemos();
|
|
|
}
|
|
|
api2.getMyMemos = getMyMemos;
|
|
|
function getMyDeletedMemos() {
|
|
|
return getDeletedMemos();
|
|
|
}
|
|
|
api2.getMyDeletedMemos = getMyDeletedMemos;
|
|
|
function hideMemo(memoId) {
|
|
|
return obHideMemo(memoId);
|
|
|
}
|
|
|
api2.hideMemo = hideMemo;
|
|
|
function restoreMemo(memoId) {
|
|
|
return restoreDeletedMemo(memoId);
|
|
|
}
|
|
|
api2.restoreMemo = restoreMemo;
|
|
|
function deleteMemo(memoId) {
|
|
|
return deleteForever(memoId);
|
|
|
}
|
|
|
api2.deleteMemo = deleteMemo;
|
|
|
function getMyQueries() {
|
|
|
return findQuery();
|
|
|
}
|
|
|
api2.getMyQueries = getMyQueries;
|
|
|
function createQuery(title, querystring) {
|
|
|
return createObsidianQuery(title, querystring);
|
|
|
}
|
|
|
api2.createQuery = createQuery;
|
|
|
function updateQuery(queryId, title, querystring) {
|
|
|
return updateObsidianQuery(queryId, title, querystring);
|
|
|
}
|
|
|
api2.updateQuery = updateQuery;
|
|
|
function deleteQueryById(queryId) {
|
|
|
return deleteQueryForever(queryId);
|
|
|
}
|
|
|
api2.deleteQueryById = deleteQueryById;
|
|
|
function pinQuery(queryId) {
|
|
|
return pinQueryInFile(queryId);
|
|
|
}
|
|
|
api2.pinQuery = pinQuery;
|
|
|
function unpinQuery(queryId) {
|
|
|
return unpinQueryInFile(queryId);
|
|
|
}
|
|
|
api2.unpinQuery = unpinQuery;
|
|
|
})(api || (api = {}));
|
|
|
var api$1 = api;
|
|
|
const SHOW_SIDERBAR_MOBILE_CLASSNAME = "mobile-show-sidebar";
|
|
|
const ANIMATION_DURATION = 200;
|
|
|
const DAILY_TIMESTAMP = 3600 * 24 * 1e3;
|
|
|
const TAG_REG = /\s#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const FIRST_TAG_REG = /(<p>|<br>)#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const NOP_FIRST_TAG_REG = /^#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu;
|
|
|
const LINK_REG = /(\s|:|>)((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-]))/g;
|
|
|
const MD_LINK_REG = /\[([\s\S]*?)\]\(([\s\S]*?)\)/gu;
|
|
|
const IMAGE_URL_REG = /([^\s<\\*>']+\.(jpeg|jpg|gif|png|svg))(\]\])?(\))?/g;
|
|
|
const MARKDOWN_URL_REG = /(!\[([^\]]*)(\|)?(.*?)\]\((.*?)("(?:.*[^"])")?\s*\))/g;
|
|
|
const MARKDOWN_WEB_URL_REG = /(\s|:|^)(http[s]?:\/\/)([^\/\s]+\/)(.*?)(jpeg|jpg|gif|png|svg|bmp|wepg)(?!\))/g;
|
|
|
const WIKI_IMAGE_URL_REG = /!\[\[((.*?)\.(jpeg|jpg|gif|png|svg|bmp|wepg))?(\|)?(.*?)\]\]/g;
|
|
|
const MEMO_LINK_REG = /\[@(.+?)\]\((.+?)\)/g;
|
|
|
class MemoService {
|
|
|
constructor() {
|
|
|
__publicField(this, "initialized", false);
|
|
|
}
|
|
|
getState() {
|
|
|
return appStore.getState().memoState;
|
|
|
}
|
|
|
async fetchAllMemos() {
|
|
|
const data = await api$1.getMyMemos();
|
|
|
const memos = [];
|
|
|
for (const m2 of data) {
|
|
|
memos.push(m2);
|
|
|
}
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MEMOS",
|
|
|
payload: {
|
|
|
memos
|
|
|
}
|
|
|
});
|
|
|
if (!this.initialized) {
|
|
|
this.initialized = true;
|
|
|
}
|
|
|
return memos;
|
|
|
}
|
|
|
async fetchDeletedMemos() {
|
|
|
const data = await api$1.getMyDeletedMemos();
|
|
|
data.sort((a, b) => utils$1.getTimeStampByDate(b.deletedAt) - utils$1.getTimeStampByDate(a.deletedAt));
|
|
|
return data;
|
|
|
}
|
|
|
pushMemo(memo2) {
|
|
|
appStore.dispatch({
|
|
|
type: "INSERT_MEMO",
|
|
|
payload: {
|
|
|
memo: __spreadValues({}, memo2)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
getMemoById(id2) {
|
|
|
for (const m2 of this.getState().memos) {
|
|
|
if (m2.id === id2) {
|
|
|
return m2;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
async hideMemoById(id2) {
|
|
|
await api$1.hideMemo(id2);
|
|
|
appStore.dispatch({
|
|
|
type: "DELETE_MEMO_BY_ID",
|
|
|
payload: {
|
|
|
id: id2
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async restoreMemoById(id2) {
|
|
|
await api$1.restoreMemo(id2);
|
|
|
}
|
|
|
async deleteMemoById(id2) {
|
|
|
await api$1.deleteMemo(id2);
|
|
|
}
|
|
|
editMemo(memo2) {
|
|
|
appStore.dispatch({
|
|
|
type: "EDIT_MEMO",
|
|
|
payload: memo2
|
|
|
});
|
|
|
}
|
|
|
updateTagsState() {
|
|
|
var _a, _b, _c;
|
|
|
const { memos } = this.getState();
|
|
|
const tagsSet = new Set();
|
|
|
for (const m2 of memos) {
|
|
|
for (const t2 of Array.from((_a = m2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
tagsSet.add(t2.replace(TAG_REG, "$1").trim());
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = m2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
tagsSet.add(t2.replace(NOP_FIRST_TAG_REG, "$1").trim());
|
|
|
}
|
|
|
for (const t2 of Array.from((_c = m2.content.match(FIRST_TAG_REG)) != null ? _c : [])) {
|
|
|
tagsSet.add(t2.replace(FIRST_TAG_REG, "$2").trim());
|
|
|
}
|
|
|
}
|
|
|
appStore.dispatch({
|
|
|
type: "SET_TAGS",
|
|
|
payload: {
|
|
|
tags: Array.from(tagsSet)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
clearMemos() {
|
|
|
appStore.dispatch({
|
|
|
type: "SET_MEMOS",
|
|
|
payload: {
|
|
|
memos: []
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async getLinkedMemos(memoId) {
|
|
|
const { memos } = this.getState();
|
|
|
return memos.filter((m2) => m2.content.includes(memoId));
|
|
|
}
|
|
|
async createMemo(text, isList2) {
|
|
|
const memo2 = await waitForInsert(text, isList2);
|
|
|
return memo2;
|
|
|
}
|
|
|
async updateMemo(memoId, originalText, text, type) {
|
|
|
const memo2 = await changeMemo(memoId, originalText, text, type);
|
|
|
return memo2;
|
|
|
}
|
|
|
}
|
|
|
const memoService = new MemoService();
|
|
|
class QueryService {
|
|
|
getState() {
|
|
|
return appStore.getState().queryState;
|
|
|
}
|
|
|
async getMyAllQueries() {
|
|
|
const data = await api$1.getMyQueries();
|
|
|
appStore.dispatch({
|
|
|
type: "SET_QUERIES",
|
|
|
payload: {
|
|
|
queries: data
|
|
|
}
|
|
|
});
|
|
|
return data;
|
|
|
}
|
|
|
getQueryById(id2) {
|
|
|
for (const q2 of this.getState().queries) {
|
|
|
if (q2.id === id2) {
|
|
|
return q2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
pushQuery(query) {
|
|
|
appStore.dispatch({
|
|
|
type: "INSERT_QUERY",
|
|
|
payload: {
|
|
|
query: __spreadValues({}, query)
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
editQuery(query) {
|
|
|
appStore.dispatch({
|
|
|
type: "UPDATE_QUERY",
|
|
|
payload: query
|
|
|
});
|
|
|
}
|
|
|
async deleteQuery(queryId) {
|
|
|
await api$1.deleteQueryById(queryId);
|
|
|
appStore.dispatch({
|
|
|
type: "DELETE_QUERY_BY_ID",
|
|
|
payload: {
|
|
|
id: queryId
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
async createQuery(title, querystring) {
|
|
|
const data = await api$1.createQuery(title, querystring);
|
|
|
return data;
|
|
|
}
|
|
|
async updateQuery(queryId, title, querystring) {
|
|
|
const data = await api$1.updateQuery(queryId, title, querystring);
|
|
|
return data;
|
|
|
}
|
|
|
async pinQuery(queryId) {
|
|
|
await api$1.pinQuery(queryId);
|
|
|
}
|
|
|
async unpinQuery(queryId) {
|
|
|
await api$1.unpinQuery(queryId);
|
|
|
}
|
|
|
}
|
|
|
const queryService = new QueryService();
|
|
|
class ResourceService {
|
|
|
async upload(file) {
|
|
|
const { vault, fileManager } = appStore.getState().dailyNotesState.app;
|
|
|
const fileArray = await file.arrayBuffer();
|
|
|
const ext = getExt(file.type);
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
const date = require$$0.moment();
|
|
|
const existingFile = getDailyNote_1(date, dailyNotes);
|
|
|
let newFile;
|
|
|
if (!existingFile) {
|
|
|
const dailyFile = await createDailyNote_1(date);
|
|
|
newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, dailyFile), fileArray);
|
|
|
} else if (existingFile instanceof require$$0.TFile) {
|
|
|
newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, existingFile), fileArray);
|
|
|
}
|
|
|
const newFilePath = fileManager.generateMarkdownLink(newFile, newFile.path, "", "");
|
|
|
return newFilePath;
|
|
|
}
|
|
|
}
|
|
|
const getExt = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /^image\/(.+)$/.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const resourceService = new ResourceService();
|
|
|
const getInitialAction = () => {
|
|
|
return {
|
|
|
type: "initialText",
|
|
|
value: "",
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: 0,
|
|
|
selectionEnd: 0
|
|
|
};
|
|
|
};
|
|
|
const defaultConfig = {
|
|
|
initialValue: "",
|
|
|
interval: 300
|
|
|
};
|
|
|
class TinyUndo {
|
|
|
constructor(element, config = defaultConfig) {
|
|
|
this.listeners = [];
|
|
|
this.runUndo = () => {
|
|
|
const cursorPosition = this.actions[this.currentIndex].selectionStart;
|
|
|
if (this.currentIndex > 0) {
|
|
|
this.currentIndex--;
|
|
|
}
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.element.setSelectionRange(cursorPosition, cursorPosition);
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.runRedo = () => {
|
|
|
if (this.currentIndex < this.actions.length - 1) {
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
const cursorPosition = this.actions[this.currentIndex].selectionEnd;
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.element.setSelectionRange(cursorPosition, cursorPosition);
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.getActions = () => {
|
|
|
return this.actions;
|
|
|
};
|
|
|
this.setState = (actions, index) => {
|
|
|
this.actions = [...actions];
|
|
|
this.currentIndex = index < this.actions.length ? index : this.actions.length - 1;
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.resetState = () => {
|
|
|
this.actions = [getInitialAction()];
|
|
|
this.currentIndex = 0;
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.destroy = () => {
|
|
|
this.rmEventListeners();
|
|
|
};
|
|
|
this.subscribe = (callback) => {
|
|
|
this.listeners.push(callback);
|
|
|
};
|
|
|
this.handleElementKeydown = (event) => {
|
|
|
const keyboardEvent = event;
|
|
|
if (keyboardEvent.key === "z" && !keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) {
|
|
|
event.preventDefault();
|
|
|
this.runUndo();
|
|
|
} else if (keyboardEvent.key === "z" && keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey) || keyboardEvent.key === "y" && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) {
|
|
|
event.preventDefault();
|
|
|
this.runRedo();
|
|
|
}
|
|
|
};
|
|
|
this.handleElementInput = (event) => {
|
|
|
const inputEvent = event;
|
|
|
const lastAction = this.actions[this.currentIndex];
|
|
|
this.pushNewAction({
|
|
|
type: inputEvent.inputType,
|
|
|
value: this.element.value,
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: this.element.selectionEnd - (this.element.value.length - lastAction.value.length),
|
|
|
selectionEnd: this.element.selectionEnd
|
|
|
});
|
|
|
};
|
|
|
this.addEventListeners = () => {
|
|
|
this.element.addEventListener("keydown", this.handleElementKeydown);
|
|
|
this.element.addEventListener("input", this.handleElementInput);
|
|
|
};
|
|
|
this.rmEventListeners = () => {
|
|
|
this.element.removeEventListener("keydown", this.handleElementKeydown);
|
|
|
this.element.removeEventListener("input", this.handleElementInput);
|
|
|
};
|
|
|
this.pushNewAction = (action) => {
|
|
|
const lastAction = this.actions[this.currentIndex];
|
|
|
if (lastAction && lastAction.type === action.type && action.timestamp - lastAction.timestamp < this.config.interval) {
|
|
|
this.actions[this.currentIndex] = Object.assign(Object.assign({}, lastAction), { value: action.value, selectionEnd: action.selectionEnd, timestamp: action.timestamp });
|
|
|
} else {
|
|
|
if (this.config.maxSize && this.currentIndex >= this.config.maxSize) {
|
|
|
this.actions.shift();
|
|
|
this.actions[0] = getInitialAction();
|
|
|
} else {
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
this.actions[this.currentIndex] = action;
|
|
|
this.actions = this.actions.slice(0, this.currentIndex + 1);
|
|
|
}
|
|
|
this.dispatchChange();
|
|
|
};
|
|
|
this.dispatchChange = () => {
|
|
|
for (const cb2 of this.listeners) {
|
|
|
cb2([...this.actions], this.currentIndex);
|
|
|
}
|
|
|
};
|
|
|
this.element = element;
|
|
|
this.config = Object.assign(Object.assign({}, defaultConfig), config);
|
|
|
if (this.config.initialActions && this.config.initialActions.length > 0) {
|
|
|
this.actions = this.config.initialActions;
|
|
|
if (this.config.initialIndex !== void 0 && this.config.initialIndex < this.actions.length) {
|
|
|
this.currentIndex = this.config.initialIndex;
|
|
|
} else {
|
|
|
this.currentIndex = this.actions.length - 1;
|
|
|
}
|
|
|
} else {
|
|
|
this.actions = [getInitialAction()];
|
|
|
this.currentIndex = 0;
|
|
|
if (this.config.initialValue !== "") {
|
|
|
this.actions.push({
|
|
|
type: "insertText",
|
|
|
value: this.config.initialValue,
|
|
|
timestamp: Date.now(),
|
|
|
selectionStart: 0,
|
|
|
selectionEnd: this.config.initialValue.length
|
|
|
});
|
|
|
this.currentIndex++;
|
|
|
}
|
|
|
}
|
|
|
this.element.value = this.actions[this.currentIndex].value;
|
|
|
this.addEventListeners();
|
|
|
}
|
|
|
}
|
|
|
function useRefresh() {
|
|
|
const [, setBoolean] = _react_17_0_2_react.exports.useState(false);
|
|
|
const refresh = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
setBoolean((ps) => {
|
|
|
return !ps;
|
|
|
});
|
|
|
}, []);
|
|
|
return refresh;
|
|
|
}
|
|
|
var jsxRuntime = { exports: {} };
|
|
|
var reactJsxRuntime_production_min = {};
|
|
|
/** @license React v17.0.2
|
|
|
* react-jsx-runtime.production.min.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.
|
|
|
*/
|
|
|
var f = _react_17_0_2_react.exports, g = 60103;
|
|
|
reactJsxRuntime_production_min.Fragment = 60107;
|
|
|
if (typeof Symbol === "function" && Symbol.for) {
|
|
|
var h = Symbol.for;
|
|
|
g = h("react.element");
|
|
|
reactJsxRuntime_production_min.Fragment = h("react.fragment");
|
|
|
}
|
|
|
var m = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, n = Object.prototype.hasOwnProperty, p = { key: true, ref: true, __self: true, __source: true };
|
|
|
function q(c, a, k) {
|
|
|
var b, d = {}, e = null, l2 = null;
|
|
|
k !== void 0 && (e = "" + k);
|
|
|
a.key !== void 0 && (e = "" + a.key);
|
|
|
a.ref !== void 0 && (l2 = a.ref);
|
|
|
for (b in a)
|
|
|
n.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
|
|
|
if (c && c.defaultProps)
|
|
|
for (b in a = c.defaultProps, a)
|
|
|
d[b] === void 0 && (d[b] = a[b]);
|
|
|
return { $$typeof: g, type: c, key: e, ref: l2, props: d, _owner: m.current };
|
|
|
}
|
|
|
reactJsxRuntime_production_min.jsx = q;
|
|
|
reactJsxRuntime_production_min.jsxs = q;
|
|
|
{
|
|
|
jsxRuntime.exports = reactJsxRuntime_production_min;
|
|
|
}
|
|
|
const jsx = jsxRuntime.exports.jsx;
|
|
|
const jsxs = jsxRuntime.exports.jsxs;
|
|
|
const Fragment = jsxRuntime.exports.Fragment;
|
|
|
const OnlyWhen = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
when
|
|
|
} = props;
|
|
|
return when ? /* @__PURE__ */ jsx(Fragment, {
|
|
|
children
|
|
|
}) : null;
|
|
|
};
|
|
|
const Only = OnlyWhen;
|
|
|
var editor = "";
|
|
|
var _textareaCaret_3_0_2_textareaCaret = { exports: {} };
|
|
|
(function(module2) {
|
|
|
(function() {
|
|
|
var properties = [
|
|
|
"direction",
|
|
|
"boxSizing",
|
|
|
"width",
|
|
|
"height",
|
|
|
"overflowX",
|
|
|
"overflowY",
|
|
|
"borderTopWidth",
|
|
|
"borderRightWidth",
|
|
|
"borderBottomWidth",
|
|
|
"borderLeftWidth",
|
|
|
"borderStyle",
|
|
|
"paddingTop",
|
|
|
"paddingRight",
|
|
|
"paddingBottom",
|
|
|
"paddingLeft",
|
|
|
"fontStyle",
|
|
|
"fontVariant",
|
|
|
"fontWeight",
|
|
|
"fontStretch",
|
|
|
"fontSize",
|
|
|
"fontSizeAdjust",
|
|
|
"lineHeight",
|
|
|
"fontFamily",
|
|
|
"textAlign",
|
|
|
"textTransform",
|
|
|
"textIndent",
|
|
|
"textDecoration",
|
|
|
"letterSpacing",
|
|
|
"wordSpacing",
|
|
|
"tabSize",
|
|
|
"MozTabSize"
|
|
|
];
|
|
|
var isBrowser = typeof window !== "undefined";
|
|
|
var isFirefox = isBrowser && window.mozInnerScreenX != null;
|
|
|
function getCaretCoordinates2(element, position, options) {
|
|
|
if (!isBrowser) {
|
|
|
throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");
|
|
|
}
|
|
|
var debug = options && options.debug || false;
|
|
|
if (debug) {
|
|
|
var el = document.querySelector("#input-textarea-caret-position-mirror-div");
|
|
|
if (el) {
|
|
|
el.parentNode.removeChild(el);
|
|
|
}
|
|
|
}
|
|
|
var div = document.createElement("div");
|
|
|
div.id = "input-textarea-caret-position-mirror-div";
|
|
|
document.body.appendChild(div);
|
|
|
var style = div.style;
|
|
|
var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle;
|
|
|
style.whiteSpace = "pre-wrap";
|
|
|
if (element.nodeName !== "INPUT")
|
|
|
style.wordWrap = "break-word";
|
|
|
style.position = "absolute";
|
|
|
if (!debug)
|
|
|
style.visibility = "hidden";
|
|
|
properties.forEach(function(prop) {
|
|
|
style[prop] = computed[prop];
|
|
|
});
|
|
|
if (isFirefox) {
|
|
|
if (element.scrollHeight > parseInt(computed.height))
|
|
|
style.overflowY = "scroll";
|
|
|
} else {
|
|
|
style.overflow = "hidden";
|
|
|
}
|
|
|
div.textContent = element.value.substring(0, position);
|
|
|
if (element.nodeName === "INPUT")
|
|
|
div.textContent = div.textContent.replace(/\s/g, "\xA0");
|
|
|
var span = document.createElement("span");
|
|
|
span.textContent = element.value.substring(position) || ".";
|
|
|
div.appendChild(span);
|
|
|
var coordinates = {
|
|
|
top: span.offsetTop + parseInt(computed["borderTopWidth"]),
|
|
|
left: span.offsetLeft + parseInt(computed["borderLeftWidth"])
|
|
|
};
|
|
|
if (debug) {
|
|
|
span.style.backgroundColor = "#aaa";
|
|
|
} else {
|
|
|
document.body.removeChild(div);
|
|
|
}
|
|
|
return coordinates;
|
|
|
}
|
|
|
{
|
|
|
module2.exports = getCaretCoordinates2;
|
|
|
}
|
|
|
})();
|
|
|
})(_textareaCaret_3_0_2_textareaCaret);
|
|
|
var getCaretCoordinates = _textareaCaret_3_0_2_textareaCaret.exports;
|
|
|
var NativeCustomEvent = commonjsGlobal.CustomEvent;
|
|
|
function useNative() {
|
|
|
try {
|
|
|
var p2 = new NativeCustomEvent("cat", { detail: { foo: "bar" } });
|
|
|
return p2.type === "cat" && p2.detail.foo === "bar";
|
|
|
} catch (e) {
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
var _customEvent_1_0_1_customEvent = useNative() ? NativeCustomEvent : typeof document !== "undefined" && typeof document.createEvent === "function" ? function CustomEvent(type, params) {
|
|
|
var e = document.createEvent("CustomEvent");
|
|
|
if (params) {
|
|
|
e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
|
|
|
} else {
|
|
|
e.initCustomEvent(type, false, false, void 0);
|
|
|
}
|
|
|
return e;
|
|
|
} : function CustomEvent2(type, params) {
|
|
|
var e = document.createEventObject();
|
|
|
e.type = type;
|
|
|
if (params) {
|
|
|
e.bubbles = Boolean(params.bubbles);
|
|
|
e.cancelable = Boolean(params.cancelable);
|
|
|
e.detail = params.detail;
|
|
|
} else {
|
|
|
e.bubbles = false;
|
|
|
e.cancelable = false;
|
|
|
e.detail = void 0;
|
|
|
}
|
|
|
return e;
|
|
|
};
|
|
|
function _defineProperty$2(obj, key, value) {
|
|
|
if (key in obj) {
|
|
|
Object.defineProperty(obj, key, {
|
|
|
value,
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
writable: true
|
|
|
});
|
|
|
} else {
|
|
|
obj[key] = value;
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
function _objectSpread$7(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
var ownKeys2 = Object.keys(source);
|
|
|
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
|
ownKeys2 = ownKeys2.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
|
}));
|
|
|
}
|
|
|
ownKeys2.forEach(function(key) {
|
|
|
_defineProperty$2(target, key, source[key]);
|
|
|
});
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _classCallCheck$2(instance2, Constructor) {
|
|
|
if (!(instance2 instanceof Constructor)) {
|
|
|
throw new TypeError("Cannot call a class as a function");
|
|
|
}
|
|
|
}
|
|
|
function _defineProperties$2(target, props) {
|
|
|
for (var i = 0; i < props.length; i++) {
|
|
|
var descriptor = props[i];
|
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
|
descriptor.configurable = true;
|
|
|
if ("value" in descriptor)
|
|
|
descriptor.writable = true;
|
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
|
}
|
|
|
}
|
|
|
function _createClass$2(Constructor, protoProps, staticProps) {
|
|
|
if (protoProps)
|
|
|
_defineProperties$2(Constructor.prototype, protoProps);
|
|
|
if (staticProps)
|
|
|
_defineProperties$2(Constructor, staticProps);
|
|
|
return Constructor;
|
|
|
}
|
|
|
function _typeof2(obj) {
|
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
|
_typeof2 = function _typeof22(obj2) {
|
|
|
return typeof obj2;
|
|
|
};
|
|
|
} else {
|
|
|
_typeof2 = function _typeof22(obj2) {
|
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
|
};
|
|
|
}
|
|
|
return _typeof2(obj);
|
|
|
}
|
|
|
function _typeof$2(obj) {
|
|
|
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
|
|
|
_typeof$2 = function _typeof3(obj2) {
|
|
|
return _typeof2(obj2);
|
|
|
};
|
|
|
} else {
|
|
|
_typeof$2 = function _typeof3(obj2) {
|
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : _typeof2(obj2);
|
|
|
};
|
|
|
}
|
|
|
return _typeof$2(obj);
|
|
|
}
|
|
|
function _assertThisInitialized$2(self2) {
|
|
|
if (self2 === void 0) {
|
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
|
}
|
|
|
return self2;
|
|
|
}
|
|
|
function _possibleConstructorReturn$2(self2, call) {
|
|
|
if (call && (_typeof$2(call) === "object" || typeof call === "function")) {
|
|
|
return call;
|
|
|
}
|
|
|
return _assertThisInitialized$2(self2);
|
|
|
}
|
|
|
function _getPrototypeOf$2(o) {
|
|
|
_getPrototypeOf$2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
|
|
|
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
|
};
|
|
|
return _getPrototypeOf$2(o);
|
|
|
}
|
|
|
function _setPrototypeOf$2(o, p2) {
|
|
|
_setPrototypeOf$2 = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) {
|
|
|
o2.__proto__ = p3;
|
|
|
return o2;
|
|
|
};
|
|
|
return _setPrototypeOf$2(o, p2);
|
|
|
}
|
|
|
function _inherits$2(subClass, superClass) {
|
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
|
}
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
|
constructor: {
|
|
|
value: subClass,
|
|
|
writable: true,
|
|
|
configurable: true
|
|
|
}
|
|
|
});
|
|
|
if (superClass)
|
|
|
_setPrototypeOf$2(subClass, superClass);
|
|
|
}
|
|
|
function _arrayWithoutHoles(arr) {
|
|
|
if (Array.isArray(arr)) {
|
|
|
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
|
|
|
arr2[i] = arr[i];
|
|
|
}
|
|
|
return arr2;
|
|
|
}
|
|
|
}
|
|
|
function _iterableToArray$1(iter) {
|
|
|
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]")
|
|
|
return Array.from(iter);
|
|
|
}
|
|
|
function _nonIterableSpread() {
|
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance");
|
|
|
}
|
|
|
function _toConsumableArray(arr) {
|
|
|
return _arrayWithoutHoles(arr) || _iterableToArray$1(arr) || _nonIterableSpread();
|
|
|
}
|
|
|
var KEY_CODES = {
|
|
|
ESC: 27,
|
|
|
UP: 38,
|
|
|
DOWN: 40,
|
|
|
LEFT: 37,
|
|
|
RIGHT: 39,
|
|
|
ENTER: 13,
|
|
|
TAB: 9
|
|
|
};
|
|
|
var Listener = function Listener2() {
|
|
|
var _this = this;
|
|
|
_classCallCheck$2(this, Listener2);
|
|
|
this.startListen = function(ref) {
|
|
|
if (!ref)
|
|
|
return;
|
|
|
ref.addEventListener("keydown", _this.f);
|
|
|
};
|
|
|
this.stopListen = function(ref) {
|
|
|
if (!ref)
|
|
|
return;
|
|
|
ref.removeEventListener("keydown", _this.f);
|
|
|
};
|
|
|
this.add = function(keyCodes, fn2) {
|
|
|
var keyCode = keyCodes;
|
|
|
if (typeof keyCode !== "object")
|
|
|
keyCode = [keyCode];
|
|
|
_this.listeners[_this.index] = {
|
|
|
keyCode,
|
|
|
fn: fn2
|
|
|
};
|
|
|
return _this.index++;
|
|
|
};
|
|
|
this.remove = function(id2) {
|
|
|
delete _this.listeners[id2];
|
|
|
};
|
|
|
this.removeAll = function() {
|
|
|
_this.listeners = {};
|
|
|
_this.index = 1;
|
|
|
};
|
|
|
this.index = 1;
|
|
|
this.listeners = {};
|
|
|
this.f = function(e) {
|
|
|
if (!e)
|
|
|
return;
|
|
|
var code = e.keyCode || e.which;
|
|
|
Object.values(_this.listeners).forEach(function(_ref) {
|
|
|
var keyCode = _ref.keyCode, fn2 = _ref.fn;
|
|
|
if (keyCode.includes(code)) {
|
|
|
e.stopPropagation();
|
|
|
e.preventDefault();
|
|
|
fn2(e);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
};
|
|
|
var Listeners = new Listener();
|
|
|
var Item = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$2(Item2, _React$Component);
|
|
|
function Item2() {
|
|
|
var _getPrototypeOf2;
|
|
|
var _this;
|
|
|
_classCallCheck$2(this, Item2);
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
_this = _possibleConstructorReturn$2(this, (_getPrototypeOf2 = _getPrototypeOf$2(Item2)).call.apply(_getPrototypeOf2, [this].concat(args)));
|
|
|
_this.selectItem = function() {
|
|
|
var _this$props = _this.props, item = _this$props.item, onSelectHandler = _this$props.onSelectHandler;
|
|
|
onSelectHandler(item);
|
|
|
};
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass$2(Item2, [{
|
|
|
key: "shouldComponentUpdate",
|
|
|
value: function shouldComponentUpdate(nextProps) {
|
|
|
if (this.props.item !== nextProps.item || this.props.selected !== nextProps.selected || this.props.style !== nextProps.style || this.props.className !== nextProps.className) {
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this2 = this;
|
|
|
var _this$props2 = this.props, Component = _this$props2.component, style = _this$props2.style, onClickHandler = _this$props2.onClickHandler, item = _this$props2.item, selected = _this$props2.selected, className = _this$props2.className, innerRef = _this$props2.innerRef;
|
|
|
return React$1.createElement("li", {
|
|
|
className: "rta__item ".concat(selected === true ? "rta__item--selected" : "", " ").concat(className || ""),
|
|
|
style
|
|
|
}, React$1.createElement("div", {
|
|
|
className: "rta__entity ".concat(selected === true ? "rta__entity--selected" : ""),
|
|
|
role: "button",
|
|
|
tabIndex: 0,
|
|
|
onClick: onClickHandler,
|
|
|
onFocus: this.selectItem,
|
|
|
onMouseEnter: this.selectItem,
|
|
|
onTouchStart: function onTouchStart() {
|
|
|
_this2.clicked = true;
|
|
|
_this2.selectItem();
|
|
|
},
|
|
|
onTouchEnd: function onTouchEnd(e) {
|
|
|
e.preventDefault();
|
|
|
if (_this2.clicked) {
|
|
|
onClickHandler(e);
|
|
|
}
|
|
|
},
|
|
|
onTouchMove: function onTouchMove() {
|
|
|
_this2.clicked = false;
|
|
|
},
|
|
|
onTouchCancel: function onTouchCancel() {
|
|
|
_this2.clicked = false;
|
|
|
},
|
|
|
ref: innerRef
|
|
|
}, React$1.createElement(Component, {
|
|
|
selected,
|
|
|
entity: item
|
|
|
})));
|
|
|
}
|
|
|
}]);
|
|
|
return Item2;
|
|
|
}(React$1.Component);
|
|
|
var List = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$2(List2, _React$Component);
|
|
|
function List2() {
|
|
|
var _getPrototypeOf2;
|
|
|
var _this;
|
|
|
_classCallCheck$2(this, List2);
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
_this = _possibleConstructorReturn$2(this, (_getPrototypeOf2 = _getPrototypeOf$2(List2)).call.apply(_getPrototypeOf2, [this].concat(args)));
|
|
|
_this.state = {
|
|
|
selectedItem: null
|
|
|
};
|
|
|
_this.cachedIdOfItems = new Map();
|
|
|
_this.onPressEnter = function(e) {
|
|
|
if (typeof e !== "undefined") {
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
var values = _this.props.values;
|
|
|
_this.modifyText(values[_this.getPositionInList()]);
|
|
|
};
|
|
|
_this.getPositionInList = function() {
|
|
|
var values = _this.props.values;
|
|
|
var selectedItem = _this.state.selectedItem;
|
|
|
if (!selectedItem)
|
|
|
return 0;
|
|
|
return values.findIndex(function(a) {
|
|
|
return _this.getId(a) === _this.getId(selectedItem);
|
|
|
});
|
|
|
};
|
|
|
_this.getId = function(item) {
|
|
|
if (_this.cachedIdOfItems.has(item)) {
|
|
|
return _this.cachedIdOfItems.get(item);
|
|
|
}
|
|
|
var textToReplace = _this.props.getTextToReplace(item);
|
|
|
var computeId = function computeId2() {
|
|
|
if (textToReplace) {
|
|
|
if (textToReplace.key) {
|
|
|
return textToReplace.key;
|
|
|
}
|
|
|
if (typeof item === "string" || !item.key) {
|
|
|
return textToReplace.text;
|
|
|
}
|
|
|
}
|
|
|
if (!item.key) {
|
|
|
throw new Error("Item ".concat(JSON.stringify(item), ' has to have defined "key" property'));
|
|
|
}
|
|
|
return item.key;
|
|
|
};
|
|
|
var id2 = computeId();
|
|
|
_this.cachedIdOfItems.set(item, id2);
|
|
|
return id2;
|
|
|
};
|
|
|
_this.listeners = [];
|
|
|
_this.itemsRef = {};
|
|
|
_this.modifyText = function(value) {
|
|
|
if (!value)
|
|
|
return;
|
|
|
var onSelect = _this.props.onSelect;
|
|
|
onSelect(value);
|
|
|
};
|
|
|
_this.selectItem = function(item) {
|
|
|
var keyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
|
var onItemHighlighted = _this.props.onItemHighlighted;
|
|
|
if (_this.state.selectedItem === item)
|
|
|
return;
|
|
|
_this.setState({
|
|
|
selectedItem: item
|
|
|
}, function() {
|
|
|
onItemHighlighted(item);
|
|
|
if (keyboard) {
|
|
|
_this.props.dropdownScroll(_this.itemsRef[_this.getId(item)]);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this.scroll = function(e) {
|
|
|
e.preventDefault();
|
|
|
var values = _this.props.values;
|
|
|
var code = e.keyCode || e.which;
|
|
|
var oldPosition = _this.getPositionInList();
|
|
|
var newPosition;
|
|
|
switch (code) {
|
|
|
case KEY_CODES.DOWN:
|
|
|
newPosition = oldPosition + 1;
|
|
|
break;
|
|
|
case KEY_CODES.UP:
|
|
|
newPosition = oldPosition - 1;
|
|
|
break;
|
|
|
default:
|
|
|
newPosition = oldPosition;
|
|
|
break;
|
|
|
}
|
|
|
newPosition = (newPosition % values.length + values.length) % values.length;
|
|
|
_this.selectItem(values[newPosition], [KEY_CODES.DOWN, KEY_CODES.UP].includes(code));
|
|
|
};
|
|
|
_this.isSelected = function(item) {
|
|
|
var selectedItem = _this.state.selectedItem;
|
|
|
if (!selectedItem)
|
|
|
return false;
|
|
|
return _this.getId(selectedItem) === _this.getId(item);
|
|
|
};
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass$2(List2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
this.listeners.push(Listeners.add([KEY_CODES.DOWN, KEY_CODES.UP], this.scroll), Listeners.add([KEY_CODES.ENTER, KEY_CODES.TAB], this.onPressEnter));
|
|
|
var values = this.props.values;
|
|
|
if (values && values[0])
|
|
|
this.selectItem(values[0]);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(_ref) {
|
|
|
var _this2 = this;
|
|
|
var oldValues = _ref.values;
|
|
|
var values = this.props.values;
|
|
|
var oldValuesSerialized = oldValues.map(function(val) {
|
|
|
return _this2.getId(val);
|
|
|
}).join("");
|
|
|
var newValuesSerialized = values.map(function(val) {
|
|
|
return _this2.getId(val);
|
|
|
}).join("");
|
|
|
if (oldValuesSerialized !== newValuesSerialized && values && values[0]) {
|
|
|
this.selectItem(values[0]);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
var listener;
|
|
|
while (this.listeners.length) {
|
|
|
listener = this.listeners.pop();
|
|
|
Listeners.remove(listener);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var _this$props = this.props, values = _this$props.values, component = _this$props.component, style = _this$props.style, itemClassName = _this$props.itemClassName, className = _this$props.className, itemStyle = _this$props.itemStyle;
|
|
|
return React$1.createElement("ul", {
|
|
|
className: "rta__list ".concat(className || ""),
|
|
|
style
|
|
|
}, values.map(function(item) {
|
|
|
return React$1.createElement(Item, {
|
|
|
key: _this3.getId(item),
|
|
|
innerRef: function innerRef(ref) {
|
|
|
_this3.itemsRef[_this3.getId(item)] = ref;
|
|
|
},
|
|
|
selected: _this3.isSelected(item),
|
|
|
item,
|
|
|
className: itemClassName,
|
|
|
style: itemStyle,
|
|
|
onClickHandler: _this3.onPressEnter,
|
|
|
onSelectHandler: _this3.selectItem,
|
|
|
component
|
|
|
});
|
|
|
}));
|
|
|
}
|
|
|
}]);
|
|
|
return List2;
|
|
|
}(React$1.Component);
|
|
|
function defaultScrollToItem(container, item) {
|
|
|
var itemHeight = parseInt(getComputedStyle(item).getPropertyValue("height"), 10);
|
|
|
var containerHight = parseInt(getComputedStyle(container).getPropertyValue("height"), 10) - itemHeight;
|
|
|
var itemOffsetTop = item.offsetTop;
|
|
|
var actualScrollTop = container.scrollTop;
|
|
|
if (itemOffsetTop < actualScrollTop + containerHight && actualScrollTop < itemOffsetTop) {
|
|
|
return;
|
|
|
}
|
|
|
container.scrollTop = itemOffsetTop;
|
|
|
}
|
|
|
var DEFAULT_CARET_POSITION = "next";
|
|
|
var POSITION_CONFIGURATION = {
|
|
|
X: {
|
|
|
LEFT: "rta__autocomplete--left",
|
|
|
RIGHT: "rta__autocomplete--right"
|
|
|
},
|
|
|
Y: {
|
|
|
TOP: "rta__autocomplete--top",
|
|
|
BOTTOM: "rta__autocomplete--bottom"
|
|
|
}
|
|
|
};
|
|
|
var errorMessage = function errorMessage2(message) {
|
|
|
return console.error("RTA: dataProvider fails: ".concat(message, "\n \nCheck the documentation or create issue if you think it's bug. https://github.com/webscopeio/react-textarea-autocomplete/issues"));
|
|
|
};
|
|
|
var reservedRegexChars = [".", "^", "$", "*", "+", "-", "?", "(", ")", "[", "]", "{", "}", "\\", "|"];
|
|
|
var escapeRegex = function escapeRegex2(text) {
|
|
|
return _toConsumableArray(text).map(function(character) {
|
|
|
return reservedRegexChars.includes(character) ? "\\".concat(character) : character;
|
|
|
}).join("");
|
|
|
};
|
|
|
var Autocomplete = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$2(Autocomplete2, _React$Component);
|
|
|
function Autocomplete2() {
|
|
|
_classCallCheck$2(this, Autocomplete2);
|
|
|
return _possibleConstructorReturn$2(this, _getPrototypeOf$2(Autocomplete2).apply(this, arguments));
|
|
|
}
|
|
|
_createClass$2(Autocomplete2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
var boundariesElement = this.props.boundariesElement;
|
|
|
if (typeof boundariesElement === "string") {
|
|
|
var elem = document.querySelector(boundariesElement);
|
|
|
if (!elem) {
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement.");
|
|
|
}
|
|
|
this.containerElem = elem;
|
|
|
} else if (boundariesElement instanceof HTMLElement) {
|
|
|
this.containerElem = boundariesElement;
|
|
|
} else {
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement.");
|
|
|
}
|
|
|
if (!this.containerElem || !this.containerElem.contains(this.ref)) {
|
|
|
{
|
|
|
throw new Error("RTA: Invalid prop boundariesElement: it has to be one of the parents of the RTA.");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate() {
|
|
|
var _this$ref$classList, _this$ref$classList2;
|
|
|
var top2 = this.props.top || 0;
|
|
|
var left2 = this.props.left || 0;
|
|
|
var usedClasses = [];
|
|
|
var unusedClasses = [];
|
|
|
var topPosition = 0;
|
|
|
var leftPosition = 0;
|
|
|
var containerBounds = this.containerElem.getBoundingClientRect();
|
|
|
var dropdownBounds = this.ref.getBoundingClientRect();
|
|
|
var textareaBounds = this.props.textareaRef.getBoundingClientRect();
|
|
|
var computedStyle = window.getComputedStyle(this.ref);
|
|
|
var marginTop = parseInt(computedStyle.getPropertyValue("margin-top"), 10);
|
|
|
var marginBottom = parseInt(computedStyle.getPropertyValue("margin-bottom"), 10);
|
|
|
var marginLeft = parseInt(computedStyle.getPropertyValue("margin-left"), 10);
|
|
|
var marginRight = parseInt(computedStyle.getPropertyValue("margin-right"), 10);
|
|
|
var dropdownBottom = marginTop + marginBottom + textareaBounds.top + top2 + dropdownBounds.height;
|
|
|
var dropdownRight = marginLeft + marginRight + textareaBounds.left + left2 + dropdownBounds.width;
|
|
|
if (dropdownRight > containerBounds.right && textareaBounds.left + left2 > dropdownBounds.width) {
|
|
|
leftPosition = left2 - dropdownBounds.width;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.X.LEFT);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.X.RIGHT);
|
|
|
} else {
|
|
|
leftPosition = left2;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.X.RIGHT);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.X.LEFT);
|
|
|
}
|
|
|
if (dropdownBottom > containerBounds.bottom && textareaBounds.top + top2 > dropdownBounds.height) {
|
|
|
topPosition = top2 - dropdownBounds.height;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.Y.TOP);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM);
|
|
|
} else {
|
|
|
topPosition = top2;
|
|
|
usedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM);
|
|
|
unusedClasses.push(POSITION_CONFIGURATION.Y.TOP);
|
|
|
}
|
|
|
if (this.props.renderToBody) {
|
|
|
topPosition += textareaBounds.top;
|
|
|
leftPosition += textareaBounds.left;
|
|
|
}
|
|
|
this.ref.style.top = "".concat(topPosition, "px");
|
|
|
this.ref.style.left = "".concat(leftPosition, "px");
|
|
|
(_this$ref$classList = this.ref.classList).remove.apply(_this$ref$classList, unusedClasses);
|
|
|
(_this$ref$classList2 = this.ref.classList).add.apply(_this$ref$classList2, usedClasses);
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this = this;
|
|
|
var _this$props = this.props, style = _this$props.style, className = _this$props.className, innerRef = _this$props.innerRef, children = _this$props.children, renderToBody = _this$props.renderToBody;
|
|
|
var body = document.body;
|
|
|
var autocompleteContainer = React$1.createElement("div", {
|
|
|
ref: function ref(_ref) {
|
|
|
_this.ref = _ref;
|
|
|
innerRef(_ref);
|
|
|
},
|
|
|
className: "rta__autocomplete ".concat(className || ""),
|
|
|
style
|
|
|
}, children);
|
|
|
return renderToBody && body !== null ? ReactDOM$1.createPortal(autocompleteContainer, body) : autocompleteContainer;
|
|
|
}
|
|
|
}]);
|
|
|
return Autocomplete2;
|
|
|
}(React$1.Component);
|
|
|
var ReactTextareaAutocomplete = /* @__PURE__ */ function(_React$Component2) {
|
|
|
_inherits$2(ReactTextareaAutocomplete2, _React$Component2);
|
|
|
function ReactTextareaAutocomplete2(_props) {
|
|
|
var _this2;
|
|
|
_classCallCheck$2(this, ReactTextareaAutocomplete2);
|
|
|
_this2 = _possibleConstructorReturn$2(this, _getPrototypeOf$2(ReactTextareaAutocomplete2).call(this, _props));
|
|
|
_this2.state = {
|
|
|
top: null,
|
|
|
left: null,
|
|
|
currentTrigger: null,
|
|
|
actualToken: "",
|
|
|
data: null,
|
|
|
value: "",
|
|
|
dataLoading: false,
|
|
|
selectionEnd: 0,
|
|
|
component: null,
|
|
|
textToReplace: null
|
|
|
};
|
|
|
_this2.escListenerInit = function() {
|
|
|
if (!_this2.escListener) {
|
|
|
_this2.escListener = Listeners.add(KEY_CODES.ESC, _this2._closeAutocomplete);
|
|
|
}
|
|
|
};
|
|
|
_this2.escListenerDestroy = function() {
|
|
|
if (_this2.escListener) {
|
|
|
Listeners.remove(_this2.escListener);
|
|
|
_this2.escListener = null;
|
|
|
}
|
|
|
};
|
|
|
_this2.getSelectionPosition = function() {
|
|
|
if (!_this2.textareaRef)
|
|
|
return null;
|
|
|
return {
|
|
|
selectionStart: _this2.textareaRef.selectionStart,
|
|
|
selectionEnd: _this2.textareaRef.selectionEnd
|
|
|
};
|
|
|
};
|
|
|
_this2.getSelectedText = function() {
|
|
|
if (!_this2.textareaRef)
|
|
|
return null;
|
|
|
var _this2$textareaRef = _this2.textareaRef, selectionStart = _this2$textareaRef.selectionStart, selectionEnd = _this2$textareaRef.selectionEnd;
|
|
|
if (selectionStart === selectionEnd)
|
|
|
return null;
|
|
|
return _this2.state.value.substr(selectionStart, selectionEnd - selectionStart);
|
|
|
};
|
|
|
_this2.setCaretPosition = function() {
|
|
|
var position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
|
|
|
if (!_this2.textareaRef)
|
|
|
return;
|
|
|
_this2.textareaRef.focus();
|
|
|
_this2.textareaRef.setSelectionRange(position, position);
|
|
|
};
|
|
|
_this2.getCaretPosition = function() {
|
|
|
if (!_this2.textareaRef) {
|
|
|
return 0;
|
|
|
}
|
|
|
var position = _this2.textareaRef.selectionEnd;
|
|
|
return position;
|
|
|
};
|
|
|
_this2._handleCaretChange = function(e) {
|
|
|
var cleanLastTrigger = function cleanLastTrigger2() {
|
|
|
var beforeHandle = _this2.getCaretPosition() - 1;
|
|
|
_this2.lastTrigger = _this2.lastTrigger ? beforeHandle : 0;
|
|
|
};
|
|
|
if (e.type === "keydown") {
|
|
|
var code = e.keyCode || e.which;
|
|
|
switch (code) {
|
|
|
case KEY_CODES.UP:
|
|
|
case KEY_CODES.DOWN:
|
|
|
if (!_this2._isAutocompleteOpen()) {
|
|
|
cleanLastTrigger();
|
|
|
}
|
|
|
break;
|
|
|
case KEY_CODES.LEFT:
|
|
|
case KEY_CODES.RIGHT:
|
|
|
cleanLastTrigger();
|
|
|
break;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
cleanLastTrigger();
|
|
|
};
|
|
|
_this2._onSelect = function(item) {
|
|
|
var _this2$state = _this2.state, selectionEnd = _this2$state.selectionEnd, currentTrigger = _this2$state.currentTrigger, textareaValue = _this2$state.value;
|
|
|
var onItemSelected = _this2.props.onItemSelected;
|
|
|
if (!currentTrigger)
|
|
|
return;
|
|
|
var getTextToReplaceForCurrentTrigger = _this2._getTextToReplace(currentTrigger);
|
|
|
if (!getTextToReplaceForCurrentTrigger) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
var newToken = getTextToReplaceForCurrentTrigger(item);
|
|
|
if (!newToken) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (onItemSelected) {
|
|
|
onItemSelected({
|
|
|
currentTrigger,
|
|
|
item
|
|
|
});
|
|
|
}
|
|
|
var computeCaretPosition = function computeCaretPosition2(position, token, startToken) {
|
|
|
switch (position) {
|
|
|
case "start":
|
|
|
return startToken;
|
|
|
case "next":
|
|
|
case "end":
|
|
|
return startToken + token.length;
|
|
|
default:
|
|
|
if (!Number.isInteger(position)) {
|
|
|
throw new Error('RTA: caretPosition should be "start", "next", "end" or number.');
|
|
|
}
|
|
|
return position;
|
|
|
}
|
|
|
};
|
|
|
var textToModify = textareaValue.slice(0, selectionEnd);
|
|
|
var escapedCurrentTrigger = escapeRegex(currentTrigger);
|
|
|
var triggerOffset = textToModify.length - textToModify.lastIndexOf(currentTrigger);
|
|
|
var startOfTokenPosition = textToModify.search(new RegExp("(?!".concat(escapedCurrentTrigger, ")$"))) - triggerOffset;
|
|
|
var newTokenString = newToken.caretPosition === "next" ? "".concat(newToken.text, " ") : newToken.text;
|
|
|
var newCaretPosition = computeCaretPosition(newToken.caretPosition, newTokenString, startOfTokenPosition);
|
|
|
var modifiedText = textToModify.substring(0, startOfTokenPosition) + newTokenString;
|
|
|
var newValue = textareaValue.replace(textToModify, modifiedText);
|
|
|
_this2.setState({
|
|
|
value: newValue,
|
|
|
dataLoading: false
|
|
|
}, function() {
|
|
|
var insertedTrigger = _this2.tokenRegExpEnding.exec(newTokenString);
|
|
|
var insertedTriggerModifier = insertedTrigger ? insertedTrigger[0].length : 1;
|
|
|
_this2.lastTrigger = newCaretPosition ? newCaretPosition - insertedTriggerModifier : newCaretPosition;
|
|
|
_this2.textareaRef.value = newValue;
|
|
|
_this2.textareaRef.selectionEnd = newCaretPosition;
|
|
|
_this2._changeHandler();
|
|
|
var scrollTop = _this2.textareaRef.scrollTop;
|
|
|
_this2.setCaretPosition(newCaretPosition);
|
|
|
if (window.chrome) {
|
|
|
_this2.textareaRef.scrollTop = scrollTop;
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this2._getTextToReplace = function(currentTrigger) {
|
|
|
var triggerSettings = _this2.props.trigger[currentTrigger];
|
|
|
if (!currentTrigger || !triggerSettings)
|
|
|
return null;
|
|
|
var output2 = triggerSettings.output;
|
|
|
return function(item) {
|
|
|
if (typeof item === "object" && (!output2 || typeof output2 !== "function")) {
|
|
|
throw new Error('Output functor is not defined! If you are using items as object you have to define "output" function. https://github.com/webscopeio/react-textarea-autocomplete#trigger-type');
|
|
|
}
|
|
|
if (output2) {
|
|
|
var textToReplace = output2(item, currentTrigger);
|
|
|
if (textToReplace === void 0 || typeof textToReplace === "number") {
|
|
|
throw new Error('Output functor should return string or object in shape {text: string, caretPosition: string | number}.\nGot "'.concat(String(textToReplace), '". Check the implementation for trigger "').concat(currentTrigger, '"\n\nSee https://github.com/webscopeio/react-textarea-autocomplete#trigger-type for more information.\n'));
|
|
|
}
|
|
|
if (textToReplace === null)
|
|
|
return null;
|
|
|
if (typeof textToReplace === "string") {
|
|
|
return {
|
|
|
text: textToReplace,
|
|
|
caretPosition: DEFAULT_CARET_POSITION
|
|
|
};
|
|
|
}
|
|
|
if (!textToReplace.text && typeof textToReplace.text !== "string") {
|
|
|
throw new Error('Output "text" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n'));
|
|
|
}
|
|
|
if (!textToReplace.caretPosition) {
|
|
|
throw new Error('Output "caretPosition" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n'));
|
|
|
}
|
|
|
return textToReplace;
|
|
|
}
|
|
|
if (typeof item !== "string") {
|
|
|
throw new Error("Output item should be string\n");
|
|
|
}
|
|
|
return {
|
|
|
text: "".concat(currentTrigger).concat(item).concat(currentTrigger),
|
|
|
caretPosition: DEFAULT_CARET_POSITION
|
|
|
};
|
|
|
};
|
|
|
};
|
|
|
_this2._getCurrentTriggerSettings = function() {
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
if (!currentTrigger)
|
|
|
return null;
|
|
|
return _this2.props.trigger[currentTrigger];
|
|
|
};
|
|
|
_this2._getValuesFromProvider = function() {
|
|
|
var _this2$state2 = _this2.state, currentTrigger = _this2$state2.currentTrigger, actualToken2 = _this2$state2.actualToken;
|
|
|
var triggerSettings = _this2._getCurrentTriggerSettings();
|
|
|
if (!currentTrigger || !triggerSettings) {
|
|
|
return;
|
|
|
}
|
|
|
var dataProvider = triggerSettings.dataProvider, component = triggerSettings.component;
|
|
|
if (typeof dataProvider !== "function") {
|
|
|
throw new Error("Trigger provider has to be a function!");
|
|
|
}
|
|
|
_this2.setState({
|
|
|
dataLoading: true
|
|
|
});
|
|
|
var providedData = dataProvider(actualToken2);
|
|
|
if (!(providedData instanceof Promise)) {
|
|
|
providedData = Promise.resolve(providedData);
|
|
|
}
|
|
|
providedData.then(function(data) {
|
|
|
if (!Array.isArray(data)) {
|
|
|
throw new Error("Trigger provider has to provide an array!");
|
|
|
}
|
|
|
if (typeof component !== "function") {
|
|
|
throw new Error("Component should be defined!");
|
|
|
}
|
|
|
if (currentTrigger !== _this2.state.currentTrigger)
|
|
|
return;
|
|
|
if (!data.length) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
_this2.setState({
|
|
|
dataLoading: false,
|
|
|
data,
|
|
|
component
|
|
|
});
|
|
|
}).catch(function(e) {
|
|
|
return errorMessage(e.message);
|
|
|
});
|
|
|
};
|
|
|
_this2._getSuggestions = function() {
|
|
|
var _this2$state3 = _this2.state, currentTrigger = _this2$state3.currentTrigger, data = _this2$state3.data;
|
|
|
if (!currentTrigger || !data || data && !data.length)
|
|
|
return null;
|
|
|
return data;
|
|
|
};
|
|
|
_this2._createRegExp = function() {
|
|
|
var trigger = _this2.props.trigger;
|
|
|
_this2.tokenRegExp = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) {
|
|
|
if (a < b) {
|
|
|
return 1;
|
|
|
}
|
|
|
if (a > b) {
|
|
|
return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}).map(function(a) {
|
|
|
return escapeRegex(a);
|
|
|
}).join("|"), ")((?:(?!\\1)[^\\s])*$)"));
|
|
|
_this2.tokenRegExpEnding = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) {
|
|
|
if (a < b) {
|
|
|
return 1;
|
|
|
}
|
|
|
if (a > b) {
|
|
|
return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}).map(function(a) {
|
|
|
return escapeRegex(a);
|
|
|
}).join("|"), ")$"));
|
|
|
};
|
|
|
_this2._closeAutocomplete = function() {
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
_this2.escListenerDestroy();
|
|
|
_this2.setState({
|
|
|
data: null,
|
|
|
dataLoading: false,
|
|
|
currentTrigger: null
|
|
|
}, function() {
|
|
|
if (currentTrigger)
|
|
|
_this2._onItemHighlightedHandler(null);
|
|
|
});
|
|
|
};
|
|
|
_this2._cleanUpProps = function() {
|
|
|
var props = _objectSpread$7({}, _this2.props);
|
|
|
var notSafe = ["loadingComponent", "boundariesElement", "containerStyle", "minChar", "scrollToItem", "ref", "innerRef", "onChange", "onCaretPositionChange", "className", "value", "trigger", "listStyle", "itemStyle", "containerStyle", "loaderStyle", "className", "containerClassName", "listClassName", "itemClassName", "loaderClassName", "dropdownStyle", "dropdownClassName", "movePopupAsYouType", "textAreaComponent", "renderToBody", "onItemSelected", "onItemHighlighted"];
|
|
|
for (var prop in props) {
|
|
|
if (notSafe.includes(prop))
|
|
|
delete props[prop];
|
|
|
}
|
|
|
return props;
|
|
|
};
|
|
|
_this2._changeHandler = function(e) {
|
|
|
var _this2$props = _this2.props, trigger = _this2$props.trigger, onChange = _this2$props.onChange, minChar = _this2$props.minChar, onCaretPositionChange = _this2$props.onCaretPositionChange, movePopupAsYouType = _this2$props.movePopupAsYouType;
|
|
|
var _this2$state4 = _this2.state, top2 = _this2$state4.top, left2 = _this2$state4.left;
|
|
|
var event = e;
|
|
|
if (!event) {
|
|
|
event = new _customEvent_1_0_1_customEvent("change", {
|
|
|
bubbles: true
|
|
|
});
|
|
|
_this2.textareaRef.dispatchEvent(event);
|
|
|
}
|
|
|
var textarea = event.target || _this2.textareaRef;
|
|
|
var selectionEnd = textarea.selectionEnd;
|
|
|
var value = textarea.value;
|
|
|
_this2.lastValueBubbledEvent = value;
|
|
|
if (onChange && event) {
|
|
|
event.persist && event.persist();
|
|
|
onChange(new Proxy(event, {
|
|
|
get: function get2(original, prop, receiver) {
|
|
|
if (prop === "target") {
|
|
|
return textarea;
|
|
|
}
|
|
|
return Reflect.get(original, prop, receiver);
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
if (onCaretPositionChange) {
|
|
|
var caretPosition = _this2.getCaretPosition();
|
|
|
onCaretPositionChange(caretPosition);
|
|
|
}
|
|
|
_this2.setState({
|
|
|
value
|
|
|
});
|
|
|
var setTopLeft = function setTopLeft2() {
|
|
|
var _getCaretCoordinates = getCaretCoordinates(textarea, selectionEnd), newTop = _getCaretCoordinates.top, newLeft = _getCaretCoordinates.left;
|
|
|
_this2.setState({
|
|
|
top: newTop - _this2.textareaRef.scrollTop || 0,
|
|
|
left: newLeft
|
|
|
});
|
|
|
};
|
|
|
var cleanLastTrigger = function cleanLastTrigger2(triggerLength) {
|
|
|
_this2.lastTrigger = selectionEnd - triggerLength;
|
|
|
_this2._closeAutocomplete();
|
|
|
setTopLeft();
|
|
|
};
|
|
|
if (selectionEnd <= _this2.lastTrigger) {
|
|
|
var _affectedTextareaValue = value.slice(0, selectionEnd);
|
|
|
var _newTrigger = _this2.tokenRegExp.exec(_affectedTextareaValue);
|
|
|
cleanLastTrigger(_newTrigger ? _newTrigger[0].length : 0);
|
|
|
}
|
|
|
var affectedTextareaValue = value.slice(_this2.lastTrigger, selectionEnd);
|
|
|
var tokenMatch = _this2.tokenRegExp.exec(affectedTextareaValue);
|
|
|
var lastToken = tokenMatch && tokenMatch[0];
|
|
|
var currentTrigger = tokenMatch && tokenMatch[1] || null;
|
|
|
var currentTriggerLength = currentTrigger ? currentTrigger.length - 1 : 0;
|
|
|
var newTrigger = _this2.tokenRegExpEnding.exec(affectedTextareaValue);
|
|
|
if (newTrigger) {
|
|
|
cleanLastTrigger(newTrigger[0].length);
|
|
|
} else if (!_this2._isAutocompleteOpen()) {
|
|
|
_this2._closeAutocomplete();
|
|
|
}
|
|
|
if ((!lastToken || lastToken.length <= minChar + currentTriggerLength) && (_this2.state.currentTrigger && !trigger[_this2.state.currentTrigger].allowWhitespace || !_this2.state.currentTrigger)) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (currentTrigger && trigger[currentTrigger].afterWhitespace && !/\s/.test(value[selectionEnd - lastToken.length - 1]) && value[selectionEnd - lastToken.length - 1] !== void 0) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
if (_this2.state.currentTrigger && trigger[_this2.state.currentTrigger].allowWhitespace) {
|
|
|
tokenMatch = new RegExp("".concat(escapeRegex(_this2.state.currentTrigger), ".*$")).exec(value.slice(0, selectionEnd));
|
|
|
lastToken = tokenMatch && tokenMatch[0];
|
|
|
if (!lastToken) {
|
|
|
_this2._closeAutocomplete();
|
|
|
return;
|
|
|
}
|
|
|
currentTrigger = Object.keys(trigger).find(function(a) {
|
|
|
return a.slice(0, currentTriggerLength + 1) === lastToken.slice(0, currentTriggerLength + 1);
|
|
|
}) || null;
|
|
|
}
|
|
|
var actualToken2 = lastToken.slice(1);
|
|
|
if (!currentTrigger) {
|
|
|
return;
|
|
|
}
|
|
|
if (movePopupAsYouType || top2 === null && left2 === null || _this2.state.currentTrigger !== currentTrigger) {
|
|
|
setTopLeft();
|
|
|
}
|
|
|
_this2.escListenerInit();
|
|
|
var textToReplace = _this2._getTextToReplace(currentTrigger);
|
|
|
_this2.setState({
|
|
|
selectionEnd,
|
|
|
currentTrigger,
|
|
|
textToReplace,
|
|
|
actualToken: actualToken2
|
|
|
}, function() {
|
|
|
try {
|
|
|
_this2._getValuesFromProvider();
|
|
|
} catch (err) {
|
|
|
errorMessage(err.message);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
_this2._selectHandler = function(e) {
|
|
|
var _this2$props2 = _this2.props, onCaretPositionChange = _this2$props2.onCaretPositionChange, onSelect = _this2$props2.onSelect;
|
|
|
if (onCaretPositionChange) {
|
|
|
var caretPosition = _this2.getCaretPosition();
|
|
|
onCaretPositionChange(caretPosition);
|
|
|
}
|
|
|
if (onSelect) {
|
|
|
e.persist();
|
|
|
onSelect(e);
|
|
|
}
|
|
|
};
|
|
|
_this2._shouldStayOpen = function(e) {
|
|
|
var el = e.relatedTarget;
|
|
|
if (el === null) {
|
|
|
el = document.activeElement;
|
|
|
}
|
|
|
if (_this2.dropdownRef && el instanceof Node && _this2.dropdownRef.contains(el)) {
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
_this2._onClick = function(e) {
|
|
|
var onClick = _this2.props.onClick;
|
|
|
if (onClick) {
|
|
|
e.persist();
|
|
|
onClick(e);
|
|
|
}
|
|
|
if (_this2._shouldStayOpen(e)) {
|
|
|
return;
|
|
|
}
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onBlur = function(e) {
|
|
|
var onBlur = _this2.props.onBlur;
|
|
|
if (onBlur) {
|
|
|
e.persist();
|
|
|
onBlur(e);
|
|
|
}
|
|
|
if (_this2._shouldStayOpen(e)) {
|
|
|
return;
|
|
|
}
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onScrollHandler = function() {
|
|
|
_this2._closeAutocomplete();
|
|
|
};
|
|
|
_this2._onItemHighlightedHandler = function(item) {
|
|
|
var onItemHighlighted = _this2.props.onItemHighlighted;
|
|
|
var currentTrigger = _this2.state.currentTrigger;
|
|
|
if (onItemHighlighted) {
|
|
|
if (typeof onItemHighlighted === "function") {
|
|
|
onItemHighlighted({
|
|
|
currentTrigger,
|
|
|
item
|
|
|
});
|
|
|
} else {
|
|
|
throw new Error("`onItemHighlighted` has to be a function");
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
_this2._dropdownScroll = function(item) {
|
|
|
var scrollToItem = _this2.props.scrollToItem;
|
|
|
if (!scrollToItem)
|
|
|
return;
|
|
|
if (scrollToItem === true) {
|
|
|
defaultScrollToItem(_this2.dropdownRef, item);
|
|
|
return;
|
|
|
}
|
|
|
if (typeof scrollToItem !== "function" || scrollToItem.length !== 2) {
|
|
|
throw new Error("`scrollToItem` has to be boolean (true for default implementation) or function with two parameters: container, item.");
|
|
|
}
|
|
|
scrollToItem(_this2.dropdownRef, item);
|
|
|
};
|
|
|
_this2._isAutocompleteOpen = function() {
|
|
|
var _this2$state5 = _this2.state, dataLoading = _this2$state5.dataLoading, currentTrigger = _this2$state5.currentTrigger;
|
|
|
var suggestionData = _this2._getSuggestions();
|
|
|
return !!((dataLoading || suggestionData) && currentTrigger);
|
|
|
};
|
|
|
_this2._textareaRef = function(ref) {
|
|
|
_this2.props.innerRef && _this2.props.innerRef(ref);
|
|
|
_this2.textareaRef = ref;
|
|
|
};
|
|
|
_this2.lastTrigger = 0;
|
|
|
_this2.escListener = null;
|
|
|
var _this2$props3 = _this2.props, loadingComponent = _this2$props3.loadingComponent, _trigger = _this2$props3.trigger, _value = _this2$props3.value;
|
|
|
if (_value)
|
|
|
_this2.state.value = _value;
|
|
|
_this2._createRegExp();
|
|
|
if (!loadingComponent) {
|
|
|
throw new Error("RTA: loadingComponent is not defined");
|
|
|
}
|
|
|
if (!_trigger) {
|
|
|
throw new Error("RTA: trigger is not defined");
|
|
|
}
|
|
|
return _this2;
|
|
|
}
|
|
|
_createClass$2(ReactTextareaAutocomplete2, [{
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
Listeners.startListen(this.textareaRef);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("focus", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("click", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.addEventListener("keydown", this._handleCaretChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(_ref2) {
|
|
|
var oldTrigger = _ref2.trigger, oldValue = _ref2.value;
|
|
|
var _this$props2 = this.props, trigger = _this$props2.trigger, value = _this$props2.value;
|
|
|
if (Object.keys(trigger).join("") !== Object.keys(oldTrigger).join("")) {
|
|
|
this._createRegExp();
|
|
|
}
|
|
|
if (oldValue !== value && this.lastValueBubbledEvent !== value) {
|
|
|
this.lastTrigger = 0;
|
|
|
this._changeHandler();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.escListenerDestroy();
|
|
|
Listeners.stopListen(this.textareaRef);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("focus", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("click", this._handleCaretChange);
|
|
|
this.textareaRef && this.textareaRef.removeEventListener("keydown", this._handleCaretChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var _this$props3 = this.props, Loader = _this$props3.loadingComponent, style = _this$props3.style, className = _this$props3.className, listStyle = _this$props3.listStyle, itemStyle = _this$props3.itemStyle, boundariesElement = _this$props3.boundariesElement, movePopupAsYouType = _this$props3.movePopupAsYouType, listClassName = _this$props3.listClassName, itemClassName = _this$props3.itemClassName, dropdownClassName = _this$props3.dropdownClassName, dropdownStyle = _this$props3.dropdownStyle, containerStyle = _this$props3.containerStyle, containerClassName = _this$props3.containerClassName, loaderStyle = _this$props3.loaderStyle, loaderClassName = _this$props3.loaderClassName, textAreaComponent = _this$props3.textAreaComponent, renderToBody = _this$props3.renderToBody;
|
|
|
var _this$state = this.state, left2 = _this$state.left, top2 = _this$state.top, dataLoading = _this$state.dataLoading, component = _this$state.component, value = _this$state.value, textToReplace = _this$state.textToReplace;
|
|
|
var isAutocompleteOpen = this._isAutocompleteOpen();
|
|
|
var suggestionData = this._getSuggestions();
|
|
|
var extraAttrs = {};
|
|
|
var TextAreaComponent;
|
|
|
if (textAreaComponent.component) {
|
|
|
TextAreaComponent = textAreaComponent.component;
|
|
|
extraAttrs[textAreaComponent.ref] = this._textareaRef;
|
|
|
} else {
|
|
|
TextAreaComponent = textAreaComponent;
|
|
|
extraAttrs.ref = this._textareaRef;
|
|
|
}
|
|
|
return React$1.createElement("div", {
|
|
|
className: "rta ".concat(dataLoading === true ? "rta--loading" : "", " ").concat(containerClassName || ""),
|
|
|
style: containerStyle
|
|
|
}, React$1.createElement(TextAreaComponent, Object.assign({}, this._cleanUpProps(), {
|
|
|
className: "rta__textarea ".concat(className || ""),
|
|
|
onChange: this._changeHandler,
|
|
|
onSelect: this._selectHandler,
|
|
|
onScroll: this._onScrollHandler,
|
|
|
onClick: this._onClick,
|
|
|
onBlur: this._onBlur,
|
|
|
value,
|
|
|
style
|
|
|
}, extraAttrs)), isAutocompleteOpen && React$1.createElement(Autocomplete, {
|
|
|
innerRef: function innerRef(ref) {
|
|
|
_this3.dropdownRef = ref;
|
|
|
},
|
|
|
top: top2,
|
|
|
left: left2,
|
|
|
style: dropdownStyle,
|
|
|
className: dropdownClassName,
|
|
|
movePopupAsYouType,
|
|
|
boundariesElement,
|
|
|
textareaRef: this.textareaRef,
|
|
|
renderToBody
|
|
|
}, suggestionData && component && textToReplace && React$1.createElement(List, {
|
|
|
values: suggestionData,
|
|
|
component,
|
|
|
style: listStyle,
|
|
|
className: listClassName,
|
|
|
itemClassName,
|
|
|
itemStyle,
|
|
|
getTextToReplace: textToReplace,
|
|
|
onItemHighlighted: this._onItemHighlightedHandler,
|
|
|
onSelect: this._onSelect,
|
|
|
dropdownScroll: this._dropdownScroll
|
|
|
}), dataLoading && React$1.createElement("div", {
|
|
|
className: "rta__loader ".concat(suggestionData !== null ? "rta__loader--suggestion-data" : "rta__loader--empty-suggestion-data", " ").concat(loaderClassName || ""),
|
|
|
style: loaderStyle
|
|
|
}, React$1.createElement(Loader, {
|
|
|
data: suggestionData
|
|
|
}))));
|
|
|
}
|
|
|
}], [{
|
|
|
key: "getDerivedStateFromProps",
|
|
|
value: function getDerivedStateFromProps(_ref3) {
|
|
|
var value = _ref3.value;
|
|
|
if (value === null || value === void 0)
|
|
|
return null;
|
|
|
return {
|
|
|
value
|
|
|
};
|
|
|
}
|
|
|
}]);
|
|
|
return ReactTextareaAutocomplete2;
|
|
|
}(React$1.Component);
|
|
|
ReactTextareaAutocomplete.defaultProps = {
|
|
|
movePopupAsYouType: false,
|
|
|
value: null,
|
|
|
minChar: 1,
|
|
|
boundariesElement: "body",
|
|
|
scrollToItem: true,
|
|
|
textAreaComponent: "textarea",
|
|
|
renderToBody: false
|
|
|
};
|
|
|
const usedTags = (seletecText) => {
|
|
|
const { tags } = memoService.getState();
|
|
|
const lowerCaseInputStr = seletecText.toLowerCase();
|
|
|
const usedTags2 = [];
|
|
|
tags.forEach((tag2) => {
|
|
|
if (tag2 && tag2.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
usedTags2.push({
|
|
|
name: tag2,
|
|
|
char: tag2
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
return usedTags2;
|
|
|
};
|
|
|
var suggest = "";
|
|
|
const getSuggestions = (inputStr) => {
|
|
|
const { app: app2 } = dailyNotesService.getState();
|
|
|
const abstractFiles = app2.vault.getAllLoadedFiles();
|
|
|
const files = [];
|
|
|
let actualInput;
|
|
|
abstractFiles.forEach((file) => {
|
|
|
if (inputStr === "[") {
|
|
|
actualInput = "";
|
|
|
const lowerCaseInputStr = actualInput.toLowerCase();
|
|
|
if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
files.push({
|
|
|
name: file.basename,
|
|
|
char: file.name,
|
|
|
file
|
|
|
});
|
|
|
}
|
|
|
} else if (inputStr.contains("[")) {
|
|
|
actualInput = inputStr.slice(1);
|
|
|
const lowerCaseInputStr = actualInput.toLowerCase();
|
|
|
if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) {
|
|
|
files.push({
|
|
|
name: file.basename,
|
|
|
char: file.name,
|
|
|
file
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return files;
|
|
|
};
|
|
|
var ar = {};
|
|
|
var cz = {};
|
|
|
var da = {};
|
|
|
var de = {};
|
|
|
var en = {
|
|
|
"Basic Options": "Basic Options",
|
|
|
"User name in Memos": "User name in Memos",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "Set your user name here. 'Memos \u{1F60F}' By default",
|
|
|
"Insert after heading": "Insert after heading",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "You should set the same heading below if you want to insert and process memos below the same heading.",
|
|
|
"Allows admonitions to be created using ": "Allows admonitions to be created using ",
|
|
|
"Process Memos below": "Process Memos below",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.",
|
|
|
"Save Memo button label": "Save Memo button label",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": "The text shown on the save Memo button in the UI. 'NOTEIT' by default.",
|
|
|
"Focus on editor when open memos": "Focus on editor when open memos",
|
|
|
"Focus on editor when open memos. Focus by default.": "Focus on editor when open memos. Focus by default.",
|
|
|
"Open daily memos with open memos": "Open daily memos with open memos",
|
|
|
"Open daily memos with open memos. Open by default.": "Open daily memos with open memos. Open by default.",
|
|
|
"Open Memos when obsidian opens": "Open Memos when obsidian opens",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "When enable this, Memos will open when Obsidian opens. False by default.",
|
|
|
"Hide done tasks in Memo list": "Hide done tasks in Memo list",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "Hide all done tasks in Memo list. Show done tasks by default.",
|
|
|
"Advanced Options": "Advanced Options",
|
|
|
"UI language for date": "UI language for date",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "Translates the date UI language. Only 'en' and 'zh' are available.",
|
|
|
"Default prefix": "Default prefix",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "Set the default prefix when create memo, 'List' by default.",
|
|
|
"Default insert date format": "Default insert date format",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "Set the default date format when insert date by @, 'Tasks' by default.",
|
|
|
"Default editor position on mobile": "Default editor position on mobile",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "Set the default editor position on Mobile, 'Top' by default.",
|
|
|
"Use button to show editor on mobile": "Use button to show editor on mobile",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "Set a float button to call editor on mobile. Only when editor located at the bottom works.",
|
|
|
"Show Time When Copy Results": "Show Time When Copy Results",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "Show time when you copy results, like 12:00. Copy time by default.",
|
|
|
"Show Date When Copy Results": "Show Date When Copy Results",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "Show date when you copy results, like [[2022-01-01]]. Copy date by default.",
|
|
|
"Add Blank Line Between Different Date": "Add Blank Line Between Different Date",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "Add blank line when copy result with date. No blank line by default.",
|
|
|
"Share Options": "Share Options",
|
|
|
"Share Memos Image Footer Start": "Share Memos Image Footer Start",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default",
|
|
|
"Share Memos Image Footer End": "Share Memos Image Footer End",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default",
|
|
|
"Save Shared Image To Folder For Mobile": "Save Shared Image To Folder For Mobile",
|
|
|
"Save image to folder for mobile. Disable by Default": "Save image to folder for mobile. False by Default",
|
|
|
"Say Thank You": "Say Thank You",
|
|
|
Donate: "Donate",
|
|
|
"If you like this plugin, consider donating to support continued development:": "If you like this plugin, consider donating to support continued development:",
|
|
|
List: "List",
|
|
|
Task: "Task",
|
|
|
Top: "Top",
|
|
|
Bottom: "Bottom",
|
|
|
TAG: "TAG",
|
|
|
DAY: "DAY",
|
|
|
QUERY: "QUERY",
|
|
|
EDIT: "EDIT",
|
|
|
PIN: "PIN",
|
|
|
UNPIN: "UNPIN",
|
|
|
DELETE: "DELETE",
|
|
|
"CONFIRM\uFF01": "CONFIRM\uFF01",
|
|
|
"CREATE FILTER": "CREATE FILTER",
|
|
|
Settings: "Settings",
|
|
|
"Recycle bin": "Recycle bin",
|
|
|
"About Me": "About Me",
|
|
|
"Fetching data...": "Fetching data...",
|
|
|
"Here is No Zettels.": "Here is No Zettels.",
|
|
|
"Frequently Used Tags": "Frequently Used Tags",
|
|
|
"What do you think now...": "What do you think now...",
|
|
|
READ: "READ",
|
|
|
MARK: "MARK",
|
|
|
SHARE: "SHARE",
|
|
|
SOURCE: "SOURCE",
|
|
|
RESTORE: "RESTORE",
|
|
|
"DELETE AT": "DELETE AT",
|
|
|
"Noooop!": "Noooop!",
|
|
|
"All Data is Loaded \u{1F389}": "All Data is Loaded \u{1F389}",
|
|
|
"Quick filter": "Quick filter",
|
|
|
TYPE: "TYPE",
|
|
|
LINKED: "LINKED",
|
|
|
"NO TAGS": "NO TAGS",
|
|
|
"HAS LINKS": "HAS LINKS",
|
|
|
"HAS IMAGES": "HAS IMAGES",
|
|
|
INCLUDE: "INCLUDE",
|
|
|
EXCLUDE: "EXCLUDE",
|
|
|
TEXT: "TEXT",
|
|
|
IS: "IS",
|
|
|
ISNOT: "ISNOT",
|
|
|
SELECT: "SELECT",
|
|
|
"ADD FILTER TERMS": "ADD FILTER TERMS",
|
|
|
FILTER: "FILTER",
|
|
|
TITLE: "TITLE",
|
|
|
"CREATE QUERY": "CREATE QUERY",
|
|
|
"EDIT QUERY": "EDIT QUERY",
|
|
|
MATCH: "MATCH",
|
|
|
TIMES: "TIMES",
|
|
|
"Share Memo Image": "Share Memo Image",
|
|
|
"\u2197Click the button to save": "\u2197Click the button to save",
|
|
|
"Image is generating...": "Image is generating...",
|
|
|
"Image is loading...": "Image is loading...",
|
|
|
"Loading...": "Loading...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} Cannot load image, image link maybe broken",
|
|
|
"Daily Memos": "Daily Memos",
|
|
|
"CANCEL EDIT": "CANCEL EDIT",
|
|
|
"LINK TO THE": "LINK TO THE"
|
|
|
};
|
|
|
var enGB = {};
|
|
|
var es = {};
|
|
|
var fr = {};
|
|
|
var hi = {};
|
|
|
var id$1 = {};
|
|
|
var it = {};
|
|
|
var ja = {};
|
|
|
var ko = {};
|
|
|
var nl = {};
|
|
|
var no = {};
|
|
|
var pl = {};
|
|
|
var pt = {};
|
|
|
var ptBR = {};
|
|
|
var ro = {};
|
|
|
var ru = {};
|
|
|
var tr = {};
|
|
|
var zhCN = {
|
|
|
"Basic Options": "\u57FA\u7840\u9009\u9879",
|
|
|
"User name in Memos": "\u5728 Memos \u4E2D\u663E\u793A\u7684\u7528\u6237\u540D",
|
|
|
"Set your user name here. 'Memos \u{1F60F}' By default": "\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u559C\u6B22\u7684\u7528\u6237\u540D\u3002 \u9ED8\u8BA4\u4E3A 'Memos \u{1F60F}'",
|
|
|
"Insert after heading": "\u5728\u6307\u5B9A\u6807\u9898\u540E\u63D2\u5165 Memo",
|
|
|
"You should set the same heading below if you want to insert and process memos below the same heading.": "\u4F60\u5982\u679C\u60F3\u8981\u63D2\u5165\u6807\u9898\u7684\u540C\u65F6\u663E\u793A\u5BF9\u5E94\u6807\u9898\u4E0B\u7684 Memo\uFF0C\u4F60\u5FC5\u987B\u4FDD\u8BC1\u5F53\u524D\u8BBE\u7F6E\u4E0E\u4E0B\u65B9\u7684\u89E3\u6790\u8BBE\u7F6E\u662F\u4E00\u81F4\u7684\u3002\u5F53\u4E3A\u7A7A\u65F6\u63D2\u5165\u5230\u6587\u672B",
|
|
|
"Process Memos below": "\u89E3\u6790\u6307\u5B9A\u6807\u9898\u540E\u7684 Memo",
|
|
|
"Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.": "\u53EA\u6709\u5728\u8BBE\u7F6E\u7684\u6807\u9898\u540E\u7684 Memo \u624D\u4F1A\u88AB\u89E3\u6790\u3002\u5F53\u4E3A\u7A7A\u65F6\u89E3\u6790\u5168\u6587\u7684 Memo",
|
|
|
"Save Memo button label": "\u4FDD\u5B58\u6309\u94AE\u4E0A\u7684\u6587\u672C",
|
|
|
"The text shown on the save Memo button in the UI. 'NOTEIT' by default.": "\u5728\u4FDD\u5B58\u6309\u94AE\u4E0A\u5C55\u793A\u7684\u6587\u672C\u3002\u9ED8\u8BA4\u4E3A 'NOTEIT'",
|
|
|
"Focus on editor when open memos": "\u81EA\u52A8\u805A\u7126\u5230 Memos \u8F93\u5165\u6846",
|
|
|
"Focus on editor when open memos. Focus by default.": "\u5F53\u6253\u5F00 Memos \u7684\u65F6\u5019\u81EA\u52A8\u805A\u7126\u5230 Memos \u8F93\u5165\u6846\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Open daily memos with open memos": "\u6253\u5F00\u6BCF\u65E5 Memo \u7684\u65F6\u5019\u6253\u5F00 Memos \u754C\u9762",
|
|
|
"Open daily memos with open memos. Open by default.": "\u6253\u5F00\u6BCF\u65E5 Memo \u7684\u65F6\u5019\u6253\u5F00 Memos \u754C\u9762\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Open Memos when obsidian opens": "\u5F53\u5F00\u542F Obsidian \u7684\u65F6\u5019\u81EA\u52A8\u6253\u5F00 Memos",
|
|
|
"When enable this, Memos will open when Obsidian opens. False by default.": "\u5F53\u5F00\u542F\u8BE5\u9009\u9879, Memos \u4F1A\u5728 Obsidian \u6253\u5F00\u65F6\u81EA\u52A8\u6253\u5F00\u3002\u9ED8\u8BA4\u4E0D\u5F00\u542F\u3002",
|
|
|
"Hide done tasks in Memo list": "\u5728 memo \u5217\u8868\u4E2D\u9690\u85CF\u5DF2\u5B8C\u6210 memo",
|
|
|
"Hide all done tasks in Memo list. Show done tasks by default.": "\u5728 memo \u5217\u8868\u4E2D\u9690\u85CF\u5DF2\u5B8C\u6210 memo\u3002\u9ED8\u8BA4\u4E0D\u5F00\u542F",
|
|
|
"Advanced Options": "\u8FDB\u9636\u9009\u9879",
|
|
|
"UI language for date": "\u9488\u5BF9\u65E5\u671F\u5C55\u793A\u7684\u8BED\u8A00\u754C\u9762",
|
|
|
"Translates the date UI language. Only 'en' and 'zh' are available.": "\u5BF9\u65E5\u671F\u7684\u4E0D\u540C\u7FFB\u8BD1\u3002\u76EE\u524D\u53EA\u80FD\u9009\u62E9 'en' \u548C 'zh'\uFF08\u672A\u6765\u4F1A\u5E9F\u7F6E\uFF09",
|
|
|
"Default prefix": "\u9ED8\u8BA4\u524D\u7F00",
|
|
|
"Set the default prefix when create memo, 'List' by default.": "\u8BBE\u7F6E\u9ED8\u8BA4\u7684\u524D\u7F00\u6837\u5F0F\u3002\u9ED8\u8BA4\u4E3A\u5217\u8868",
|
|
|
"Default insert date format": "\u63D2\u5165\u65E5\u671F\u9644\u5E26\u7684\u6837\u5F0F",
|
|
|
"Set the default date format when insert date by @, 'Tasks' by default.": "\u5F53\u4F7F\u7528 @ \u6765\u5FEB\u901F\u63D2\u5165\u65E5\u671F\u65F6\uFF0C\u63D2\u5165\u65E5\u671F\u9644\u5E26\u7684\u6837\u5F0F\uFF0C\u9ED8\u8BA4\u4E3A 'Tasks' \u6837\u5F0F",
|
|
|
"Default editor position on mobile": "\u5728\u79FB\u52A8\u7AEF\u4E0A\u7684\u9ED8\u8BA4\u7F16\u8F91\u5668\u4F4D\u7F6E",
|
|
|
"Set the default editor position on Mobile, 'Top' by default.": "\u8BBE\u7F6E\u5728\u79FB\u52A8\u7AEF\u4E0A\u7684\u9ED8\u8BA4\u7F16\u8F91\u5668\u4F4D\u7F6E\uFF0C\u9ED8\u8BA4\u5728\u9876\u90E8\u3002",
|
|
|
"Use button to show editor on mobile": "\u5F53\u7F16\u8F91\u5668\u4F4D\u7F6E\u5728\u5E95\u90E8\u65F6\uFF0C\u7528\u6309\u94AE\u6765\u5524\u51FA\u7F16\u8F91\u5668",
|
|
|
"Set a float button to call editor on mobile. Only when editor located at the bottom works.": "\u8BBE\u7F6E\u4E00\u4E2A\u6D6E\u52A8\u6309\u94AE\u6765\u5524\u51FA\u7F16\u8F91\u5668\u3002\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u542F\u7528\u8BE5\u9009\u9879\u624D\u4F1A\u751F\u6548",
|
|
|
"Show Time When Copy Results": "\u5F53\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u65F6\u95F4",
|
|
|
"Show time when you copy results, like 12:00. Copy time by default.": "\u5728\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u5176\u65F6\u95F4\uFF0C\u4F8B\u5982 12:00 \u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Show Date When Copy Results": "\u5F53\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u65E5\u671F",
|
|
|
"Show date when you copy results, like [[2022-01-01]]. Copy date by default.": "\u5728\u590D\u5236\u68C0\u7D22\u7ED3\u679C\u65F6\u9644\u5E26\u5176\u65E5\u671F\uFF0C\u4F8B\u5982 [[2022-01-01]]\u3002\u9ED8\u8BA4\u5F00\u542F",
|
|
|
"Add Blank Line Between Different Date": "\u5728\u590D\u5236\u65E5\u671F\u7684\u65F6\u5019\u52A0\u4E0A\u7A7A\u884C",
|
|
|
"Add blank line when copy result with date. No blank line by default.": "\u5728\u590D\u5236\u65E5\u671F\u7684\u65F6\u5019\u5728\u76F8\u90BB\u7684\u65E5\u671F\u4E4B\u95F4\u52A0\u4E0A\u7A7A\u884C\u3002\u9ED8\u8BA4\u65E0\u7A7A\u884C",
|
|
|
"Share Options": "\u5206\u4EAB\u9009\u9879",
|
|
|
"Share Memos Image Footer Start": "\u5206\u4EAB memo \u56FE\u7247\u7684\u5DE6\u8FB9\u9875\u811A",
|
|
|
"Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default": "\u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u60F3\u8981\u7684\u4EFB\u610F\u6587\u672C\uFF0C\u7528 {MemosNum} \u6765\u5C55\u793A\u4F60\u8BB0\u5F55\u7684 memo \u6570\u91CF\uFF0C{UsedDay} \u6765\u5C55\u793A\u4F7F\u7528\u65E5\u671F\u3002\u9ED8\u8BA4\u4E3A'{MemosNum} Memos {UsedDay} Days'",
|
|
|
"Share Memos Image Footer End": "\u5206\u4EAB memo \u56FE\u7247\u7684\u53F3\u8FB9\u9875\u811A",
|
|
|
"Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default": "\u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u8BBE\u7F6E\u4F60\u60F3\u8981\u7684\u4EFB\u610F\u6587\u672C\uFF0C\u7528 {UserName} \u6765\u5C55\u793A\u4F60\u7684\u7528\u6237\u540D\u3002\u9ED8\u8BA4\u4E3A '\u270D\uFE0F By {UserName}'",
|
|
|
"Save Shared Image To Folder For Mobile": "\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u65F6\u4FDD\u5B58\u56FE\u7247\u5230\u6587\u4EF6\u5939",
|
|
|
"Save image to folder for mobile. False by Default": "\u5F53\u5728\u79FB\u52A8\u7AEF\u4E0A\u65F6\uFF0C\u4FDD\u5B58\u751F\u6210\u7684\u56FE\u7247\u5230\u6587\u4EF6\u5939",
|
|
|
"Say Thank You": "\u611F\u8C22\u5F00\u53D1",
|
|
|
Donate: "\u6350\u8D60",
|
|
|
"If you like this plugin, consider donating to support continued development:": "\u5982\u679C\u4F60\u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u800C\u4E14\u4E5F\u5E0C\u671B\u7ED9\u6211\u4E70\u9E21\u817F\uFF0C\u90A3\u4E48\u53EF\u4EE5\u8003\u8651 Github \u9875\u9762\u53F3\u8FB9\u7684 Sponsor~",
|
|
|
List: "\u5217\u8868",
|
|
|
Task: "\u4EFB\u52A1",
|
|
|
Top: "\u9876\u90E8",
|
|
|
Bottom: "\u5E95\u90E8",
|
|
|
TAG: "\u6807\u7B7E",
|
|
|
DAY: "\u5929",
|
|
|
QUERY: "\u68C0\u7D22\u5F0F",
|
|
|
EDIT: "\u7F16\u8F91",
|
|
|
PIN: "\u7F6E\u9876",
|
|
|
UNPIN: "\u53D6\u6D88\u7F6E\u9876",
|
|
|
DELETE: "\u5220\u9664",
|
|
|
"CONFIRM\uFF01": "\u786E\u5B9A\u5220\u9664",
|
|
|
"CREATE FILTER": "\u521B\u5EFA\u68C0\u7D22\u5F0F",
|
|
|
Settings: "\u8BBE\u7F6E",
|
|
|
"Recycle bin": "\u56DE\u6536\u7AD9",
|
|
|
"About Me": "\u5173\u4E8E",
|
|
|
"Fetching data...": "\u83B7\u53D6\u6570\u636E\u4E2D...",
|
|
|
"Here is No Zettels.": "\u6CA1\u6709\u627E\u5230 memo",
|
|
|
"Frequently Used Tags": "\u5E38\u7528\u6807\u7B7E",
|
|
|
"What do you think now...": "\u4F60\u73B0\u5728\u5728\u60F3\u4EC0\u4E48\uFF1F",
|
|
|
READ: "\u9605\u8BFB",
|
|
|
MARK: "\u5F15\u7528",
|
|
|
SHARE: "\u5206\u4EAB",
|
|
|
SOURCE: "\u6765\u6E90",
|
|
|
RESTORE: "\u6062\u590D",
|
|
|
"DELETE AT": "\u5220\u9664\u4E8E",
|
|
|
"Noooop!": "\u5565\u90FD\u6CA1\u6709\uFF01",
|
|
|
"All Data is Loaded \u{1F389}": "\u6240\u6709\u6570\u636E\u90FD\u52A0\u8F7D\u597D\u5566 \u{1F389}",
|
|
|
"Quick filter": "\u5FEB\u901F\u7B5B\u9009",
|
|
|
TYPE: "\u7C7B\u578B",
|
|
|
LINKED: "\u6709\u94FE\u63A5",
|
|
|
"NO TAGS": "\u65E0\u6807\u7B7E",
|
|
|
"HAS LINKS": "\u6709\u8D85\u94FE\u63A5",
|
|
|
"HAS IMAGES": "\u6709\u56FE\u7247",
|
|
|
INCLUDE: "\u5305\u62EC",
|
|
|
EXCLUDE: "\u6392\u9664",
|
|
|
TEXT: "\u6587\u672C",
|
|
|
IS: "\u662F",
|
|
|
ISNOT: "\u4E0D\u662F",
|
|
|
SELECT: "\u9009\u62E9",
|
|
|
"ADD FILTER TERMS": "\u6DFB\u52A0\u68C0\u7D22\u6761\u4EF6",
|
|
|
FILTER: "\u68C0\u7D22\u5668",
|
|
|
TITLE: "\u6807\u9898",
|
|
|
"CREATE QUERY": "\u521B\u5EFA\u68C0\u7D22\u5F0F",
|
|
|
"EDIT QUERY": "\u7F16\u8F91\u68C0\u7D22\u5F0F",
|
|
|
MATCH: "\u5339\u914D",
|
|
|
TIMES: "\u6B21",
|
|
|
"Share Memo Image": "\u5206\u4EAB Memo \u56FE\u7247",
|
|
|
"\u2197Click the button to save": "\u2197\u70B9\u51FB\u53F3\u4E0A\u89D2\u7684\u6309\u94AE\u6765\u4FDD\u5B58",
|
|
|
"Image is generating...": "\u56FE\u7247\u6B63\u5728\u751F\u6210\u4E2D...",
|
|
|
"Image is loading...": "\u56FE\u7247\u6B63\u5728\u52A0\u8F7D\u4E2D...",
|
|
|
"\u{1F61F} Cannot load image, image link maybe broken": "\u{1F61F} \u65E0\u6CD5\u52A0\u8F7D\u56FE\u7247\uFF0C\u56FE\u7247\u94FE\u63A5\u4E5F\u8BB8\u4E0D\u5B58\u5728",
|
|
|
"Loading...": "\u52AA\u529B\u52A0\u8F7D\u4E2D...",
|
|
|
"Daily Memos": "\u6BCF\u65E5 Memos",
|
|
|
"CANCEL EDIT": "\u53D6\u6D88\u7F16\u8F91",
|
|
|
"LINK TO THE": "\u94FE\u63A5\u5230"
|
|
|
};
|
|
|
var zhTW = {};
|
|
|
const localeMap = {
|
|
|
ar,
|
|
|
cs: cz,
|
|
|
da,
|
|
|
de,
|
|
|
en,
|
|
|
"en-gb": enGB,
|
|
|
es,
|
|
|
fr,
|
|
|
hi,
|
|
|
id: id$1,
|
|
|
it,
|
|
|
ja,
|
|
|
ko,
|
|
|
nl,
|
|
|
nn: no,
|
|
|
pl,
|
|
|
pt,
|
|
|
"pt-br": ptBR,
|
|
|
ro,
|
|
|
ru,
|
|
|
tr,
|
|
|
"zh-cn": zhCN,
|
|
|
"zh-tw": zhTW
|
|
|
};
|
|
|
const locale$1 = localeMap[require$$0.moment.locale()];
|
|
|
function t(str) {
|
|
|
return locale$1 && locale$1[str] || en[str];
|
|
|
}
|
|
|
const TItem = ({
|
|
|
entity: {
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}
|
|
|
}) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
children: `${char}`
|
|
|
});
|
|
|
};
|
|
|
const Loading = ({
|
|
|
data
|
|
|
}) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
children: "Loading"
|
|
|
});
|
|
|
};
|
|
|
let actualToken;
|
|
|
const Editor = _react_17_0_2_react.exports.forwardRef((props, ref) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
globalState: {
|
|
|
useTinyUndoHistoryCache
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
className,
|
|
|
initialContent,
|
|
|
placeholder,
|
|
|
showConfirmBtn,
|
|
|
showCancelBtn,
|
|
|
onConfirmBtnClick: handleConfirmBtnClickCallback,
|
|
|
onCancelBtnClick: handleCancelBtnClickCallback,
|
|
|
onContentChange: handleContentChangeCallback
|
|
|
} = props;
|
|
|
const editorRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const tinyUndoRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const refresh = useRefresh();
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (initialContent) {
|
|
|
editorRef.current.value = initialContent;
|
|
|
refresh();
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a2;
|
|
|
if (useTinyUndoHistoryCache) {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
tinyUndoActionsCache,
|
|
|
tinyUndoIndexCache
|
|
|
} = storage.get(["tinyUndoActionsCache", "tinyUndoIndexCache"]);
|
|
|
tinyUndoRef.current = new TinyUndo(editorRef.current, {
|
|
|
interval: 5e3,
|
|
|
initialActions: tinyUndoActionsCache,
|
|
|
initialIndex: tinyUndoIndexCache
|
|
|
});
|
|
|
tinyUndoRef.current.subscribe((actions, index) => {
|
|
|
storage.set({
|
|
|
tinyUndoActionsCache: actions,
|
|
|
tinyUndoIndexCache: index
|
|
|
});
|
|
|
});
|
|
|
return () => {
|
|
|
var _a3;
|
|
|
(_a3 = tinyUndoRef.current) == null ? void 0 : _a3.destroy();
|
|
|
};
|
|
|
} else {
|
|
|
(_a2 = tinyUndoRef.current) == null ? void 0 : _a2.destroy();
|
|
|
tinyUndoRef.current = null;
|
|
|
storage.remove(["tinyUndoActionsCache", "tinyUndoIndexCache"]);
|
|
|
}
|
|
|
}, [useTinyUndoHistoryCache]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a2;
|
|
|
if (editorRef.current) {
|
|
|
editorRef.current.style.height = "auto";
|
|
|
editorRef.current.style.height = ((_a2 = editorRef.current.scrollHeight) != null ? _a2 : 0) + "px";
|
|
|
}
|
|
|
}, [(_a = editorRef.current) == null ? void 0 : _a.value]);
|
|
|
_react_17_0_2_react.exports.useImperativeHandle(ref, () => ({
|
|
|
element: editorRef.current,
|
|
|
focus: () => {
|
|
|
var _a2;
|
|
|
if (FocusOnEditor) {
|
|
|
(_a2 = editorRef.current) == null ? void 0 : _a2.focus();
|
|
|
}
|
|
|
},
|
|
|
insertText: (rawText) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const prevValue = editorRef.current.value;
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart) + rawText + prevValue.slice(editorRef.current.selectionStart);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
},
|
|
|
setContent: (text) => {
|
|
|
if (editorRef.current) {
|
|
|
editorRef.current.value = text;
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
}
|
|
|
},
|
|
|
getContent: () => {
|
|
|
var _a2, _b2;
|
|
|
return (_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : "";
|
|
|
}
|
|
|
}), []);
|
|
|
const handleInsertTrigger = (event) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
fileManager
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
if (event.currentTrigger === "#") {
|
|
|
const prevValue = editorRef.current.value;
|
|
|
let removeCharNum;
|
|
|
if (actualToken !== null && actualToken !== void 0) {
|
|
|
removeCharNum = actualToken.length;
|
|
|
} else {
|
|
|
removeCharNum = 0;
|
|
|
}
|
|
|
let behindCharNum = editorRef.current.selectionStart;
|
|
|
for (let i = 0; i < prevValue.length; i++) {
|
|
|
if (!/\s/g.test(prevValue[behindCharNum])) {
|
|
|
behindCharNum++;
|
|
|
}
|
|
|
}
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + event.item.char + prevValue.slice(behindCharNum);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
} else if (event.currentTrigger === "[[") {
|
|
|
const filePath = fileManager.generateMarkdownLink(event.item.file, event.item.file.path, "", "");
|
|
|
const prevValue = editorRef.current.value;
|
|
|
let removeCharNum;
|
|
|
if (actualToken !== null && actualToken !== void 0) {
|
|
|
if (filePath.contains("[[")) {
|
|
|
removeCharNum = actualToken.length + 1;
|
|
|
} else if (event.item.file.extension !== "md") {
|
|
|
removeCharNum = actualToken.length + 1;
|
|
|
} else {
|
|
|
removeCharNum = actualToken.length + 2;
|
|
|
}
|
|
|
} else {
|
|
|
removeCharNum = 2;
|
|
|
}
|
|
|
let behindCharNum = editorRef.current.selectionStart;
|
|
|
for (let i = 0; i < prevValue.length; i++) {
|
|
|
if (!/\s/g.test(prevValue[behindCharNum])) {
|
|
|
behindCharNum++;
|
|
|
}
|
|
|
}
|
|
|
editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + filePath + prevValue.slice(behindCharNum);
|
|
|
handleContentChangeCallback(editorRef.current.value);
|
|
|
refresh();
|
|
|
}
|
|
|
};
|
|
|
const handleEditorInput = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a2, _b2;
|
|
|
handleContentChangeCallback((_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : "");
|
|
|
refresh();
|
|
|
}, []);
|
|
|
const handleEditorKeyDown = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
event.stopPropagation();
|
|
|
if (event.code === "Enter") {
|
|
|
if (event.metaKey || event.ctrlKey) {
|
|
|
handleCommonConfirmBtnClick();
|
|
|
}
|
|
|
}
|
|
|
refresh();
|
|
|
}, []);
|
|
|
const handleCommonConfirmBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a2;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
editorRef.current.value = getEditorContentCache2();
|
|
|
handleConfirmBtnClickCallback(editorRef.current.value);
|
|
|
editorRef.current.value = "";
|
|
|
refresh();
|
|
|
(_a2 = tinyUndoRef.current) == null ? void 0 : _a2.resetState();
|
|
|
}, []);
|
|
|
const handleCommonCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
handleCancelBtnClickCallback();
|
|
|
}, []);
|
|
|
const getEditorContentCache2 = () => {
|
|
|
var _a2;
|
|
|
return (_a2 = storage.get(["editorContentCache"]).editorContentCache) != null ? _a2 : "";
|
|
|
};
|
|
|
const getEditorContent = () => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
editorRef.current.value = getEditorContentCache2();
|
|
|
return editorRef.current.value;
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "common-editor-wrapper " + className,
|
|
|
children: [/* @__PURE__ */ jsx(ReactTextareaAutocomplete, {
|
|
|
className: "common-editor-inputer scroll",
|
|
|
loadingComponent: Loading,
|
|
|
placeholder,
|
|
|
movePopupAsYouType: true,
|
|
|
ref: (rta) => {
|
|
|
},
|
|
|
value: getEditorContent(),
|
|
|
innerRef: (textarea) => {
|
|
|
editorRef.current = textarea;
|
|
|
},
|
|
|
onInput: handleEditorInput,
|
|
|
onKeyDown: handleEditorKeyDown,
|
|
|
style: {
|
|
|
minHeight: 48
|
|
|
},
|
|
|
dropdownStyle: {
|
|
|
minWidth: 180,
|
|
|
maxHeight: 250,
|
|
|
overflowY: "auto"
|
|
|
},
|
|
|
minChar: 0,
|
|
|
onItemSelected: handleInsertTrigger,
|
|
|
scrollToItem: true,
|
|
|
trigger: {
|
|
|
"#": {
|
|
|
dataProvider: (token) => {
|
|
|
actualToken = token;
|
|
|
return usedTags(token).map(({
|
|
|
name,
|
|
|
char
|
|
|
}) => ({
|
|
|
name,
|
|
|
char
|
|
|
}));
|
|
|
},
|
|
|
component: TItem,
|
|
|
afterWhitespace: true,
|
|
|
output: (item) => item.char
|
|
|
},
|
|
|
"[[": {
|
|
|
dataProvider: (token) => {
|
|
|
actualToken = token;
|
|
|
return getSuggestions(token).slice(0, 10).map(({
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}) => ({
|
|
|
name,
|
|
|
char,
|
|
|
file
|
|
|
}));
|
|
|
},
|
|
|
component: TItem,
|
|
|
afterWhitespace: true,
|
|
|
output: (item) => item.char
|
|
|
}
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "common-tools-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "common-tools-container",
|
|
|
children: /* @__PURE__ */ jsx(Only, {
|
|
|
when: props.tools !== void 0,
|
|
|
children: props.tools
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: showCancelBtn,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn cancel-btn",
|
|
|
onClick: handleCommonCancelBtnClick,
|
|
|
children: t("CANCEL EDIT")
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: showConfirmBtn,
|
|
|
children: /* @__PURE__ */ jsxs("button", {
|
|
|
className: "action-btn confirm-btn",
|
|
|
disabled: !((_b = editorRef.current) == null ? void 0 : _b.value),
|
|
|
onClick: handleCommonConfirmBtnClick,
|
|
|
children: [SaveMemoButtonLabel, /* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u270D\uFE0F"
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
});
|
|
|
var memoEditor = "";
|
|
|
var selectDatePicker = "";
|
|
|
var tag = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMwMDAwMDAiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMjAsMTBWOGgtNFY0aC0ydjRoLTRWNEg4djRINHYyaDR2NEg0djJoNHY0aDJ2LTRoNHY0aDJ2LTRoNHYtMmgtNHYtNEgyMHogTTE0LDE0aC00di00aDRWMTR6Ii8+PC9nPjwvc3ZnPg==";
|
|
|
var imageSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00Ljg2IDguODZsLTMgMy44N0w5IDEzLjE0IDYgMTdoMTJsLTMuODYtNS4xNHoiLz48L3N2Zz4=";
|
|
|
var taskSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA3MDQzMTQ2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4ODEiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTIyNCA4MDAuMjU2TDIyMy43MTIgMjI0SDMyMHYzMS42OGMwIDM1LjQ1NiAyOC42NCA2NC4zMiA2My44NzIgNjQuMzJoMjU2LjI1NkE2NC4xNiA2NC4xNiAwIDAgMCA3MDQgMjU1LjY4VjIyNGw5Ni0wLjI1Nkw4MDAuMjU2IDgwMCAyMjQgODAwLjI1NnpNNjQwIDE5Mi4zMkw2NDAuMTI4IDI1NiAzODQgMjU1LjY4VjE5Mi4zMkwzODMuODcyIDE5MiA2NDAgMTkyLjMyek03OTkuODQgMTYwSDY5NS4wNGMtMTEuMDcyLTE5LjA0LTMxLjQyNC0zMi01NC45MTItMzJoLTI1Ni4yNTZjLTIzLjQ4OCAwLTQzLjgwOCAxMi45MjgtNTQuOTEyIDMySDIyMy43MTJBNjMuNzc2IDYzLjc3NiAwIDAgMCAxNjAgMjIzLjc0NHY1NzYuNTEyQzE2MCA4MzUuMzkyIDE4OC42MDggODY0IDIyMy43NDQgODY0aDU3Ni41MTJBNjMuODQgNjMuODQgMCAwIDAgODY0IDgwMC4yNTZWMjIzLjc0NEE2NCA2NCAwIDAgMCA3OTkuODQgMTYweiIgcC1pZD0iMTg4MiI+PC9wYXRoPjxwYXRoIGQ9Ik02MTkuMDcyIDQyOS4wODhsLTE1MS43NDQgMTY1Ljg4OC02Mi4xMTItNjkuNmEzMiAzMiAwIDEgMC00Ny43NDQgNDIuNjI0bDg1LjY5NiA5NmEzMiAzMiAwIDAgMCAyMy42OCAxMC42ODhoMC4xOTJjOC45NiAwIDE3LjUzNi0zLjc3NiAyMy42MTYtMTAuNGwxNzUuNjQ4LTE5MmEzMiAzMiAwIDAgMC00Ny4yMzItNDMuMiIgcC1pZD0iMTg4MyI+PC9wYXRoPjwvc3ZnPg0K";
|
|
|
var showEditorSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNTY0NDUyMjA4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYxOTQiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiI+PHBhdGggZD0iTTUxMiAzMkMyNDggMzIgMzIgMjQ4IDMyIDUxMnMyMTYgNDgwIDQ4MCA0ODAgNDgwLTIxNiA0ODAtNDgwUzc3NiAzMiA1MTIgMzJ6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI2MTk1Ij48L3BhdGg+PHBhdGggZD0iTTUxMiAwQzIyOC44IDAgMCAyMjguOCAwIDUxMnMyMjguOCA1MTIgNTEyIDUxMiA1MTItMjI4LjggNTEyLTUxMlM3OTUuMiAwIDUxMiAweiBtMCA5OTJDMjQ4IDk5MiAzMiA3NzYgMzIgNTEyUzI0OCAzMiA1MTIgMzJzNDgwIDIxNiA0ODAgNDgwLTIxNiA0ODAtNDgwIDQ4MHoiIGZpbGw9IiIgcC1pZD0iNjE5NiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEybS0zOTIgMGEzOTIgMzkyIDAgMSAwIDc4NCAwIDM5MiAzOTIgMCAxIDAtNzg0IDBaIiBmaWxsPSIjOURFOEY3IiBwLWlkPSI2MTk3Ij48L3BhdGg+PHBhdGggZD0iTTc4NCA0OTZINTI4VjI0MGgtMzJ2MjU2SDI0MHYzMmgyNTZ2MjU2aDMyVjUyOGgyNTZ6IiBmaWxsPSIjMUExNzE4IiBwLWlkPSI2MTk4Ij48L3BhdGg+PC9zdmc+";
|
|
|
var journalSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA2OTY3MTE1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2NTIiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTU0NCA4MDAuMTI4bC0zMjAgMC4xNi0wLjA2NC05Ni4zMi0wLjA2NC0xNjAtMC4wMzItNjQtMC4wOTYtMTYwLTAuMDMyLTk2aDU3Ni4xMjhMODAwIDIyMy43NzYgODAwLjI1NiA4MDAgNTQ0IDgwMC4xMjh6TTc5OS44NCAxNjBIMjIzLjcxMkE2My44MDggNjMuODA4IDAgMCAwIDE2MCAyMjMuNzQ0djU3Ni41NDRjMCAzNS4xMzYgMjguNjA4IDYzLjY4IDYzLjc0NCA2My42OGg1NzYuNTEyQTYzLjgwOCA2My44MDggMCAwIDAgODY0IDgwMC4zMlYyMjMuNzQ0QTY0IDY0IDAgMCAwIDc5OS44NCAxNjB6IiBwLWlkPSIxNjUzIj48L3BhdGg+PHBhdGggZD0iTTY4MC42MDggMzIwaC0yMjRhMzIgMzIgMCAwIDAgMCA2NGgyMjRhMzIgMzIgMCAwIDAgMC02NE02ODAuNjA4IDQ4MGgtMjI0YTMyIDMyIDAgMCAwIDAgNjRoMjI0YTMyIDMyIDAgMCAwIDAtNjRNNjgwLjYwOCA2NDBoLTIyNGEzMiAzMiAwIDAgMCAwIDY0aDIyNGEzMiAzMiAwIDAgMCAwLTY0TTM1MiAzMjBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA0ODBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA2NDBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0IiBwLWlkPSIxNjU0Ij48L3BhdGg+PC9zdmc+";
|
|
|
/*! *****************************************************************************
|
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
purpose with or without fee is hereby granted.
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
|
***************************************************************************** */
|
|
|
var __assign = function() {
|
|
|
__assign = Object.assign || function __assign2(t2) {
|
|
|
for (var s, i = 1, n2 = arguments.length; i < n2; i++) {
|
|
|
s = arguments[i];
|
|
|
for (var p2 in s)
|
|
|
if (Object.prototype.hasOwnProperty.call(s, p2))
|
|
|
t2[p2] = s[p2];
|
|
|
}
|
|
|
return t2;
|
|
|
};
|
|
|
return __assign.apply(this, arguments);
|
|
|
};
|
|
|
function __rest(s, e) {
|
|
|
var t2 = {};
|
|
|
for (var p2 in s)
|
|
|
if (Object.prototype.hasOwnProperty.call(s, p2) && e.indexOf(p2) < 0)
|
|
|
t2[p2] = s[p2];
|
|
|
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
|
for (var i = 0, p2 = Object.getOwnPropertySymbols(s); i < p2.length; i++) {
|
|
|
if (e.indexOf(p2[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i]))
|
|
|
t2[p2[i]] = s[p2[i]];
|
|
|
}
|
|
|
return t2;
|
|
|
}
|
|
|
function __spreadArray(to, from, pack) {
|
|
|
if (pack || arguments.length === 2)
|
|
|
for (var i = 0, l2 = from.length, ar2; i < l2; i++) {
|
|
|
if (ar2 || !(i in from)) {
|
|
|
if (!ar2)
|
|
|
ar2 = Array.prototype.slice.call(from, 0, i);
|
|
|
ar2[i] = from[i];
|
|
|
}
|
|
|
}
|
|
|
return to.concat(ar2 || Array.prototype.slice.call(from));
|
|
|
}
|
|
|
function canUseDOM() {
|
|
|
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
|
|
|
}
|
|
|
var useIsomorphicLayoutEffect$1 = /* @__PURE__ */ canUseDOM() ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect;
|
|
|
var serverHandoffComplete = false;
|
|
|
var id = 0;
|
|
|
var genId = function genId2() {
|
|
|
return ++id;
|
|
|
};
|
|
|
function useId(idFromProps) {
|
|
|
var initialId = idFromProps || (serverHandoffComplete ? genId() : null);
|
|
|
var _React$useState = _react_17_0_2_react.exports.useState(initialId), id2 = _React$useState[0], setId = _React$useState[1];
|
|
|
useIsomorphicLayoutEffect$1(function() {
|
|
|
if (id2 === null) {
|
|
|
setId(genId());
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(function() {
|
|
|
if (serverHandoffComplete === false) {
|
|
|
serverHandoffComplete = true;
|
|
|
}
|
|
|
}, []);
|
|
|
return id2 != null ? String(id2) : void 0;
|
|
|
}
|
|
|
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 format2 = args.formats[width] || args.formats[args.defaultWidth];
|
|
|
return format2;
|
|
|
};
|
|
|
}
|
|
|
function buildLocalizeFn(args) {
|
|
|
return function(dirtyIndex, dirtyOptions) {
|
|
|
var options = dirtyOptions || {};
|
|
|
var context = options.context ? String(options.context) : "standalone";
|
|
|
var valuesArray;
|
|
|
if (context === "formatting" && args.formattingValues) {
|
|
|
var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
|
|
|
var width = options.width ? String(options.width) : defaultWidth;
|
|
|
valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
|
|
|
} else {
|
|
|
var _defaultWidth = args.defaultWidth;
|
|
|
var _width = options.width ? String(options.width) : args.defaultWidth;
|
|
|
valuesArray = args.values[_width] || args.values[_defaultWidth];
|
|
|
}
|
|
|
var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex;
|
|
|
return valuesArray[index];
|
|
|
};
|
|
|
}
|
|
|
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
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
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$1(parsePatterns, function(pattern) {
|
|
|
return pattern.test(matchedString);
|
|
|
}) : findKey(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 findKey(object, predicate) {
|
|
|
for (var key in object) {
|
|
|
if (object.hasOwnProperty(key) && predicate(object[key])) {
|
|
|
return key;
|
|
|
}
|
|
|
}
|
|
|
return void 0;
|
|
|
}
|
|
|
function findIndex$1(array, predicate) {
|
|
|
for (var key = 0; key < array.length; key++) {
|
|
|
if (predicate(array[key])) {
|
|
|
return key;
|
|
|
}
|
|
|
}
|
|
|
return void 0;
|
|
|
}
|
|
|
function requiredArgs(required, args) {
|
|
|
if (args.length < required) {
|
|
|
throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present");
|
|
|
}
|
|
|
}
|
|
|
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://git.io/fjule");
|
|
|
console.warn(new Error().stack);
|
|
|
}
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
}
|
|
|
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);
|
|
|
}
|
|
|
function startOfUTCWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
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;
|
|
|
}
|
|
|
function addDays(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
if (isNaN(amount)) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
if (!amount) {
|
|
|
return date;
|
|
|
}
|
|
|
date.setDate(date.getDate() + amount);
|
|
|
return date;
|
|
|
}
|
|
|
function addMonths(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
if (isNaN(amount)) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
if (!amount) {
|
|
|
return date;
|
|
|
}
|
|
|
var dayOfMonth = date.getDate();
|
|
|
var endOfDesiredMonth = new Date(date.getTime());
|
|
|
endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0);
|
|
|
var daysInMonth = endOfDesiredMonth.getDate();
|
|
|
if (dayOfMonth >= daysInMonth) {
|
|
|
return endOfDesiredMonth;
|
|
|
} else {
|
|
|
date.setFullYear(endOfDesiredMonth.getFullYear(), endOfDesiredMonth.getMonth(), dayOfMonth);
|
|
|
return date;
|
|
|
}
|
|
|
}
|
|
|
function addMilliseconds(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var timestamp = toDate(dirtyDate).getTime();
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return new Date(timestamp + amount);
|
|
|
}
|
|
|
function startOfWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getDay();
|
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
|
date.setDate(date.getDate() - diff);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function getTimezoneOffsetInMilliseconds(date) {
|
|
|
var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
|
|
|
utcDate.setUTCFullYear(date.getFullYear());
|
|
|
return date.getTime() - utcDate.getTime();
|
|
|
}
|
|
|
function startOfDay(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_DAY$1 = 864e5;
|
|
|
function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var startOfDayLeft = startOfDay(dirtyDateLeft);
|
|
|
var startOfDayRight = startOfDay(dirtyDateRight);
|
|
|
var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft);
|
|
|
var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight);
|
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY$1);
|
|
|
}
|
|
|
function addWeeks(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
var days = amount * 7;
|
|
|
return addDays(dirtyDate, days);
|
|
|
}
|
|
|
function addYears(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return addMonths(dirtyDate, amount * 12);
|
|
|
}
|
|
|
function isSameDay(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeftStartOfDay = startOfDay(dirtyDateLeft);
|
|
|
var dateRightStartOfDay = startOfDay(dirtyDateRight);
|
|
|
return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime();
|
|
|
}
|
|
|
function isDate(value) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
|
|
|
}
|
|
|
function isValid(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
if (!isDate(dirtyDate) && typeof dirtyDate !== "number") {
|
|
|
return false;
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
return !isNaN(Number(date));
|
|
|
}
|
|
|
function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();
|
|
|
var monthDiff = dateLeft.getMonth() - dateRight.getMonth();
|
|
|
return yearDiff * 12 + monthDiff;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$3 = 6048e5;
|
|
|
function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, dirtyOptions) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions);
|
|
|
var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions);
|
|
|
var timestampLeft = startOfWeekLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekLeft);
|
|
|
var timestampRight = startOfWeekRight.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekRight);
|
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK$3);
|
|
|
}
|
|
|
function endOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = date.getMonth();
|
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
|
date.setHours(23, 59, 59, 999);
|
|
|
return date;
|
|
|
}
|
|
|
function startOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
date.setDate(1);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function startOfYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var cleanDate = toDate(dirtyDate);
|
|
|
var date = new Date(0);
|
|
|
date.setFullYear(cleanDate.getFullYear(), 0, 1);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function endOfWeek(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
var date = toDate(dirtyDate);
|
|
|
var day = date.getDay();
|
|
|
var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);
|
|
|
date.setDate(date.getDate() + diff);
|
|
|
date.setHours(23, 59, 59, 999);
|
|
|
return date;
|
|
|
}
|
|
|
var formatDistanceLocale = {
|
|
|
lessThanXSeconds: {
|
|
|
one: "less than a second",
|
|
|
other: "less than {{count}} seconds"
|
|
|
},
|
|
|
xSeconds: {
|
|
|
one: "1 second",
|
|
|
other: "{{count}} seconds"
|
|
|
},
|
|
|
halfAMinute: "half a minute",
|
|
|
lessThanXMinutes: {
|
|
|
one: "less than a minute",
|
|
|
other: "less than {{count}} minutes"
|
|
|
},
|
|
|
xMinutes: {
|
|
|
one: "1 minute",
|
|
|
other: "{{count}} minutes"
|
|
|
},
|
|
|
aboutXHours: {
|
|
|
one: "about 1 hour",
|
|
|
other: "about {{count}} hours"
|
|
|
},
|
|
|
xHours: {
|
|
|
one: "1 hour",
|
|
|
other: "{{count}} hours"
|
|
|
},
|
|
|
xDays: {
|
|
|
one: "1 day",
|
|
|
other: "{{count}} days"
|
|
|
},
|
|
|
aboutXWeeks: {
|
|
|
one: "about 1 week",
|
|
|
other: "about {{count}} weeks"
|
|
|
},
|
|
|
xWeeks: {
|
|
|
one: "1 week",
|
|
|
other: "{{count}} weeks"
|
|
|
},
|
|
|
aboutXMonths: {
|
|
|
one: "about 1 month",
|
|
|
other: "about {{count}} months"
|
|
|
},
|
|
|
xMonths: {
|
|
|
one: "1 month",
|
|
|
other: "{{count}} months"
|
|
|
},
|
|
|
aboutXYears: {
|
|
|
one: "about 1 year",
|
|
|
other: "about {{count}} years"
|
|
|
},
|
|
|
xYears: {
|
|
|
one: "1 year",
|
|
|
other: "{{count}} years"
|
|
|
},
|
|
|
overXYears: {
|
|
|
one: "over 1 year",
|
|
|
other: "over {{count}} years"
|
|
|
},
|
|
|
almostXYears: {
|
|
|
one: "almost 1 year",
|
|
|
other: "almost {{count}} years"
|
|
|
}
|
|
|
};
|
|
|
var formatDistance = function(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}}", count.toString());
|
|
|
}
|
|
|
if (options !== null && options !== void 0 && options.addSuffix) {
|
|
|
if (options.comparison && options.comparison > 0) {
|
|
|
return "in " + result;
|
|
|
} else {
|
|
|
return result + " ago";
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
};
|
|
|
var formatDistance$1 = formatDistance;
|
|
|
var dateFormats = {
|
|
|
full: "EEEE, MMMM do, y",
|
|
|
long: "MMMM do, y",
|
|
|
medium: "MMM d, y",
|
|
|
short: "MM/dd/yyyy"
|
|
|
};
|
|
|
var timeFormats = {
|
|
|
full: "h:mm:ss a zzzz",
|
|
|
long: "h:mm:ss a z",
|
|
|
medium: "h:mm:ss a",
|
|
|
short: "h:mm a"
|
|
|
};
|
|
|
var dateTimeFormats = {
|
|
|
full: "{{date}} 'at' {{time}}",
|
|
|
long: "{{date}} 'at' {{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$1 = formatLong;
|
|
|
var formatRelativeLocale = {
|
|
|
lastWeek: "'last' eeee 'at' p",
|
|
|
yesterday: "'yesterday at' p",
|
|
|
today: "'today at' p",
|
|
|
tomorrow: "'tomorrow at' p",
|
|
|
nextWeek: "eeee 'at' p",
|
|
|
other: "P"
|
|
|
};
|
|
|
var formatRelative = function(token, _date, _baseDate, _options) {
|
|
|
return formatRelativeLocale[token];
|
|
|
};
|
|
|
var formatRelative$1 = formatRelative;
|
|
|
var eraValues = {
|
|
|
narrow: ["B", "A"],
|
|
|
abbreviated: ["BC", "AD"],
|
|
|
wide: ["Before Christ", "Anno Domini"]
|
|
|
};
|
|
|
var quarterValues = {
|
|
|
narrow: ["1", "2", "3", "4"],
|
|
|
abbreviated: ["Q1", "Q2", "Q3", "Q4"],
|
|
|
wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
|
|
|
};
|
|
|
var monthValues = {
|
|
|
narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
|
|
|
abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
|
|
wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
|
|
};
|
|
|
var dayValues = {
|
|
|
narrow: ["S", "M", "T", "W", "T", "F", "S"],
|
|
|
short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
|
abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
|
wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
|
};
|
|
|
var dayPeriodValues = {
|
|
|
narrow: {
|
|
|
am: "a",
|
|
|
pm: "p",
|
|
|
midnight: "mi",
|
|
|
noon: "n",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
},
|
|
|
abbreviated: {
|
|
|
am: "AM",
|
|
|
pm: "PM",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
},
|
|
|
wide: {
|
|
|
am: "a.m.",
|
|
|
pm: "p.m.",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
}
|
|
|
};
|
|
|
var formattingDayPeriodValues = {
|
|
|
narrow: {
|
|
|
am: "a",
|
|
|
pm: "p",
|
|
|
midnight: "mi",
|
|
|
noon: "n",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
},
|
|
|
abbreviated: {
|
|
|
am: "AM",
|
|
|
pm: "PM",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
},
|
|
|
wide: {
|
|
|
am: "a.m.",
|
|
|
pm: "p.m.",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "in the morning",
|
|
|
afternoon: "in the afternoon",
|
|
|
evening: "in the evening",
|
|
|
night: "at night"
|
|
|
}
|
|
|
};
|
|
|
var ordinalNumber = function(dirtyNumber, _options) {
|
|
|
var number = Number(dirtyNumber);
|
|
|
var rem100 = number % 100;
|
|
|
if (rem100 > 20 || rem100 < 10) {
|
|
|
switch (rem100 % 10) {
|
|
|
case 1:
|
|
|
return number + "st";
|
|
|
case 2:
|
|
|
return number + "nd";
|
|
|
case 3:
|
|
|
return number + "rd";
|
|
|
}
|
|
|
}
|
|
|
return number + "th";
|
|
|
};
|
|
|
var localize = {
|
|
|
ordinalNumber,
|
|
|
era: buildLocalizeFn({
|
|
|
values: eraValues,
|
|
|
defaultWidth: "wide"
|
|
|
}),
|
|
|
quarter: buildLocalizeFn({
|
|
|
values: quarterValues,
|
|
|
defaultWidth: "wide",
|
|
|
argumentCallback: function(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$1 = localize;
|
|
|
var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
|
|
|
var parseOrdinalNumberPattern = /\d+/i;
|
|
|
var matchEraPatterns = {
|
|
|
narrow: /^(b|a)/i,
|
|
|
abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
|
|
|
wide: /^(before christ|before common era|anno domini|common era)/i
|
|
|
};
|
|
|
var parseEraPatterns = {
|
|
|
any: [/^b/i, /^(a|c)/i]
|
|
|
};
|
|
|
var matchQuarterPatterns = {
|
|
|
narrow: /^[1234]/i,
|
|
|
abbreviated: /^q[1234]/i,
|
|
|
wide: /^[1234](th|st|nd|rd)? quarter/i
|
|
|
};
|
|
|
var parseQuarterPatterns = {
|
|
|
any: [/1/i, /2/i, /3/i, /4/i]
|
|
|
};
|
|
|
var matchMonthPatterns = {
|
|
|
narrow: /^[jfmasond]/i,
|
|
|
abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
|
|
|
wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
|
|
|
};
|
|
|
var parseMonthPatterns = {
|
|
|
narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],
|
|
|
any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]
|
|
|
};
|
|
|
var matchDayPatterns = {
|
|
|
narrow: /^[smtwf]/i,
|
|
|
short: /^(su|mo|tu|we|th|fr|sa)/i,
|
|
|
abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
|
|
|
wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
|
|
|
};
|
|
|
var parseDayPatterns = {
|
|
|
narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
|
|
|
any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
|
|
|
};
|
|
|
var matchDayPeriodPatterns = {
|
|
|
narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
|
|
|
any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
|
|
|
};
|
|
|
var parseDayPeriodPatterns = {
|
|
|
any: {
|
|
|
am: /^a/i,
|
|
|
pm: /^p/i,
|
|
|
midnight: /^mi/i,
|
|
|
noon: /^no/i,
|
|
|
morning: /morning/i,
|
|
|
afternoon: /afternoon/i,
|
|
|
evening: /evening/i,
|
|
|
night: /night/i
|
|
|
}
|
|
|
};
|
|
|
var match = {
|
|
|
ordinalNumber: buildMatchPatternFn({
|
|
|
matchPattern: matchOrdinalNumberPattern,
|
|
|
parsePattern: parseOrdinalNumberPattern,
|
|
|
valueCallback: function(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(index) {
|
|
|
return index + 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$1 = match;
|
|
|
var locale = {
|
|
|
code: "en-US",
|
|
|
formatDistance: formatDistance$1,
|
|
|
formatLong: formatLong$1,
|
|
|
formatRelative: formatRelative$1,
|
|
|
localize: localize$1,
|
|
|
match: match$1,
|
|
|
options: {
|
|
|
weekStartsOn: 0,
|
|
|
firstWeekContainsDate: 1
|
|
|
}
|
|
|
};
|
|
|
var enUS = locale;
|
|
|
function subMilliseconds(dirtyDate, dirtyAmount) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var amount = toInteger(dirtyAmount);
|
|
|
return addMilliseconds(dirtyDate, -amount);
|
|
|
}
|
|
|
var MILLISECONDS_IN_DAY = 864e5;
|
|
|
function getUTCDayOfYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var timestamp = date.getTime();
|
|
|
date.setUTCMonth(0, 1);
|
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfYearTimestamp = date.getTime();
|
|
|
var difference = timestamp - startOfYearTimestamp;
|
|
|
return Math.floor(difference / MILLISECONDS_IN_DAY) + 1;
|
|
|
}
|
|
|
function startOfUTCISOWeek(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var weekStartsOn = 1;
|
|
|
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;
|
|
|
}
|
|
|
function getUTCISOWeekYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getUTCFullYear();
|
|
|
var fourthOfJanuaryOfNextYear = new Date(0);
|
|
|
fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);
|
|
|
fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear);
|
|
|
var fourthOfJanuaryOfThisYear = new Date(0);
|
|
|
fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);
|
|
|
fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfUTCISOWeekYear(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var year = getUTCISOWeekYear(dirtyDate);
|
|
|
var fourthOfJanuary = new Date(0);
|
|
|
fourthOfJanuary.setUTCFullYear(year, 0, 4);
|
|
|
fourthOfJanuary.setUTCHours(0, 0, 0, 0);
|
|
|
var date = startOfUTCISOWeek(fourthOfJanuary);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$2 = 6048e5;
|
|
|
function getUTCISOWeek(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK$2) + 1;
|
|
|
}
|
|
|
function getUTCWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getUTCFullYear();
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var firstWeekOfNextYear = new Date(0);
|
|
|
firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);
|
|
|
firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions);
|
|
|
var firstWeekOfThisYear = new Date(0);
|
|
|
firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfUTCWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
var year = getUTCWeekYear(dirtyDate, dirtyOptions);
|
|
|
var firstWeek = new Date(0);
|
|
|
firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeek.setUTCHours(0, 0, 0, 0);
|
|
|
var date = startOfUTCWeek(firstWeek, dirtyOptions);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK$1 = 6048e5;
|
|
|
function getUTCWeek(dirtyDate, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK$1) + 1;
|
|
|
}
|
|
|
function addLeadingZeros(number, targetLength) {
|
|
|
var sign = number < 0 ? "-" : "";
|
|
|
var output2 = Math.abs(number).toString();
|
|
|
while (output2.length < targetLength) {
|
|
|
output2 = "0" + output2;
|
|
|
}
|
|
|
return sign + output2;
|
|
|
}
|
|
|
var formatters$3 = {
|
|
|
y: function(date, token) {
|
|
|
var signedYear = date.getUTCFullYear();
|
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
|
return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
|
|
|
},
|
|
|
M: function(date, token) {
|
|
|
var month = date.getUTCMonth();
|
|
|
return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
|
|
|
},
|
|
|
d: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCDate(), token.length);
|
|
|
},
|
|
|
a: function(date, token) {
|
|
|
var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? "pm" : "am";
|
|
|
switch (token) {
|
|
|
case "a":
|
|
|
case "aa":
|
|
|
return dayPeriodEnumValue.toUpperCase();
|
|
|
case "aaa":
|
|
|
return dayPeriodEnumValue;
|
|
|
case "aaaaa":
|
|
|
return dayPeriodEnumValue[0];
|
|
|
case "aaaa":
|
|
|
default:
|
|
|
return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
|
|
|
}
|
|
|
},
|
|
|
h: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length);
|
|
|
},
|
|
|
H: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCHours(), token.length);
|
|
|
},
|
|
|
m: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCMinutes(), token.length);
|
|
|
},
|
|
|
s: function(date, token) {
|
|
|
return addLeadingZeros(date.getUTCSeconds(), token.length);
|
|
|
},
|
|
|
S: function(date, token) {
|
|
|
var numberOfDigits = token.length;
|
|
|
var milliseconds = date.getUTCMilliseconds();
|
|
|
var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));
|
|
|
return addLeadingZeros(fractionalSeconds, token.length);
|
|
|
}
|
|
|
};
|
|
|
var formatters$4 = formatters$3;
|
|
|
var dayPeriodEnum = {
|
|
|
am: "am",
|
|
|
pm: "pm",
|
|
|
midnight: "midnight",
|
|
|
noon: "noon",
|
|
|
morning: "morning",
|
|
|
afternoon: "afternoon",
|
|
|
evening: "evening",
|
|
|
night: "night"
|
|
|
};
|
|
|
var formatters$1 = {
|
|
|
G: function(date, token, localize2) {
|
|
|
var era = date.getUTCFullYear() > 0 ? 1 : 0;
|
|
|
switch (token) {
|
|
|
case "G":
|
|
|
case "GG":
|
|
|
case "GGG":
|
|
|
return localize2.era(era, {
|
|
|
width: "abbreviated"
|
|
|
});
|
|
|
case "GGGGG":
|
|
|
return localize2.era(era, {
|
|
|
width: "narrow"
|
|
|
});
|
|
|
case "GGGG":
|
|
|
default:
|
|
|
return localize2.era(era, {
|
|
|
width: "wide"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
y: function(date, token, localize2) {
|
|
|
if (token === "yo") {
|
|
|
var signedYear = date.getUTCFullYear();
|
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
|
return localize2.ordinalNumber(year, {
|
|
|
unit: "year"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.y(date, token);
|
|
|
},
|
|
|
Y: function(date, token, localize2, options) {
|
|
|
var signedWeekYear = getUTCWeekYear(date, options);
|
|
|
var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
|
|
|
if (token === "YY") {
|
|
|
var twoDigitYear = weekYear % 100;
|
|
|
return addLeadingZeros(twoDigitYear, 2);
|
|
|
}
|
|
|
if (token === "Yo") {
|
|
|
return localize2.ordinalNumber(weekYear, {
|
|
|
unit: "year"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(weekYear, token.length);
|
|
|
},
|
|
|
R: function(date, token) {
|
|
|
var isoWeekYear = getUTCISOWeekYear(date);
|
|
|
return addLeadingZeros(isoWeekYear, token.length);
|
|
|
},
|
|
|
u: function(date, token) {
|
|
|
var year = date.getUTCFullYear();
|
|
|
return addLeadingZeros(year, token.length);
|
|
|
},
|
|
|
Q: function(date, token, localize2) {
|
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
|
switch (token) {
|
|
|
case "Q":
|
|
|
return String(quarter);
|
|
|
case "QQ":
|
|
|
return addLeadingZeros(quarter, 2);
|
|
|
case "Qo":
|
|
|
return localize2.ordinalNumber(quarter, {
|
|
|
unit: "quarter"
|
|
|
});
|
|
|
case "QQQ":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "QQQQQ":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "QQQQ":
|
|
|
default:
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
q: function(date, token, localize2) {
|
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
|
switch (token) {
|
|
|
case "q":
|
|
|
return String(quarter);
|
|
|
case "qq":
|
|
|
return addLeadingZeros(quarter, 2);
|
|
|
case "qo":
|
|
|
return localize2.ordinalNumber(quarter, {
|
|
|
unit: "quarter"
|
|
|
});
|
|
|
case "qqq":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "qqqqq":
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "qqqq":
|
|
|
default:
|
|
|
return localize2.quarter(quarter, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
M: function(date, token, localize2) {
|
|
|
var month = date.getUTCMonth();
|
|
|
switch (token) {
|
|
|
case "M":
|
|
|
case "MM":
|
|
|
return formatters$4.M(date, token);
|
|
|
case "Mo":
|
|
|
return localize2.ordinalNumber(month + 1, {
|
|
|
unit: "month"
|
|
|
});
|
|
|
case "MMM":
|
|
|
return localize2.month(month, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "MMMMM":
|
|
|
return localize2.month(month, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "MMMM":
|
|
|
default:
|
|
|
return localize2.month(month, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
L: function(date, token, localize2) {
|
|
|
var month = date.getUTCMonth();
|
|
|
switch (token) {
|
|
|
case "L":
|
|
|
return String(month + 1);
|
|
|
case "LL":
|
|
|
return addLeadingZeros(month + 1, 2);
|
|
|
case "Lo":
|
|
|
return localize2.ordinalNumber(month + 1, {
|
|
|
unit: "month"
|
|
|
});
|
|
|
case "LLL":
|
|
|
return localize2.month(month, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "LLLLL":
|
|
|
return localize2.month(month, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "LLLL":
|
|
|
default:
|
|
|
return localize2.month(month, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
w: function(date, token, localize2, options) {
|
|
|
var week = getUTCWeek(date, options);
|
|
|
if (token === "wo") {
|
|
|
return localize2.ordinalNumber(week, {
|
|
|
unit: "week"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(week, token.length);
|
|
|
},
|
|
|
I: function(date, token, localize2) {
|
|
|
var isoWeek = getUTCISOWeek(date);
|
|
|
if (token === "Io") {
|
|
|
return localize2.ordinalNumber(isoWeek, {
|
|
|
unit: "week"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(isoWeek, token.length);
|
|
|
},
|
|
|
d: function(date, token, localize2) {
|
|
|
if (token === "do") {
|
|
|
return localize2.ordinalNumber(date.getUTCDate(), {
|
|
|
unit: "date"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.d(date, token);
|
|
|
},
|
|
|
D: function(date, token, localize2) {
|
|
|
var dayOfYear = getUTCDayOfYear(date);
|
|
|
if (token === "Do") {
|
|
|
return localize2.ordinalNumber(dayOfYear, {
|
|
|
unit: "dayOfYear"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(dayOfYear, token.length);
|
|
|
},
|
|
|
E: function(date, token, localize2) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
switch (token) {
|
|
|
case "E":
|
|
|
case "EE":
|
|
|
case "EEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEEEE":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "EEEE":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
e: function(date, token, localize2, options) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
|
switch (token) {
|
|
|
case "e":
|
|
|
return String(localDayOfWeek);
|
|
|
case "ee":
|
|
|
return addLeadingZeros(localDayOfWeek, 2);
|
|
|
case "eo":
|
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "eee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeeee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeeeee":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "eeee":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
c: function(date, token, localize2, options) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
|
switch (token) {
|
|
|
case "c":
|
|
|
return String(localDayOfWeek);
|
|
|
case "cc":
|
|
|
return addLeadingZeros(localDayOfWeek, token.length);
|
|
|
case "co":
|
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "ccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "ccccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "cccccc":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
case "cccc":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "standalone"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
i: function(date, token, localize2) {
|
|
|
var dayOfWeek = date.getUTCDay();
|
|
|
var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
|
|
|
switch (token) {
|
|
|
case "i":
|
|
|
return String(isoDayOfWeek);
|
|
|
case "ii":
|
|
|
return addLeadingZeros(isoDayOfWeek, token.length);
|
|
|
case "io":
|
|
|
return localize2.ordinalNumber(isoDayOfWeek, {
|
|
|
unit: "day"
|
|
|
});
|
|
|
case "iii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiiii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiiiii":
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "short",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "iiii":
|
|
|
default:
|
|
|
return localize2.day(dayOfWeek, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
a: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
|
switch (token) {
|
|
|
case "a":
|
|
|
case "aa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "aaa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
}).toLowerCase();
|
|
|
case "aaaaa":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "aaaa":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
b: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue;
|
|
|
if (hours === 12) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.noon;
|
|
|
} else if (hours === 0) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.midnight;
|
|
|
} else {
|
|
|
dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "b":
|
|
|
case "bb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "bbb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
}).toLowerCase();
|
|
|
case "bbbbb":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "bbbb":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
B: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
var dayPeriodEnumValue;
|
|
|
if (hours >= 17) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.evening;
|
|
|
} else if (hours >= 12) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.afternoon;
|
|
|
} else if (hours >= 4) {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.morning;
|
|
|
} else {
|
|
|
dayPeriodEnumValue = dayPeriodEnum.night;
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "B":
|
|
|
case "BB":
|
|
|
case "BBB":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "abbreviated",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "BBBBB":
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "narrow",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
case "BBBB":
|
|
|
default:
|
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
|
width: "wide",
|
|
|
context: "formatting"
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
h: function(date, token, localize2) {
|
|
|
if (token === "ho") {
|
|
|
var hours = date.getUTCHours() % 12;
|
|
|
if (hours === 0)
|
|
|
hours = 12;
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.h(date, token);
|
|
|
},
|
|
|
H: function(date, token, localize2) {
|
|
|
if (token === "Ho") {
|
|
|
return localize2.ordinalNumber(date.getUTCHours(), {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.H(date, token);
|
|
|
},
|
|
|
K: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours() % 12;
|
|
|
if (token === "Ko") {
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(hours, token.length);
|
|
|
},
|
|
|
k: function(date, token, localize2) {
|
|
|
var hours = date.getUTCHours();
|
|
|
if (hours === 0)
|
|
|
hours = 24;
|
|
|
if (token === "ko") {
|
|
|
return localize2.ordinalNumber(hours, {
|
|
|
unit: "hour"
|
|
|
});
|
|
|
}
|
|
|
return addLeadingZeros(hours, token.length);
|
|
|
},
|
|
|
m: function(date, token, localize2) {
|
|
|
if (token === "mo") {
|
|
|
return localize2.ordinalNumber(date.getUTCMinutes(), {
|
|
|
unit: "minute"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.m(date, token);
|
|
|
},
|
|
|
s: function(date, token, localize2) {
|
|
|
if (token === "so") {
|
|
|
return localize2.ordinalNumber(date.getUTCSeconds(), {
|
|
|
unit: "second"
|
|
|
});
|
|
|
}
|
|
|
return formatters$4.s(date, token);
|
|
|
},
|
|
|
S: function(date, token) {
|
|
|
return formatters$4.S(date, token);
|
|
|
},
|
|
|
X: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
if (timezoneOffset === 0) {
|
|
|
return "Z";
|
|
|
}
|
|
|
switch (token) {
|
|
|
case "X":
|
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
|
case "XXXX":
|
|
|
case "XX":
|
|
|
return formatTimezone(timezoneOffset);
|
|
|
case "XXXXX":
|
|
|
case "XXX":
|
|
|
default:
|
|
|
return formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
x: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "x":
|
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
|
case "xxxx":
|
|
|
case "xx":
|
|
|
return formatTimezone(timezoneOffset);
|
|
|
case "xxxxx":
|
|
|
case "xxx":
|
|
|
default:
|
|
|
return formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
O: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "O":
|
|
|
case "OO":
|
|
|
case "OOO":
|
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
|
case "OOOO":
|
|
|
default:
|
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
z: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
|
switch (token) {
|
|
|
case "z":
|
|
|
case "zz":
|
|
|
case "zzz":
|
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
|
case "zzzz":
|
|
|
default:
|
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
|
}
|
|
|
},
|
|
|
t: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timestamp = Math.floor(originalDate.getTime() / 1e3);
|
|
|
return addLeadingZeros(timestamp, token.length);
|
|
|
},
|
|
|
T: function(date, token, _localize, options) {
|
|
|
var originalDate = options._originalDate || date;
|
|
|
var timestamp = originalDate.getTime();
|
|
|
return addLeadingZeros(timestamp, token.length);
|
|
|
}
|
|
|
};
|
|
|
function formatTimezoneShort(offset2, dirtyDelimiter) {
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
var absOffset = Math.abs(offset2);
|
|
|
var hours = Math.floor(absOffset / 60);
|
|
|
var minutes = absOffset % 60;
|
|
|
if (minutes === 0) {
|
|
|
return sign + String(hours);
|
|
|
}
|
|
|
var delimiter = dirtyDelimiter || "";
|
|
|
return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
|
|
|
}
|
|
|
function formatTimezoneWithOptionalMinutes(offset2, dirtyDelimiter) {
|
|
|
if (offset2 % 60 === 0) {
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
return sign + addLeadingZeros(Math.abs(offset2) / 60, 2);
|
|
|
}
|
|
|
return formatTimezone(offset2, dirtyDelimiter);
|
|
|
}
|
|
|
function formatTimezone(offset2, dirtyDelimiter) {
|
|
|
var delimiter = dirtyDelimiter || "";
|
|
|
var sign = offset2 > 0 ? "-" : "+";
|
|
|
var absOffset = Math.abs(offset2);
|
|
|
var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);
|
|
|
var minutes = addLeadingZeros(absOffset % 60, 2);
|
|
|
return sign + hours + delimiter + minutes;
|
|
|
}
|
|
|
var formatters$2 = formatters$1;
|
|
|
function dateLongFormatter(pattern, formatLong2) {
|
|
|
switch (pattern) {
|
|
|
case "P":
|
|
|
return formatLong2.date({
|
|
|
width: "short"
|
|
|
});
|
|
|
case "PP":
|
|
|
return formatLong2.date({
|
|
|
width: "medium"
|
|
|
});
|
|
|
case "PPP":
|
|
|
return formatLong2.date({
|
|
|
width: "long"
|
|
|
});
|
|
|
case "PPPP":
|
|
|
default:
|
|
|
return formatLong2.date({
|
|
|
width: "full"
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function timeLongFormatter(pattern, formatLong2) {
|
|
|
switch (pattern) {
|
|
|
case "p":
|
|
|
return formatLong2.time({
|
|
|
width: "short"
|
|
|
});
|
|
|
case "pp":
|
|
|
return formatLong2.time({
|
|
|
width: "medium"
|
|
|
});
|
|
|
case "ppp":
|
|
|
return formatLong2.time({
|
|
|
width: "long"
|
|
|
});
|
|
|
case "pppp":
|
|
|
default:
|
|
|
return formatLong2.time({
|
|
|
width: "full"
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function dateTimeLongFormatter(pattern, formatLong2) {
|
|
|
var matchResult = pattern.match(/(P+)(p+)?/) || [];
|
|
|
var datePattern = matchResult[1];
|
|
|
var timePattern = matchResult[2];
|
|
|
if (!timePattern) {
|
|
|
return dateLongFormatter(pattern, formatLong2);
|
|
|
}
|
|
|
var dateTimeFormat;
|
|
|
switch (datePattern) {
|
|
|
case "P":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "short"
|
|
|
});
|
|
|
break;
|
|
|
case "PP":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "medium"
|
|
|
});
|
|
|
break;
|
|
|
case "PPP":
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "long"
|
|
|
});
|
|
|
break;
|
|
|
case "PPPP":
|
|
|
default:
|
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
|
width: "full"
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
|
|
|
}
|
|
|
var longFormatters = {
|
|
|
p: timeLongFormatter,
|
|
|
P: dateTimeLongFormatter
|
|
|
};
|
|
|
var longFormatters$1 = longFormatters;
|
|
|
var protectedDayOfYearTokens = ["D", "DD"];
|
|
|
var protectedWeekYearTokens = ["YY", "YYYY"];
|
|
|
function isProtectedDayOfYearToken(token) {
|
|
|
return protectedDayOfYearTokens.indexOf(token) !== -1;
|
|
|
}
|
|
|
function isProtectedWeekYearToken(token) {
|
|
|
return protectedWeekYearTokens.indexOf(token) !== -1;
|
|
|
}
|
|
|
function throwProtectedError(token, format2, input) {
|
|
|
if (token === "YYYY") {
|
|
|
throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "YY") {
|
|
|
throw new RangeError("Use `yy` instead of `YY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "D") {
|
|
|
throw new RangeError("Use `d` instead of `D` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
} else if (token === "DD") {
|
|
|
throw new RangeError("Use `dd` instead of `DD` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr"));
|
|
|
}
|
|
|
}
|
|
|
var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
|
var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
|
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
|
var doubleQuoteRegExp = /''/g;
|
|
|
var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
|
|
|
function format(dirtyDate, dirtyFormatStr, dirtyOptions) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var formatStr = String(dirtyFormatStr);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale || enUS;
|
|
|
var localeFirstWeekContainsDate = locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var localeWeekStartsOn = locale2.options && locale2.options.weekStartsOn;
|
|
|
var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);
|
|
|
var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);
|
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
|
}
|
|
|
if (!locale2.localize) {
|
|
|
throw new RangeError("locale must contain localize property");
|
|
|
}
|
|
|
if (!locale2.formatLong) {
|
|
|
throw new RangeError("locale must contain formatLong property");
|
|
|
}
|
|
|
var originalDate = toDate(dirtyDate);
|
|
|
if (!isValid(originalDate)) {
|
|
|
throw new RangeError("Invalid time value");
|
|
|
}
|
|
|
var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);
|
|
|
var utcDate = subMilliseconds(originalDate, timezoneOffset);
|
|
|
var formatterOptions = {
|
|
|
firstWeekContainsDate,
|
|
|
weekStartsOn,
|
|
|
locale: locale2,
|
|
|
_originalDate: originalDate
|
|
|
};
|
|
|
var result = formatStr.match(longFormattingTokensRegExp).map(function(substring) {
|
|
|
var firstCharacter = substring[0];
|
|
|
if (firstCharacter === "p" || firstCharacter === "P") {
|
|
|
var longFormatter = longFormatters$1[firstCharacter];
|
|
|
return longFormatter(substring, locale2.formatLong, formatterOptions);
|
|
|
}
|
|
|
return substring;
|
|
|
}).join("").match(formattingTokensRegExp).map(function(substring) {
|
|
|
if (substring === "''") {
|
|
|
return "'";
|
|
|
}
|
|
|
var firstCharacter = substring[0];
|
|
|
if (firstCharacter === "'") {
|
|
|
return cleanEscapedString(substring);
|
|
|
}
|
|
|
var formatter = formatters$2[firstCharacter];
|
|
|
if (formatter) {
|
|
|
if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) {
|
|
|
throwProtectedError(substring, dirtyFormatStr, dirtyDate);
|
|
|
}
|
|
|
if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) {
|
|
|
throwProtectedError(substring, dirtyFormatStr, dirtyDate);
|
|
|
}
|
|
|
return formatter(utcDate, substring, locale2.localize, formatterOptions);
|
|
|
}
|
|
|
if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
|
|
|
throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`");
|
|
|
}
|
|
|
return substring;
|
|
|
}).join("");
|
|
|
return result;
|
|
|
}
|
|
|
function cleanEscapedString(input) {
|
|
|
return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'");
|
|
|
}
|
|
|
function getDaysInMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getFullYear();
|
|
|
var monthIndex = date.getMonth();
|
|
|
var lastDayOfMonth2 = new Date(0);
|
|
|
lastDayOfMonth2.setFullYear(year, monthIndex + 1, 0);
|
|
|
lastDayOfMonth2.setHours(0, 0, 0, 0);
|
|
|
return lastDayOfMonth2.getDate();
|
|
|
}
|
|
|
function getTime(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var timestamp = date.getTime();
|
|
|
return timestamp;
|
|
|
}
|
|
|
function getUnixTime(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return Math.floor(getTime(dirtyDate) / 1e3);
|
|
|
}
|
|
|
function getWeekYear(dirtyDate, options) {
|
|
|
var _options$locale, _options$locale$optio;
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = date.getFullYear();
|
|
|
var localeFirstWeekContainsDate = 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.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = (options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
|
}
|
|
|
var firstWeekOfNextYear = new Date(0);
|
|
|
firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
|
|
|
firstWeekOfNextYear.setHours(0, 0, 0, 0);
|
|
|
var startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
|
|
|
var firstWeekOfThisYear = new Date(0);
|
|
|
firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeekOfThisYear.setHours(0, 0, 0, 0);
|
|
|
var startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
|
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
|
return year + 1;
|
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
|
return year;
|
|
|
} else {
|
|
|
return year - 1;
|
|
|
}
|
|
|
}
|
|
|
function startOfWeekYear(dirtyDate, dirtyOptions) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var options = dirtyOptions || {};
|
|
|
var locale2 = options.locale;
|
|
|
var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate;
|
|
|
var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);
|
|
|
var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);
|
|
|
var year = getWeekYear(dirtyDate, dirtyOptions);
|
|
|
var firstWeek = new Date(0);
|
|
|
firstWeek.setFullYear(year, 0, firstWeekContainsDate);
|
|
|
firstWeek.setHours(0, 0, 0, 0);
|
|
|
var date = startOfWeek(firstWeek, dirtyOptions);
|
|
|
return date;
|
|
|
}
|
|
|
var MILLISECONDS_IN_WEEK = 6048e5;
|
|
|
function getWeek(dirtyDate, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var diff = startOfWeek(date, options).getTime() - startOfWeekYear(date, options).getTime();
|
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;
|
|
|
}
|
|
|
function lastDayOfMonth(dirtyDate) {
|
|
|
requiredArgs(1, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = date.getMonth();
|
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
|
date.setHours(0, 0, 0, 0);
|
|
|
return date;
|
|
|
}
|
|
|
function getWeeksInMonth(date, options) {
|
|
|
requiredArgs(1, arguments);
|
|
|
return differenceInCalendarWeeks(lastDayOfMonth(date), startOfMonth(date), options) + 1;
|
|
|
}
|
|
|
function isAfter(dirtyDate, dirtyDateToCompare) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
|
return date.getTime() > dateToCompare.getTime();
|
|
|
}
|
|
|
function isBefore(dirtyDate, dirtyDateToCompare) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
|
return date.getTime() < dateToCompare.getTime();
|
|
|
}
|
|
|
function isSameMonth(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth();
|
|
|
}
|
|
|
function isSameYear(dirtyDateLeft, dirtyDateRight) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
|
var dateRight = toDate(dirtyDateRight);
|
|
|
return dateLeft.getFullYear() === dateRight.getFullYear();
|
|
|
}
|
|
|
function setMonth(dirtyDate, dirtyMonth) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var month = toInteger(dirtyMonth);
|
|
|
var year = date.getFullYear();
|
|
|
var day = date.getDate();
|
|
|
var dateWithDesiredMonth = new Date(0);
|
|
|
dateWithDesiredMonth.setFullYear(year, month, 15);
|
|
|
dateWithDesiredMonth.setHours(0, 0, 0, 0);
|
|
|
var daysInMonth = getDaysInMonth(dateWithDesiredMonth);
|
|
|
date.setMonth(month, Math.min(day, daysInMonth));
|
|
|
return date;
|
|
|
}
|
|
|
function setYear(dirtyDate, dirtyYear) {
|
|
|
requiredArgs(2, arguments);
|
|
|
var date = toDate(dirtyDate);
|
|
|
var year = toInteger(dirtyYear);
|
|
|
if (isNaN(date.getTime())) {
|
|
|
return new Date(NaN);
|
|
|
}
|
|
|
date.setFullYear(year);
|
|
|
return date;
|
|
|
}
|
|
|
function MonthsDropdown(props) {
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, styles = _a.styles, locale2 = _a.locale, formatMonthCaption2 = _a.formatters.formatMonthCaption, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, labelMonthDropdown2 = _a.labels.labelMonthDropdown;
|
|
|
if (!fromDate && !toDate2) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
var dropdownMonths = [];
|
|
|
if (fromDate && toDate2) {
|
|
|
if (isSameYear(fromDate, toDate2)) {
|
|
|
for (var month = fromDate.getMonth(); month <= toDate2.getMonth(); month++) {
|
|
|
dropdownMonths.push(setMonth(startOfMonth(fromDate), month));
|
|
|
}
|
|
|
} else {
|
|
|
for (var month = 0; month <= 11; month++) {
|
|
|
var anyDate = new Date();
|
|
|
dropdownMonths.push(setMonth(startOfMonth(anyDate), month));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var handleChange = function(e) {
|
|
|
var newMonth = setMonth(new Date(displayMonth), Number(e.target.value));
|
|
|
props.onChange(newMonth);
|
|
|
};
|
|
|
return React$1.createElement(Dropdown2, { "aria-label": labelMonthDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getMonth(), caption: formatMonthCaption2(displayMonth, { locale: locale2 }) }, dropdownMonths.map(function(m2) {
|
|
|
return React$1.createElement("option", { key: m2.getMonth(), value: m2.getMonth() }, formatMonthCaption2(m2, { locale: locale2 }));
|
|
|
}));
|
|
|
}
|
|
|
var Button = React$1.forwardRef(function(props, ref) {
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles;
|
|
|
var classNamesArr = [classNames.button_reset, classNames.button];
|
|
|
if (props.className) {
|
|
|
classNamesArr.push(props.className);
|
|
|
}
|
|
|
var className = classNamesArr.join(" ");
|
|
|
var style = __assign(__assign({}, styles.button_reset), styles.button);
|
|
|
if (props.style) {
|
|
|
Object.assign(style, props.style);
|
|
|
}
|
|
|
return React$1.createElement("button", __assign({}, props, { ref, type: "button", className, style }));
|
|
|
});
|
|
|
function Navigation(props) {
|
|
|
var _a;
|
|
|
var _b = useDayPicker(), dir = _b.dir, locale2 = _b.locale, classNames = _b.classNames, styles = _b.styles, _c = _b.labels, labelPrevious2 = _c.labelPrevious, labelNext2 = _c.labelNext, _d = _b.components, IconRight2 = _d.IconRight, IconLeft2 = _d.IconLeft;
|
|
|
var onPreviousClick = props.onPreviousClick, onNextClick = props.onNextClick;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [onPreviousClick, onNextClick], onNextClick = _a[0], onPreviousClick = _a[1];
|
|
|
}
|
|
|
var previousMonth = props.previousMonth, nextMonth = props.nextMonth;
|
|
|
var previousLabel = labelPrevious2(previousMonth, { locale: locale2 });
|
|
|
var previousClassName = [
|
|
|
classNames.nav_button,
|
|
|
classNames.nav_button_previous
|
|
|
].join(" ");
|
|
|
var nextLabel = labelNext2(nextMonth, { locale: locale2 });
|
|
|
var nextClassName = [
|
|
|
classNames.nav_button,
|
|
|
classNames.nav_button_next
|
|
|
].join(" ");
|
|
|
if (!nextMonth && !previousMonth) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
return React$1.createElement("div", { className: classNames.nav, style: styles.nav }, !props.hidePrevious && React$1.createElement(Button, { "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_next, disabled: !previousMonth, onClick: dir === "rtl" ? onNextClick : onPreviousClick }, dir === "rtl" ? React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon })), !props.hideNext && React$1.createElement(Button, { "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !nextMonth, onClick: dir === "rtl" ? onPreviousClick : onNextClick }, dir === "rtl" ? React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon })));
|
|
|
}
|
|
|
function YearsDropdown(props) {
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, locale2 = _a.locale, styles = _a.styles, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, formatYearCaption2 = _a.formatters.formatYearCaption, labelYearDropdown2 = _a.labels.labelYearDropdown;
|
|
|
var years = [];
|
|
|
if (fromDate && toDate2) {
|
|
|
var fromYear = fromDate.getFullYear();
|
|
|
var toYear = toDate2.getFullYear();
|
|
|
for (var year = fromYear; year <= toYear; year++) {
|
|
|
years.push(setYear(startOfYear(new Date()), year));
|
|
|
}
|
|
|
}
|
|
|
var handleChange = function(e) {
|
|
|
var newMonth = setYear(new Date(displayMonth), Number(e.target.value));
|
|
|
props.onChange(newMonth);
|
|
|
};
|
|
|
return React$1.createElement(Dropdown2, { "aria-label": labelYearDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption2(displayMonth, { locale: locale2 }) }, years.map(function(year2) {
|
|
|
return React$1.createElement("option", { key: year2.getFullYear(), value: year2.getFullYear() }, formatYearCaption2(year2, { locale: locale2 }));
|
|
|
}));
|
|
|
}
|
|
|
function useControlledValue(defaultValue, controlledValue) {
|
|
|
var _a = React$1.useState(defaultValue), uncontrolledValue = _a[0], setValue = _a[1];
|
|
|
var value = controlledValue === void 0 ? uncontrolledValue : controlledValue;
|
|
|
return [value, setValue];
|
|
|
}
|
|
|
function getInitialMonth(context) {
|
|
|
var month = context.month, defaultMonth = context.defaultMonth, today = context.today;
|
|
|
var initialMonth = month || defaultMonth || today || new Date();
|
|
|
var toDate2 = context.toDate, fromDate = context.fromDate, _a = context.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
if (toDate2 && differenceInCalendarMonths(toDate2, initialMonth) < 0) {
|
|
|
var offset2 = -1 * (numberOfMonths - 1);
|
|
|
initialMonth = addMonths(toDate2, offset2);
|
|
|
}
|
|
|
if (fromDate && differenceInCalendarMonths(initialMonth, fromDate) < 0) {
|
|
|
initialMonth = fromDate;
|
|
|
}
|
|
|
return startOfMonth(initialMonth);
|
|
|
}
|
|
|
function useNavigationState() {
|
|
|
var context = useDayPicker();
|
|
|
var initialMonth = getInitialMonth(context);
|
|
|
var _a = useControlledValue(initialMonth, context.month), month = _a[0], setMonth2 = _a[1];
|
|
|
var goToMonth = function(date) {
|
|
|
if (context.disableNavigation)
|
|
|
return;
|
|
|
setMonth2(date);
|
|
|
};
|
|
|
return [month, goToMonth];
|
|
|
}
|
|
|
function getDisplayMonths(month, _a) {
|
|
|
var reverseMonths = _a.reverseMonths, numberOfMonths = _a.numberOfMonths;
|
|
|
var start2 = startOfMonth(month);
|
|
|
var end2 = startOfMonth(addMonths(start2, numberOfMonths));
|
|
|
var monthsDiff = differenceInCalendarMonths(end2, start2);
|
|
|
var months = [];
|
|
|
for (var i = 0; i < monthsDiff; i++) {
|
|
|
var nextMonth = addMonths(start2, i);
|
|
|
months.push(nextMonth);
|
|
|
}
|
|
|
if (reverseMonths)
|
|
|
months = months.reverse();
|
|
|
return months;
|
|
|
}
|
|
|
function getNextMonth(startingMonth, options) {
|
|
|
if (options.disableNavigation) {
|
|
|
return void 0;
|
|
|
}
|
|
|
var toDate2 = options.toDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
var offset2 = pagedNavigation ? numberOfMonths : 1;
|
|
|
var month = startOfMonth(startingMonth);
|
|
|
if (!toDate2) {
|
|
|
return addMonths(month, offset2);
|
|
|
}
|
|
|
var monthsDiff = differenceInCalendarMonths(toDate2, startingMonth);
|
|
|
if (monthsDiff < numberOfMonths) {
|
|
|
return void 0;
|
|
|
}
|
|
|
return addMonths(month, offset2);
|
|
|
}
|
|
|
function getPreviousMonth(startingMonth, options) {
|
|
|
if (options.disableNavigation) {
|
|
|
return void 0;
|
|
|
}
|
|
|
var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
|
|
|
var offset2 = pagedNavigation ? numberOfMonths : 1;
|
|
|
var month = startOfMonth(startingMonth);
|
|
|
if (!fromDate) {
|
|
|
return addMonths(month, -offset2);
|
|
|
}
|
|
|
var monthsDiff = differenceInCalendarMonths(month, fromDate);
|
|
|
if (monthsDiff <= 0) {
|
|
|
return void 0;
|
|
|
}
|
|
|
return addMonths(month, -offset2);
|
|
|
}
|
|
|
var NavigationContext = React$1.createContext(void 0);
|
|
|
function NavigationProvider(props) {
|
|
|
var context = useDayPicker();
|
|
|
var _a = useNavigationState(), month = _a[0], goToMonth = _a[1];
|
|
|
var displayMonths = getDisplayMonths(month, context);
|
|
|
var nextMonth = getNextMonth(month, context);
|
|
|
var previousMonth = getPreviousMonth(month, context);
|
|
|
return React$1.createElement(NavigationContext.Provider, { value: {
|
|
|
month,
|
|
|
displayMonths,
|
|
|
goToMonth,
|
|
|
previousMonth,
|
|
|
nextMonth
|
|
|
} }, props.children);
|
|
|
}
|
|
|
function useNavigation() {
|
|
|
var context = React$1.useContext(NavigationContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useNavigation must be used within a NavigationProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function Caption(props) {
|
|
|
var _a;
|
|
|
var displayMonth = props.displayMonth;
|
|
|
var context = useDayPicker();
|
|
|
var classNames = context.classNames, numberOfMonths = context.numberOfMonths, disableNavigation = context.disableNavigation, styles = context.styles, captionLayout = context.captionLayout, onMonthChange = context.onMonthChange, dir = context.dir, CaptionLabel2 = context.components.CaptionLabel;
|
|
|
var _b = useNavigation(), previousMonth = _b.previousMonth, nextMonth = _b.nextMonth, goToMonth = _b.goToMonth, displayMonths = _b.displayMonths;
|
|
|
var handlePreviousClick = function() {
|
|
|
if (!previousMonth)
|
|
|
return;
|
|
|
goToMonth(previousMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(previousMonth);
|
|
|
};
|
|
|
var handleNextClick = function() {
|
|
|
if (!nextMonth)
|
|
|
return;
|
|
|
goToMonth(nextMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(nextMonth);
|
|
|
};
|
|
|
var handleMonthChange = function(newMonth) {
|
|
|
goToMonth(newMonth);
|
|
|
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(newMonth);
|
|
|
};
|
|
|
var displayIndex = displayMonths.findIndex(function(month) {
|
|
|
return isSameMonth(displayMonth, month);
|
|
|
});
|
|
|
var isFirst = displayIndex === 0;
|
|
|
var isLast = displayIndex === displayMonths.length - 1;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [isFirst, isLast], isLast = _a[0], isFirst = _a[1];
|
|
|
}
|
|
|
var hideNext = numberOfMonths > 1 && (isFirst || !isLast);
|
|
|
var hidePrevious = numberOfMonths > 1 && (isLast || !isFirst);
|
|
|
var captionLabel = React$1.createElement(CaptionLabel2, { id: props.id, displayMonth });
|
|
|
var captionContent;
|
|
|
if (disableNavigation) {
|
|
|
captionContent = captionLabel;
|
|
|
} else if (captionLayout === "dropdown") {
|
|
|
captionContent = React$1.createElement("div", { className: classNames.caption_dropdowns, style: styles.caption_dropdowns }, React$1.createElement("div", { className: classNames.vhidden }, captionLabel), React$1.createElement(MonthsDropdown, { onChange: handleMonthChange, displayMonth }), React$1.createElement(YearsDropdown, { onChange: handleMonthChange, displayMonth }));
|
|
|
} else {
|
|
|
captionContent = React$1.createElement(React$1.Fragment, null, captionLabel, React$1.createElement(Navigation, { displayMonth, hideNext, hidePrevious, nextMonth, previousMonth, onPreviousClick: handlePreviousClick, onNextClick: handleNextClick }));
|
|
|
}
|
|
|
return React$1.createElement("div", { className: classNames.caption, style: styles.caption }, captionContent);
|
|
|
}
|
|
|
function CaptionLabel(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, formatCaption2 = _a.formatters.formatCaption;
|
|
|
return React$1.createElement("h2", { className: classNames.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true", id: props.id }, formatCaption2(props.displayMonth, { locale: locale2 }));
|
|
|
}
|
|
|
function isDayPickerMultiple(props) {
|
|
|
return props.mode === "multiple";
|
|
|
}
|
|
|
var SelectMultipleContext = React$1.createContext(void 0);
|
|
|
function SelectMultipleProvider(props) {
|
|
|
if (!isDayPickerMultiple(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0,
|
|
|
modifiers: {
|
|
|
disabled: []
|
|
|
}
|
|
|
};
|
|
|
return React$1.createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectMultipleProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectMultipleProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var selected = initialProps.selected;
|
|
|
var onDayClick = function(day, modifiers2, e) {
|
|
|
var _a2, _b;
|
|
|
(_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e);
|
|
|
var isMinSelected = Boolean(initialProps.min && modifiers2.selected && selected && selected.length === initialProps.min);
|
|
|
if (isMinSelected) {
|
|
|
return;
|
|
|
}
|
|
|
var isMaxSelected = Boolean(initialProps.max && !modifiers2.selected && selected && selected.length === initialProps.max);
|
|
|
if (isMaxSelected) {
|
|
|
return;
|
|
|
}
|
|
|
var days = selected ? __spreadArray([], selected, true) : [];
|
|
|
if (modifiers2.selected) {
|
|
|
var index = days.findIndex(function(selectedDay) {
|
|
|
return isSameDay(day, selectedDay);
|
|
|
});
|
|
|
days.splice(index, 1);
|
|
|
} else {
|
|
|
days.push(day);
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, days, day, modifiers2, e);
|
|
|
};
|
|
|
var modifiers = {
|
|
|
disabled: []
|
|
|
};
|
|
|
if (selected) {
|
|
|
modifiers.disabled = [
|
|
|
function disableDay(day) {
|
|
|
var isMaxSelected = initialProps.max && selected && selected.length > initialProps.max - 1;
|
|
|
var isSelected = selected === null || selected === void 0 ? void 0 : selected.some(function(selectedDay) {
|
|
|
return isSameDay(selectedDay, day);
|
|
|
});
|
|
|
return Boolean(isMaxSelected && !isSelected);
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
var contextValue = { selected, onDayClick, modifiers };
|
|
|
return React$1.createElement(SelectMultipleContext.Provider, { value: contextValue }, children);
|
|
|
}
|
|
|
function useSelectMultiple() {
|
|
|
var context = React$1.useContext(SelectMultipleContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectMultiple must be used within a SelectMultipleProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDayPickerRange(props) {
|
|
|
return props.mode === "range";
|
|
|
}
|
|
|
function addToRange(day, range) {
|
|
|
var _a = range || {}, from = _a.from, to = _a.to;
|
|
|
if (!from) {
|
|
|
return { from: day, to: day };
|
|
|
}
|
|
|
if (!to && isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (!to && isBefore(day, from)) {
|
|
|
return { from: day, to: from };
|
|
|
}
|
|
|
if (!to) {
|
|
|
return { from, to: day };
|
|
|
}
|
|
|
if (isSameDay(to, day) && isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (isSameDay(to, day)) {
|
|
|
return { from: to, to };
|
|
|
}
|
|
|
if (isSameDay(from, day)) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (isAfter(from, day)) {
|
|
|
return { from: day, to };
|
|
|
}
|
|
|
return { from, to: day };
|
|
|
}
|
|
|
var SelectRangeContext = React$1.createContext(void 0);
|
|
|
function SelectRangeProvider(props) {
|
|
|
if (!isDayPickerRange(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0,
|
|
|
modifiers: {
|
|
|
range_start: [],
|
|
|
range_end: [],
|
|
|
range_middle: [],
|
|
|
disabled: []
|
|
|
}
|
|
|
};
|
|
|
return React$1.createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectRangeProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectRangeProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var selected = initialProps.selected;
|
|
|
var min2 = initialProps.min;
|
|
|
var max2 = initialProps.max;
|
|
|
var onDayClick = function(day, modifiers2, e) {
|
|
|
var _a2, _b;
|
|
|
(_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e);
|
|
|
var newValue = addToRange(day, selected);
|
|
|
if ((min2 || max2) && selected && (newValue === null || newValue === void 0 ? void 0 : newValue.to) && newValue.from && newValue.from !== newValue.to) {
|
|
|
var diff = Math.abs(differenceInCalendarDays(newValue === null || newValue === void 0 ? void 0 : newValue.to, newValue === null || newValue === void 0 ? void 0 : newValue.from));
|
|
|
if (min2 && diff < min2) {
|
|
|
return;
|
|
|
}
|
|
|
if (max2 && diff >= max2) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, newValue, day, modifiers2, e);
|
|
|
};
|
|
|
var modifiers = {
|
|
|
range_start: [],
|
|
|
range_end: [],
|
|
|
range_middle: [],
|
|
|
disabled: []
|
|
|
};
|
|
|
if (selected) {
|
|
|
if (selected.from) {
|
|
|
modifiers.range_start = [selected.from];
|
|
|
if (selected.to) {
|
|
|
modifiers.range_middle = [
|
|
|
{
|
|
|
after: selected.from,
|
|
|
before: selected.to
|
|
|
}
|
|
|
];
|
|
|
if (max2 || min2) {
|
|
|
modifiers.disabled = [
|
|
|
function(date) {
|
|
|
if (max2 && selected.to && selected.from && isBefore(date, selected.from)) {
|
|
|
var diff = differenceInCalendarDays(selected.to, date);
|
|
|
if (diff >= max2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (max2 && selected.to && selected.from && isAfter(date, selected.to)) {
|
|
|
var diff = differenceInCalendarDays(date, selected.from);
|
|
|
if (diff >= max2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (min2 && selected.from && isBefore(date, selected.from)) {
|
|
|
var diff = differenceInCalendarDays(selected.from, date);
|
|
|
if (diff < min2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
if (min2 && selected.to && selected.from && isAfter(date, selected.to)) {
|
|
|
var diff = differenceInCalendarDays(date, selected.from);
|
|
|
if (diff < min2) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
modifiers.range_end = [selected.to];
|
|
|
} else {
|
|
|
modifiers.range_end = [selected.from];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return React$1.createElement(SelectRangeContext.Provider, { value: { selected, onDayClick, modifiers } }, children);
|
|
|
}
|
|
|
function useSelectRange() {
|
|
|
var context = React$1.useContext(SelectRangeContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectRange must be used within a SelectRangeProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDayPickerSingle(props) {
|
|
|
return props.mode === "single";
|
|
|
}
|
|
|
var SelectSingleContext = React$1.createContext(void 0);
|
|
|
function SelectSingleProvider(props) {
|
|
|
if (!isDayPickerSingle(props.initialProps)) {
|
|
|
var emptyContextValue = {
|
|
|
selected: void 0
|
|
|
};
|
|
|
return React$1.createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props.children);
|
|
|
}
|
|
|
return React$1.createElement(SelectSingleProviderInternal, { initialProps: props.initialProps, children: props.children });
|
|
|
}
|
|
|
function SelectSingleProviderInternal(_a) {
|
|
|
var initialProps = _a.initialProps, children = _a.children;
|
|
|
var onDayClick = function(day, dayModifiers, e) {
|
|
|
var _a2, _b;
|
|
|
if (dayModifiers.selected && !initialProps.required) {
|
|
|
(_a2 = initialProps.onSelect) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, void 0, day, dayModifiers, e);
|
|
|
return;
|
|
|
}
|
|
|
(_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, day, day, dayModifiers, e);
|
|
|
};
|
|
|
var contextValue = {
|
|
|
selected: initialProps.selected,
|
|
|
onDayClick
|
|
|
};
|
|
|
return React$1.createElement(SelectSingleContext.Provider, { value: contextValue }, children);
|
|
|
}
|
|
|
function useSelectSingle() {
|
|
|
var context = React$1.useContext(SelectSingleContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useSelectSingle must be used within a SelectSingleProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function toMatcherArray(modifierFromProp) {
|
|
|
if (Array.isArray(modifierFromProp)) {
|
|
|
return modifierFromProp;
|
|
|
} else if (modifierFromProp !== void 0) {
|
|
|
return [modifierFromProp];
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
|
}
|
|
|
function getCustomModifiers(dayPicker) {
|
|
|
var customModifiers = {};
|
|
|
Object.entries(dayPicker.modifiers).forEach(function(_a) {
|
|
|
var modifier = _a[0], matcher = _a[1];
|
|
|
customModifiers[modifier] = toMatcherArray(matcher);
|
|
|
});
|
|
|
return customModifiers;
|
|
|
}
|
|
|
var InternalModifier;
|
|
|
(function(InternalModifier2) {
|
|
|
InternalModifier2["Disabled"] = "disabled";
|
|
|
InternalModifier2["Selected"] = "selected";
|
|
|
InternalModifier2["Hidden"] = "hidden";
|
|
|
InternalModifier2["Today"] = "today";
|
|
|
InternalModifier2["RangeStart"] = "range_start";
|
|
|
InternalModifier2["RangeEnd"] = "range_end";
|
|
|
InternalModifier2["RangeMiddle"] = "range_middle";
|
|
|
})(InternalModifier || (InternalModifier = {}));
|
|
|
function getInternalModifiers(dayPicker, selectMultiple, selectRange) {
|
|
|
var _a;
|
|
|
var internalModifiers = (_a = {}, _a[InternalModifier.Selected] = toMatcherArray(dayPicker.selected), _a[InternalModifier.Disabled] = toMatcherArray(dayPicker.disabled), _a[InternalModifier.Hidden] = toMatcherArray(dayPicker.hidden), _a[InternalModifier.Today] = [dayPicker.today], _a[InternalModifier.RangeEnd] = [], _a[InternalModifier.RangeMiddle] = [], _a[InternalModifier.RangeStart] = [], _a);
|
|
|
if (dayPicker.fromDate) {
|
|
|
internalModifiers.disabled.push({ before: dayPicker.fromDate });
|
|
|
}
|
|
|
if (dayPicker.toDate) {
|
|
|
internalModifiers.disabled.push({ after: dayPicker.toDate });
|
|
|
}
|
|
|
if (isDayPickerMultiple(dayPicker)) {
|
|
|
internalModifiers.disabled = internalModifiers.disabled.concat(selectMultiple.modifiers.disabled);
|
|
|
} else if (isDayPickerRange(dayPicker)) {
|
|
|
internalModifiers.disabled = internalModifiers.disabled.concat(selectRange.modifiers.disabled);
|
|
|
internalModifiers.range_start = selectRange.modifiers.range_start;
|
|
|
internalModifiers.range_middle = selectRange.modifiers.range_middle;
|
|
|
internalModifiers.range_end = selectRange.modifiers.range_end;
|
|
|
}
|
|
|
return internalModifiers;
|
|
|
}
|
|
|
var ModifiersContext = React$1.createContext(void 0);
|
|
|
function ModifiersProvider(props) {
|
|
|
var dayPicker = useDayPicker();
|
|
|
var selectMultiple = useSelectMultiple();
|
|
|
var selectRange = useSelectRange();
|
|
|
var internalModifiers = getInternalModifiers(dayPicker, selectMultiple, selectRange);
|
|
|
var customModifiers = getCustomModifiers(dayPicker);
|
|
|
var modifiers = __assign(__assign({}, internalModifiers), customModifiers);
|
|
|
return React$1.createElement(ModifiersContext.Provider, { value: modifiers }, props.children);
|
|
|
}
|
|
|
function useModifiers() {
|
|
|
var context = React$1.useContext(ModifiersContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useModifiers must be used within a ModifiersProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function isDateInterval(matcher) {
|
|
|
return Boolean(matcher && typeof matcher === "object" && "before" in matcher && "after" in matcher);
|
|
|
}
|
|
|
function isDateRange(value) {
|
|
|
return Boolean(value && typeof value === "object" && "from" in value);
|
|
|
}
|
|
|
function isDateAfterType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "after" in value);
|
|
|
}
|
|
|
function isDateBeforeType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "before" in value);
|
|
|
}
|
|
|
function isDayOfWeekType(value) {
|
|
|
return Boolean(value && typeof value === "object" && "dayOfWeek" in value);
|
|
|
}
|
|
|
function isDateInRange(date, range) {
|
|
|
var _a;
|
|
|
var from = range.from, to = range.to;
|
|
|
if (!from) {
|
|
|
return false;
|
|
|
}
|
|
|
if (!to && isSameDay(from, date)) {
|
|
|
return true;
|
|
|
}
|
|
|
if (!to) {
|
|
|
return false;
|
|
|
}
|
|
|
var isToBeforeFrom = differenceInCalendarDays(to, from) < 0;
|
|
|
if (to && isToBeforeFrom) {
|
|
|
_a = [to, from], from = _a[0], to = _a[1];
|
|
|
}
|
|
|
return differenceInCalendarDays(date, from) >= 0 && differenceInCalendarDays(to, date) >= 0;
|
|
|
}
|
|
|
function isDateType(value) {
|
|
|
return isDate(value);
|
|
|
}
|
|
|
function isArrayOfDates(value) {
|
|
|
return Array.isArray(value) && value.every(isDate);
|
|
|
}
|
|
|
function isMatch(day, matchers) {
|
|
|
return matchers.some(function(matcher) {
|
|
|
if (typeof matcher === "boolean") {
|
|
|
return matcher;
|
|
|
}
|
|
|
if (isDateType(matcher)) {
|
|
|
return isSameDay(day, matcher);
|
|
|
}
|
|
|
if (isArrayOfDates(matcher)) {
|
|
|
return matcher.includes(day);
|
|
|
}
|
|
|
if (isDateRange(matcher)) {
|
|
|
return isDateInRange(day, matcher);
|
|
|
}
|
|
|
if (isDayOfWeekType(matcher)) {
|
|
|
return matcher.dayOfWeek.includes(day.getDay());
|
|
|
}
|
|
|
if (isDateInterval(matcher)) {
|
|
|
var isBefore2 = differenceInCalendarDays(matcher.before, day) > 0;
|
|
|
var isAfter2 = differenceInCalendarDays(day, matcher.after) > 0;
|
|
|
return isBefore2 && isAfter2;
|
|
|
}
|
|
|
if (isDateAfterType(matcher)) {
|
|
|
return differenceInCalendarDays(day, matcher.after) > 0;
|
|
|
}
|
|
|
if (isDateBeforeType(matcher)) {
|
|
|
return differenceInCalendarDays(matcher.before, day) > 0;
|
|
|
}
|
|
|
if (typeof matcher === "function") {
|
|
|
return matcher(day);
|
|
|
}
|
|
|
return false;
|
|
|
});
|
|
|
}
|
|
|
function getModifierStatus(date, modifiers) {
|
|
|
var modifiersList = Object.keys(modifiers).reduce(function(previousValue, key) {
|
|
|
var modifier = modifiers[key];
|
|
|
if (isMatch(date, modifier)) {
|
|
|
previousValue.push(key);
|
|
|
}
|
|
|
return previousValue;
|
|
|
}, []);
|
|
|
var modifiersStatus = {};
|
|
|
modifiersList.forEach(function(modifier) {
|
|
|
return modifiersStatus[modifier] = true;
|
|
|
});
|
|
|
return modifiersStatus;
|
|
|
}
|
|
|
function useDayModifiers(date) {
|
|
|
var context = useDayPicker();
|
|
|
var modifiersContext = useModifiers();
|
|
|
var modifiers = getModifierStatus(date, modifiersContext);
|
|
|
var modifierClassNames = [];
|
|
|
Object.keys(modifiers).forEach(function(modifier) {
|
|
|
var customClassName = context.modifierClassNames[modifier];
|
|
|
if (customClassName) {
|
|
|
modifierClassNames.push(customClassName);
|
|
|
} else {
|
|
|
modifierClassNames.push("" + context.modifierPrefix + modifier);
|
|
|
}
|
|
|
});
|
|
|
var modifierStyle = {};
|
|
|
if (context.modifierStyles) {
|
|
|
Object.keys(modifiers).forEach(function(modifier) {
|
|
|
var _a;
|
|
|
modifierStyle = __assign(__assign({}, modifierStyle), (_a = context.modifierStyles) === null || _a === void 0 ? void 0 : _a[modifier]);
|
|
|
});
|
|
|
}
|
|
|
return {
|
|
|
modifiers,
|
|
|
modifierClassNames,
|
|
|
modifierStyle
|
|
|
};
|
|
|
}
|
|
|
var isFocusable$1 = function(modifiers) {
|
|
|
return !modifiers.disabled && !modifiers.hidden;
|
|
|
};
|
|
|
function getInitialFocusTarget(displayMonths, modifiersContext) {
|
|
|
var firstDayInMonth = startOfMonth(displayMonths[0]);
|
|
|
var lastDayInMonth = endOfMonth(displayMonths[displayMonths.length - 1]);
|
|
|
var firstFocusableDay;
|
|
|
var today;
|
|
|
var date = firstDayInMonth;
|
|
|
while (date <= lastDayInMonth) {
|
|
|
var modifiers = getModifierStatus(date, modifiersContext);
|
|
|
if (!isFocusable$1(modifiers)) {
|
|
|
date = addDays(date, 1);
|
|
|
continue;
|
|
|
}
|
|
|
if (modifiers.selected) {
|
|
|
return date;
|
|
|
}
|
|
|
if (modifiers.today && !today) {
|
|
|
today = date;
|
|
|
}
|
|
|
if (!firstFocusableDay) {
|
|
|
firstFocusableDay = date;
|
|
|
}
|
|
|
date = addDays(date, 1);
|
|
|
}
|
|
|
if (today) {
|
|
|
return today;
|
|
|
} else {
|
|
|
return firstFocusableDay;
|
|
|
}
|
|
|
}
|
|
|
var FocusContext = React$1.createContext(void 0);
|
|
|
function FocusProvider(_a) {
|
|
|
var children = _a.children;
|
|
|
var _b = React$1.useState(), focusedDay = _b[0], setDay = _b[1];
|
|
|
var _c = useNavigation(), goToMonth = _c.goToMonth, displayMonths = _c.displayMonths;
|
|
|
var numberOfMonths = useDayPicker().numberOfMonths;
|
|
|
var modifiersContext = useModifiers();
|
|
|
var initialFocusTarget = getInitialFocusTarget(displayMonths, modifiersContext);
|
|
|
var _d = React$1.useState(), lastFocusedDay = _d[0], setLastFocusedDay = _d[1];
|
|
|
var isWithinDisplayMonths = function(date) {
|
|
|
return displayMonths.some(function(displayMonth) {
|
|
|
return isSameMonth(date, displayMonth);
|
|
|
});
|
|
|
};
|
|
|
var focusTarget = (focusedDay !== null && focusedDay !== void 0 ? focusedDay : lastFocusedDay && isWithinDisplayMonths(lastFocusedDay)) ? lastFocusedDay : initialFocusTarget;
|
|
|
var blur = function() {
|
|
|
setLastFocusedDay(focusedDay);
|
|
|
setDay(void 0);
|
|
|
};
|
|
|
var focus = function(date) {
|
|
|
return setDay(date);
|
|
|
};
|
|
|
var switchMonth = function(date, offset2) {
|
|
|
if (displayMonths.some(function(m2) {
|
|
|
return isSameMonth(date, m2);
|
|
|
}))
|
|
|
return;
|
|
|
if (offset2 < 0) {
|
|
|
goToMonth(addMonths(date, 1 + offset2));
|
|
|
} else {
|
|
|
goToMonth(date);
|
|
|
}
|
|
|
};
|
|
|
var focusDayBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var before = addDays(focusedDay, -1);
|
|
|
focus(before);
|
|
|
switchMonth(before, numberOfMonths * -1);
|
|
|
};
|
|
|
var focusDayAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var after = addDays(focusedDay, 1);
|
|
|
focus(after);
|
|
|
switchMonth(after, numberOfMonths);
|
|
|
};
|
|
|
var focusWeekBeforeDay = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var up = addWeeks(focusedDay, -1);
|
|
|
focus(up);
|
|
|
switchMonth(up, numberOfMonths * -1);
|
|
|
};
|
|
|
var focusWeekAfterDay = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var down = addWeeks(focusedDay, 1);
|
|
|
focus(down);
|
|
|
switchMonth(down, numberOfMonths);
|
|
|
};
|
|
|
var focusStartOfWeek = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var dayToFocus = startOfWeek(focusedDay);
|
|
|
switchMonth(dayToFocus, numberOfMonths);
|
|
|
focus(dayToFocus);
|
|
|
};
|
|
|
var focusEndOfWeek = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var dayToFocus = endOfWeek(focusedDay);
|
|
|
switchMonth(dayToFocus, numberOfMonths);
|
|
|
focus(dayToFocus);
|
|
|
};
|
|
|
var focusMonthBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var monthBefore = addMonths(focusedDay, -1);
|
|
|
switchMonth(monthBefore, numberOfMonths);
|
|
|
focus(monthBefore);
|
|
|
};
|
|
|
var focusMonthAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var monthAfter = addMonths(focusedDay, 1);
|
|
|
switchMonth(monthAfter, numberOfMonths);
|
|
|
focus(monthAfter);
|
|
|
};
|
|
|
var focusYearBefore = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var yearBefore = addYears(focusedDay, -1);
|
|
|
switchMonth(yearBefore, numberOfMonths);
|
|
|
focus(yearBefore);
|
|
|
};
|
|
|
var focusYearAfter = function() {
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
var yearAfter = addYears(focusedDay, 1);
|
|
|
switchMonth(yearAfter, numberOfMonths);
|
|
|
focus(yearAfter);
|
|
|
};
|
|
|
var value = {
|
|
|
focusedDay,
|
|
|
focusTarget,
|
|
|
blur,
|
|
|
focus,
|
|
|
focusDayAfter,
|
|
|
focusDayBefore,
|
|
|
focusWeekAfterDay,
|
|
|
focusWeekBeforeDay,
|
|
|
focusMonthBefore,
|
|
|
focusMonthAfter,
|
|
|
focusYearBefore,
|
|
|
focusYearAfter,
|
|
|
focusStartOfWeek,
|
|
|
focusEndOfWeek
|
|
|
};
|
|
|
return React$1.createElement(FocusContext.Provider, { value }, children);
|
|
|
}
|
|
|
function useFocus() {
|
|
|
var context = React$1.useContext(FocusContext);
|
|
|
if (!context) {
|
|
|
throw new Error("useFocus must be used within a FocusProvider");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function useDayFocus(date, buttonRef) {
|
|
|
var _a = useFocus(), focusedDay = _a.focusedDay, focusTarget = _a.focusTarget, focusDayAfter = _a.focusDayAfter, focusDayBefore = _a.focusDayBefore, focusWeekAfterDay = _a.focusWeekAfterDay, focusWeekBeforeDay = _a.focusWeekBeforeDay, blur = _a.blur, focus = _a.focus, focusMonthBefore = _a.focusMonthBefore, focusMonthAfter = _a.focusMonthAfter, focusYearBefore = _a.focusYearBefore, focusYearAfter = _a.focusYearAfter, focusStartOfWeek = _a.focusStartOfWeek, focusEndOfWeek = _a.focusEndOfWeek;
|
|
|
var dir = useDayPicker().dir;
|
|
|
React$1.useEffect(function() {
|
|
|
var _a2;
|
|
|
if (!focusedDay)
|
|
|
return;
|
|
|
if (isSameDay(focusedDay, date)) {
|
|
|
(_a2 = buttonRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();
|
|
|
}
|
|
|
}, [focusedDay, date, buttonRef]);
|
|
|
var focusOnKeyDown = function(e) {
|
|
|
switch (e.key) {
|
|
|
case "ArrowLeft":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
dir === "rtl" ? focusDayAfter() : focusDayBefore();
|
|
|
break;
|
|
|
case "ArrowRight":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
dir === "rtl" ? focusDayBefore() : focusDayAfter();
|
|
|
break;
|
|
|
case "ArrowDown":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusWeekAfterDay();
|
|
|
break;
|
|
|
case "ArrowUp":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusWeekBeforeDay();
|
|
|
break;
|
|
|
case "PageUp":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
e.shiftKey ? focusYearBefore() : focusMonthBefore();
|
|
|
break;
|
|
|
case "PageDown":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
e.shiftKey ? focusYearAfter() : focusMonthAfter();
|
|
|
break;
|
|
|
case "Home":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusStartOfWeek();
|
|
|
break;
|
|
|
case "End":
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
focusEndOfWeek();
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
var isFocusTarget = Boolean(focusTarget && isSameDay(focusTarget, date));
|
|
|
return { focus, blur, focusOnKeyDown, isFocusTarget };
|
|
|
}
|
|
|
function useDay(date, displayMonth, buttonRef) {
|
|
|
var context = useDayPicker();
|
|
|
var single = useSelectSingle();
|
|
|
var multiple = useSelectMultiple();
|
|
|
var range = useSelectRange();
|
|
|
var _a = useDayFocus(date, buttonRef), focus = _a.focus, blur = _a.blur, focusOnKeyDown = _a.focusOnKeyDown, isFocusTarget = _a.isFocusTarget;
|
|
|
var _b = useDayModifiers(date), modifiers = _b.modifiers, modifierClassNames = _b.modifierClassNames, modifierStyle = _b.modifierStyle;
|
|
|
var isOutside = !isSameMonth(date, displayMonth);
|
|
|
var returnValue = {
|
|
|
isOutside,
|
|
|
modifiers,
|
|
|
selected: isDayPickerSingle(context) ? single.selected : isDayPickerMultiple(context) ? multiple.selected : isDayPickerRange(context) ? range.selected : void 0,
|
|
|
single,
|
|
|
multiple,
|
|
|
range
|
|
|
};
|
|
|
if (isOutside && !context.showOutsideDays) {
|
|
|
return returnValue;
|
|
|
}
|
|
|
if (modifiers.hidden) {
|
|
|
return returnValue;
|
|
|
}
|
|
|
var classNames = [context.classNames.day].concat(modifierClassNames);
|
|
|
var style = __assign(__assign({}, context.styles.day), modifierStyle);
|
|
|
if (isOutside) {
|
|
|
classNames.push(context.classNames.day_outside);
|
|
|
style = __assign(__assign({}, context.styles), context.styles.day_outside);
|
|
|
}
|
|
|
var DayContent2 = context.components.DayContent;
|
|
|
var children = React$1.createElement(DayContent2, { date, displayMonth, modifiers });
|
|
|
var className = classNames.join(" ");
|
|
|
if (!context.mode && !context.onDayClick) {
|
|
|
return __assign(__assign({}, returnValue), { nonInteractiveProps: {
|
|
|
style,
|
|
|
className,
|
|
|
children
|
|
|
} });
|
|
|
}
|
|
|
var handleClick = function(e) {
|
|
|
var _a2, _b2, _c, _d;
|
|
|
if (isDayPickerSingle(context)) {
|
|
|
(_a2 = single.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(single, date, modifiers, e);
|
|
|
} else if (isDayPickerMultiple(context)) {
|
|
|
(_b2 = multiple.onDayClick) === null || _b2 === void 0 ? void 0 : _b2.call(multiple, date, modifiers, e);
|
|
|
} else if (isDayPickerRange(context)) {
|
|
|
(_c = range.onDayClick) === null || _c === void 0 ? void 0 : _c.call(range, date, modifiers, e);
|
|
|
}
|
|
|
(_d = context.onDayClick) === null || _d === void 0 ? void 0 : _d.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleFocus = function(e) {
|
|
|
var _a2;
|
|
|
focus(date);
|
|
|
(_a2 = context.onDayFocus) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleBlur = function(e) {
|
|
|
var _a2;
|
|
|
blur();
|
|
|
(_a2 = context.onDayBlur) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleKeyDown = function(e) {
|
|
|
var _a2;
|
|
|
focusOnKeyDown(e);
|
|
|
(_a2 = context.onDayKeyDown) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleKeyUp = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayKeyUp) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleMouseEnter = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayMouseEnter) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleMouseLeave = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayMouseLeave) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchCancel = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchCancel) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchEnd = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchEnd) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchMove = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchMove) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
var handleTouchStart = function(e) {
|
|
|
var _a2;
|
|
|
(_a2 = context.onDayTouchStart) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e);
|
|
|
};
|
|
|
if (isOutside) {
|
|
|
classNames.push(context.classNames.day_outside);
|
|
|
style = __assign(__assign({}, context.styles), context.styles.day_outside);
|
|
|
}
|
|
|
className = classNames.join(" ");
|
|
|
var selected = modifiers.selected, disabled = modifiers.disabled;
|
|
|
var tabIndex = isFocusTarget ? 0 : -1;
|
|
|
return __assign(__assign({}, returnValue), { buttonProps: {
|
|
|
children,
|
|
|
"aria-pressed": selected,
|
|
|
style,
|
|
|
disabled,
|
|
|
className,
|
|
|
tabIndex,
|
|
|
onClick: handleClick,
|
|
|
onFocus: handleFocus,
|
|
|
onBlur: handleBlur,
|
|
|
onKeyDown: handleKeyDown,
|
|
|
onKeyUp: handleKeyUp,
|
|
|
onMouseEnter: handleMouseEnter,
|
|
|
onMouseLeave: handleMouseLeave,
|
|
|
onTouchCancel: handleTouchCancel,
|
|
|
onTouchEnd: handleTouchEnd,
|
|
|
onTouchMove: handleTouchMove,
|
|
|
onTouchStart: handleTouchStart
|
|
|
} });
|
|
|
}
|
|
|
function Day(props) {
|
|
|
var buttonRef = React$1.useRef(null);
|
|
|
var day = useDay(props.date, props.displayMonth, buttonRef);
|
|
|
var buttonProps = day.buttonProps, nonInteractiveProps = day.nonInteractiveProps;
|
|
|
if (!buttonProps && !nonInteractiveProps) {
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
}
|
|
|
if (nonInteractiveProps) {
|
|
|
return React$1.createElement("div", __assign({}, nonInteractiveProps));
|
|
|
}
|
|
|
return React$1.createElement(Button, __assign({ ref: buttonRef }, buttonProps));
|
|
|
}
|
|
|
function DayContent(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, labelDay2 = _a.labels.labelDay, formatDay2 = _a.formatters.formatDay;
|
|
|
return React$1.createElement(React$1.Fragment, null, React$1.createElement("span", { "aria-hidden": "true" }, formatDay2(props.date, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden, style: styles.vhidden }, labelDay2(props.date, props.modifiers, { locale: locale2 })));
|
|
|
}
|
|
|
function Dropdown(props) {
|
|
|
var onChange = props.onChange, value = props.value, children = props.children, caption = props.caption, className = props.className, style = props.style;
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, IconDropdown2 = _a.components.IconDropdown;
|
|
|
return React$1.createElement("div", { className, style }, React$1.createElement("span", { className: classNames.vhidden }, props["aria-label"]), React$1.createElement("select", { "aria-label": props["aria-label"], className: classNames.dropdown, style: styles.dropdown, value, onChange }, children), React$1.createElement("div", { className: classNames.caption_label, style: styles.caption_label, "aria-hidden": "true" }, caption, React$1.createElement(IconDropdown2, { className: classNames.dropdown_icon, style: styles.dropdown_icon })));
|
|
|
}
|
|
|
function Footer() {
|
|
|
var _a = useDayPicker(), footer = _a.footer, styles = _a.styles, tfoot = _a.classNames.tfoot;
|
|
|
if (!footer)
|
|
|
return React$1.createElement(React$1.Fragment, null);
|
|
|
return React$1.createElement("tfoot", { className: tfoot, style: styles.tfoot }, React$1.createElement("tr", null, React$1.createElement("td", { colSpan: 8 }, footer)));
|
|
|
}
|
|
|
function getWeekdays(locale2) {
|
|
|
var start2 = startOfWeek(new Date(), { locale: locale2 });
|
|
|
var days = [];
|
|
|
for (var i = 0; i < 7; i++) {
|
|
|
var day = addDays(start2, i);
|
|
|
days.push(day);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function Head() {
|
|
|
var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, showWeekNumber = _a.showWeekNumber, locale2 = _a.locale, formatWeekdayName2 = _a.formatters.formatWeekdayName, labelWeekday2 = _a.labels.labelWeekday;
|
|
|
var weekdays = getWeekdays(locale2);
|
|
|
return React$1.createElement("thead", { style: styles.head, className: classNames.head }, React$1.createElement("tr", { style: styles.head_row, className: classNames.head_row }, showWeekNumber && React$1.createElement("th", { scope: "col", style: styles.head_cell, className: classNames.head_cell }), weekdays.map(function(weekday, i) {
|
|
|
return React$1.createElement("th", { key: i, scope: "col", className: classNames.head_cell, style: styles.head_cell }, React$1.createElement("span", { "aria-hidden": true }, formatWeekdayName2(weekday, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden }, labelWeekday2(weekday, { locale: locale2 })));
|
|
|
})));
|
|
|
}
|
|
|
function IconDropdown(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props), React$1.createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" }));
|
|
|
}
|
|
|
function IconLeft(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120", "data-testid": "iconLeft" }, props), React$1.createElement("path", { d: "M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z", fill: "currentColor", fillRule: "nonzero" }));
|
|
|
}
|
|
|
function IconRight(props) {
|
|
|
return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120" }, props, { "data-testid": "iconRight" }), React$1.createElement("path", { d: "M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z", fill: "currentColor" }));
|
|
|
}
|
|
|
function Row(props) {
|
|
|
var _a = useDayPicker(), styles = _a.styles, classNames = _a.classNames, showWeekNumber = _a.showWeekNumber, _b = _a.components, Day2 = _b.Day, WeekNumber2 = _b.WeekNumber;
|
|
|
var weekNumberCell;
|
|
|
if (showWeekNumber) {
|
|
|
weekNumberCell = React$1.createElement("td", { className: classNames.cell, style: styles.cell }, React$1.createElement(WeekNumber2, { number: props.weekNumber, dates: props.dates }));
|
|
|
}
|
|
|
return React$1.createElement("tr", { className: classNames.row, style: styles.row }, weekNumberCell, props.dates.map(function(date) {
|
|
|
return React$1.createElement("td", { className: classNames.cell, style: styles.cell, key: getUnixTime(date) }, React$1.createElement(Day2, { displayMonth: props.displayMonth, date }));
|
|
|
}));
|
|
|
}
|
|
|
function WeekNumber(props) {
|
|
|
var weekNumber = props.number, dates = props.dates;
|
|
|
var _a = useDayPicker(), onWeekNumberClick = _a.onWeekNumberClick, styles = _a.styles, classNames = _a.classNames, locale2 = _a.locale, labelWeekNumber2 = _a.labels.labelWeekNumber, formatWeekNumber2 = _a.formatters.formatWeekNumber;
|
|
|
var handleClick = function(e) {
|
|
|
onWeekNumberClick === null || onWeekNumberClick === void 0 ? void 0 : onWeekNumberClick(weekNumber, dates, e);
|
|
|
};
|
|
|
var content = formatWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
|
if (!onWeekNumberClick) {
|
|
|
return React$1.createElement("span", { className: classNames.weeknumber, style: styles.weeknumber }, content);
|
|
|
}
|
|
|
var label = labelWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
|
return React$1.createElement(Button, { "aria-label": label, className: classNames.weeknumber, style: styles.weeknumber, onClick: handleClick }, content);
|
|
|
}
|
|
|
var defaultClassNames = {
|
|
|
root: "rdp",
|
|
|
multiple_months: "rdp-multiple_months",
|
|
|
with_weeknumber: "rdp-with_weeknumber",
|
|
|
vhidden: "rdp-vhidden",
|
|
|
button_reset: "rdp-button_reset",
|
|
|
button: "rdp-button",
|
|
|
caption: "rdp-caption",
|
|
|
caption_start: "rdp-caption_start",
|
|
|
caption_end: "rdp-caption_end",
|
|
|
caption_between: "rdp-caption_between",
|
|
|
caption_label: "rdp-caption_label",
|
|
|
caption_dropdowns: "rdp-caption_dropdowns",
|
|
|
dropdown: "rdp-dropdown",
|
|
|
dropdown_month: "rdp-dropdown_month",
|
|
|
dropdown_year: "rdp-dropdown_year",
|
|
|
dropdown_icon: "rdp-dropdown_icon",
|
|
|
months: "rdp-months",
|
|
|
month: "rdp-month",
|
|
|
table: "rdp-table",
|
|
|
tbody: "rdp-tbody",
|
|
|
tfoot: "rdp-tfoot",
|
|
|
head: "rdp-head",
|
|
|
head_row: "rdp-head_row",
|
|
|
head_cell: "rdp-head_cell",
|
|
|
nav: "rdp-nav",
|
|
|
nav_button: "rdp-nav_button",
|
|
|
nav_button_previous: "rdp-nav_button_previous",
|
|
|
nav_button_next: "rdp-nav_button_next",
|
|
|
nav_icon: "rdp-nav_icon",
|
|
|
row: "rdp-row",
|
|
|
weeknumber: "rdp-weeknumber",
|
|
|
cell: "rdp-cell",
|
|
|
day: "rdp-day",
|
|
|
day_outside: "rdp-day_outside"
|
|
|
};
|
|
|
function formatCaption(month, options) {
|
|
|
return format(month, "LLLL y", options);
|
|
|
}
|
|
|
function formatDay(day, options) {
|
|
|
return format(day, "d", options);
|
|
|
}
|
|
|
function formatMonthCaption(month, options) {
|
|
|
return format(month, "LLLL", options);
|
|
|
}
|
|
|
function formatWeekNumber(weekNumber) {
|
|
|
return "" + weekNumber;
|
|
|
}
|
|
|
function formatWeekdayName(weekday, options) {
|
|
|
return format(weekday, "cccccc", options);
|
|
|
}
|
|
|
function formatYearCaption(year, options) {
|
|
|
return format(year, "yyyy", options);
|
|
|
}
|
|
|
var formatters = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
formatCaption,
|
|
|
formatDay,
|
|
|
formatMonthCaption,
|
|
|
formatWeekNumber,
|
|
|
formatWeekdayName,
|
|
|
formatYearCaption
|
|
|
});
|
|
|
var labelDay = function(day, modifers, options) {
|
|
|
return format(day, "do MMMM (EEEE)", options);
|
|
|
};
|
|
|
var labelMonthDropdown = function() {
|
|
|
return "Month: ";
|
|
|
};
|
|
|
var labelNext = function() {
|
|
|
return "Go to next month";
|
|
|
};
|
|
|
var labelPrevious = function() {
|
|
|
return "Go to previous month";
|
|
|
};
|
|
|
var labelWeekday = function(day, options) {
|
|
|
return format(day, "cccc", options);
|
|
|
};
|
|
|
var labelWeekNumber = function(n2) {
|
|
|
return "Week n. " + n2;
|
|
|
};
|
|
|
var labelYearDropdown = function() {
|
|
|
return "Year: ";
|
|
|
};
|
|
|
var labels = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
labelDay,
|
|
|
labelMonthDropdown,
|
|
|
labelNext,
|
|
|
labelPrevious,
|
|
|
labelWeekday,
|
|
|
labelWeekNumber,
|
|
|
labelYearDropdown
|
|
|
});
|
|
|
function parseFromToProps(props) {
|
|
|
var fromYear = props.fromYear, toYear = props.toYear, fromMonth = props.fromMonth, toMonth = props.toMonth;
|
|
|
var fromDate = props.fromDate, toDate2 = props.toDate;
|
|
|
if (fromMonth) {
|
|
|
fromDate = startOfMonth(fromMonth);
|
|
|
} else if (fromYear) {
|
|
|
fromDate = new Date(fromYear, 0, 1);
|
|
|
}
|
|
|
if (toMonth) {
|
|
|
toDate2 = startOfMonth(toMonth);
|
|
|
} else if (toYear) {
|
|
|
toDate2 = new Date(toYear, 11, 31);
|
|
|
}
|
|
|
return {
|
|
|
fromDate: fromDate ? startOfDay(fromDate) : void 0,
|
|
|
toDate: toDate2 ? startOfDay(toDate2) : void 0
|
|
|
};
|
|
|
}
|
|
|
var DayPickerContext = React$1.createContext(void 0);
|
|
|
function DayPickerProvider(props) {
|
|
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
|
var children = props.children, initialProps = props.initialProps;
|
|
|
var locale2 = (_a = initialProps.locale) !== null && _a !== void 0 ? _a : enUS;
|
|
|
var numberOfMonths = (_b = initialProps.numberOfMonths) !== null && _b !== void 0 ? _b : 1;
|
|
|
var today = (_c = initialProps.today) !== null && _c !== void 0 ? _c : new Date();
|
|
|
var _h = parseFromToProps(initialProps), fromDate = _h.fromDate, toDate2 = _h.toDate;
|
|
|
var captionLayout = (_d = initialProps.captionLayout) !== null && _d !== void 0 ? _d : "buttons";
|
|
|
if (!fromDate && !toDate2)
|
|
|
captionLayout = "buttons";
|
|
|
initialProps.toYear;
|
|
|
initialProps.fromYear;
|
|
|
initialProps.toMonth;
|
|
|
initialProps.fromMonth;
|
|
|
var contextProps = __rest(initialProps, ["toYear", "fromYear", "toMonth", "fromMonth"]);
|
|
|
var context = __assign(__assign({}, contextProps), {
|
|
|
captionLayout,
|
|
|
fromDate,
|
|
|
toDate: toDate2,
|
|
|
today,
|
|
|
locale: locale2,
|
|
|
modifierClassNames: (_e = initialProps.modifierClassNames) !== null && _e !== void 0 ? _e : {},
|
|
|
modifierPrefix: "rdp-day_",
|
|
|
modifiers: (_f = initialProps.modifiers) !== null && _f !== void 0 ? _f : {},
|
|
|
numberOfMonths,
|
|
|
styles: (_g = initialProps.styles) !== null && _g !== void 0 ? _g : {},
|
|
|
classNames: __assign(__assign({}, defaultClassNames), initialProps.classNames),
|
|
|
formatters: __assign(__assign({}, formatters), initialProps.formatters),
|
|
|
labels: __assign(__assign({}, labels), initialProps.labels),
|
|
|
components: __assign({ Caption, CaptionLabel, Day, DayContent, Dropdown, Footer, Head, IconDropdown, IconRight, IconLeft, Row, WeekNumber }, initialProps.components)
|
|
|
});
|
|
|
return React$1.createElement(DayPickerContext.Provider, { value: context }, children);
|
|
|
}
|
|
|
function useDayPicker() {
|
|
|
var context = React$1.useContext(DayPickerContext);
|
|
|
if (!context) {
|
|
|
throw new Error("Context is not defined. useDayPicker must be used within a DayPickerProvider with a valid values.");
|
|
|
}
|
|
|
return context;
|
|
|
}
|
|
|
function getOutsideEndDays(month, options) {
|
|
|
var days = [];
|
|
|
var lastDayOfWeek = endOfWeek(month, options);
|
|
|
var endDiff = differenceInCalendarDays(lastDayOfWeek, month);
|
|
|
for (var i = 1; i <= endDiff; i++) {
|
|
|
var dayDate = addDays(month, i);
|
|
|
days.push(dayDate);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function getOutsideStartDays(month, options) {
|
|
|
var days = [];
|
|
|
var firstDayOfWeek = startOfWeek(month, options);
|
|
|
var startDiff = differenceInCalendarDays(month, firstDayOfWeek);
|
|
|
for (var i = 0; i < startDiff; i++) {
|
|
|
var newDay = addDays(firstDayOfWeek, i);
|
|
|
days.push(newDay);
|
|
|
}
|
|
|
return days;
|
|
|
}
|
|
|
function getWeeks(month, _a) {
|
|
|
var locale2 = _a.locale, fixedWeeks = _a.fixedWeeks;
|
|
|
var monthStart = startOfMonth(month);
|
|
|
var monthEnd = endOfMonth(month);
|
|
|
var diff = differenceInCalendarDays(monthEnd, monthStart);
|
|
|
var weeks = [];
|
|
|
var lastWeek = { weekNumber: 0, dates: [] };
|
|
|
for (var i = 0; i <= diff; i++) {
|
|
|
var date = addDays(monthStart, i);
|
|
|
var week = getWeek(date, { locale: locale2 });
|
|
|
if (lastWeek.weekNumber !== week) {
|
|
|
var startDays = getOutsideStartDays(date, { locale: locale2 });
|
|
|
lastWeek = { weekNumber: week, dates: startDays };
|
|
|
weeks.push(lastWeek);
|
|
|
}
|
|
|
lastWeek.dates.push(date);
|
|
|
}
|
|
|
var lastDay = lastWeek.dates[lastWeek.dates.length - 1];
|
|
|
var endDays = getOutsideEndDays(lastDay, { locale: locale2 });
|
|
|
lastWeek.dates = lastWeek.dates.concat(endDays);
|
|
|
if (fixedWeeks) {
|
|
|
var lastWeekDate = lastWeek.dates[lastWeek.dates.length - 1];
|
|
|
var weeksInMonth = getWeeksInMonth(month, { locale: locale2 });
|
|
|
if (weeksInMonth < 6) {
|
|
|
var diffDays = differenceInCalendarDays(addWeeks(lastWeekDate, 6 - weeksInMonth), lastWeekDate);
|
|
|
for (var i = 0; i < diffDays; i++) {
|
|
|
var date = addDays(lastWeekDate, i + 1);
|
|
|
var week = getWeek(date, { locale: locale2 });
|
|
|
if (lastWeek.weekNumber !== week) {
|
|
|
lastWeek = { weekNumber: week, dates: [] };
|
|
|
weeks.push(lastWeek);
|
|
|
}
|
|
|
lastWeek.dates.push(date);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return weeks;
|
|
|
}
|
|
|
function Table(props) {
|
|
|
var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, hideHead = _a.hideHead, fixedWeeks = _a.fixedWeeks, _b = _a.components, Head2 = _b.Head, Row2 = _b.Row, Footer2 = _b.Footer;
|
|
|
var weeks = getWeeks(props.displayMonth, { locale: locale2, fixedWeeks });
|
|
|
return React$1.createElement("table", { className: classNames.table, style: styles.table, role: "grid", "aria-labelledby": props["aria-labelledby"] }, !hideHead && React$1.createElement(Head2, null), React$1.createElement("tbody", { className: classNames.tbody, style: styles.tbody }, weeks.map(function(week) {
|
|
|
return React$1.createElement(Row2, { displayMonth: props.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber });
|
|
|
})), React$1.createElement(Footer2, null));
|
|
|
}
|
|
|
function Month(props) {
|
|
|
var _a;
|
|
|
var _b = useDayPicker(), dir = _b.dir, classNames = _b.classNames, styles = _b.styles, Caption2 = _b.components.Caption;
|
|
|
var displayMonths = useNavigation().displayMonths;
|
|
|
var captionId = useId();
|
|
|
var className = [classNames.month];
|
|
|
var style = styles.month;
|
|
|
var isStart = props.displayIndex === 0;
|
|
|
var isEnd = props.displayIndex === displayMonths.length - 1;
|
|
|
var isCenter = !isStart && !isEnd;
|
|
|
if (dir === "rtl") {
|
|
|
_a = [isStart, isEnd], isEnd = _a[0], isStart = _a[1];
|
|
|
}
|
|
|
if (isStart) {
|
|
|
className.push(classNames.caption_start);
|
|
|
style = __assign(__assign({}, style), styles.caption_start);
|
|
|
}
|
|
|
if (isEnd) {
|
|
|
className.push(classNames.caption_end);
|
|
|
style = __assign(__assign({}, style), styles.caption_end);
|
|
|
}
|
|
|
if (isCenter) {
|
|
|
className.push(classNames.caption_between);
|
|
|
style = __assign(__assign({}, style), styles.caption_between);
|
|
|
}
|
|
|
return React$1.createElement("div", { key: props.displayIndex, className: className.join(" "), style }, React$1.createElement(Caption2, { id: captionId, displayMonth: props.displayMonth }), React$1.createElement(Table, { "aria-labelledby": captionId, displayMonth: props.displayMonth }));
|
|
|
}
|
|
|
function Root() {
|
|
|
var _a = useDayPicker(), dir = _a.dir, className = _a.className, classNames = _a.classNames, style = _a.style, styles = _a.styles, numberOfMonths = _a.numberOfMonths, showWeekNumber = _a.showWeekNumber, initialFocus = _a.initialFocus;
|
|
|
var _b = useFocus(), focusTarget = _b.focusTarget, focus = _b.focus;
|
|
|
var _c = React$1.useState(false), hasInitialFocus = _c[0], setHasInitialFocus = _c[1];
|
|
|
var displayMonths = useNavigation().displayMonths;
|
|
|
var rootClassNames = [className !== null && className !== void 0 ? className : classNames.root];
|
|
|
if (numberOfMonths > 1) {
|
|
|
rootClassNames.push(classNames.multiple_months);
|
|
|
}
|
|
|
if (showWeekNumber) {
|
|
|
rootClassNames.push(classNames.with_weeknumber);
|
|
|
}
|
|
|
React$1.useEffect(function() {
|
|
|
if (initialFocus && !hasInitialFocus && focusTarget) {
|
|
|
focus(focusTarget);
|
|
|
setHasInitialFocus(true);
|
|
|
}
|
|
|
}, [initialFocus, hasInitialFocus, focus, focusTarget]);
|
|
|
return React$1.createElement("div", { className: rootClassNames.join(" "), style: __assign(__assign({}, styles.root), style), dir }, React$1.createElement("div", { className: classNames.months, style: styles.months }, displayMonths.map(function(month, i) {
|
|
|
return React$1.createElement(Month, { key: i, displayIndex: i, displayMonth: month });
|
|
|
})));
|
|
|
}
|
|
|
function RootProvider(props) {
|
|
|
var children = props.children, initialProps = __rest(props, ["children"]);
|
|
|
return React$1.createElement(DayPickerProvider, { initialProps }, React$1.createElement(NavigationProvider, null, React$1.createElement(SelectSingleProvider, { initialProps }, React$1.createElement(SelectMultipleProvider, { initialProps }, React$1.createElement(SelectRangeProvider, { initialProps }, React$1.createElement(ModifiersProvider, null, React$1.createElement(FocusProvider, null, children)))))));
|
|
|
}
|
|
|
function DayPicker(props) {
|
|
|
return React$1.createElement(RootProvider, __assign({}, props), React$1.createElement(Root, null));
|
|
|
}
|
|
|
var fromEntries = function fromEntries2(entries) {
|
|
|
return entries.reduce(function(acc, _ref) {
|
|
|
var key = _ref[0], value = _ref[1];
|
|
|
acc[key] = value;
|
|
|
return acc;
|
|
|
}, {});
|
|
|
};
|
|
|
var useIsomorphicLayoutEffect = typeof window !== "undefined" && window.document && window.document.createElement ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect;
|
|
|
var top = "top";
|
|
|
var bottom = "bottom";
|
|
|
var right = "right";
|
|
|
var left = "left";
|
|
|
var auto = "auto";
|
|
|
var basePlacements = [top, bottom, right, left];
|
|
|
var start = "start";
|
|
|
var end = "end";
|
|
|
var clippingParents = "clippingParents";
|
|
|
var viewport = "viewport";
|
|
|
var popper = "popper";
|
|
|
var reference = "reference";
|
|
|
var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
|
|
|
return acc.concat([placement + "-" + start, placement + "-" + end]);
|
|
|
}, []);
|
|
|
var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
|
|
|
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
|
|
|
}, []);
|
|
|
var beforeRead = "beforeRead";
|
|
|
var read = "read";
|
|
|
var afterRead = "afterRead";
|
|
|
var beforeMain = "beforeMain";
|
|
|
var main = "main";
|
|
|
var afterMain = "afterMain";
|
|
|
var beforeWrite = "beforeWrite";
|
|
|
var write = "write";
|
|
|
var afterWrite = "afterWrite";
|
|
|
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
|
|
|
function getNodeName(element) {
|
|
|
return element ? (element.nodeName || "").toLowerCase() : null;
|
|
|
}
|
|
|
function getWindow(node) {
|
|
|
if (node == null) {
|
|
|
return window;
|
|
|
}
|
|
|
if (node.toString() !== "[object Window]") {
|
|
|
var ownerDocument = node.ownerDocument;
|
|
|
return ownerDocument ? ownerDocument.defaultView || window : window;
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
function isElement(node) {
|
|
|
var OwnElement = getWindow(node).Element;
|
|
|
return node instanceof OwnElement || node instanceof Element;
|
|
|
}
|
|
|
function isHTMLElement(node) {
|
|
|
var OwnElement = getWindow(node).HTMLElement;
|
|
|
return node instanceof OwnElement || node instanceof HTMLElement;
|
|
|
}
|
|
|
function isShadowRoot(node) {
|
|
|
if (typeof ShadowRoot === "undefined") {
|
|
|
return false;
|
|
|
}
|
|
|
var OwnElement = getWindow(node).ShadowRoot;
|
|
|
return node instanceof OwnElement || node instanceof ShadowRoot;
|
|
|
}
|
|
|
function applyStyles(_ref) {
|
|
|
var state = _ref.state;
|
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
|
var style = state.styles[name] || {};
|
|
|
var attributes = state.attributes[name] || {};
|
|
|
var element = state.elements[name];
|
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
|
return;
|
|
|
}
|
|
|
Object.assign(element.style, style);
|
|
|
Object.keys(attributes).forEach(function(name2) {
|
|
|
var value = attributes[name2];
|
|
|
if (value === false) {
|
|
|
element.removeAttribute(name2);
|
|
|
} else {
|
|
|
element.setAttribute(name2, value === true ? "" : value);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
function effect$2(_ref2) {
|
|
|
var state = _ref2.state;
|
|
|
var initialStyles = {
|
|
|
popper: {
|
|
|
position: state.options.strategy,
|
|
|
left: "0",
|
|
|
top: "0",
|
|
|
margin: "0"
|
|
|
},
|
|
|
arrow: {
|
|
|
position: "absolute"
|
|
|
},
|
|
|
reference: {}
|
|
|
};
|
|
|
Object.assign(state.elements.popper.style, initialStyles.popper);
|
|
|
state.styles = initialStyles;
|
|
|
if (state.elements.arrow) {
|
|
|
Object.assign(state.elements.arrow.style, initialStyles.arrow);
|
|
|
}
|
|
|
return function() {
|
|
|
Object.keys(state.elements).forEach(function(name) {
|
|
|
var element = state.elements[name];
|
|
|
var attributes = state.attributes[name] || {};
|
|
|
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
|
|
|
var style = styleProperties.reduce(function(style2, property) {
|
|
|
style2[property] = "";
|
|
|
return style2;
|
|
|
}, {});
|
|
|
if (!isHTMLElement(element) || !getNodeName(element)) {
|
|
|
return;
|
|
|
}
|
|
|
Object.assign(element.style, style);
|
|
|
Object.keys(attributes).forEach(function(attribute) {
|
|
|
element.removeAttribute(attribute);
|
|
|
});
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
var applyStyles$1 = {
|
|
|
name: "applyStyles",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: applyStyles,
|
|
|
effect: effect$2,
|
|
|
requires: ["computeStyles"]
|
|
|
};
|
|
|
function getBasePlacement(placement) {
|
|
|
return placement.split("-")[0];
|
|
|
}
|
|
|
var max = Math.max;
|
|
|
var min = Math.min;
|
|
|
var round = Math.round;
|
|
|
function getBoundingClientRect(element, includeScale) {
|
|
|
if (includeScale === void 0) {
|
|
|
includeScale = false;
|
|
|
}
|
|
|
var rect = element.getBoundingClientRect();
|
|
|
var scaleX = 1;
|
|
|
var scaleY = 1;
|
|
|
if (isHTMLElement(element) && includeScale) {
|
|
|
var offsetHeight = element.offsetHeight;
|
|
|
var offsetWidth = element.offsetWidth;
|
|
|
if (offsetWidth > 0) {
|
|
|
scaleX = round(rect.width) / offsetWidth || 1;
|
|
|
}
|
|
|
if (offsetHeight > 0) {
|
|
|
scaleY = round(rect.height) / offsetHeight || 1;
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
width: rect.width / scaleX,
|
|
|
height: rect.height / scaleY,
|
|
|
top: rect.top / scaleY,
|
|
|
right: rect.right / scaleX,
|
|
|
bottom: rect.bottom / scaleY,
|
|
|
left: rect.left / scaleX,
|
|
|
x: rect.left / scaleX,
|
|
|
y: rect.top / scaleY
|
|
|
};
|
|
|
}
|
|
|
function getLayoutRect(element) {
|
|
|
var clientRect = getBoundingClientRect(element);
|
|
|
var width = element.offsetWidth;
|
|
|
var height = element.offsetHeight;
|
|
|
if (Math.abs(clientRect.width - width) <= 1) {
|
|
|
width = clientRect.width;
|
|
|
}
|
|
|
if (Math.abs(clientRect.height - height) <= 1) {
|
|
|
height = clientRect.height;
|
|
|
}
|
|
|
return {
|
|
|
x: element.offsetLeft,
|
|
|
y: element.offsetTop,
|
|
|
width,
|
|
|
height
|
|
|
};
|
|
|
}
|
|
|
function contains(parent, child) {
|
|
|
var rootNode = child.getRootNode && child.getRootNode();
|
|
|
if (parent.contains(child)) {
|
|
|
return true;
|
|
|
} else if (rootNode && isShadowRoot(rootNode)) {
|
|
|
var next = child;
|
|
|
do {
|
|
|
if (next && parent.isSameNode(next)) {
|
|
|
return true;
|
|
|
}
|
|
|
next = next.parentNode || next.host;
|
|
|
} while (next);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
function getComputedStyle$1(element) {
|
|
|
return getWindow(element).getComputedStyle(element);
|
|
|
}
|
|
|
function isTableElement(element) {
|
|
|
return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
|
|
|
}
|
|
|
function getDocumentElement(element) {
|
|
|
return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
|
|
|
}
|
|
|
function getParentNode(element) {
|
|
|
if (getNodeName(element) === "html") {
|
|
|
return element;
|
|
|
}
|
|
|
return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element);
|
|
|
}
|
|
|
function getTrueOffsetParent(element) {
|
|
|
if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") {
|
|
|
return null;
|
|
|
}
|
|
|
return element.offsetParent;
|
|
|
}
|
|
|
function getContainingBlock(element) {
|
|
|
var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
|
|
|
var isIE = navigator.userAgent.indexOf("Trident") !== -1;
|
|
|
if (isIE && isHTMLElement(element)) {
|
|
|
var elementCss = getComputedStyle$1(element);
|
|
|
if (elementCss.position === "fixed") {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
var currentNode = getParentNode(element);
|
|
|
while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
|
|
|
var css = getComputedStyle$1(currentNode);
|
|
|
if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
|
|
|
return currentNode;
|
|
|
} else {
|
|
|
currentNode = currentNode.parentNode;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
function getOffsetParent(element) {
|
|
|
var window2 = getWindow(element);
|
|
|
var offsetParent = getTrueOffsetParent(element);
|
|
|
while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === "static") {
|
|
|
offsetParent = getTrueOffsetParent(offsetParent);
|
|
|
}
|
|
|
if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle$1(offsetParent).position === "static")) {
|
|
|
return window2;
|
|
|
}
|
|
|
return offsetParent || getContainingBlock(element) || window2;
|
|
|
}
|
|
|
function getMainAxisFromPlacement(placement) {
|
|
|
return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
|
|
|
}
|
|
|
function within(min$1, value, max$1) {
|
|
|
return max(min$1, min(value, max$1));
|
|
|
}
|
|
|
function withinMaxClamp(min2, value, max2) {
|
|
|
var v2 = within(min2, value, max2);
|
|
|
return v2 > max2 ? max2 : v2;
|
|
|
}
|
|
|
function getFreshSideObject() {
|
|
|
return {
|
|
|
top: 0,
|
|
|
right: 0,
|
|
|
bottom: 0,
|
|
|
left: 0
|
|
|
};
|
|
|
}
|
|
|
function mergePaddingObject(paddingObject) {
|
|
|
return Object.assign({}, getFreshSideObject(), paddingObject);
|
|
|
}
|
|
|
function expandToHashMap(value, keys) {
|
|
|
return keys.reduce(function(hashMap, key) {
|
|
|
hashMap[key] = value;
|
|
|
return hashMap;
|
|
|
}, {});
|
|
|
}
|
|
|
var toPaddingObject = function toPaddingObject2(padding, state) {
|
|
|
padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
|
|
|
placement: state.placement
|
|
|
})) : padding;
|
|
|
return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
|
};
|
|
|
function arrow(_ref) {
|
|
|
var _state$modifiersData$;
|
|
|
var state = _ref.state, name = _ref.name, options = _ref.options;
|
|
|
var arrowElement = state.elements.arrow;
|
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
|
var axis = getMainAxisFromPlacement(basePlacement);
|
|
|
var isVertical = [left, right].indexOf(basePlacement) >= 0;
|
|
|
var len = isVertical ? "height" : "width";
|
|
|
if (!arrowElement || !popperOffsets2) {
|
|
|
return;
|
|
|
}
|
|
|
var paddingObject = toPaddingObject(options.padding, state);
|
|
|
var arrowRect = getLayoutRect(arrowElement);
|
|
|
var minProp = axis === "y" ? top : left;
|
|
|
var maxProp = axis === "y" ? bottom : right;
|
|
|
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
|
|
|
var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
|
|
|
var arrowOffsetParent = getOffsetParent(arrowElement);
|
|
|
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
|
|
|
var centerToReference = endDiff / 2 - startDiff / 2;
|
|
|
var min2 = paddingObject[minProp];
|
|
|
var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
|
|
|
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
|
|
|
var offset2 = within(min2, center, max2);
|
|
|
var axisProp = axis;
|
|
|
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
|
|
|
}
|
|
|
function effect$1(_ref2) {
|
|
|
var state = _ref2.state, options = _ref2.options;
|
|
|
var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
|
|
|
if (arrowElement == null) {
|
|
|
return;
|
|
|
}
|
|
|
if (typeof arrowElement === "string") {
|
|
|
arrowElement = state.elements.popper.querySelector(arrowElement);
|
|
|
if (!arrowElement) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
if (!contains(state.elements.popper, arrowElement)) {
|
|
|
return;
|
|
|
}
|
|
|
state.elements.arrow = arrowElement;
|
|
|
}
|
|
|
var arrow$1 = {
|
|
|
name: "arrow",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: arrow,
|
|
|
effect: effect$1,
|
|
|
requires: ["popperOffsets"],
|
|
|
requiresIfExists: ["preventOverflow"]
|
|
|
};
|
|
|
function getVariation(placement) {
|
|
|
return placement.split("-")[1];
|
|
|
}
|
|
|
var unsetSides = {
|
|
|
top: "auto",
|
|
|
right: "auto",
|
|
|
bottom: "auto",
|
|
|
left: "auto"
|
|
|
};
|
|
|
function roundOffsetsByDPR(_ref) {
|
|
|
var x2 = _ref.x, y2 = _ref.y;
|
|
|
var win = window;
|
|
|
var dpr = win.devicePixelRatio || 1;
|
|
|
return {
|
|
|
x: round(x2 * dpr) / dpr || 0,
|
|
|
y: round(y2 * dpr) / dpr || 0
|
|
|
};
|
|
|
}
|
|
|
function mapToStyles(_ref2) {
|
|
|
var _Object$assign2;
|
|
|
var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
|
|
|
var _offsets$x = offsets.x, x2 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y2 = _offsets$y === void 0 ? 0 : _offsets$y;
|
|
|
var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
}) : {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
x2 = _ref3.x;
|
|
|
y2 = _ref3.y;
|
|
|
var hasX = offsets.hasOwnProperty("x");
|
|
|
var hasY = offsets.hasOwnProperty("y");
|
|
|
var sideX = left;
|
|
|
var sideY = top;
|
|
|
var win = window;
|
|
|
if (adaptive) {
|
|
|
var offsetParent = getOffsetParent(popper2);
|
|
|
var heightProp = "clientHeight";
|
|
|
var widthProp = "clientWidth";
|
|
|
if (offsetParent === getWindow(popper2)) {
|
|
|
offsetParent = getDocumentElement(popper2);
|
|
|
if (getComputedStyle$1(offsetParent).position !== "static" && position === "absolute") {
|
|
|
heightProp = "scrollHeight";
|
|
|
widthProp = "scrollWidth";
|
|
|
}
|
|
|
}
|
|
|
offsetParent = offsetParent;
|
|
|
if (placement === top || (placement === left || placement === right) && variation === end) {
|
|
|
sideY = bottom;
|
|
|
var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp];
|
|
|
y2 -= offsetY - popperRect.height;
|
|
|
y2 *= gpuAcceleration ? 1 : -1;
|
|
|
}
|
|
|
if (placement === left || (placement === top || placement === bottom) && variation === end) {
|
|
|
sideX = right;
|
|
|
var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp];
|
|
|
x2 -= offsetX - popperRect.width;
|
|
|
x2 *= gpuAcceleration ? 1 : -1;
|
|
|
}
|
|
|
}
|
|
|
var commonStyles = Object.assign({
|
|
|
position
|
|
|
}, adaptive && unsetSides);
|
|
|
var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
}) : {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
x2 = _ref4.x;
|
|
|
y2 = _ref4.y;
|
|
|
if (gpuAcceleration) {
|
|
|
var _Object$assign;
|
|
|
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x2 + "px, " + y2 + "px)" : "translate3d(" + x2 + "px, " + y2 + "px, 0)", _Object$assign));
|
|
|
}
|
|
|
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y2 + "px" : "", _Object$assign2[sideX] = hasX ? x2 + "px" : "", _Object$assign2.transform = "", _Object$assign2));
|
|
|
}
|
|
|
function computeStyles(_ref5) {
|
|
|
var state = _ref5.state, options = _ref5.options;
|
|
|
var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
|
|
|
var commonStyles = {
|
|
|
placement: getBasePlacement(state.placement),
|
|
|
variation: getVariation(state.placement),
|
|
|
popper: state.elements.popper,
|
|
|
popperRect: state.rects.popper,
|
|
|
gpuAcceleration,
|
|
|
isFixed: state.options.strategy === "fixed"
|
|
|
};
|
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
|
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
|
|
|
offsets: state.modifiersData.popperOffsets,
|
|
|
position: state.options.strategy,
|
|
|
adaptive,
|
|
|
roundOffsets
|
|
|
})));
|
|
|
}
|
|
|
if (state.modifiersData.arrow != null) {
|
|
|
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
|
|
|
offsets: state.modifiersData.arrow,
|
|
|
position: "absolute",
|
|
|
adaptive: false,
|
|
|
roundOffsets
|
|
|
})));
|
|
|
}
|
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
|
"data-popper-placement": state.placement
|
|
|
});
|
|
|
}
|
|
|
var computeStyles$1 = {
|
|
|
name: "computeStyles",
|
|
|
enabled: true,
|
|
|
phase: "beforeWrite",
|
|
|
fn: computeStyles,
|
|
|
data: {}
|
|
|
};
|
|
|
var passive = {
|
|
|
passive: true
|
|
|
};
|
|
|
function effect(_ref) {
|
|
|
var state = _ref.state, instance2 = _ref.instance, options = _ref.options;
|
|
|
var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
|
|
|
var window2 = getWindow(state.elements.popper);
|
|
|
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
|
|
|
if (scroll) {
|
|
|
scrollParents.forEach(function(scrollParent) {
|
|
|
scrollParent.addEventListener("scroll", instance2.update, passive);
|
|
|
});
|
|
|
}
|
|
|
if (resize) {
|
|
|
window2.addEventListener("resize", instance2.update, passive);
|
|
|
}
|
|
|
return function() {
|
|
|
if (scroll) {
|
|
|
scrollParents.forEach(function(scrollParent) {
|
|
|
scrollParent.removeEventListener("scroll", instance2.update, passive);
|
|
|
});
|
|
|
}
|
|
|
if (resize) {
|
|
|
window2.removeEventListener("resize", instance2.update, passive);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
var eventListeners = {
|
|
|
name: "eventListeners",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: function fn() {
|
|
|
},
|
|
|
effect,
|
|
|
data: {}
|
|
|
};
|
|
|
var hash$1 = {
|
|
|
left: "right",
|
|
|
right: "left",
|
|
|
bottom: "top",
|
|
|
top: "bottom"
|
|
|
};
|
|
|
function getOppositePlacement(placement) {
|
|
|
return placement.replace(/left|right|bottom|top/g, function(matched) {
|
|
|
return hash$1[matched];
|
|
|
});
|
|
|
}
|
|
|
var hash = {
|
|
|
start: "end",
|
|
|
end: "start"
|
|
|
};
|
|
|
function getOppositeVariationPlacement(placement) {
|
|
|
return placement.replace(/start|end/g, function(matched) {
|
|
|
return hash[matched];
|
|
|
});
|
|
|
}
|
|
|
function getWindowScroll(node) {
|
|
|
var win = getWindow(node);
|
|
|
var scrollLeft = win.pageXOffset;
|
|
|
var scrollTop = win.pageYOffset;
|
|
|
return {
|
|
|
scrollLeft,
|
|
|
scrollTop
|
|
|
};
|
|
|
}
|
|
|
function getWindowScrollBarX(element) {
|
|
|
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
|
|
|
}
|
|
|
function getViewportRect(element) {
|
|
|
var win = getWindow(element);
|
|
|
var html = getDocumentElement(element);
|
|
|
var visualViewport = win.visualViewport;
|
|
|
var width = html.clientWidth;
|
|
|
var height = html.clientHeight;
|
|
|
var x2 = 0;
|
|
|
var y2 = 0;
|
|
|
if (visualViewport) {
|
|
|
width = visualViewport.width;
|
|
|
height = visualViewport.height;
|
|
|
if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
|
|
|
x2 = visualViewport.offsetLeft;
|
|
|
y2 = visualViewport.offsetTop;
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
width,
|
|
|
height,
|
|
|
x: x2 + getWindowScrollBarX(element),
|
|
|
y: y2
|
|
|
};
|
|
|
}
|
|
|
function getDocumentRect(element) {
|
|
|
var _element$ownerDocumen;
|
|
|
var html = getDocumentElement(element);
|
|
|
var winScroll = getWindowScroll(element);
|
|
|
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
|
|
|
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
|
|
|
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
|
|
|
var x2 = -winScroll.scrollLeft + getWindowScrollBarX(element);
|
|
|
var y2 = -winScroll.scrollTop;
|
|
|
if (getComputedStyle$1(body || html).direction === "rtl") {
|
|
|
x2 += max(html.clientWidth, body ? body.clientWidth : 0) - width;
|
|
|
}
|
|
|
return {
|
|
|
width,
|
|
|
height,
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
};
|
|
|
}
|
|
|
function isScrollParent(element) {
|
|
|
var _getComputedStyle = getComputedStyle$1(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
|
|
|
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
|
|
|
}
|
|
|
function getScrollParent(node) {
|
|
|
if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
|
|
|
return node.ownerDocument.body;
|
|
|
}
|
|
|
if (isHTMLElement(node) && isScrollParent(node)) {
|
|
|
return node;
|
|
|
}
|
|
|
return getScrollParent(getParentNode(node));
|
|
|
}
|
|
|
function listScrollParents(element, list) {
|
|
|
var _element$ownerDocumen;
|
|
|
if (list === void 0) {
|
|
|
list = [];
|
|
|
}
|
|
|
var scrollParent = getScrollParent(element);
|
|
|
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
|
|
|
var win = getWindow(scrollParent);
|
|
|
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
|
|
|
var updatedList = list.concat(target);
|
|
|
return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target)));
|
|
|
}
|
|
|
function rectToClientRect(rect) {
|
|
|
return Object.assign({}, rect, {
|
|
|
left: rect.x,
|
|
|
top: rect.y,
|
|
|
right: rect.x + rect.width,
|
|
|
bottom: rect.y + rect.height
|
|
|
});
|
|
|
}
|
|
|
function getInnerBoundingClientRect(element) {
|
|
|
var rect = getBoundingClientRect(element);
|
|
|
rect.top = rect.top + element.clientTop;
|
|
|
rect.left = rect.left + element.clientLeft;
|
|
|
rect.bottom = rect.top + element.clientHeight;
|
|
|
rect.right = rect.left + element.clientWidth;
|
|
|
rect.width = element.clientWidth;
|
|
|
rect.height = element.clientHeight;
|
|
|
rect.x = rect.left;
|
|
|
rect.y = rect.top;
|
|
|
return rect;
|
|
|
}
|
|
|
function getClientRectFromMixedType(element, clippingParent) {
|
|
|
return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
|
|
|
}
|
|
|
function getClippingParents(element) {
|
|
|
var clippingParents2 = listScrollParents(getParentNode(element));
|
|
|
var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle$1(element).position) >= 0;
|
|
|
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
|
|
|
if (!isElement(clipperElement)) {
|
|
|
return [];
|
|
|
}
|
|
|
return clippingParents2.filter(function(clippingParent) {
|
|
|
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
|
|
|
});
|
|
|
}
|
|
|
function getClippingRect(element, boundary, rootBoundary) {
|
|
|
var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
|
|
|
var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
|
|
|
var firstClippingParent = clippingParents2[0];
|
|
|
var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
|
|
|
var rect = getClientRectFromMixedType(element, clippingParent);
|
|
|
accRect.top = max(rect.top, accRect.top);
|
|
|
accRect.right = min(rect.right, accRect.right);
|
|
|
accRect.bottom = min(rect.bottom, accRect.bottom);
|
|
|
accRect.left = max(rect.left, accRect.left);
|
|
|
return accRect;
|
|
|
}, getClientRectFromMixedType(element, firstClippingParent));
|
|
|
clippingRect.width = clippingRect.right - clippingRect.left;
|
|
|
clippingRect.height = clippingRect.bottom - clippingRect.top;
|
|
|
clippingRect.x = clippingRect.left;
|
|
|
clippingRect.y = clippingRect.top;
|
|
|
return clippingRect;
|
|
|
}
|
|
|
function computeOffsets(_ref) {
|
|
|
var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
|
|
|
var basePlacement = placement ? getBasePlacement(placement) : null;
|
|
|
var variation = placement ? getVariation(placement) : null;
|
|
|
var commonX = reference2.x + reference2.width / 2 - element.width / 2;
|
|
|
var commonY = reference2.y + reference2.height / 2 - element.height / 2;
|
|
|
var offsets;
|
|
|
switch (basePlacement) {
|
|
|
case top:
|
|
|
offsets = {
|
|
|
x: commonX,
|
|
|
y: reference2.y - element.height
|
|
|
};
|
|
|
break;
|
|
|
case bottom:
|
|
|
offsets = {
|
|
|
x: commonX,
|
|
|
y: reference2.y + reference2.height
|
|
|
};
|
|
|
break;
|
|
|
case right:
|
|
|
offsets = {
|
|
|
x: reference2.x + reference2.width,
|
|
|
y: commonY
|
|
|
};
|
|
|
break;
|
|
|
case left:
|
|
|
offsets = {
|
|
|
x: reference2.x - element.width,
|
|
|
y: commonY
|
|
|
};
|
|
|
break;
|
|
|
default:
|
|
|
offsets = {
|
|
|
x: reference2.x,
|
|
|
y: reference2.y
|
|
|
};
|
|
|
}
|
|
|
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
|
|
|
if (mainAxis != null) {
|
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
|
switch (variation) {
|
|
|
case start:
|
|
|
offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
|
|
|
break;
|
|
|
case end:
|
|
|
offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return offsets;
|
|
|
}
|
|
|
function detectOverflow(state, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
|
|
|
var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
|
|
|
var altContext = elementContext === popper ? reference : popper;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var element = state.elements[altBoundary ? altContext : elementContext];
|
|
|
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
|
|
|
var referenceClientRect = getBoundingClientRect(state.elements.reference);
|
|
|
var popperOffsets2 = computeOffsets({
|
|
|
reference: referenceClientRect,
|
|
|
element: popperRect,
|
|
|
strategy: "absolute",
|
|
|
placement
|
|
|
});
|
|
|
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
|
|
|
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
|
|
|
var overflowOffsets = {
|
|
|
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
|
|
|
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
|
|
|
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
|
|
|
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
|
|
|
};
|
|
|
var offsetData = state.modifiersData.offset;
|
|
|
if (elementContext === popper && offsetData) {
|
|
|
var offset2 = offsetData[placement];
|
|
|
Object.keys(overflowOffsets).forEach(function(key) {
|
|
|
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
|
|
|
var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
|
|
|
overflowOffsets[key] += offset2[axis] * multiply;
|
|
|
});
|
|
|
}
|
|
|
return overflowOffsets;
|
|
|
}
|
|
|
function computeAutoPlacement(state, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
|
|
|
var variation = getVariation(placement);
|
|
|
var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
|
|
|
return getVariation(placement2) === variation;
|
|
|
}) : basePlacements;
|
|
|
var allowedPlacements = placements$1.filter(function(placement2) {
|
|
|
return allowedAutoPlacements.indexOf(placement2) >= 0;
|
|
|
});
|
|
|
if (allowedPlacements.length === 0) {
|
|
|
allowedPlacements = placements$1;
|
|
|
}
|
|
|
var overflows = allowedPlacements.reduce(function(acc, placement2) {
|
|
|
acc[placement2] = detectOverflow(state, {
|
|
|
placement: placement2,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding
|
|
|
})[getBasePlacement(placement2)];
|
|
|
return acc;
|
|
|
}, {});
|
|
|
return Object.keys(overflows).sort(function(a, b) {
|
|
|
return overflows[a] - overflows[b];
|
|
|
});
|
|
|
}
|
|
|
function getExpandedFallbackPlacements(placement) {
|
|
|
if (getBasePlacement(placement) === auto) {
|
|
|
return [];
|
|
|
}
|
|
|
var oppositePlacement = getOppositePlacement(placement);
|
|
|
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
|
|
|
}
|
|
|
function flip(_ref) {
|
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
|
if (state.modifiersData[name]._skip) {
|
|
|
return;
|
|
|
}
|
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
|
|
|
var preferredPlacement = state.options.placement;
|
|
|
var basePlacement = getBasePlacement(preferredPlacement);
|
|
|
var isBasePlacement = basePlacement === preferredPlacement;
|
|
|
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
|
|
|
var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
|
|
|
return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
|
|
|
placement: placement2,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding,
|
|
|
flipVariations,
|
|
|
allowedAutoPlacements
|
|
|
}) : placement2);
|
|
|
}, []);
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var checksMap = new Map();
|
|
|
var makeFallbackChecks = true;
|
|
|
var firstFittingPlacement = placements2[0];
|
|
|
for (var i = 0; i < placements2.length; i++) {
|
|
|
var placement = placements2[i];
|
|
|
var _basePlacement = getBasePlacement(placement);
|
|
|
var isStartVariation = getVariation(placement) === start;
|
|
|
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
|
|
|
var len = isVertical ? "width" : "height";
|
|
|
var overflow = detectOverflow(state, {
|
|
|
placement,
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
altBoundary,
|
|
|
padding
|
|
|
});
|
|
|
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
|
|
|
if (referenceRect[len] > popperRect[len]) {
|
|
|
mainVariationSide = getOppositePlacement(mainVariationSide);
|
|
|
}
|
|
|
var altVariationSide = getOppositePlacement(mainVariationSide);
|
|
|
var checks = [];
|
|
|
if (checkMainAxis) {
|
|
|
checks.push(overflow[_basePlacement] <= 0);
|
|
|
}
|
|
|
if (checkAltAxis) {
|
|
|
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
|
|
|
}
|
|
|
if (checks.every(function(check) {
|
|
|
return check;
|
|
|
})) {
|
|
|
firstFittingPlacement = placement;
|
|
|
makeFallbackChecks = false;
|
|
|
break;
|
|
|
}
|
|
|
checksMap.set(placement, checks);
|
|
|
}
|
|
|
if (makeFallbackChecks) {
|
|
|
var numberOfChecks = flipVariations ? 3 : 1;
|
|
|
var _loop = function _loop2(_i2) {
|
|
|
var fittingPlacement = placements2.find(function(placement2) {
|
|
|
var checks2 = checksMap.get(placement2);
|
|
|
if (checks2) {
|
|
|
return checks2.slice(0, _i2).every(function(check) {
|
|
|
return check;
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
if (fittingPlacement) {
|
|
|
firstFittingPlacement = fittingPlacement;
|
|
|
return "break";
|
|
|
}
|
|
|
};
|
|
|
for (var _i = numberOfChecks; _i > 0; _i--) {
|
|
|
var _ret = _loop(_i);
|
|
|
if (_ret === "break")
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (state.placement !== firstFittingPlacement) {
|
|
|
state.modifiersData[name]._skip = true;
|
|
|
state.placement = firstFittingPlacement;
|
|
|
state.reset = true;
|
|
|
}
|
|
|
}
|
|
|
var flip$1 = {
|
|
|
name: "flip",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: flip,
|
|
|
requiresIfExists: ["offset"],
|
|
|
data: {
|
|
|
_skip: false
|
|
|
}
|
|
|
};
|
|
|
function getSideOffsets(overflow, rect, preventedOffsets) {
|
|
|
if (preventedOffsets === void 0) {
|
|
|
preventedOffsets = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
}
|
|
|
return {
|
|
|
top: overflow.top - rect.height - preventedOffsets.y,
|
|
|
right: overflow.right - rect.width + preventedOffsets.x,
|
|
|
bottom: overflow.bottom - rect.height + preventedOffsets.y,
|
|
|
left: overflow.left - rect.width - preventedOffsets.x
|
|
|
};
|
|
|
}
|
|
|
function isAnySideFullyClipped(overflow) {
|
|
|
return [top, right, bottom, left].some(function(side) {
|
|
|
return overflow[side] >= 0;
|
|
|
});
|
|
|
}
|
|
|
function hide(_ref) {
|
|
|
var state = _ref.state, name = _ref.name;
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var preventedOffsets = state.modifiersData.preventOverflow;
|
|
|
var referenceOverflow = detectOverflow(state, {
|
|
|
elementContext: "reference"
|
|
|
});
|
|
|
var popperAltOverflow = detectOverflow(state, {
|
|
|
altBoundary: true
|
|
|
});
|
|
|
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
|
|
|
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
|
|
|
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
|
|
|
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
|
|
|
state.modifiersData[name] = {
|
|
|
referenceClippingOffsets,
|
|
|
popperEscapeOffsets,
|
|
|
isReferenceHidden,
|
|
|
hasPopperEscaped
|
|
|
};
|
|
|
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
|
|
"data-popper-reference-hidden": isReferenceHidden,
|
|
|
"data-popper-escaped": hasPopperEscaped
|
|
|
});
|
|
|
}
|
|
|
var hide$1 = {
|
|
|
name: "hide",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
requiresIfExists: ["preventOverflow"],
|
|
|
fn: hide
|
|
|
};
|
|
|
function distanceAndSkiddingToXY(placement, rects, offset2) {
|
|
|
var basePlacement = getBasePlacement(placement);
|
|
|
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
|
|
|
var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
|
|
|
placement
|
|
|
})) : offset2, skidding = _ref[0], distance = _ref[1];
|
|
|
skidding = skidding || 0;
|
|
|
distance = (distance || 0) * invertDistance;
|
|
|
return [left, right].indexOf(basePlacement) >= 0 ? {
|
|
|
x: distance,
|
|
|
y: skidding
|
|
|
} : {
|
|
|
x: skidding,
|
|
|
y: distance
|
|
|
};
|
|
|
}
|
|
|
function offset(_ref2) {
|
|
|
var state = _ref2.state, options = _ref2.options, name = _ref2.name;
|
|
|
var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
|
|
|
var data = placements.reduce(function(acc, placement) {
|
|
|
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
|
|
|
return acc;
|
|
|
}, {});
|
|
|
var _data$state$placement = data[state.placement], x2 = _data$state$placement.x, y2 = _data$state$placement.y;
|
|
|
if (state.modifiersData.popperOffsets != null) {
|
|
|
state.modifiersData.popperOffsets.x += x2;
|
|
|
state.modifiersData.popperOffsets.y += y2;
|
|
|
}
|
|
|
state.modifiersData[name] = data;
|
|
|
}
|
|
|
var offset$1 = {
|
|
|
name: "offset",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
requires: ["popperOffsets"],
|
|
|
fn: offset
|
|
|
};
|
|
|
function popperOffsets(_ref) {
|
|
|
var state = _ref.state, name = _ref.name;
|
|
|
state.modifiersData[name] = computeOffsets({
|
|
|
reference: state.rects.reference,
|
|
|
element: state.rects.popper,
|
|
|
strategy: "absolute",
|
|
|
placement: state.placement
|
|
|
});
|
|
|
}
|
|
|
var popperOffsets$1 = {
|
|
|
name: "popperOffsets",
|
|
|
enabled: true,
|
|
|
phase: "read",
|
|
|
fn: popperOffsets,
|
|
|
data: {}
|
|
|
};
|
|
|
function getAltAxis(axis) {
|
|
|
return axis === "x" ? "y" : "x";
|
|
|
}
|
|
|
function preventOverflow(_ref) {
|
|
|
var state = _ref.state, options = _ref.options, name = _ref.name;
|
|
|
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
|
|
|
var overflow = detectOverflow(state, {
|
|
|
boundary,
|
|
|
rootBoundary,
|
|
|
padding,
|
|
|
altBoundary
|
|
|
});
|
|
|
var basePlacement = getBasePlacement(state.placement);
|
|
|
var variation = getVariation(state.placement);
|
|
|
var isBasePlacement = !variation;
|
|
|
var mainAxis = getMainAxisFromPlacement(basePlacement);
|
|
|
var altAxis = getAltAxis(mainAxis);
|
|
|
var popperOffsets2 = state.modifiersData.popperOffsets;
|
|
|
var referenceRect = state.rects.reference;
|
|
|
var popperRect = state.rects.popper;
|
|
|
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
|
|
|
placement: state.placement
|
|
|
})) : tetherOffset;
|
|
|
var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
|
|
|
mainAxis: tetherOffsetValue,
|
|
|
altAxis: tetherOffsetValue
|
|
|
} : Object.assign({
|
|
|
mainAxis: 0,
|
|
|
altAxis: 0
|
|
|
}, tetherOffsetValue);
|
|
|
var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
|
|
|
var data = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
if (!popperOffsets2) {
|
|
|
return;
|
|
|
}
|
|
|
if (checkMainAxis) {
|
|
|
var _offsetModifierState$;
|
|
|
var mainSide = mainAxis === "y" ? top : left;
|
|
|
var altSide = mainAxis === "y" ? bottom : right;
|
|
|
var len = mainAxis === "y" ? "height" : "width";
|
|
|
var offset2 = popperOffsets2[mainAxis];
|
|
|
var min$1 = offset2 + overflow[mainSide];
|
|
|
var max$1 = offset2 - overflow[altSide];
|
|
|
var additive = tether ? -popperRect[len] / 2 : 0;
|
|
|
var minLen = variation === start ? referenceRect[len] : popperRect[len];
|
|
|
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
|
|
|
var arrowElement = state.elements.arrow;
|
|
|
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
|
|
|
width: 0,
|
|
|
height: 0
|
|
|
};
|
|
|
var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
|
|
|
var arrowPaddingMin = arrowPaddingObject[mainSide];
|
|
|
var arrowPaddingMax = arrowPaddingObject[altSide];
|
|
|
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
|
|
|
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
|
|
|
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
|
|
|
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
|
|
|
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
|
|
|
var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
|
|
|
var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
|
|
|
var tetherMax = offset2 + maxOffset - offsetModifierValue;
|
|
|
var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset2, tether ? max(max$1, tetherMax) : max$1);
|
|
|
popperOffsets2[mainAxis] = preventedOffset;
|
|
|
data[mainAxis] = preventedOffset - offset2;
|
|
|
}
|
|
|
if (checkAltAxis) {
|
|
|
var _offsetModifierState$2;
|
|
|
var _mainSide = mainAxis === "x" ? top : left;
|
|
|
var _altSide = mainAxis === "x" ? bottom : right;
|
|
|
var _offset = popperOffsets2[altAxis];
|
|
|
var _len = altAxis === "y" ? "height" : "width";
|
|
|
var _min = _offset + overflow[_mainSide];
|
|
|
var _max = _offset - overflow[_altSide];
|
|
|
var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
|
|
|
var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
|
|
|
var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
|
|
|
var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
|
|
|
var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
|
|
|
popperOffsets2[altAxis] = _preventedOffset;
|
|
|
data[altAxis] = _preventedOffset - _offset;
|
|
|
}
|
|
|
state.modifiersData[name] = data;
|
|
|
}
|
|
|
var preventOverflow$1 = {
|
|
|
name: "preventOverflow",
|
|
|
enabled: true,
|
|
|
phase: "main",
|
|
|
fn: preventOverflow,
|
|
|
requiresIfExists: ["offset"]
|
|
|
};
|
|
|
function getHTMLElementScroll(element) {
|
|
|
return {
|
|
|
scrollLeft: element.scrollLeft,
|
|
|
scrollTop: element.scrollTop
|
|
|
};
|
|
|
}
|
|
|
function getNodeScroll(node) {
|
|
|
if (node === getWindow(node) || !isHTMLElement(node)) {
|
|
|
return getWindowScroll(node);
|
|
|
} else {
|
|
|
return getHTMLElementScroll(node);
|
|
|
}
|
|
|
}
|
|
|
function isElementScaled(element) {
|
|
|
var rect = element.getBoundingClientRect();
|
|
|
var scaleX = round(rect.width) / element.offsetWidth || 1;
|
|
|
var scaleY = round(rect.height) / element.offsetHeight || 1;
|
|
|
return scaleX !== 1 || scaleY !== 1;
|
|
|
}
|
|
|
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
|
|
|
if (isFixed === void 0) {
|
|
|
isFixed = false;
|
|
|
}
|
|
|
var isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
|
var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
|
|
|
var documentElement = getDocumentElement(offsetParent);
|
|
|
var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
|
|
|
var scroll = {
|
|
|
scrollLeft: 0,
|
|
|
scrollTop: 0
|
|
|
};
|
|
|
var offsets = {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
|
if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) {
|
|
|
scroll = getNodeScroll(offsetParent);
|
|
|
}
|
|
|
if (isHTMLElement(offsetParent)) {
|
|
|
offsets = getBoundingClientRect(offsetParent, true);
|
|
|
offsets.x += offsetParent.clientLeft;
|
|
|
offsets.y += offsetParent.clientTop;
|
|
|
} else if (documentElement) {
|
|
|
offsets.x = getWindowScrollBarX(documentElement);
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
x: rect.left + scroll.scrollLeft - offsets.x,
|
|
|
y: rect.top + scroll.scrollTop - offsets.y,
|
|
|
width: rect.width,
|
|
|
height: rect.height
|
|
|
};
|
|
|
}
|
|
|
function order(modifiers) {
|
|
|
var map = new Map();
|
|
|
var visited = new Set();
|
|
|
var result = [];
|
|
|
modifiers.forEach(function(modifier) {
|
|
|
map.set(modifier.name, modifier);
|
|
|
});
|
|
|
function sort(modifier) {
|
|
|
visited.add(modifier.name);
|
|
|
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
|
|
|
requires.forEach(function(dep) {
|
|
|
if (!visited.has(dep)) {
|
|
|
var depModifier = map.get(dep);
|
|
|
if (depModifier) {
|
|
|
sort(depModifier);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
result.push(modifier);
|
|
|
}
|
|
|
modifiers.forEach(function(modifier) {
|
|
|
if (!visited.has(modifier.name)) {
|
|
|
sort(modifier);
|
|
|
}
|
|
|
});
|
|
|
return result;
|
|
|
}
|
|
|
function orderModifiers(modifiers) {
|
|
|
var orderedModifiers = order(modifiers);
|
|
|
return modifierPhases.reduce(function(acc, phase) {
|
|
|
return acc.concat(orderedModifiers.filter(function(modifier) {
|
|
|
return modifier.phase === phase;
|
|
|
}));
|
|
|
}, []);
|
|
|
}
|
|
|
function debounce(fn2) {
|
|
|
var pending;
|
|
|
return function() {
|
|
|
if (!pending) {
|
|
|
pending = new Promise(function(resolve) {
|
|
|
Promise.resolve().then(function() {
|
|
|
pending = void 0;
|
|
|
resolve(fn2());
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
return pending;
|
|
|
};
|
|
|
}
|
|
|
function mergeByName(modifiers) {
|
|
|
var merged = modifiers.reduce(function(merged2, current) {
|
|
|
var existing = merged2[current.name];
|
|
|
merged2[current.name] = existing ? Object.assign({}, existing, current, {
|
|
|
options: Object.assign({}, existing.options, current.options),
|
|
|
data: Object.assign({}, existing.data, current.data)
|
|
|
}) : current;
|
|
|
return merged2;
|
|
|
}, {});
|
|
|
return Object.keys(merged).map(function(key) {
|
|
|
return merged[key];
|
|
|
});
|
|
|
}
|
|
|
var DEFAULT_OPTIONS = {
|
|
|
placement: "bottom",
|
|
|
modifiers: [],
|
|
|
strategy: "absolute"
|
|
|
};
|
|
|
function areValidElements() {
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
return !args.some(function(element) {
|
|
|
return !(element && typeof element.getBoundingClientRect === "function");
|
|
|
});
|
|
|
}
|
|
|
function popperGenerator(generatorOptions) {
|
|
|
if (generatorOptions === void 0) {
|
|
|
generatorOptions = {};
|
|
|
}
|
|
|
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
|
|
|
return function createPopper2(reference2, popper2, options) {
|
|
|
if (options === void 0) {
|
|
|
options = defaultOptions;
|
|
|
}
|
|
|
var state = {
|
|
|
placement: "bottom",
|
|
|
orderedModifiers: [],
|
|
|
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
|
|
|
modifiersData: {},
|
|
|
elements: {
|
|
|
reference: reference2,
|
|
|
popper: popper2
|
|
|
},
|
|
|
attributes: {},
|
|
|
styles: {}
|
|
|
};
|
|
|
var effectCleanupFns = [];
|
|
|
var isDestroyed = false;
|
|
|
var instance2 = {
|
|
|
state,
|
|
|
setOptions: function setOptions(setOptionsAction) {
|
|
|
var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
|
|
|
cleanupModifierEffects();
|
|
|
state.options = Object.assign({}, defaultOptions, state.options, options2);
|
|
|
state.scrollParents = {
|
|
|
reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
|
|
|
popper: listScrollParents(popper2)
|
|
|
};
|
|
|
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers)));
|
|
|
state.orderedModifiers = orderedModifiers.filter(function(m2) {
|
|
|
return m2.enabled;
|
|
|
});
|
|
|
runModifierEffects();
|
|
|
return instance2.update();
|
|
|
},
|
|
|
forceUpdate: function forceUpdate() {
|
|
|
if (isDestroyed) {
|
|
|
return;
|
|
|
}
|
|
|
var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
|
|
|
if (!areValidElements(reference3, popper3)) {
|
|
|
return;
|
|
|
}
|
|
|
state.rects = {
|
|
|
reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
|
|
|
popper: getLayoutRect(popper3)
|
|
|
};
|
|
|
state.reset = false;
|
|
|
state.placement = state.options.placement;
|
|
|
state.orderedModifiers.forEach(function(modifier) {
|
|
|
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
|
|
|
});
|
|
|
for (var index = 0; index < state.orderedModifiers.length; index++) {
|
|
|
if (state.reset === true) {
|
|
|
state.reset = false;
|
|
|
index = -1;
|
|
|
continue;
|
|
|
}
|
|
|
var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
|
|
|
if (typeof fn2 === "function") {
|
|
|
state = fn2({
|
|
|
state,
|
|
|
options: _options,
|
|
|
name,
|
|
|
instance: instance2
|
|
|
}) || state;
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
update: debounce(function() {
|
|
|
return new Promise(function(resolve) {
|
|
|
instance2.forceUpdate();
|
|
|
resolve(state);
|
|
|
});
|
|
|
}),
|
|
|
destroy: function destroy() {
|
|
|
cleanupModifierEffects();
|
|
|
isDestroyed = true;
|
|
|
}
|
|
|
};
|
|
|
if (!areValidElements(reference2, popper2)) {
|
|
|
return instance2;
|
|
|
}
|
|
|
instance2.setOptions(options).then(function(state2) {
|
|
|
if (!isDestroyed && options.onFirstUpdate) {
|
|
|
options.onFirstUpdate(state2);
|
|
|
}
|
|
|
});
|
|
|
function runModifierEffects() {
|
|
|
state.orderedModifiers.forEach(function(_ref3) {
|
|
|
var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect2 = _ref3.effect;
|
|
|
if (typeof effect2 === "function") {
|
|
|
var cleanupFn = effect2({
|
|
|
state,
|
|
|
name,
|
|
|
instance: instance2,
|
|
|
options: options2
|
|
|
});
|
|
|
var noopFn = function noopFn2() {
|
|
|
};
|
|
|
effectCleanupFns.push(cleanupFn || noopFn);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
function cleanupModifierEffects() {
|
|
|
effectCleanupFns.forEach(function(fn2) {
|
|
|
return fn2();
|
|
|
});
|
|
|
effectCleanupFns = [];
|
|
|
}
|
|
|
return instance2;
|
|
|
};
|
|
|
}
|
|
|
var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
|
|
|
var createPopper = /* @__PURE__ */ popperGenerator({
|
|
|
defaultModifiers
|
|
|
});
|
|
|
var hasElementType = typeof Element !== "undefined";
|
|
|
var hasMap = typeof Map === "function";
|
|
|
var hasSet = typeof Set === "function";
|
|
|
var hasArrayBuffer = typeof ArrayBuffer === "function" && !!ArrayBuffer.isView;
|
|
|
function equal(a, b) {
|
|
|
if (a === b)
|
|
|
return true;
|
|
|
if (a && b && typeof a == "object" && typeof b == "object") {
|
|
|
if (a.constructor !== b.constructor)
|
|
|
return false;
|
|
|
var length, i, keys;
|
|
|
if (Array.isArray(a)) {
|
|
|
length = a.length;
|
|
|
if (length != b.length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (!equal(a[i], b[i]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
var it2;
|
|
|
if (hasMap && a instanceof Map && b instanceof Map) {
|
|
|
if (a.size !== b.size)
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!b.has(i.value[0]))
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!equal(i.value[1], b.get(i.value[0])))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (hasSet && a instanceof Set && b instanceof Set) {
|
|
|
if (a.size !== b.size)
|
|
|
return false;
|
|
|
it2 = a.entries();
|
|
|
while (!(i = it2.next()).done)
|
|
|
if (!b.has(i.value[0]))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
|
|
|
length = a.length;
|
|
|
if (length != b.length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (a[i] !== b[i])
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
if (a.constructor === RegExp)
|
|
|
return a.source === b.source && a.flags === b.flags;
|
|
|
if (a.valueOf !== Object.prototype.valueOf)
|
|
|
return a.valueOf() === b.valueOf();
|
|
|
if (a.toString !== Object.prototype.toString)
|
|
|
return a.toString() === b.toString();
|
|
|
keys = Object.keys(a);
|
|
|
length = keys.length;
|
|
|
if (length !== Object.keys(b).length)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; )
|
|
|
if (!Object.prototype.hasOwnProperty.call(b, keys[i]))
|
|
|
return false;
|
|
|
if (hasElementType && a instanceof Element)
|
|
|
return false;
|
|
|
for (i = length; i-- !== 0; ) {
|
|
|
if ((keys[i] === "_owner" || keys[i] === "__v" || keys[i] === "__o") && a.$$typeof) {
|
|
|
continue;
|
|
|
}
|
|
|
if (!equal(a[keys[i]], b[keys[i]]))
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
return a !== a && b !== b;
|
|
|
}
|
|
|
var _reactFastCompare_3_2_0_reactFastCompare = function isEqual(a, b) {
|
|
|
try {
|
|
|
return equal(a, b);
|
|
|
} catch (error2) {
|
|
|
if ((error2.message || "").match(/stack|recursion/i)) {
|
|
|
console.warn("react-fast-compare cannot handle circular refs");
|
|
|
return false;
|
|
|
}
|
|
|
throw error2;
|
|
|
}
|
|
|
};
|
|
|
var EMPTY_MODIFIERS = [];
|
|
|
var usePopper = function usePopper2(referenceElement, popperElement, options) {
|
|
|
if (options === void 0) {
|
|
|
options = {};
|
|
|
}
|
|
|
var prevOptions = _react_17_0_2_react.exports.useRef(null);
|
|
|
var optionsWithDefaults = {
|
|
|
onFirstUpdate: options.onFirstUpdate,
|
|
|
placement: options.placement || "bottom",
|
|
|
strategy: options.strategy || "absolute",
|
|
|
modifiers: options.modifiers || EMPTY_MODIFIERS
|
|
|
};
|
|
|
var _React$useState = _react_17_0_2_react.exports.useState({
|
|
|
styles: {
|
|
|
popper: {
|
|
|
position: optionsWithDefaults.strategy,
|
|
|
left: "0",
|
|
|
top: "0"
|
|
|
},
|
|
|
arrow: {
|
|
|
position: "absolute"
|
|
|
}
|
|
|
},
|
|
|
attributes: {}
|
|
|
}), state = _React$useState[0], setState = _React$useState[1];
|
|
|
var updateStateModifier = _react_17_0_2_react.exports.useMemo(function() {
|
|
|
return {
|
|
|
name: "updateState",
|
|
|
enabled: true,
|
|
|
phase: "write",
|
|
|
fn: function fn2(_ref) {
|
|
|
var state2 = _ref.state;
|
|
|
var elements = Object.keys(state2.elements);
|
|
|
setState({
|
|
|
styles: fromEntries(elements.map(function(element) {
|
|
|
return [element, state2.styles[element] || {}];
|
|
|
})),
|
|
|
attributes: fromEntries(elements.map(function(element) {
|
|
|
return [element, state2.attributes[element]];
|
|
|
}))
|
|
|
});
|
|
|
},
|
|
|
requires: ["computeStyles"]
|
|
|
};
|
|
|
}, []);
|
|
|
var popperOptions = _react_17_0_2_react.exports.useMemo(function() {
|
|
|
var newOptions = {
|
|
|
onFirstUpdate: optionsWithDefaults.onFirstUpdate,
|
|
|
placement: optionsWithDefaults.placement,
|
|
|
strategy: optionsWithDefaults.strategy,
|
|
|
modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {
|
|
|
name: "applyStyles",
|
|
|
enabled: false
|
|
|
}])
|
|
|
};
|
|
|
if (_reactFastCompare_3_2_0_reactFastCompare(prevOptions.current, newOptions)) {
|
|
|
return prevOptions.current || newOptions;
|
|
|
} else {
|
|
|
prevOptions.current = newOptions;
|
|
|
return newOptions;
|
|
|
}
|
|
|
}, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);
|
|
|
var popperInstanceRef = _react_17_0_2_react.exports.useRef();
|
|
|
useIsomorphicLayoutEffect(function() {
|
|
|
if (popperInstanceRef.current) {
|
|
|
popperInstanceRef.current.setOptions(popperOptions);
|
|
|
}
|
|
|
}, [popperOptions]);
|
|
|
useIsomorphicLayoutEffect(function() {
|
|
|
if (referenceElement == null || popperElement == null) {
|
|
|
return;
|
|
|
}
|
|
|
var createPopper$1 = options.createPopper || createPopper;
|
|
|
var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions);
|
|
|
popperInstanceRef.current = popperInstance;
|
|
|
return function() {
|
|
|
popperInstance.destroy();
|
|
|
popperInstanceRef.current = null;
|
|
|
};
|
|
|
}, [referenceElement, popperElement, options.createPopper]);
|
|
|
return {
|
|
|
state: popperInstanceRef.current ? popperInstanceRef.current.state : null,
|
|
|
styles: state.styles,
|
|
|
attributes: state.attributes,
|
|
|
update: popperInstanceRef.current ? popperInstanceRef.current.update : null,
|
|
|
forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null
|
|
|
};
|
|
|
};
|
|
|
var _propTypes_15_8_1_propTypes = { exports: {} };
|
|
|
var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
|
|
|
var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
|
|
|
var ReactPropTypesSecret = ReactPropTypesSecret_1;
|
|
|
function emptyFunction() {
|
|
|
}
|
|
|
function emptyFunctionWithReset() {
|
|
|
}
|
|
|
emptyFunctionWithReset.resetWarningCache = emptyFunction;
|
|
|
var factoryWithThrowingShims = function() {
|
|
|
function shim(props, propName, componentName, location, propFullName, secret) {
|
|
|
if (secret === ReactPropTypesSecret) {
|
|
|
return;
|
|
|
}
|
|
|
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;
|
|
|
}
|
|
|
shim.isRequired = shim;
|
|
|
function getShim() {
|
|
|
return shim;
|
|
|
}
|
|
|
var ReactPropTypes = {
|
|
|
array: shim,
|
|
|
bigint: shim,
|
|
|
bool: shim,
|
|
|
func: shim,
|
|
|
number: shim,
|
|
|
object: shim,
|
|
|
string: shim,
|
|
|
symbol: shim,
|
|
|
any: shim,
|
|
|
arrayOf: getShim,
|
|
|
element: shim,
|
|
|
elementType: shim,
|
|
|
instanceOf: getShim,
|
|
|
node: shim,
|
|
|
objectOf: getShim,
|
|
|
oneOf: getShim,
|
|
|
oneOfType: getShim,
|
|
|
shape: getShim,
|
|
|
exact: getShim,
|
|
|
checkPropTypes: emptyFunctionWithReset,
|
|
|
resetWarningCache: emptyFunction
|
|
|
};
|
|
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
|
return ReactPropTypes;
|
|
|
};
|
|
|
{
|
|
|
_propTypes_15_8_1_propTypes.exports = factoryWithThrowingShims();
|
|
|
}
|
|
|
/*!
|
|
|
* tabbable 5.2.1
|
|
|
* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
|
|
|
*/
|
|
|
var candidateSelectors = ["input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])', "details>summary:first-of-type", "details"];
|
|
|
var candidateSelector = /* @__PURE__ */ candidateSelectors.join(",");
|
|
|
var matches = typeof Element === "undefined" ? function() {
|
|
|
} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
|
|
|
var getCandidates = function getCandidates2(el, includeContainer, filter) {
|
|
|
var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector));
|
|
|
if (includeContainer && matches.call(el, candidateSelector)) {
|
|
|
candidates.unshift(el);
|
|
|
}
|
|
|
candidates = candidates.filter(filter);
|
|
|
return candidates;
|
|
|
};
|
|
|
var isContentEditable = function isContentEditable2(node) {
|
|
|
return node.contentEditable === "true";
|
|
|
};
|
|
|
var getTabindex = function getTabindex2(node) {
|
|
|
var tabindexAttr = parseInt(node.getAttribute("tabindex"), 10);
|
|
|
if (!isNaN(tabindexAttr)) {
|
|
|
return tabindexAttr;
|
|
|
}
|
|
|
if (isContentEditable(node)) {
|
|
|
return 0;
|
|
|
}
|
|
|
if ((node.nodeName === "AUDIO" || node.nodeName === "VIDEO" || node.nodeName === "DETAILS") && node.getAttribute("tabindex") === null) {
|
|
|
return 0;
|
|
|
}
|
|
|
return node.tabIndex;
|
|
|
};
|
|
|
var sortOrderedTabbables = function sortOrderedTabbables2(a, b) {
|
|
|
return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;
|
|
|
};
|
|
|
var isInput = function isInput2(node) {
|
|
|
return node.tagName === "INPUT";
|
|
|
};
|
|
|
var isHiddenInput = function isHiddenInput2(node) {
|
|
|
return isInput(node) && node.type === "hidden";
|
|
|
};
|
|
|
var isDetailsWithSummary = function isDetailsWithSummary2(node) {
|
|
|
var r2 = node.tagName === "DETAILS" && Array.prototype.slice.apply(node.children).some(function(child) {
|
|
|
return child.tagName === "SUMMARY";
|
|
|
});
|
|
|
return r2;
|
|
|
};
|
|
|
var getCheckedRadio = function getCheckedRadio2(nodes, form) {
|
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
|
if (nodes[i].checked && nodes[i].form === form) {
|
|
|
return nodes[i];
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
var isTabbableRadio = function isTabbableRadio2(node) {
|
|
|
if (!node.name) {
|
|
|
return true;
|
|
|
}
|
|
|
var radioScope = node.form || node.ownerDocument;
|
|
|
var queryRadios = function queryRadios2(name) {
|
|
|
return radioScope.querySelectorAll('input[type="radio"][name="' + name + '"]');
|
|
|
};
|
|
|
var radioSet;
|
|
|
if (typeof window !== "undefined" && typeof window.CSS !== "undefined" && typeof window.CSS.escape === "function") {
|
|
|
radioSet = queryRadios(window.CSS.escape(node.name));
|
|
|
} else {
|
|
|
try {
|
|
|
radioSet = queryRadios(node.name);
|
|
|
} catch (err) {
|
|
|
console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s", err.message);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
var checked = getCheckedRadio(radioSet, node.form);
|
|
|
return !checked || checked === node;
|
|
|
};
|
|
|
var isRadio = function isRadio2(node) {
|
|
|
return isInput(node) && node.type === "radio";
|
|
|
};
|
|
|
var isNonTabbableRadio = function isNonTabbableRadio2(node) {
|
|
|
return isRadio(node) && !isTabbableRadio(node);
|
|
|
};
|
|
|
var isHidden = function isHidden2(node, displayCheck) {
|
|
|
if (getComputedStyle(node).visibility === "hidden") {
|
|
|
return true;
|
|
|
}
|
|
|
var isDirectSummary = matches.call(node, "details>summary:first-of-type");
|
|
|
var nodeUnderDetails = isDirectSummary ? node.parentElement : node;
|
|
|
if (matches.call(nodeUnderDetails, "details:not([open]) *")) {
|
|
|
return true;
|
|
|
}
|
|
|
if (!displayCheck || displayCheck === "full") {
|
|
|
while (node) {
|
|
|
if (getComputedStyle(node).display === "none") {
|
|
|
return true;
|
|
|
}
|
|
|
node = node.parentElement;
|
|
|
}
|
|
|
} else if (displayCheck === "non-zero-area") {
|
|
|
var _node$getBoundingClie = node.getBoundingClientRect(), width = _node$getBoundingClie.width, height = _node$getBoundingClie.height;
|
|
|
return width === 0 && height === 0;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
var isDisabledFromFieldset = function isDisabledFromFieldset2(node) {
|
|
|
if (isInput(node) || node.tagName === "SELECT" || node.tagName === "TEXTAREA" || node.tagName === "BUTTON") {
|
|
|
var parentNode = node.parentElement;
|
|
|
while (parentNode) {
|
|
|
if (parentNode.tagName === "FIELDSET" && parentNode.disabled) {
|
|
|
for (var i = 0; i < parentNode.children.length; i++) {
|
|
|
var child = parentNode.children.item(i);
|
|
|
if (child.tagName === "LEGEND") {
|
|
|
if (child.contains(node)) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
parentNode = parentNode.parentElement;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
var isNodeMatchingSelectorFocusable = function isNodeMatchingSelectorFocusable2(options, node) {
|
|
|
if (node.disabled || isHiddenInput(node) || isHidden(node, options.displayCheck) || isDetailsWithSummary(node) || isDisabledFromFieldset(node)) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
var isNodeMatchingSelectorTabbable = function isNodeMatchingSelectorTabbable2(options, node) {
|
|
|
if (!isNodeMatchingSelectorFocusable(options, node) || isNonTabbableRadio(node) || getTabindex(node) < 0) {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
};
|
|
|
var tabbable = function tabbable2(el, options) {
|
|
|
options = options || {};
|
|
|
var regularTabbables = [];
|
|
|
var orderedTabbables = [];
|
|
|
var candidates = getCandidates(el, options.includeContainer, isNodeMatchingSelectorTabbable.bind(null, options));
|
|
|
candidates.forEach(function(candidate, i) {
|
|
|
var candidateTabindex = getTabindex(candidate);
|
|
|
if (candidateTabindex === 0) {
|
|
|
regularTabbables.push(candidate);
|
|
|
} else {
|
|
|
orderedTabbables.push({
|
|
|
documentOrder: i,
|
|
|
tabIndex: candidateTabindex,
|
|
|
node: candidate
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
var tabbableNodes = orderedTabbables.sort(sortOrderedTabbables).map(function(a) {
|
|
|
return a.node;
|
|
|
}).concat(regularTabbables);
|
|
|
return tabbableNodes;
|
|
|
};
|
|
|
var isTabbable = function isTabbable2(node, options) {
|
|
|
options = options || {};
|
|
|
if (!node) {
|
|
|
throw new Error("No node provided");
|
|
|
}
|
|
|
if (matches.call(node, candidateSelector) === false) {
|
|
|
return false;
|
|
|
}
|
|
|
return isNodeMatchingSelectorTabbable(options, node);
|
|
|
};
|
|
|
var focusableCandidateSelector = /* @__PURE__ */ candidateSelectors.concat("iframe").join(",");
|
|
|
var isFocusable = function isFocusable2(node, options) {
|
|
|
options = options || {};
|
|
|
if (!node) {
|
|
|
throw new Error("No node provided");
|
|
|
}
|
|
|
if (matches.call(node, focusableCandidateSelector) === false) {
|
|
|
return false;
|
|
|
}
|
|
|
return isNodeMatchingSelectorFocusable(options, node);
|
|
|
};
|
|
|
/*!
|
|
|
* focus-trap 6.7.2
|
|
|
* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
|
|
|
*/
|
|
|
function ownKeys$7(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
enumerableOnly && (symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
})), keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread2(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
i % 2 ? ownKeys$7(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty$1(target, key, source[key]);
|
|
|
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$7(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _defineProperty$1(obj, key, value) {
|
|
|
if (key in obj) {
|
|
|
Object.defineProperty(obj, key, {
|
|
|
value,
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
writable: true
|
|
|
});
|
|
|
} else {
|
|
|
obj[key] = value;
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
var activeFocusTraps = function() {
|
|
|
var trapQueue = [];
|
|
|
return {
|
|
|
activateTrap: function activateTrap(trap) {
|
|
|
if (trapQueue.length > 0) {
|
|
|
var activeTrap = trapQueue[trapQueue.length - 1];
|
|
|
if (activeTrap !== trap) {
|
|
|
activeTrap.pause();
|
|
|
}
|
|
|
}
|
|
|
var trapIndex = trapQueue.indexOf(trap);
|
|
|
if (trapIndex === -1) {
|
|
|
trapQueue.push(trap);
|
|
|
} else {
|
|
|
trapQueue.splice(trapIndex, 1);
|
|
|
trapQueue.push(trap);
|
|
|
}
|
|
|
},
|
|
|
deactivateTrap: function deactivateTrap(trap) {
|
|
|
var trapIndex = trapQueue.indexOf(trap);
|
|
|
if (trapIndex !== -1) {
|
|
|
trapQueue.splice(trapIndex, 1);
|
|
|
}
|
|
|
if (trapQueue.length > 0) {
|
|
|
trapQueue[trapQueue.length - 1].unpause();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}();
|
|
|
var isSelectableInput = function isSelectableInput2(node) {
|
|
|
return node.tagName && node.tagName.toLowerCase() === "input" && typeof node.select === "function";
|
|
|
};
|
|
|
var isEscapeEvent = function isEscapeEvent2(e) {
|
|
|
return e.key === "Escape" || e.key === "Esc" || e.keyCode === 27;
|
|
|
};
|
|
|
var isTabEvent = function isTabEvent2(e) {
|
|
|
return e.key === "Tab" || e.keyCode === 9;
|
|
|
};
|
|
|
var delay = function delay2(fn2) {
|
|
|
return setTimeout(fn2, 0);
|
|
|
};
|
|
|
var findIndex = function findIndex2(arr, fn2) {
|
|
|
var idx = -1;
|
|
|
arr.every(function(value, i) {
|
|
|
if (fn2(value)) {
|
|
|
idx = i;
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
});
|
|
|
return idx;
|
|
|
};
|
|
|
var valueOrHandler = function valueOrHandler2(value) {
|
|
|
for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
|
params[_key - 1] = arguments[_key];
|
|
|
}
|
|
|
return typeof value === "function" ? value.apply(void 0, params) : value;
|
|
|
};
|
|
|
var getActualTarget = function getActualTarget2(event) {
|
|
|
return event.target.shadowRoot && typeof event.composedPath === "function" ? event.composedPath()[0] : event.target;
|
|
|
};
|
|
|
var createFocusTrap$1 = function createFocusTrap2(elements, userOptions) {
|
|
|
var doc = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.document) || document;
|
|
|
var config = _objectSpread2({
|
|
|
returnFocusOnDeactivate: true,
|
|
|
escapeDeactivates: true,
|
|
|
delayInitialFocus: true
|
|
|
}, userOptions);
|
|
|
var state = {
|
|
|
containers: [],
|
|
|
tabbableGroups: [],
|
|
|
nodeFocusedBeforeActivation: null,
|
|
|
mostRecentlyFocusedNode: null,
|
|
|
active: false,
|
|
|
paused: false,
|
|
|
delayInitialFocusTimer: void 0
|
|
|
};
|
|
|
var trap;
|
|
|
var getOption = function getOption2(configOverrideOptions, optionName, configOptionName) {
|
|
|
return configOverrideOptions && configOverrideOptions[optionName] !== void 0 ? configOverrideOptions[optionName] : config[configOptionName || optionName];
|
|
|
};
|
|
|
var containersContain = function containersContain2(element) {
|
|
|
return !!(element && state.containers.some(function(container) {
|
|
|
return container.contains(element);
|
|
|
}));
|
|
|
};
|
|
|
var getNodeForOption = function getNodeForOption2(optionName) {
|
|
|
var optionValue = config[optionName];
|
|
|
if (typeof optionValue === "function") {
|
|
|
for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
|
params[_key2 - 1] = arguments[_key2];
|
|
|
}
|
|
|
optionValue = optionValue.apply(void 0, params);
|
|
|
}
|
|
|
if (!optionValue) {
|
|
|
if (optionValue === void 0 || optionValue === false) {
|
|
|
return optionValue;
|
|
|
}
|
|
|
throw new Error("`".concat(optionName, "` was specified but was not a node, or did not return a node"));
|
|
|
}
|
|
|
var node = optionValue;
|
|
|
if (typeof optionValue === "string") {
|
|
|
node = doc.querySelector(optionValue);
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` as selector refers to no known node"));
|
|
|
}
|
|
|
}
|
|
|
return node;
|
|
|
};
|
|
|
var getInitialFocusNode = function getInitialFocusNode2() {
|
|
|
var node = getNodeForOption("initialFocus");
|
|
|
if (node === false) {
|
|
|
return false;
|
|
|
}
|
|
|
if (node === void 0) {
|
|
|
if (containersContain(doc.activeElement)) {
|
|
|
node = doc.activeElement;
|
|
|
} else {
|
|
|
var firstTabbableGroup = state.tabbableGroups[0];
|
|
|
var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;
|
|
|
node = firstTabbableNode || getNodeForOption("fallbackFocus");
|
|
|
}
|
|
|
}
|
|
|
if (!node) {
|
|
|
throw new Error("Your focus-trap needs to have at least one focusable element");
|
|
|
}
|
|
|
return node;
|
|
|
};
|
|
|
var updateTabbableNodes = function updateTabbableNodes2() {
|
|
|
state.tabbableGroups = state.containers.map(function(container) {
|
|
|
var tabbableNodes = tabbable(container);
|
|
|
if (tabbableNodes.length > 0) {
|
|
|
return {
|
|
|
container,
|
|
|
firstTabbableNode: tabbableNodes[0],
|
|
|
lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]
|
|
|
};
|
|
|
}
|
|
|
return void 0;
|
|
|
}).filter(function(group) {
|
|
|
return !!group;
|
|
|
});
|
|
|
if (state.tabbableGroups.length <= 0 && !getNodeForOption("fallbackFocus")) {
|
|
|
throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");
|
|
|
}
|
|
|
};
|
|
|
var tryFocus = function tryFocus2(node) {
|
|
|
if (node === false) {
|
|
|
return;
|
|
|
}
|
|
|
if (node === doc.activeElement) {
|
|
|
return;
|
|
|
}
|
|
|
if (!node || !node.focus) {
|
|
|
tryFocus2(getInitialFocusNode());
|
|
|
return;
|
|
|
}
|
|
|
node.focus({
|
|
|
preventScroll: !!config.preventScroll
|
|
|
});
|
|
|
state.mostRecentlyFocusedNode = node;
|
|
|
if (isSelectableInput(node)) {
|
|
|
node.select();
|
|
|
}
|
|
|
};
|
|
|
var getReturnFocusNode = function getReturnFocusNode2(previousActiveElement) {
|
|
|
var node = getNodeForOption("setReturnFocus", previousActiveElement);
|
|
|
return node ? node : node === false ? false : previousActiveElement;
|
|
|
};
|
|
|
var checkPointerDown = function checkPointerDown2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
if (containersContain(target)) {
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.clickOutsideDeactivates, e)) {
|
|
|
trap.deactivate({
|
|
|
returnFocus: config.returnFocusOnDeactivate && !isFocusable(target)
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.allowOutsideClick, e)) {
|
|
|
return;
|
|
|
}
|
|
|
e.preventDefault();
|
|
|
};
|
|
|
var checkFocusIn = function checkFocusIn2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
var targetContained = containersContain(target);
|
|
|
if (targetContained || target instanceof Document) {
|
|
|
if (targetContained) {
|
|
|
state.mostRecentlyFocusedNode = target;
|
|
|
}
|
|
|
} else {
|
|
|
e.stopImmediatePropagation();
|
|
|
tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());
|
|
|
}
|
|
|
};
|
|
|
var checkTab = function checkTab2(e) {
|
|
|
var target = getActualTarget(e);
|
|
|
updateTabbableNodes();
|
|
|
var destinationNode = null;
|
|
|
if (state.tabbableGroups.length > 0) {
|
|
|
var containerIndex = findIndex(state.tabbableGroups, function(_ref) {
|
|
|
var container = _ref.container;
|
|
|
return container.contains(target);
|
|
|
});
|
|
|
if (containerIndex < 0) {
|
|
|
if (e.shiftKey) {
|
|
|
destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode;
|
|
|
} else {
|
|
|
destinationNode = state.tabbableGroups[0].firstTabbableNode;
|
|
|
}
|
|
|
} else if (e.shiftKey) {
|
|
|
var startOfGroupIndex = findIndex(state.tabbableGroups, function(_ref2) {
|
|
|
var firstTabbableNode = _ref2.firstTabbableNode;
|
|
|
return target === firstTabbableNode;
|
|
|
});
|
|
|
if (startOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) {
|
|
|
startOfGroupIndex = containerIndex;
|
|
|
}
|
|
|
if (startOfGroupIndex >= 0) {
|
|
|
var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;
|
|
|
var destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
|
destinationNode = destinationGroup.lastTabbableNode;
|
|
|
}
|
|
|
} else {
|
|
|
var lastOfGroupIndex = findIndex(state.tabbableGroups, function(_ref3) {
|
|
|
var lastTabbableNode = _ref3.lastTabbableNode;
|
|
|
return target === lastTabbableNode;
|
|
|
});
|
|
|
if (lastOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) {
|
|
|
lastOfGroupIndex = containerIndex;
|
|
|
}
|
|
|
if (lastOfGroupIndex >= 0) {
|
|
|
var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;
|
|
|
var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];
|
|
|
destinationNode = _destinationGroup.firstTabbableNode;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
destinationNode = getNodeForOption("fallbackFocus");
|
|
|
}
|
|
|
if (destinationNode) {
|
|
|
e.preventDefault();
|
|
|
tryFocus(destinationNode);
|
|
|
}
|
|
|
};
|
|
|
var checkKey = function checkKey2(e) {
|
|
|
if (isEscapeEvent(e) && valueOrHandler(config.escapeDeactivates, e) !== false) {
|
|
|
e.preventDefault();
|
|
|
trap.deactivate();
|
|
|
return;
|
|
|
}
|
|
|
if (isTabEvent(e)) {
|
|
|
checkTab(e);
|
|
|
return;
|
|
|
}
|
|
|
};
|
|
|
var checkClick = function checkClick2(e) {
|
|
|
if (valueOrHandler(config.clickOutsideDeactivates, e)) {
|
|
|
return;
|
|
|
}
|
|
|
var target = getActualTarget(e);
|
|
|
if (containersContain(target)) {
|
|
|
return;
|
|
|
}
|
|
|
if (valueOrHandler(config.allowOutsideClick, e)) {
|
|
|
return;
|
|
|
}
|
|
|
e.preventDefault();
|
|
|
e.stopImmediatePropagation();
|
|
|
};
|
|
|
var addListeners = function addListeners2() {
|
|
|
if (!state.active) {
|
|
|
return;
|
|
|
}
|
|
|
activeFocusTraps.activateTrap(trap);
|
|
|
state.delayInitialFocusTimer = config.delayInitialFocus ? delay(function() {
|
|
|
tryFocus(getInitialFocusNode());
|
|
|
}) : tryFocus(getInitialFocusNode());
|
|
|
doc.addEventListener("focusin", checkFocusIn, true);
|
|
|
doc.addEventListener("mousedown", checkPointerDown, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("touchstart", checkPointerDown, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("click", checkClick, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
doc.addEventListener("keydown", checkKey, {
|
|
|
capture: true,
|
|
|
passive: false
|
|
|
});
|
|
|
return trap;
|
|
|
};
|
|
|
var removeListeners = function removeListeners2() {
|
|
|
if (!state.active) {
|
|
|
return;
|
|
|
}
|
|
|
doc.removeEventListener("focusin", checkFocusIn, true);
|
|
|
doc.removeEventListener("mousedown", checkPointerDown, true);
|
|
|
doc.removeEventListener("touchstart", checkPointerDown, true);
|
|
|
doc.removeEventListener("click", checkClick, true);
|
|
|
doc.removeEventListener("keydown", checkKey, true);
|
|
|
return trap;
|
|
|
};
|
|
|
trap = {
|
|
|
activate: function activate(activateOptions) {
|
|
|
if (state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
var onActivate = getOption(activateOptions, "onActivate");
|
|
|
var onPostActivate = getOption(activateOptions, "onPostActivate");
|
|
|
var checkCanFocusTrap = getOption(activateOptions, "checkCanFocusTrap");
|
|
|
if (!checkCanFocusTrap) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
state.active = true;
|
|
|
state.paused = false;
|
|
|
state.nodeFocusedBeforeActivation = doc.activeElement;
|
|
|
if (onActivate) {
|
|
|
onActivate();
|
|
|
}
|
|
|
var finishActivation = function finishActivation2() {
|
|
|
if (checkCanFocusTrap) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
addListeners();
|
|
|
if (onPostActivate) {
|
|
|
onPostActivate();
|
|
|
}
|
|
|
};
|
|
|
if (checkCanFocusTrap) {
|
|
|
checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation);
|
|
|
return this;
|
|
|
}
|
|
|
finishActivation();
|
|
|
return this;
|
|
|
},
|
|
|
deactivate: function deactivate(deactivateOptions) {
|
|
|
if (!state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
clearTimeout(state.delayInitialFocusTimer);
|
|
|
state.delayInitialFocusTimer = void 0;
|
|
|
removeListeners();
|
|
|
state.active = false;
|
|
|
state.paused = false;
|
|
|
activeFocusTraps.deactivateTrap(trap);
|
|
|
var onDeactivate = getOption(deactivateOptions, "onDeactivate");
|
|
|
var onPostDeactivate = getOption(deactivateOptions, "onPostDeactivate");
|
|
|
var checkCanReturnFocus = getOption(deactivateOptions, "checkCanReturnFocus");
|
|
|
if (onDeactivate) {
|
|
|
onDeactivate();
|
|
|
}
|
|
|
var returnFocus = getOption(deactivateOptions, "returnFocus", "returnFocusOnDeactivate");
|
|
|
var finishDeactivation = function finishDeactivation2() {
|
|
|
delay(function() {
|
|
|
if (returnFocus) {
|
|
|
tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));
|
|
|
}
|
|
|
if (onPostDeactivate) {
|
|
|
onPostDeactivate();
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
if (returnFocus && checkCanReturnFocus) {
|
|
|
checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation);
|
|
|
return this;
|
|
|
}
|
|
|
finishDeactivation();
|
|
|
return this;
|
|
|
},
|
|
|
pause: function pause() {
|
|
|
if (state.paused || !state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
state.paused = true;
|
|
|
removeListeners();
|
|
|
return this;
|
|
|
},
|
|
|
unpause: function unpause() {
|
|
|
if (!state.paused || !state.active) {
|
|
|
return this;
|
|
|
}
|
|
|
state.paused = false;
|
|
|
updateTabbableNodes();
|
|
|
addListeners();
|
|
|
return this;
|
|
|
},
|
|
|
updateContainerElements: function updateContainerElements(containerElements) {
|
|
|
var elementsAsArray = [].concat(containerElements).filter(Boolean);
|
|
|
state.containers = elementsAsArray.map(function(element) {
|
|
|
return typeof element === "string" ? doc.querySelector(element) : element;
|
|
|
});
|
|
|
if (state.active) {
|
|
|
updateTabbableNodes();
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
};
|
|
|
trap.updateContainerElements(elements);
|
|
|
return trap;
|
|
|
};
|
|
|
var focusTrap_esm = /* @__PURE__ */ Object.freeze({
|
|
|
__proto__: null,
|
|
|
[Symbol.toStringTag]: "Module",
|
|
|
createFocusTrap: createFocusTrap$1
|
|
|
});
|
|
|
var require$$3 = /* @__PURE__ */ getAugmentedNamespace(focusTrap_esm);
|
|
|
function _typeof$1(obj) {
|
|
|
"@babel/helpers - typeof";
|
|
|
return _typeof$1 = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(obj2) {
|
|
|
return typeof obj2;
|
|
|
} : function(obj2) {
|
|
|
return obj2 && typeof Symbol == "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
|
}, _typeof$1(obj);
|
|
|
}
|
|
|
function _classCallCheck$1(instance2, Constructor) {
|
|
|
if (!(instance2 instanceof Constructor)) {
|
|
|
throw new TypeError("Cannot call a class as a function");
|
|
|
}
|
|
|
}
|
|
|
function _defineProperties$1(target, props) {
|
|
|
for (var i = 0; i < props.length; i++) {
|
|
|
var descriptor = props[i];
|
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
|
descriptor.configurable = true;
|
|
|
if ("value" in descriptor)
|
|
|
descriptor.writable = true;
|
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
|
}
|
|
|
}
|
|
|
function _createClass$1(Constructor, protoProps, staticProps) {
|
|
|
if (protoProps)
|
|
|
_defineProperties$1(Constructor.prototype, protoProps);
|
|
|
if (staticProps)
|
|
|
_defineProperties$1(Constructor, staticProps);
|
|
|
Object.defineProperty(Constructor, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
return Constructor;
|
|
|
}
|
|
|
function _inherits$1(subClass, superClass) {
|
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
|
}
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
|
constructor: {
|
|
|
value: subClass,
|
|
|
writable: true,
|
|
|
configurable: true
|
|
|
}
|
|
|
});
|
|
|
Object.defineProperty(subClass, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
if (superClass)
|
|
|
_setPrototypeOf$1(subClass, superClass);
|
|
|
}
|
|
|
function _setPrototypeOf$1(o, p2) {
|
|
|
_setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) {
|
|
|
o2.__proto__ = p3;
|
|
|
return o2;
|
|
|
};
|
|
|
return _setPrototypeOf$1(o, p2);
|
|
|
}
|
|
|
function _createSuper$4(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct$4();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf$1(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf$1(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn$1(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _possibleConstructorReturn$1(self2, call) {
|
|
|
if (call && (_typeof$1(call) === "object" || typeof call === "function")) {
|
|
|
return call;
|
|
|
} else if (call !== void 0) {
|
|
|
throw new TypeError("Derived constructors may only return object or undefined");
|
|
|
}
|
|
|
return _assertThisInitialized$1(self2);
|
|
|
}
|
|
|
function _assertThisInitialized$1(self2) {
|
|
|
if (self2 === void 0) {
|
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
|
}
|
|
|
return self2;
|
|
|
}
|
|
|
function _isNativeReflectConstruct$4() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function _getPrototypeOf$1(o) {
|
|
|
_getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
|
|
|
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
|
};
|
|
|
return _getPrototypeOf$1(o);
|
|
|
}
|
|
|
var React = _react_17_0_2_react.exports;
|
|
|
var ReactDOM = _reactDom_17_0_2_reactDom.exports;
|
|
|
var PropTypes = _propTypes_15_8_1_propTypes.exports;
|
|
|
var _require = require$$3, createFocusTrap = _require.createFocusTrap;
|
|
|
var FocusTrap = /* @__PURE__ */ function(_React$Component) {
|
|
|
_inherits$1(FocusTrap2, _React$Component);
|
|
|
var _super = _createSuper$4(FocusTrap2);
|
|
|
function FocusTrap2(props) {
|
|
|
var _this;
|
|
|
_classCallCheck$1(this, FocusTrap2);
|
|
|
_this = _super.call(this, props);
|
|
|
_this.tailoredFocusTrapOptions = {
|
|
|
returnFocusOnDeactivate: false
|
|
|
};
|
|
|
_this.returnFocusOnDeactivate = true;
|
|
|
var focusTrapOptions = props.focusTrapOptions;
|
|
|
for (var optionName in focusTrapOptions) {
|
|
|
if (!Object.prototype.hasOwnProperty.call(focusTrapOptions, optionName)) {
|
|
|
continue;
|
|
|
}
|
|
|
if (optionName === "returnFocusOnDeactivate") {
|
|
|
_this.returnFocusOnDeactivate = !!focusTrapOptions[optionName];
|
|
|
continue;
|
|
|
}
|
|
|
if (optionName === "onPostDeactivate") {
|
|
|
_this.onPostDeactivate = focusTrapOptions[optionName];
|
|
|
continue;
|
|
|
}
|
|
|
_this.tailoredFocusTrapOptions[optionName] = focusTrapOptions[optionName];
|
|
|
}
|
|
|
_this.focusTrapElements = props.containerElements || [];
|
|
|
_this.updatePreviousElement();
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass$1(FocusTrap2, [{
|
|
|
key: "getDocument",
|
|
|
value: function getDocument() {
|
|
|
return this.props.focusTrapOptions.document || (typeof document !== "undefined" ? document : void 0);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getNodeForOption",
|
|
|
value: function getNodeForOption(optionName) {
|
|
|
var optionValue = this.tailoredFocusTrapOptions[optionName];
|
|
|
if (!optionValue) {
|
|
|
return null;
|
|
|
}
|
|
|
var node = optionValue;
|
|
|
if (typeof optionValue === "string") {
|
|
|
var _this$getDocument;
|
|
|
node = (_this$getDocument = this.getDocument()) === null || _this$getDocument === void 0 ? void 0 : _this$getDocument.querySelector(optionValue);
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` refers to no known node"));
|
|
|
}
|
|
|
}
|
|
|
if (typeof optionValue === "function") {
|
|
|
node = optionValue();
|
|
|
if (!node) {
|
|
|
throw new Error("`".concat(optionName, "` did not return a node"));
|
|
|
}
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getReturnFocusNode",
|
|
|
value: function getReturnFocusNode() {
|
|
|
var node = this.getNodeForOption("setReturnFocus");
|
|
|
return node ? node : this.previouslyFocusedElement;
|
|
|
}
|
|
|
}, {
|
|
|
key: "updatePreviousElement",
|
|
|
value: function updatePreviousElement() {
|
|
|
var currentDocument = this.getDocument();
|
|
|
if (currentDocument) {
|
|
|
this.previouslyFocusedElement = currentDocument.activeElement;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "deactivateTrap",
|
|
|
value: function deactivateTrap() {
|
|
|
var _this2 = this;
|
|
|
var _this$tailoredFocusTr = this.tailoredFocusTrapOptions, checkCanReturnFocus = _this$tailoredFocusTr.checkCanReturnFocus, _this$tailoredFocusTr2 = _this$tailoredFocusTr.preventScroll, preventScroll = _this$tailoredFocusTr2 === void 0 ? false : _this$tailoredFocusTr2;
|
|
|
if (this.focusTrap) {
|
|
|
this.focusTrap.deactivate({
|
|
|
returnFocus: false
|
|
|
});
|
|
|
}
|
|
|
var finishDeactivation = function finishDeactivation2() {
|
|
|
var returnFocusNode = _this2.getReturnFocusNode();
|
|
|
var canReturnFocus = (returnFocusNode === null || returnFocusNode === void 0 ? void 0 : returnFocusNode.focus) && _this2.returnFocusOnDeactivate;
|
|
|
if (canReturnFocus) {
|
|
|
returnFocusNode.focus({
|
|
|
preventScroll
|
|
|
});
|
|
|
}
|
|
|
if (_this2.onPostDeactivate) {
|
|
|
_this2.onPostDeactivate.call(null);
|
|
|
}
|
|
|
};
|
|
|
if (checkCanReturnFocus) {
|
|
|
checkCanReturnFocus(this.getReturnFocusNode()).then(finishDeactivation, finishDeactivation);
|
|
|
} else {
|
|
|
finishDeactivation();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "setupFocusTrap",
|
|
|
value: function setupFocusTrap() {
|
|
|
if (!this.focusTrap) {
|
|
|
var focusTrapElementDOMNodes = this.focusTrapElements.map(ReactDOM.findDOMNode);
|
|
|
var nodesExist = focusTrapElementDOMNodes.some(Boolean);
|
|
|
if (nodesExist) {
|
|
|
this.focusTrap = this.props._createFocusTrap(focusTrapElementDOMNodes, this.tailoredFocusTrapOptions);
|
|
|
if (this.props.active) {
|
|
|
this.focusTrap.activate();
|
|
|
}
|
|
|
if (this.props.paused) {
|
|
|
this.focusTrap.pause();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
if (this.props.active) {
|
|
|
this.setupFocusTrap();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(prevProps) {
|
|
|
if (this.focusTrap) {
|
|
|
if (prevProps.containerElements !== this.props.containerElements) {
|
|
|
this.focusTrap.updateContainerElements(this.props.containerElements);
|
|
|
}
|
|
|
var hasActivated = !prevProps.active && this.props.active;
|
|
|
var hasDeactivated = prevProps.active && !this.props.active;
|
|
|
var hasPaused = !prevProps.paused && this.props.paused;
|
|
|
var hasUnpaused = prevProps.paused && !this.props.paused;
|
|
|
if (hasActivated) {
|
|
|
this.updatePreviousElement();
|
|
|
this.focusTrap.activate();
|
|
|
}
|
|
|
if (hasDeactivated) {
|
|
|
this.deactivateTrap();
|
|
|
return;
|
|
|
}
|
|
|
if (hasPaused) {
|
|
|
this.focusTrap.pause();
|
|
|
}
|
|
|
if (hasUnpaused) {
|
|
|
this.focusTrap.unpause();
|
|
|
}
|
|
|
} else {
|
|
|
if (prevProps.containerElements !== this.props.containerElements) {
|
|
|
this.focusTrapElements = this.props.containerElements;
|
|
|
}
|
|
|
if (this.props.active) {
|
|
|
this.updatePreviousElement();
|
|
|
this.setupFocusTrap();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.deactivateTrap();
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this3 = this;
|
|
|
var child = this.props.children ? React.Children.only(this.props.children) : void 0;
|
|
|
if (child) {
|
|
|
if (child.type && child.type === React.Fragment) {
|
|
|
throw new Error("A focus-trap cannot use a Fragment as its child container. Try replacing it with a <div> element.");
|
|
|
}
|
|
|
var composedRefCallback = function composedRefCallback2(element) {
|
|
|
var containerElements = _this3.props.containerElements;
|
|
|
if (child) {
|
|
|
if (typeof child.ref === "function") {
|
|
|
child.ref(element);
|
|
|
} else if (child.ref) {
|
|
|
child.ref.current = element;
|
|
|
}
|
|
|
}
|
|
|
_this3.focusTrapElements = containerElements ? containerElements : [element];
|
|
|
};
|
|
|
var childWithRef = React.cloneElement(child, {
|
|
|
ref: composedRefCallback
|
|
|
});
|
|
|
return childWithRef;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
}]);
|
|
|
return FocusTrap2;
|
|
|
}(React.Component);
|
|
|
var ElementType = typeof Element === "undefined" ? Function : Element;
|
|
|
FocusTrap.propTypes = {
|
|
|
active: PropTypes.bool,
|
|
|
paused: PropTypes.bool,
|
|
|
focusTrapOptions: PropTypes.shape({
|
|
|
document: PropTypes.object,
|
|
|
onActivate: PropTypes.func,
|
|
|
onPostActivate: PropTypes.func,
|
|
|
checkCanFocusTrap: PropTypes.func,
|
|
|
onDeactivate: PropTypes.func,
|
|
|
onPostDeactivate: PropTypes.func,
|
|
|
checkCanReturnFocus: PropTypes.func,
|
|
|
initialFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func, PropTypes.bool]),
|
|
|
fallbackFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]),
|
|
|
escapeDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
clickOutsideDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
returnFocusOnDeactivate: PropTypes.bool,
|
|
|
setReturnFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]),
|
|
|
allowOutsideClick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
|
preventScroll: PropTypes.bool
|
|
|
}),
|
|
|
containerElements: PropTypes.arrayOf(PropTypes.instanceOf(ElementType)),
|
|
|
children: PropTypes.oneOfType([
|
|
|
PropTypes.element,
|
|
|
PropTypes.instanceOf(ElementType)
|
|
|
])
|
|
|
};
|
|
|
FocusTrap.defaultProps = {
|
|
|
active: true,
|
|
|
paused: false,
|
|
|
focusTrapOptions: {},
|
|
|
_createFocusTrap: createFocusTrap
|
|
|
};
|
|
|
var focusTrapReact = FocusTrap;
|
|
|
function useToggle(initialState = false) {
|
|
|
const [state, setState] = _react_17_0_2_react.exports.useState(initialState);
|
|
|
const toggle = _react_17_0_2_react.exports.useCallback((nextState) => {
|
|
|
if (nextState !== void 0) {
|
|
|
setState(nextState);
|
|
|
} else {
|
|
|
setState((state2) => !state2);
|
|
|
}
|
|
|
}, []);
|
|
|
return [state, toggle];
|
|
|
}
|
|
|
const getCursorPostion = (input) => {
|
|
|
const {
|
|
|
offsetLeft: inputX,
|
|
|
offsetTop: inputY,
|
|
|
offsetHeight: inputH,
|
|
|
offsetWidth: inputW,
|
|
|
selectionEnd: selectionPoint
|
|
|
} = input;
|
|
|
const div = document.createElement("div");
|
|
|
const copyStyle = window.getComputedStyle(input);
|
|
|
for (const item of copyStyle) {
|
|
|
div.style.setProperty(item, copyStyle.getPropertyValue(item));
|
|
|
}
|
|
|
div.style.position = "fixed";
|
|
|
div.style.visibility = "hidden";
|
|
|
div.style.whiteSpace = "pre-wrap";
|
|
|
const swap = ".";
|
|
|
const inputValue = input.tagName === "INPUT" ? input.value.replace(/ /g, swap) : input.value;
|
|
|
const textContent = inputValue.substring(0, selectionPoint || 0);
|
|
|
div.textContent = textContent;
|
|
|
if (input.tagName === "TEXTAREA") {
|
|
|
div.style.height = "auto";
|
|
|
}
|
|
|
const span = document.createElement("span");
|
|
|
span.textContent = inputValue.substring(selectionPoint || 0) || ".";
|
|
|
div.appendChild(span);
|
|
|
document.body.appendChild(div);
|
|
|
const {
|
|
|
offsetLeft: spanX,
|
|
|
offsetTop: spanY,
|
|
|
offsetHeight: spanH,
|
|
|
offsetWidth: spanW
|
|
|
} = span;
|
|
|
document.body.removeChild(div);
|
|
|
return {
|
|
|
x: inputX + spanX,
|
|
|
y: inputY + spanY,
|
|
|
h: inputH + spanH,
|
|
|
w: inputW + spanW
|
|
|
};
|
|
|
};
|
|
|
let isList;
|
|
|
let isEditor = false;
|
|
|
let isEditorGo = false;
|
|
|
let positionX;
|
|
|
const MemoEditor = () => {
|
|
|
const {
|
|
|
globalState
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [isListShown, toggleList] = useToggle(false);
|
|
|
const [isEditorShown, toggleEditor] = useToggle(false);
|
|
|
const editorRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const prevGlobalStateRef = _react_17_0_2_react.exports.useRef(globalState);
|
|
|
const [selected, setSelected] = _react_17_0_2_react.exports.useState();
|
|
|
const [isPopperOpen, setIsPopperOpen] = _react_17_0_2_react.exports.useState(false);
|
|
|
const {
|
|
|
app: app2
|
|
|
} = dailyNotesService.getState();
|
|
|
const popperRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const [popperElement, setPopperElement] = _react_17_0_2_react.exports.useState(null);
|
|
|
let popper2;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (DefaultPrefix === "List") {
|
|
|
isList = false;
|
|
|
toggleList(false);
|
|
|
} else {
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if ((require$$0.Platform.isMobile === true || window.innerWidth < 875) && UseButtonToShowEditor) {
|
|
|
toggleEditor(true);
|
|
|
}
|
|
|
if (FocusOnEditor) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
}
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a, _b;
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (UseButtonToShowEditor === true && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) {
|
|
|
const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
let memosHeight;
|
|
|
let leafView;
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
leafView = leaf.view.containerEl;
|
|
|
memosHeight = leafView.offsetHeight;
|
|
|
} else {
|
|
|
leafView = document;
|
|
|
memosHeight = window.innerHeight;
|
|
|
}
|
|
|
const divThis = document.createElement("img");
|
|
|
const memoEditorDiv = leafView.querySelector("div[data-type='memos_view'] .view-content .memo-editor-wrapper");
|
|
|
divThis.src = `${showEditorSvg}`;
|
|
|
if (isEditorShown) {
|
|
|
divThis.className = "memo-show-editor-button hidden";
|
|
|
} else {
|
|
|
divThis.className = "memo-show-editor-button";
|
|
|
}
|
|
|
const buttonTop = memosHeight - 200;
|
|
|
const buttonLeft = window.innerWidth / 2 - 25;
|
|
|
divThis.style.top = buttonTop + "px";
|
|
|
divThis.style.left = buttonLeft + "px";
|
|
|
divThis.onclick = function() {
|
|
|
let scaleElementAni = divThis.animate([
|
|
|
{
|
|
|
transform: "rotate(0deg) scale(1)"
|
|
|
},
|
|
|
{
|
|
|
transform: "rotate(60deg) scale(1.5)"
|
|
|
}
|
|
|
], {
|
|
|
duration: 300,
|
|
|
iterations: Infinity
|
|
|
});
|
|
|
setTimeout(() => {
|
|
|
var _a2;
|
|
|
divThis.className = "memo-show-editor-button hidden";
|
|
|
handleShowEditor();
|
|
|
(_a2 = editorRef.current) == null ? void 0 : _a2.focus();
|
|
|
scaleElementAni.reverse();
|
|
|
}, 300);
|
|
|
};
|
|
|
leafView.querySelector(".content-wrapper").prepend(divThis);
|
|
|
const memolistScroll = leafView.querySelector(".memolist-wrapper");
|
|
|
memolistScroll.onscroll = function() {
|
|
|
if (isEditor && !isEditorGo) {
|
|
|
isEditorGo = true;
|
|
|
let scaleEditorElementAni = memoEditorDiv.animate([
|
|
|
{
|
|
|
transform: "scale(1)",
|
|
|
opacity: 1
|
|
|
},
|
|
|
{
|
|
|
transform: "scale(0.4)",
|
|
|
opacity: 0
|
|
|
}
|
|
|
], {
|
|
|
duration: 300,
|
|
|
iterations: 1
|
|
|
});
|
|
|
let scaleOneElementAni;
|
|
|
setTimeout(() => {
|
|
|
scaleOneElementAni = divThis.animate([
|
|
|
{
|
|
|
transform: "rotate(20deg) scale(1.5)"
|
|
|
},
|
|
|
{
|
|
|
transform: "rotate(0deg) scale(1)"
|
|
|
}
|
|
|
], {
|
|
|
duration: 100,
|
|
|
iterations: 1
|
|
|
});
|
|
|
}, 300);
|
|
|
setTimeout(() => {
|
|
|
handleShowEditor(true);
|
|
|
divThis.className = "memo-show-editor-button";
|
|
|
}, 300);
|
|
|
setTimeout(() => {
|
|
|
scaleOneElementAni.cancel();
|
|
|
scaleEditorElementAni.reverse();
|
|
|
}, 700);
|
|
|
}
|
|
|
};
|
|
|
} else if (UseButtonToShowEditor === false && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) {
|
|
|
handleShowEditor(false);
|
|
|
if (FocusOnEditor) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
}
|
|
|
} else {
|
|
|
if (!isEditor) {
|
|
|
handleShowEditor(false);
|
|
|
}
|
|
|
if (FocusOnEditor) {
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.focus();
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "right-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["bottom"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (require$$0.Platform.isMobile && DefaultEditorLocation !== "Bottom") {
|
|
|
const seletorPopupWidth = 280;
|
|
|
if (window.innerWidth - positionX > seletorPopupWidth * 1.2) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "right-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["left-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (window.innerWidth - positionX < seletorPopupWidth && window.innerWidth > seletorPopupWidth * 1.5) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "left-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["right-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "bottom",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["bottom"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
}
|
|
|
} else if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") {
|
|
|
const seletorPopupWidth = 280;
|
|
|
if (window.innerWidth - positionX > seletorPopupWidth * 1.2) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top-end",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top-start"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else if (window.innerWidth - positionX < seletorPopupWidth && positionX > seletorPopupWidth) {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top-start",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top-end"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
} else {
|
|
|
popper2 = usePopper(popperRef.current, popperElement, {
|
|
|
placement: "top",
|
|
|
modifiers: [{
|
|
|
name: "flip",
|
|
|
options: {
|
|
|
allowedAutoPlacements: ["top"],
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}, {
|
|
|
name: "preventOverflow",
|
|
|
options: {
|
|
|
rootBoundary: "document"
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
const closePopper = () => {
|
|
|
setIsPopperOpen(false);
|
|
|
};
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a, _b, _c, _d, _e;
|
|
|
if (globalState.markMemoId) {
|
|
|
const editorCurrentValue = (_a = editorRef.current) == null ? void 0 : _a.getContent();
|
|
|
const memoLinkText = `${editorCurrentValue ? "\n" : ""}${t("MARK")}: [@MEMO](${globalState.markMemoId})`;
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.insertText(memoLinkText);
|
|
|
globalStateService.setMarkMemoId("");
|
|
|
}
|
|
|
if (globalState.editMemoId && globalState.editMemoId !== prevGlobalStateRef.current.editMemoId) {
|
|
|
const editMemo = memoService.getMemoById(globalState.editMemoId);
|
|
|
if (editMemo) {
|
|
|
(_d = editorRef.current) == null ? void 0 : _d.setContent((_c = editMemo.content.replace(/\<br\>/g, "\n")) != null ? _c : "");
|
|
|
(_e = editorRef.current) == null ? void 0 : _e.focus();
|
|
|
}
|
|
|
}
|
|
|
prevGlobalStateRef.current = globalState;
|
|
|
}, [globalState.markMemoId, globalState.editMemoId]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const handlePasteEvent = async (event) => {
|
|
|
var _a;
|
|
|
if (event.clipboardData && event.clipboardData.files.length > 0) {
|
|
|
event.preventDefault();
|
|
|
const file = event.clipboardData.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const handleDropEvent = async (event) => {
|
|
|
var _a;
|
|
|
if (event.dataTransfer && event.dataTransfer.files.length > 0) {
|
|
|
event.preventDefault();
|
|
|
const file = event.dataTransfer.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const handleClickEvent = () => {
|
|
|
var _a, _b;
|
|
|
handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : "");
|
|
|
};
|
|
|
const handleKeyDownEvent = () => {
|
|
|
setTimeout(() => {
|
|
|
var _a, _b;
|
|
|
handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : "");
|
|
|
});
|
|
|
};
|
|
|
editorRef.current.element.addEventListener("paste", handlePasteEvent);
|
|
|
editorRef.current.element.addEventListener("drop", handleDropEvent);
|
|
|
editorRef.current.element.addEventListener("click", handleClickEvent);
|
|
|
editorRef.current.element.addEventListener("keydown", handleKeyDownEvent);
|
|
|
return () => {
|
|
|
var _a, _b;
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.element.removeEventListener("paste", handlePasteEvent);
|
|
|
(_b = editorRef.current) == null ? void 0 : _b.element.removeEventListener("drop", handleDropEvent);
|
|
|
};
|
|
|
}, []);
|
|
|
const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => {
|
|
|
const {
|
|
|
type
|
|
|
} = file;
|
|
|
if (!type.startsWith("image")) {
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
const image2 = await resourceService.upload(file);
|
|
|
const url = `${image2}`;
|
|
|
return url;
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2);
|
|
|
}
|
|
|
}, []);
|
|
|
const handleSaveBtnClick = _react_17_0_2_react.exports.useCallback(async (content) => {
|
|
|
if (content === "") {
|
|
|
new require$$0.Notice("\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\u5440");
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
editMemoId
|
|
|
} = globalStateService.getState();
|
|
|
content = content.replaceAll(" ", " ");
|
|
|
setEditorContentCache("");
|
|
|
try {
|
|
|
if (editMemoId) {
|
|
|
const prevMemo = memoService.getMemoById(editMemoId);
|
|
|
if (prevMemo && prevMemo.content !== content) {
|
|
|
const editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType);
|
|
|
editedMemo.updatedAt = utils$1.getDateTimeString(Date.now());
|
|
|
memoService.editMemo(editedMemo);
|
|
|
}
|
|
|
globalStateService.setEditMemoId("");
|
|
|
} else {
|
|
|
const newMemo = await memoService.createMemo(content, isList);
|
|
|
memoService.pushMemo(newMemo);
|
|
|
locationService.clearQuery();
|
|
|
}
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
setEditorContentCache("");
|
|
|
}, []);
|
|
|
const handleCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
var _a;
|
|
|
globalStateService.setEditMemoId("");
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.setContent("");
|
|
|
setEditorContentCache("");
|
|
|
}, []);
|
|
|
const handleContentChange = _react_17_0_2_react.exports.useCallback((content) => {
|
|
|
const tempDiv = document.createElement("div");
|
|
|
tempDiv.innerHTML = content;
|
|
|
if (tempDiv.innerText.trim() === "") {
|
|
|
content = "";
|
|
|
}
|
|
|
setEditorContentCache(content);
|
|
|
if (editorRef.current) {
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString.startsWith(" ")) {
|
|
|
updateDateSelectorPopupPosition();
|
|
|
setIsPopperOpen(true);
|
|
|
} else if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString === "") {
|
|
|
updateDateSelectorPopupPosition();
|
|
|
setIsPopperOpen(true);
|
|
|
} else {
|
|
|
setIsPopperOpen(false);
|
|
|
}
|
|
|
setTimeout(() => {
|
|
|
var _a;
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.focus();
|
|
|
});
|
|
|
}
|
|
|
}, []);
|
|
|
const handleDateInsertTrigger = (date) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (date) {
|
|
|
closePopper();
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
const todayMoment = require$$0.moment(date);
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (prevString.endsWith("@")) {
|
|
|
if (InsertDateFormat === "Dataview") {
|
|
|
editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "[due::" + todayMoment.format("YYYY-MM-DD") + "]" + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 17, selectionStart + 17);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
} else if (InsertDateFormat === "Tasks") {
|
|
|
editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "\u{1F4C6}" + todayMoment.format("YYYY-MM-DD") + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 11, selectionStart + 11);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}
|
|
|
} else {
|
|
|
editorRef.current.element.value = prevString + todayMoment.format("YYYY-MM-DD") + nextString;
|
|
|
editorRef.current.element.setSelectionRange(selectionStart + 10, selectionStart + 10);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}
|
|
|
};
|
|
|
const handleChangeStatus = () => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (isList) {
|
|
|
isList = false;
|
|
|
toggleList(false);
|
|
|
} else {
|
|
|
isList = true;
|
|
|
toggleList(true);
|
|
|
}
|
|
|
};
|
|
|
const handleShowEditor = (flag) => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
if (isEditor || flag === true) {
|
|
|
isEditor = false;
|
|
|
toggleEditor(true);
|
|
|
} else {
|
|
|
isEditor = true;
|
|
|
isEditorGo = false;
|
|
|
toggleEditor(false);
|
|
|
}
|
|
|
};
|
|
|
const handleTagTextBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
if (!editorRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const currentValue = editorRef.current.getContent();
|
|
|
const selectionStart = editorRef.current.element.selectionStart;
|
|
|
const prevString = currentValue.slice(0, selectionStart);
|
|
|
const nextString = currentValue.slice(selectionStart);
|
|
|
let nextValue = prevString + "# " + nextString;
|
|
|
let cursorIndex = prevString.length + 1;
|
|
|
if (prevString.endsWith("#") && nextString.startsWith(" ")) {
|
|
|
nextValue = prevString.slice(0, prevString.length - 1) + nextString.slice(1);
|
|
|
cursorIndex = prevString.length - 1;
|
|
|
}
|
|
|
editorRef.current.element.value = nextValue;
|
|
|
editorRef.current.element.setSelectionRange(cursorIndex, cursorIndex);
|
|
|
editorRef.current.focus();
|
|
|
handleContentChange(editorRef.current.element.value);
|
|
|
}, []);
|
|
|
const updateDateSelectorPopupPosition = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
if (!editorRef.current || !popperRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const seletorPopupWidth = 280;
|
|
|
const editorWidth = editorRef.current.element.clientWidth;
|
|
|
const {
|
|
|
x: x2,
|
|
|
y: y2
|
|
|
} = getCursorPostion(editorRef.current.element);
|
|
|
let left2;
|
|
|
let top2;
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2;
|
|
|
top2 = y2 + 20;
|
|
|
} else {
|
|
|
if (window.innerWidth - x2 > seletorPopupWidth) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2;
|
|
|
} else if (window.innerWidth - x2 < seletorPopupWidth) {
|
|
|
left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 18 : x2 + 18;
|
|
|
} else {
|
|
|
left2 = editorRef.current.element.clientWidth / 2;
|
|
|
}
|
|
|
if (DefaultEditorLocation === "Bottom" && window.innerWidth > 875) {
|
|
|
top2 = y2 + 20;
|
|
|
} else if (DefaultEditorLocation === "Bottom" && window.innerWidth <= 875) {
|
|
|
top2 = y2 + 35;
|
|
|
} else if (DefaultEditorLocation === "Top" && window.innerWidth <= 875) {
|
|
|
top2 = y2 + 20;
|
|
|
}
|
|
|
}
|
|
|
positionX = x2;
|
|
|
popperRef.current.style.left = `${left2}px`;
|
|
|
popperRef.current.style.top = `${top2}px`;
|
|
|
}, []);
|
|
|
const handleUploadFileBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
const inputEl = document.createElement("input");
|
|
|
document.body.appendChild(inputEl);
|
|
|
inputEl.type = "file";
|
|
|
inputEl.multiple = false;
|
|
|
inputEl.accept = "image/png, image/gif, image/jpeg";
|
|
|
inputEl.onchange = async () => {
|
|
|
var _a;
|
|
|
if (!inputEl.files || inputEl.files.length === 0) {
|
|
|
return;
|
|
|
}
|
|
|
const file = inputEl.files[0];
|
|
|
const url = await handleUploadFile(file);
|
|
|
if (url) {
|
|
|
(_a = editorRef.current) == null ? void 0 : _a.insertText(url);
|
|
|
}
|
|
|
document.body.removeChild(inputEl);
|
|
|
};
|
|
|
inputEl.click();
|
|
|
}, []);
|
|
|
const showEditStatus = Boolean(globalState.editMemoId);
|
|
|
const editorConfig = _react_17_0_2_react.exports.useMemo(() => ({
|
|
|
className: "memo-editor",
|
|
|
initialContent: getEditorContentCache(),
|
|
|
placeholder: t("What do you think now..."),
|
|
|
showConfirmBtn: true,
|
|
|
showCancelBtn: showEditStatus,
|
|
|
showTools: true,
|
|
|
onConfirmBtnClick: handleSaveBtnClick,
|
|
|
onCancelBtnClick: handleCancelBtnClick,
|
|
|
onContentChange: handleContentChange
|
|
|
}), [showEditStatus]);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-editor-wrapper ${showEditStatus ? "edit-ing" : ""} ${isEditorShown ? "hidden" : ""}`,
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: `tip-text ${showEditStatus ? "" : "hidden"}`,
|
|
|
children: "Modifying..."
|
|
|
}), /* @__PURE__ */ jsx(Editor, __spreadProps(__spreadValues({
|
|
|
ref: editorRef
|
|
|
}, editorConfig), {
|
|
|
tools: /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn add-tag",
|
|
|
src: tag,
|
|
|
onClick: handleTagTextBtnClick
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn file-upload",
|
|
|
src: imageSvg,
|
|
|
onClick: handleUploadFileBtnClick
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "action-btn list-or-task",
|
|
|
src: `${!isListShown ? journalSvg : taskSvg}`,
|
|
|
onClick: handleChangeStatus
|
|
|
})]
|
|
|
})
|
|
|
})), /* @__PURE__ */ jsx("div", {
|
|
|
ref: popperRef,
|
|
|
className: "date-picker",
|
|
|
children: isPopperOpen && /* @__PURE__ */ jsx(focusTrapReact, {
|
|
|
active: true,
|
|
|
focusTrapOptions: {
|
|
|
initialFocus: false,
|
|
|
allowOutsideClick: true,
|
|
|
clickOutsideDeactivates: true,
|
|
|
onDeactivate: closePopper
|
|
|
},
|
|
|
children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({
|
|
|
tabIndex: -1,
|
|
|
style: popper2.styles.popper
|
|
|
}, popper2.attributes.popper), {
|
|
|
ref: setPopperElement,
|
|
|
role: "dialog",
|
|
|
children: /* @__PURE__ */ jsx(DayPicker, {
|
|
|
initialFocus: isPopperOpen,
|
|
|
mode: "single",
|
|
|
defaultMonth: selected,
|
|
|
selected,
|
|
|
onSelect: handleDateInsertTrigger
|
|
|
})
|
|
|
}))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function getEditorContentCache() {
|
|
|
var _a;
|
|
|
return (_a = storage.get(["editorContentCache"]).editorContentCache) != null ? _a : "";
|
|
|
}
|
|
|
function setEditorContentCache(content) {
|
|
|
storage.set({
|
|
|
editorContentCache: content
|
|
|
});
|
|
|
}
|
|
|
const relationConsts = [
|
|
|
{ text: "AND", value: "AND" },
|
|
|
{ text: "OR", value: "OR" }
|
|
|
];
|
|
|
const filterConsts = {
|
|
|
TAG: {
|
|
|
value: "TAG",
|
|
|
text: t("TAG"),
|
|
|
operators: [
|
|
|
{
|
|
|
text: t("INCLUDE"),
|
|
|
value: "CONTAIN"
|
|
|
},
|
|
|
{
|
|
|
text: t("EXCLUDE"),
|
|
|
value: "NOT_CONTAIN"
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
TYPE: {
|
|
|
value: "TYPE",
|
|
|
text: t("TYPE"),
|
|
|
operators: [
|
|
|
{
|
|
|
value: "IS",
|
|
|
text: t("IS")
|
|
|
},
|
|
|
{
|
|
|
value: "IS_NOT",
|
|
|
text: t("ISNOT")
|
|
|
}
|
|
|
],
|
|
|
values: [
|
|
|
{
|
|
|
value: "CONNECTED",
|
|
|
text: t("LINKED")
|
|
|
},
|
|
|
{
|
|
|
value: "NOT_TAGGED",
|
|
|
text: t("NO TAGS")
|
|
|
},
|
|
|
{
|
|
|
value: "LINKED",
|
|
|
text: t("HAS LINKS")
|
|
|
},
|
|
|
{
|
|
|
value: "IMAGED",
|
|
|
text: t("HAS IMAGES")
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
TEXT: {
|
|
|
value: "TEXT",
|
|
|
text: t("TEXT"),
|
|
|
operators: [
|
|
|
{
|
|
|
value: "CONTAIN",
|
|
|
text: t("INCLUDE")
|
|
|
},
|
|
|
{
|
|
|
value: "NOT_CONTAIN",
|
|
|
text: t("EXCLUDE")
|
|
|
}
|
|
|
]
|
|
|
}
|
|
|
};
|
|
|
const memoSpecialTypes = filterConsts["TYPE"].values;
|
|
|
const getTextWithMemoType = (type) => {
|
|
|
for (const t2 of memoSpecialTypes) {
|
|
|
if (t2.value === type) {
|
|
|
return t2.text;
|
|
|
}
|
|
|
}
|
|
|
return "";
|
|
|
};
|
|
|
const getDefaultFilter = () => {
|
|
|
return {
|
|
|
type: "TAG",
|
|
|
value: {
|
|
|
operator: "CONTAIN",
|
|
|
value: ""
|
|
|
},
|
|
|
relation: "AND"
|
|
|
};
|
|
|
};
|
|
|
const checkShouldShowMemoWithFilters = (memo2, filters) => {
|
|
|
let shouldShow = true;
|
|
|
for (const f2 of filters) {
|
|
|
const { relation } = f2;
|
|
|
const r2 = checkShouldShowMemo(memo2, f2);
|
|
|
if (relation === "OR") {
|
|
|
shouldShow = shouldShow || r2;
|
|
|
} else {
|
|
|
shouldShow = shouldShow && r2;
|
|
|
}
|
|
|
}
|
|
|
return shouldShow;
|
|
|
};
|
|
|
const checkShouldShowMemo = (memo2, filter) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
type,
|
|
|
value: { operator, value }
|
|
|
} = filter;
|
|
|
if (value === "") {
|
|
|
return true;
|
|
|
}
|
|
|
let shouldShow = true;
|
|
|
if (type === "TAG") {
|
|
|
let contained = true;
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(value)) {
|
|
|
contained = false;
|
|
|
}
|
|
|
if (operator === "NOT_CONTAIN") {
|
|
|
contained = !contained;
|
|
|
}
|
|
|
shouldShow = contained;
|
|
|
} else if (type === "TYPE") {
|
|
|
let matched = false;
|
|
|
if (value === "NOT_TAGGED" && memo2.content.match(TAG_REG) === null) {
|
|
|
matched = true;
|
|
|
} else if (value === "LINKED" && memo2.content.match(LINK_REG) !== null) {
|
|
|
matched = true;
|
|
|
} else if (value === "IMAGED" && memo2.content.match(IMAGE_URL_REG) !== null) {
|
|
|
matched = true;
|
|
|
} else if (value === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) !== null) {
|
|
|
matched = true;
|
|
|
}
|
|
|
if (operator === "IS_NOT") {
|
|
|
matched = !matched;
|
|
|
}
|
|
|
shouldShow = matched;
|
|
|
} else if (type === "TEXT") {
|
|
|
let contained = memo2.content.includes(value);
|
|
|
if (operator === "NOT_CONTAIN") {
|
|
|
contained = !contained;
|
|
|
}
|
|
|
shouldShow = contained;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
};
|
|
|
var searchBar = "";
|
|
|
var search = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+";
|
|
|
const SearchBar = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
type: memoType
|
|
|
}
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const handleMemoTypeItemClick = (type) => {
|
|
|
const {
|
|
|
type: prevType
|
|
|
} = locationService.getState().query;
|
|
|
if (type === prevType) {
|
|
|
type = "";
|
|
|
}
|
|
|
locationService.setMemoTypeQuery(type);
|
|
|
};
|
|
|
const handleTextQueryInput = (event) => {
|
|
|
const text = event.currentTarget.value;
|
|
|
locationService.setTextQuery(text);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "search-bar-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "search-bar-inputer",
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: search
|
|
|
}), /* @__PURE__ */ jsx("input", {
|
|
|
className: "text-input",
|
|
|
type: "text",
|
|
|
placeholder: "",
|
|
|
onChange: handleTextQueryInput
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "quickly-action-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "quickly-action-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Quick filter")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container types-container",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "section-text",
|
|
|
children: [t("TYPE"), ":"]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "values-container",
|
|
|
children: memoSpecialTypes.map((t2, idx) => {
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: `type-item ${memoType === t2.value ? "selected" : ""}`,
|
|
|
onClick: () => {
|
|
|
handleMemoTypeItemClick(t2.value);
|
|
|
},
|
|
|
children: t2.text
|
|
|
}), idx + 1 < memoSpecialTypes.length ? /* @__PURE__ */ jsx("span", {
|
|
|
className: "split-text",
|
|
|
children: "/"
|
|
|
}) : null]
|
|
|
}, t2.value);
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var memosHeader = "";
|
|
|
var menuSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6Ii8+PC9zdmc+";
|
|
|
let prevRequestTimestamp = Date.now();
|
|
|
const MemosHeader = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
filter
|
|
|
}
|
|
|
},
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
},
|
|
|
queryState: {
|
|
|
queries
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [titleText, setTitleText] = _react_17_0_2_react.exports.useState("MEMOS");
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const query = queryService.getQueryById(filter);
|
|
|
if (query) {
|
|
|
setTitleText(query.title);
|
|
|
} else {
|
|
|
setTitleText("MEMOS");
|
|
|
}
|
|
|
}, [filter, queries]);
|
|
|
const handleMemoTextClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
const now = Date.now();
|
|
|
if (now - prevRequestTimestamp > 10 * 1e3) {
|
|
|
prevRequestTimestamp = now;
|
|
|
memoService.fetchAllMemos().catch(() => {
|
|
|
});
|
|
|
}
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-header-container memos-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
onClick: handleMemoTextClick,
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: titleText
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(SearchBar, {})]
|
|
|
});
|
|
|
};
|
|
|
var memoFilter = "";
|
|
|
function _typeof(obj) {
|
|
|
"@babel/helpers - typeof";
|
|
|
return _typeof = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(obj2) {
|
|
|
return typeof obj2;
|
|
|
} : function(obj2) {
|
|
|
return obj2 && typeof Symbol == "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
|
}, _typeof(obj);
|
|
|
}
|
|
|
function _classCallCheck(instance2, Constructor) {
|
|
|
if (!(instance2 instanceof Constructor)) {
|
|
|
throw new TypeError("Cannot call a class as a 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);
|
|
|
}
|
|
|
}
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
|
if (protoProps)
|
|
|
_defineProperties(Constructor.prototype, protoProps);
|
|
|
if (staticProps)
|
|
|
_defineProperties(Constructor, staticProps);
|
|
|
Object.defineProperty(Constructor, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
return Constructor;
|
|
|
}
|
|
|
function _assertThisInitialized(self2) {
|
|
|
if (self2 === void 0) {
|
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
|
}
|
|
|
return self2;
|
|
|
}
|
|
|
function _setPrototypeOf(o, p2) {
|
|
|
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) {
|
|
|
o2.__proto__ = p3;
|
|
|
return o2;
|
|
|
};
|
|
|
return _setPrototypeOf(o, p2);
|
|
|
}
|
|
|
function _inherits(subClass, superClass) {
|
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
|
}
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
|
constructor: {
|
|
|
value: subClass,
|
|
|
writable: true,
|
|
|
configurable: true
|
|
|
}
|
|
|
});
|
|
|
Object.defineProperty(subClass, "prototype", {
|
|
|
writable: false
|
|
|
});
|
|
|
if (superClass)
|
|
|
_setPrototypeOf(subClass, superClass);
|
|
|
}
|
|
|
function _possibleConstructorReturn(self2, call) {
|
|
|
if (call && (_typeof(call) === "object" || typeof call === "function")) {
|
|
|
return call;
|
|
|
} else if (call !== void 0) {
|
|
|
throw new TypeError("Derived constructors may only return object or undefined");
|
|
|
}
|
|
|
return _assertThisInitialized(self2);
|
|
|
}
|
|
|
function _getPrototypeOf(o) {
|
|
|
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
|
|
|
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
|
};
|
|
|
return _getPrototypeOf(o);
|
|
|
}
|
|
|
function _defineProperty(obj, key, value) {
|
|
|
if (key in obj) {
|
|
|
Object.defineProperty(obj, key, {
|
|
|
value,
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
writable: true
|
|
|
});
|
|
|
} else {
|
|
|
obj[key] = value;
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
function _arrayWithHoles(arr) {
|
|
|
if (Array.isArray(arr))
|
|
|
return arr;
|
|
|
}
|
|
|
function _iterableToArray(iter) {
|
|
|
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
|
|
|
return Array.from(iter);
|
|
|
}
|
|
|
function _arrayLikeToArray(arr, len) {
|
|
|
if (len == null || len > arr.length)
|
|
|
len = arr.length;
|
|
|
for (var i = 0, arr2 = new Array(len); i < len; i++) {
|
|
|
arr2[i] = arr[i];
|
|
|
}
|
|
|
return arr2;
|
|
|
}
|
|
|
function _unsupportedIterableToArray(o, minLen) {
|
|
|
if (!o)
|
|
|
return;
|
|
|
if (typeof o === "string")
|
|
|
return _arrayLikeToArray(o, minLen);
|
|
|
var n2 = Object.prototype.toString.call(o).slice(8, -1);
|
|
|
if (n2 === "Object" && o.constructor)
|
|
|
n2 = o.constructor.name;
|
|
|
if (n2 === "Map" || n2 === "Set")
|
|
|
return Array.from(o);
|
|
|
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
|
|
|
return _arrayLikeToArray(o, minLen);
|
|
|
}
|
|
|
function _nonIterableRest() {
|
|
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
|
}
|
|
|
function _toArray(arr) {
|
|
|
return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
|
|
|
}
|
|
|
function ownKeys(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
var consoleLogger = {
|
|
|
type: "logger",
|
|
|
log: function log(args) {
|
|
|
this.output("log", args);
|
|
|
},
|
|
|
warn: function warn(args) {
|
|
|
this.output("warn", args);
|
|
|
},
|
|
|
error: function error(args) {
|
|
|
this.output("error", args);
|
|
|
},
|
|
|
output: function output(type, args) {
|
|
|
if (console && console[type])
|
|
|
console[type].apply(console, args);
|
|
|
}
|
|
|
};
|
|
|
var Logger = function() {
|
|
|
function Logger2(concreteLogger) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
_classCallCheck(this, Logger2);
|
|
|
this.init(concreteLogger, options);
|
|
|
}
|
|
|
_createClass(Logger2, [{
|
|
|
key: "init",
|
|
|
value: function init(concreteLogger) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
this.prefix = options.prefix || "i18next:";
|
|
|
this.logger = concreteLogger || consoleLogger;
|
|
|
this.options = options;
|
|
|
this.debug = options.debug;
|
|
|
}
|
|
|
}, {
|
|
|
key: "setDebug",
|
|
|
value: function setDebug(bool) {
|
|
|
this.debug = bool;
|
|
|
}
|
|
|
}, {
|
|
|
key: "log",
|
|
|
value: function log2() {
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
return this.forward(args, "log", "", true);
|
|
|
}
|
|
|
}, {
|
|
|
key: "warn",
|
|
|
value: function warn2() {
|
|
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
|
args[_key2] = arguments[_key2];
|
|
|
}
|
|
|
return this.forward(args, "warn", "", true);
|
|
|
}
|
|
|
}, {
|
|
|
key: "error",
|
|
|
value: function error2() {
|
|
|
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
|
args[_key3] = arguments[_key3];
|
|
|
}
|
|
|
return this.forward(args, "error", "");
|
|
|
}
|
|
|
}, {
|
|
|
key: "deprecate",
|
|
|
value: function deprecate() {
|
|
|
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
|
args[_key4] = arguments[_key4];
|
|
|
}
|
|
|
return this.forward(args, "warn", "WARNING DEPRECATED: ", true);
|
|
|
}
|
|
|
}, {
|
|
|
key: "forward",
|
|
|
value: function forward(args, lvl, prefix, debugOnly) {
|
|
|
if (debugOnly && !this.debug)
|
|
|
return null;
|
|
|
if (typeof args[0] === "string")
|
|
|
args[0] = "".concat(prefix).concat(this.prefix, " ").concat(args[0]);
|
|
|
return this.logger[lvl](args);
|
|
|
}
|
|
|
}, {
|
|
|
key: "create",
|
|
|
value: function create(moduleName) {
|
|
|
return new Logger2(this.logger, _objectSpread(_objectSpread({}, {
|
|
|
prefix: "".concat(this.prefix, ":").concat(moduleName, ":")
|
|
|
}), this.options));
|
|
|
}
|
|
|
}]);
|
|
|
return Logger2;
|
|
|
}();
|
|
|
var baseLogger = new Logger();
|
|
|
var EventEmitter = function() {
|
|
|
function EventEmitter2() {
|
|
|
_classCallCheck(this, EventEmitter2);
|
|
|
this.observers = {};
|
|
|
}
|
|
|
_createClass(EventEmitter2, [{
|
|
|
key: "on",
|
|
|
value: function on(events, listener) {
|
|
|
var _this = this;
|
|
|
events.split(" ").forEach(function(event) {
|
|
|
_this.observers[event] = _this.observers[event] || [];
|
|
|
_this.observers[event].push(listener);
|
|
|
});
|
|
|
return this;
|
|
|
}
|
|
|
}, {
|
|
|
key: "off",
|
|
|
value: function off(event, listener) {
|
|
|
if (!this.observers[event])
|
|
|
return;
|
|
|
if (!listener) {
|
|
|
delete this.observers[event];
|
|
|
return;
|
|
|
}
|
|
|
this.observers[event] = this.observers[event].filter(function(l2) {
|
|
|
return l2 !== listener;
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "emit",
|
|
|
value: function 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.observers[event]) {
|
|
|
var cloned = [].concat(this.observers[event]);
|
|
|
cloned.forEach(function(observer) {
|
|
|
observer.apply(void 0, args);
|
|
|
});
|
|
|
}
|
|
|
if (this.observers["*"]) {
|
|
|
var _cloned = [].concat(this.observers["*"]);
|
|
|
_cloned.forEach(function(observer) {
|
|
|
observer.apply(observer, [event].concat(args));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}]);
|
|
|
return EventEmitter2;
|
|
|
}();
|
|
|
function defer() {
|
|
|
var res;
|
|
|
var rej;
|
|
|
var promise = new Promise(function(resolve, reject) {
|
|
|
res = resolve;
|
|
|
rej = reject;
|
|
|
});
|
|
|
promise.resolve = res;
|
|
|
promise.reject = rej;
|
|
|
return promise;
|
|
|
}
|
|
|
function makeString(object) {
|
|
|
if (object == null)
|
|
|
return "";
|
|
|
return "" + object;
|
|
|
}
|
|
|
function copy$1(a, s, t2) {
|
|
|
a.forEach(function(m2) {
|
|
|
if (s[m2])
|
|
|
t2[m2] = s[m2];
|
|
|
});
|
|
|
}
|
|
|
function getLastOfPath(object, path, Empty) {
|
|
|
function cleanKey(key2) {
|
|
|
return key2 && key2.indexOf("###") > -1 ? key2.replace(/###/g, ".") : key2;
|
|
|
}
|
|
|
function canNotTraverseDeeper() {
|
|
|
return !object || typeof object === "string";
|
|
|
}
|
|
|
var stack = typeof path !== "string" ? [].concat(path) : path.split(".");
|
|
|
while (stack.length > 1) {
|
|
|
if (canNotTraverseDeeper())
|
|
|
return {};
|
|
|
var key = cleanKey(stack.shift());
|
|
|
if (!object[key] && Empty)
|
|
|
object[key] = new Empty();
|
|
|
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
|
object = object[key];
|
|
|
} else {
|
|
|
object = {};
|
|
|
}
|
|
|
}
|
|
|
if (canNotTraverseDeeper())
|
|
|
return {};
|
|
|
return {
|
|
|
obj: object,
|
|
|
k: cleanKey(stack.shift())
|
|
|
};
|
|
|
}
|
|
|
function setPath(object, path, newValue) {
|
|
|
var _getLastOfPath = getLastOfPath(object, path, Object), obj = _getLastOfPath.obj, k = _getLastOfPath.k;
|
|
|
obj[k] = newValue;
|
|
|
}
|
|
|
function pushPath(object, path, newValue, concat) {
|
|
|
var _getLastOfPath2 = getLastOfPath(object, path, Object), obj = _getLastOfPath2.obj, k = _getLastOfPath2.k;
|
|
|
obj[k] = obj[k] || [];
|
|
|
if (concat)
|
|
|
obj[k] = obj[k].concat(newValue);
|
|
|
if (!concat)
|
|
|
obj[k].push(newValue);
|
|
|
}
|
|
|
function getPath(object, path) {
|
|
|
var _getLastOfPath3 = getLastOfPath(object, path), obj = _getLastOfPath3.obj, k = _getLastOfPath3.k;
|
|
|
if (!obj)
|
|
|
return void 0;
|
|
|
return obj[k];
|
|
|
}
|
|
|
function getPathWithDefaults(data, defaultData, key) {
|
|
|
var value = getPath(data, key);
|
|
|
if (value !== void 0) {
|
|
|
return value;
|
|
|
}
|
|
|
return getPath(defaultData, key);
|
|
|
}
|
|
|
function deepExtend(target, source, overwrite) {
|
|
|
for (var prop in source) {
|
|
|
if (prop !== "__proto__" && prop !== "constructor") {
|
|
|
if (prop in target) {
|
|
|
if (typeof target[prop] === "string" || target[prop] instanceof String || typeof source[prop] === "string" || source[prop] instanceof String) {
|
|
|
if (overwrite)
|
|
|
target[prop] = source[prop];
|
|
|
} else {
|
|
|
deepExtend(target[prop], source[prop], overwrite);
|
|
|
}
|
|
|
} else {
|
|
|
target[prop] = source[prop];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function regexEscape(str) {
|
|
|
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
|
|
}
|
|
|
var _entityMap = {
|
|
|
"&": "&",
|
|
|
"<": "<",
|
|
|
">": ">",
|
|
|
'"': """,
|
|
|
"'": "'",
|
|
|
"/": "/"
|
|
|
};
|
|
|
function escape(data) {
|
|
|
if (typeof data === "string") {
|
|
|
return data.replace(/[&<>"'\/]/g, function(s) {
|
|
|
return _entityMap[s];
|
|
|
});
|
|
|
}
|
|
|
return data;
|
|
|
}
|
|
|
var isIE10 = typeof window !== "undefined" && window.navigator && window.navigator.userAgent && window.navigator.userAgent.indexOf("MSIE") > -1;
|
|
|
var chars = [" ", ",", "?", "!", ";"];
|
|
|
function looksLikeObjectPath(key, nsSeparator, keySeparator) {
|
|
|
nsSeparator = nsSeparator || "";
|
|
|
keySeparator = keySeparator || "";
|
|
|
var possibleChars = chars.filter(function(c) {
|
|
|
return nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0;
|
|
|
});
|
|
|
if (possibleChars.length === 0)
|
|
|
return true;
|
|
|
var r2 = new RegExp("(".concat(possibleChars.map(function(c) {
|
|
|
return c === "?" ? "\\?" : c;
|
|
|
}).join("|"), ")"));
|
|
|
var matched = !r2.test(key);
|
|
|
if (!matched) {
|
|
|
var ki2 = key.indexOf(keySeparator);
|
|
|
if (ki2 > 0 && !r2.test(key.substring(0, ki2))) {
|
|
|
matched = true;
|
|
|
}
|
|
|
}
|
|
|
return matched;
|
|
|
}
|
|
|
function ownKeys$1(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$1(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$1(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$1(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _createSuper(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _isNativeReflectConstruct() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function deepFind(obj, path) {
|
|
|
var keySeparator = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : ".";
|
|
|
if (!obj)
|
|
|
return void 0;
|
|
|
if (obj[path])
|
|
|
return obj[path];
|
|
|
var paths = path.split(keySeparator);
|
|
|
var current = obj;
|
|
|
for (var i = 0; i < paths.length; ++i) {
|
|
|
if (!current)
|
|
|
return void 0;
|
|
|
if (typeof current[paths[i]] === "string" && i + 1 < paths.length) {
|
|
|
return void 0;
|
|
|
}
|
|
|
if (current[paths[i]] === void 0) {
|
|
|
var j = 2;
|
|
|
var p2 = paths.slice(i, i + j).join(keySeparator);
|
|
|
var mix = current[p2];
|
|
|
while (mix === void 0 && paths.length > i + j) {
|
|
|
j++;
|
|
|
p2 = paths.slice(i, i + j).join(keySeparator);
|
|
|
mix = current[p2];
|
|
|
}
|
|
|
if (mix === void 0)
|
|
|
return void 0;
|
|
|
if (path.endsWith(p2)) {
|
|
|
if (typeof mix === "string")
|
|
|
return mix;
|
|
|
if (p2 && typeof mix[p2] === "string")
|
|
|
return mix[p2];
|
|
|
}
|
|
|
var joinedPath = paths.slice(i + j).join(keySeparator);
|
|
|
if (joinedPath)
|
|
|
return deepFind(mix, joinedPath, keySeparator);
|
|
|
return void 0;
|
|
|
}
|
|
|
current = current[paths[i]];
|
|
|
}
|
|
|
return current;
|
|
|
}
|
|
|
var ResourceStore = function(_EventEmitter) {
|
|
|
_inherits(ResourceStore2, _EventEmitter);
|
|
|
var _super = _createSuper(ResourceStore2);
|
|
|
function ResourceStore2(data) {
|
|
|
var _this;
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
|
|
|
ns: ["translation"],
|
|
|
defaultNS: "translation"
|
|
|
};
|
|
|
_classCallCheck(this, ResourceStore2);
|
|
|
_this = _super.call(this);
|
|
|
if (isIE10) {
|
|
|
EventEmitter.call(_assertThisInitialized(_this));
|
|
|
}
|
|
|
_this.data = data || {};
|
|
|
_this.options = options;
|
|
|
if (_this.options.keySeparator === void 0) {
|
|
|
_this.options.keySeparator = ".";
|
|
|
}
|
|
|
if (_this.options.ignoreJSONStructure === void 0) {
|
|
|
_this.options.ignoreJSONStructure = true;
|
|
|
}
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass(ResourceStore2, [{
|
|
|
key: "addNamespaces",
|
|
|
value: function addNamespaces(ns) {
|
|
|
if (this.options.ns.indexOf(ns) < 0) {
|
|
|
this.options.ns.push(ns);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "removeNamespaces",
|
|
|
value: function removeNamespaces(ns) {
|
|
|
var index = this.options.ns.indexOf(ns);
|
|
|
if (index > -1) {
|
|
|
this.options.ns.splice(index, 1);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "getResource",
|
|
|
value: function getResource(lng, ns, key) {
|
|
|
var options = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
|
|
|
var keySeparator = options.keySeparator !== void 0 ? options.keySeparator : this.options.keySeparator;
|
|
|
var ignoreJSONStructure = options.ignoreJSONStructure !== void 0 ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;
|
|
|
var path = [lng, ns];
|
|
|
if (key && typeof key !== "string")
|
|
|
path = path.concat(key);
|
|
|
if (key && typeof key === "string")
|
|
|
path = path.concat(keySeparator ? key.split(keySeparator) : key);
|
|
|
if (lng.indexOf(".") > -1) {
|
|
|
path = lng.split(".");
|
|
|
}
|
|
|
var result = getPath(this.data, path);
|
|
|
if (result || !ignoreJSONStructure || typeof key !== "string")
|
|
|
return result;
|
|
|
return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);
|
|
|
}
|
|
|
}, {
|
|
|
key: "addResource",
|
|
|
value: function addResource(lng, ns, key, value) {
|
|
|
var options = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : {
|
|
|
silent: false
|
|
|
};
|
|
|
var keySeparator = this.options.keySeparator;
|
|
|
if (keySeparator === void 0)
|
|
|
keySeparator = ".";
|
|
|
var path = [lng, ns];
|
|
|
if (key)
|
|
|
path = path.concat(keySeparator ? key.split(keySeparator) : key);
|
|
|
if (lng.indexOf(".") > -1) {
|
|
|
path = lng.split(".");
|
|
|
value = ns;
|
|
|
ns = path[1];
|
|
|
}
|
|
|
this.addNamespaces(ns);
|
|
|
setPath(this.data, path, value);
|
|
|
if (!options.silent)
|
|
|
this.emit("added", lng, ns, key, value);
|
|
|
}
|
|
|
}, {
|
|
|
key: "addResources",
|
|
|
value: function addResources(lng, ns, resources) {
|
|
|
var options = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {
|
|
|
silent: false
|
|
|
};
|
|
|
for (var m2 in resources) {
|
|
|
if (typeof resources[m2] === "string" || Object.prototype.toString.apply(resources[m2]) === "[object Array]")
|
|
|
this.addResource(lng, ns, m2, resources[m2], {
|
|
|
silent: true
|
|
|
});
|
|
|
}
|
|
|
if (!options.silent)
|
|
|
this.emit("added", lng, ns, resources);
|
|
|
}
|
|
|
}, {
|
|
|
key: "addResourceBundle",
|
|
|
value: function addResourceBundle(lng, ns, resources, deep, overwrite) {
|
|
|
var options = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : {
|
|
|
silent: false
|
|
|
};
|
|
|
var path = [lng, ns];
|
|
|
if (lng.indexOf(".") > -1) {
|
|
|
path = lng.split(".");
|
|
|
deep = resources;
|
|
|
resources = ns;
|
|
|
ns = path[1];
|
|
|
}
|
|
|
this.addNamespaces(ns);
|
|
|
var pack = getPath(this.data, path) || {};
|
|
|
if (deep) {
|
|
|
deepExtend(pack, resources, overwrite);
|
|
|
} else {
|
|
|
pack = _objectSpread$1(_objectSpread$1({}, pack), resources);
|
|
|
}
|
|
|
setPath(this.data, path, pack);
|
|
|
if (!options.silent)
|
|
|
this.emit("added", lng, ns, resources);
|
|
|
}
|
|
|
}, {
|
|
|
key: "removeResourceBundle",
|
|
|
value: function removeResourceBundle(lng, ns) {
|
|
|
if (this.hasResourceBundle(lng, ns)) {
|
|
|
delete this.data[lng][ns];
|
|
|
}
|
|
|
this.removeNamespaces(ns);
|
|
|
this.emit("removed", lng, ns);
|
|
|
}
|
|
|
}, {
|
|
|
key: "hasResourceBundle",
|
|
|
value: function hasResourceBundle(lng, ns) {
|
|
|
return this.getResource(lng, ns) !== void 0;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getResourceBundle",
|
|
|
value: function getResourceBundle(lng, ns) {
|
|
|
if (!ns)
|
|
|
ns = this.options.defaultNS;
|
|
|
if (this.options.compatibilityAPI === "v1")
|
|
|
return _objectSpread$1(_objectSpread$1({}, {}), this.getResource(lng, ns));
|
|
|
return this.getResource(lng, ns);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDataByLanguage",
|
|
|
value: function getDataByLanguage(lng) {
|
|
|
return this.data[lng];
|
|
|
}
|
|
|
}, {
|
|
|
key: "hasLanguageSomeTranslations",
|
|
|
value: function hasLanguageSomeTranslations(lng) {
|
|
|
var data = this.getDataByLanguage(lng);
|
|
|
var n2 = data && Object.keys(data) || [];
|
|
|
return !!n2.find(function(v2) {
|
|
|
return data[v2] && Object.keys(data[v2]).length > 0;
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "toJSON",
|
|
|
value: function toJSON() {
|
|
|
return this.data;
|
|
|
}
|
|
|
}]);
|
|
|
return ResourceStore2;
|
|
|
}(EventEmitter);
|
|
|
var postProcessor = {
|
|
|
processors: {},
|
|
|
addPostProcessor: function addPostProcessor(module2) {
|
|
|
this.processors[module2.name] = module2;
|
|
|
},
|
|
|
handle: function handle(processors, value, key, options, translator) {
|
|
|
var _this = this;
|
|
|
processors.forEach(function(processor) {
|
|
|
if (_this.processors[processor])
|
|
|
value = _this.processors[processor].process(value, key, options, translator);
|
|
|
});
|
|
|
return value;
|
|
|
}
|
|
|
};
|
|
|
function ownKeys$2(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$2(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$2(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$2(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _createSuper$1(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct$1();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _isNativeReflectConstruct$1() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
var checkedLoadedFor = {};
|
|
|
var Translator = function(_EventEmitter) {
|
|
|
_inherits(Translator2, _EventEmitter);
|
|
|
var _super = _createSuper$1(Translator2);
|
|
|
function Translator2(services) {
|
|
|
var _this;
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
_classCallCheck(this, Translator2);
|
|
|
_this = _super.call(this);
|
|
|
if (isIE10) {
|
|
|
EventEmitter.call(_assertThisInitialized(_this));
|
|
|
}
|
|
|
copy$1(["resourceStore", "languageUtils", "pluralResolver", "interpolator", "backendConnector", "i18nFormat", "utils"], services, _assertThisInitialized(_this));
|
|
|
_this.options = options;
|
|
|
if (_this.options.keySeparator === void 0) {
|
|
|
_this.options.keySeparator = ".";
|
|
|
}
|
|
|
_this.logger = baseLogger.create("translator");
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass(Translator2, [{
|
|
|
key: "changeLanguage",
|
|
|
value: function changeLanguage(lng) {
|
|
|
if (lng)
|
|
|
this.language = lng;
|
|
|
}
|
|
|
}, {
|
|
|
key: "exists",
|
|
|
value: function exists(key) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
|
|
|
interpolation: {}
|
|
|
};
|
|
|
if (key === void 0 || key === null) {
|
|
|
return false;
|
|
|
}
|
|
|
var resolved = this.resolve(key, options);
|
|
|
return resolved && resolved.res !== void 0;
|
|
|
}
|
|
|
}, {
|
|
|
key: "extractFromKey",
|
|
|
value: function extractFromKey(key, options) {
|
|
|
var nsSeparator = options.nsSeparator !== void 0 ? options.nsSeparator : this.options.nsSeparator;
|
|
|
if (nsSeparator === void 0)
|
|
|
nsSeparator = ":";
|
|
|
var keySeparator = options.keySeparator !== void 0 ? options.keySeparator : this.options.keySeparator;
|
|
|
var namespaces = options.ns || this.options.defaultNS || [];
|
|
|
var wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;
|
|
|
var seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);
|
|
|
if (wouldCheckForNsInKey && !seemsNaturalLanguage) {
|
|
|
var m2 = key.match(this.interpolator.nestingRegexp);
|
|
|
if (m2 && m2.length > 0) {
|
|
|
return {
|
|
|
key,
|
|
|
namespaces
|
|
|
};
|
|
|
}
|
|
|
var parts = key.split(nsSeparator);
|
|
|
if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1)
|
|
|
namespaces = parts.shift();
|
|
|
key = parts.join(keySeparator);
|
|
|
}
|
|
|
if (typeof namespaces === "string")
|
|
|
namespaces = [namespaces];
|
|
|
return {
|
|
|
key,
|
|
|
namespaces
|
|
|
};
|
|
|
}
|
|
|
}, {
|
|
|
key: "translate",
|
|
|
value: function translate(keys, options, lastKey) {
|
|
|
var _this2 = this;
|
|
|
if (_typeof(options) !== "object" && this.options.overloadTranslationOptionHandler) {
|
|
|
options = this.options.overloadTranslationOptionHandler(arguments);
|
|
|
}
|
|
|
if (!options)
|
|
|
options = {};
|
|
|
if (keys === void 0 || keys === null)
|
|
|
return "";
|
|
|
if (!Array.isArray(keys))
|
|
|
keys = [String(keys)];
|
|
|
var keySeparator = options.keySeparator !== void 0 ? options.keySeparator : this.options.keySeparator;
|
|
|
var _this$extractFromKey = this.extractFromKey(keys[keys.length - 1], options), key = _this$extractFromKey.key, namespaces = _this$extractFromKey.namespaces;
|
|
|
var namespace = namespaces[namespaces.length - 1];
|
|
|
var lng = options.lng || this.language;
|
|
|
var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;
|
|
|
if (lng && lng.toLowerCase() === "cimode") {
|
|
|
if (appendNamespaceToCIMode) {
|
|
|
var nsSeparator = options.nsSeparator || this.options.nsSeparator;
|
|
|
return namespace + nsSeparator + key;
|
|
|
}
|
|
|
return key;
|
|
|
}
|
|
|
var resolved = this.resolve(keys, options);
|
|
|
var res = resolved && resolved.res;
|
|
|
var resUsedKey = resolved && resolved.usedKey || key;
|
|
|
var resExactUsedKey = resolved && resolved.exactUsedKey || key;
|
|
|
var resType = Object.prototype.toString.apply(res);
|
|
|
var noObject = ["[object Number]", "[object Function]", "[object RegExp]"];
|
|
|
var joinArrays = options.joinArrays !== void 0 ? options.joinArrays : this.options.joinArrays;
|
|
|
var handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;
|
|
|
var handleAsObject = typeof res !== "string" && typeof res !== "boolean" && typeof res !== "number";
|
|
|
if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === "string" && resType === "[object Array]")) {
|
|
|
if (!options.returnObjects && !this.options.returnObjects) {
|
|
|
if (!this.options.returnedObjectHandler) {
|
|
|
this.logger.warn("accessing an object - but returnObjects options is not enabled!");
|
|
|
}
|
|
|
return this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, _objectSpread$2(_objectSpread$2({}, options), {}, {
|
|
|
ns: namespaces
|
|
|
})) : "key '".concat(key, " (").concat(this.language, ")' returned an object instead of string.");
|
|
|
}
|
|
|
if (keySeparator) {
|
|
|
var resTypeIsArray = resType === "[object Array]";
|
|
|
var copy2 = resTypeIsArray ? [] : {};
|
|
|
var newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;
|
|
|
for (var m2 in res) {
|
|
|
if (Object.prototype.hasOwnProperty.call(res, m2)) {
|
|
|
var deepKey = "".concat(newKeyToUse).concat(keySeparator).concat(m2);
|
|
|
copy2[m2] = this.translate(deepKey, _objectSpread$2(_objectSpread$2({}, options), {
|
|
|
joinArrays: false,
|
|
|
ns: namespaces
|
|
|
}));
|
|
|
if (copy2[m2] === deepKey)
|
|
|
copy2[m2] = res[m2];
|
|
|
}
|
|
|
}
|
|
|
res = copy2;
|
|
|
}
|
|
|
} else if (handleAsObjectInI18nFormat && typeof joinArrays === "string" && resType === "[object Array]") {
|
|
|
res = res.join(joinArrays);
|
|
|
if (res)
|
|
|
res = this.extendTranslation(res, keys, options, lastKey);
|
|
|
} else {
|
|
|
var usedDefault = false;
|
|
|
var usedKey = false;
|
|
|
var needsPluralHandling = options.count !== void 0 && typeof options.count !== "string";
|
|
|
var hasDefaultValue = Translator2.hasDefaultValue(options);
|
|
|
var defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : "";
|
|
|
var defaultValue = options["defaultValue".concat(defaultValueSuffix)] || options.defaultValue;
|
|
|
if (!this.isValidLookup(res) && hasDefaultValue) {
|
|
|
usedDefault = true;
|
|
|
res = defaultValue;
|
|
|
}
|
|
|
if (!this.isValidLookup(res)) {
|
|
|
usedKey = true;
|
|
|
res = key;
|
|
|
}
|
|
|
var missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;
|
|
|
var resForMissing = missingKeyNoValueFallbackToKey && usedKey ? void 0 : res;
|
|
|
var updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;
|
|
|
if (usedKey || usedDefault || updateMissing) {
|
|
|
this.logger.log(updateMissing ? "updateKey" : "missingKey", lng, namespace, key, updateMissing ? defaultValue : res);
|
|
|
if (keySeparator) {
|
|
|
var fk2 = this.resolve(key, _objectSpread$2(_objectSpread$2({}, options), {}, {
|
|
|
keySeparator: false
|
|
|
}));
|
|
|
if (fk2 && fk2.res)
|
|
|
this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.");
|
|
|
}
|
|
|
var lngs = [];
|
|
|
var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);
|
|
|
if (this.options.saveMissingTo === "fallback" && fallbackLngs && fallbackLngs[0]) {
|
|
|
for (var i = 0; i < fallbackLngs.length; i++) {
|
|
|
lngs.push(fallbackLngs[i]);
|
|
|
}
|
|
|
} else if (this.options.saveMissingTo === "all") {
|
|
|
lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);
|
|
|
} else {
|
|
|
lngs.push(options.lng || this.language);
|
|
|
}
|
|
|
var send = function send2(l2, k, specificDefaultValue) {
|
|
|
var defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;
|
|
|
if (_this2.options.missingKeyHandler) {
|
|
|
_this2.options.missingKeyHandler(l2, namespace, k, defaultForMissing, updateMissing, options);
|
|
|
} else if (_this2.backendConnector && _this2.backendConnector.saveMissing) {
|
|
|
_this2.backendConnector.saveMissing(l2, namespace, k, defaultForMissing, updateMissing, options);
|
|
|
}
|
|
|
_this2.emit("missingKey", l2, namespace, k, res);
|
|
|
};
|
|
|
if (this.options.saveMissing) {
|
|
|
if (this.options.saveMissingPlurals && needsPluralHandling) {
|
|
|
lngs.forEach(function(language) {
|
|
|
_this2.pluralResolver.getSuffixes(language).forEach(function(suffix) {
|
|
|
send([language], key + suffix, options["defaultValue".concat(suffix)] || defaultValue);
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
send(lngs, key, defaultValue);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
res = this.extendTranslation(res, keys, options, resolved, lastKey);
|
|
|
if (usedKey && res === key && this.options.appendNamespaceToMissingKey)
|
|
|
res = "".concat(namespace, ":").concat(key);
|
|
|
if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler)
|
|
|
res = this.options.parseMissingKeyHandler(res);
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
}, {
|
|
|
key: "extendTranslation",
|
|
|
value: function extendTranslation(res, key, options, resolved, lastKey) {
|
|
|
var _this3 = this;
|
|
|
if (this.i18nFormat && this.i18nFormat.parse) {
|
|
|
res = this.i18nFormat.parse(res, options, resolved.usedLng, resolved.usedNS, resolved.usedKey, {
|
|
|
resolved
|
|
|
});
|
|
|
} else if (!options.skipInterpolation) {
|
|
|
if (options.interpolation)
|
|
|
this.interpolator.init(_objectSpread$2(_objectSpread$2({}, options), {
|
|
|
interpolation: _objectSpread$2(_objectSpread$2({}, this.options.interpolation), options.interpolation)
|
|
|
}));
|
|
|
var skipOnVariables = typeof res === "string" && (options.interpolation && options.interpolation.skipOnVariables || this.options.interpolation.skipOnVariables);
|
|
|
var nestBef;
|
|
|
if (skipOnVariables) {
|
|
|
var nb2 = res.match(this.interpolator.nestingRegexp);
|
|
|
nestBef = nb2 && nb2.length;
|
|
|
}
|
|
|
var data = options.replace && typeof options.replace !== "string" ? options.replace : options;
|
|
|
if (this.options.interpolation.defaultVariables)
|
|
|
data = _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), data);
|
|
|
res = this.interpolator.interpolate(res, data, options.lng || this.language, options);
|
|
|
if (skipOnVariables) {
|
|
|
var na2 = res.match(this.interpolator.nestingRegexp);
|
|
|
var nestAft = na2 && na2.length;
|
|
|
if (nestBef < nestAft)
|
|
|
options.nest = false;
|
|
|
}
|
|
|
if (options.nest !== false)
|
|
|
res = this.interpolator.nest(res, function() {
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
if (lastKey && lastKey[0] === args[0] && !options.context) {
|
|
|
_this3.logger.warn("It seems you are nesting recursively key: ".concat(args[0], " in key: ").concat(key[0]));
|
|
|
return null;
|
|
|
}
|
|
|
return _this3.translate.apply(_this3, args.concat([key]));
|
|
|
}, options);
|
|
|
if (options.interpolation)
|
|
|
this.interpolator.reset();
|
|
|
}
|
|
|
var postProcess = options.postProcess || this.options.postProcess;
|
|
|
var postProcessorNames = typeof postProcess === "string" ? [postProcess] : postProcess;
|
|
|
if (res !== void 0 && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {
|
|
|
res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? _objectSpread$2({
|
|
|
i18nResolved: resolved
|
|
|
}, options) : options, this);
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
}, {
|
|
|
key: "resolve",
|
|
|
value: function resolve(keys) {
|
|
|
var _this4 = this;
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
var found;
|
|
|
var usedKey;
|
|
|
var exactUsedKey;
|
|
|
var usedLng;
|
|
|
var usedNS;
|
|
|
if (typeof keys === "string")
|
|
|
keys = [keys];
|
|
|
keys.forEach(function(k) {
|
|
|
if (_this4.isValidLookup(found))
|
|
|
return;
|
|
|
var extracted = _this4.extractFromKey(k, options);
|
|
|
var key = extracted.key;
|
|
|
usedKey = key;
|
|
|
var namespaces = extracted.namespaces;
|
|
|
if (_this4.options.fallbackNS)
|
|
|
namespaces = namespaces.concat(_this4.options.fallbackNS);
|
|
|
var needsPluralHandling = options.count !== void 0 && typeof options.count !== "string";
|
|
|
var needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && _this4.pluralResolver.shouldUseIntlApi();
|
|
|
var needsContextHandling = options.context !== void 0 && (typeof options.context === "string" || typeof options.context === "number") && options.context !== "";
|
|
|
var codes = options.lngs ? options.lngs : _this4.languageUtils.toResolveHierarchy(options.lng || _this4.language, options.fallbackLng);
|
|
|
namespaces.forEach(function(ns) {
|
|
|
if (_this4.isValidLookup(found))
|
|
|
return;
|
|
|
usedNS = ns;
|
|
|
if (!checkedLoadedFor["".concat(codes[0], "-").concat(ns)] && _this4.utils && _this4.utils.hasLoadedNamespace && !_this4.utils.hasLoadedNamespace(usedNS)) {
|
|
|
checkedLoadedFor["".concat(codes[0], "-").concat(ns)] = true;
|
|
|
_this4.logger.warn('key "'.concat(usedKey, '" for languages "').concat(codes.join(", "), `" won't get resolved as namespace "`).concat(usedNS, '" was not yet loaded'), "This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");
|
|
|
}
|
|
|
codes.forEach(function(code) {
|
|
|
if (_this4.isValidLookup(found))
|
|
|
return;
|
|
|
usedLng = code;
|
|
|
var finalKeys = [key];
|
|
|
if (_this4.i18nFormat && _this4.i18nFormat.addLookupKeys) {
|
|
|
_this4.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);
|
|
|
} else {
|
|
|
var pluralSuffix;
|
|
|
if (needsPluralHandling)
|
|
|
pluralSuffix = _this4.pluralResolver.getSuffix(code, options.count, options);
|
|
|
var zeroSuffix = "_zero";
|
|
|
if (needsPluralHandling) {
|
|
|
finalKeys.push(key + pluralSuffix);
|
|
|
if (needsZeroSuffixLookup) {
|
|
|
finalKeys.push(key + zeroSuffix);
|
|
|
}
|
|
|
}
|
|
|
if (needsContextHandling) {
|
|
|
var contextKey = "".concat(key).concat(_this4.options.contextSeparator).concat(options.context);
|
|
|
finalKeys.push(contextKey);
|
|
|
if (needsPluralHandling) {
|
|
|
finalKeys.push(contextKey + pluralSuffix);
|
|
|
if (needsZeroSuffixLookup) {
|
|
|
finalKeys.push(contextKey + zeroSuffix);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var possibleKey;
|
|
|
while (possibleKey = finalKeys.pop()) {
|
|
|
if (!_this4.isValidLookup(found)) {
|
|
|
exactUsedKey = possibleKey;
|
|
|
found = _this4.getResource(code, ns, possibleKey, options);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
return {
|
|
|
res: found,
|
|
|
usedKey,
|
|
|
exactUsedKey,
|
|
|
usedLng,
|
|
|
usedNS
|
|
|
};
|
|
|
}
|
|
|
}, {
|
|
|
key: "isValidLookup",
|
|
|
value: function isValidLookup(res) {
|
|
|
return res !== void 0 && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === "");
|
|
|
}
|
|
|
}, {
|
|
|
key: "getResource",
|
|
|
value: function getResource(code, ns, key) {
|
|
|
var options = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
|
|
|
if (this.i18nFormat && this.i18nFormat.getResource)
|
|
|
return this.i18nFormat.getResource(code, ns, key, options);
|
|
|
return this.resourceStore.getResource(code, ns, key, options);
|
|
|
}
|
|
|
}], [{
|
|
|
key: "hasDefaultValue",
|
|
|
value: function hasDefaultValue(options) {
|
|
|
var prefix = "defaultValue";
|
|
|
for (var option in options) {
|
|
|
if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && options[option] !== void 0) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
}]);
|
|
|
return Translator2;
|
|
|
}(EventEmitter);
|
|
|
function capitalize(string) {
|
|
|
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
|
}
|
|
|
var LanguageUtil = function() {
|
|
|
function LanguageUtil2(options) {
|
|
|
_classCallCheck(this, LanguageUtil2);
|
|
|
this.options = options;
|
|
|
this.supportedLngs = this.options.supportedLngs || false;
|
|
|
this.logger = baseLogger.create("languageUtils");
|
|
|
}
|
|
|
_createClass(LanguageUtil2, [{
|
|
|
key: "getScriptPartFromCode",
|
|
|
value: function getScriptPartFromCode(code) {
|
|
|
if (!code || code.indexOf("-") < 0)
|
|
|
return null;
|
|
|
var p2 = code.split("-");
|
|
|
if (p2.length === 2)
|
|
|
return null;
|
|
|
p2.pop();
|
|
|
if (p2[p2.length - 1].toLowerCase() === "x")
|
|
|
return null;
|
|
|
return this.formatLanguageCode(p2.join("-"));
|
|
|
}
|
|
|
}, {
|
|
|
key: "getLanguagePartFromCode",
|
|
|
value: function getLanguagePartFromCode(code) {
|
|
|
if (!code || code.indexOf("-") < 0)
|
|
|
return code;
|
|
|
var p2 = code.split("-");
|
|
|
return this.formatLanguageCode(p2[0]);
|
|
|
}
|
|
|
}, {
|
|
|
key: "formatLanguageCode",
|
|
|
value: function formatLanguageCode(code) {
|
|
|
if (typeof code === "string" && code.indexOf("-") > -1) {
|
|
|
var specialCases = ["hans", "hant", "latn", "cyrl", "cans", "mong", "arab"];
|
|
|
var p2 = code.split("-");
|
|
|
if (this.options.lowerCaseLng) {
|
|
|
p2 = p2.map(function(part) {
|
|
|
return part.toLowerCase();
|
|
|
});
|
|
|
} else if (p2.length === 2) {
|
|
|
p2[0] = p2[0].toLowerCase();
|
|
|
p2[1] = p2[1].toUpperCase();
|
|
|
if (specialCases.indexOf(p2[1].toLowerCase()) > -1)
|
|
|
p2[1] = capitalize(p2[1].toLowerCase());
|
|
|
} else if (p2.length === 3) {
|
|
|
p2[0] = p2[0].toLowerCase();
|
|
|
if (p2[1].length === 2)
|
|
|
p2[1] = p2[1].toUpperCase();
|
|
|
if (p2[0] !== "sgn" && p2[2].length === 2)
|
|
|
p2[2] = p2[2].toUpperCase();
|
|
|
if (specialCases.indexOf(p2[1].toLowerCase()) > -1)
|
|
|
p2[1] = capitalize(p2[1].toLowerCase());
|
|
|
if (specialCases.indexOf(p2[2].toLowerCase()) > -1)
|
|
|
p2[2] = capitalize(p2[2].toLowerCase());
|
|
|
}
|
|
|
return p2.join("-");
|
|
|
}
|
|
|
return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;
|
|
|
}
|
|
|
}, {
|
|
|
key: "isSupportedCode",
|
|
|
value: function isSupportedCode(code) {
|
|
|
if (this.options.load === "languageOnly" || this.options.nonExplicitSupportedLngs) {
|
|
|
code = this.getLanguagePartFromCode(code);
|
|
|
}
|
|
|
return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getBestMatchFromCodes",
|
|
|
value: function getBestMatchFromCodes(codes) {
|
|
|
var _this = this;
|
|
|
if (!codes)
|
|
|
return null;
|
|
|
var found;
|
|
|
codes.forEach(function(code) {
|
|
|
if (found)
|
|
|
return;
|
|
|
var cleanedLng = _this.formatLanguageCode(code);
|
|
|
if (!_this.options.supportedLngs || _this.isSupportedCode(cleanedLng))
|
|
|
found = cleanedLng;
|
|
|
});
|
|
|
if (!found && this.options.supportedLngs) {
|
|
|
codes.forEach(function(code) {
|
|
|
if (found)
|
|
|
return;
|
|
|
var lngOnly = _this.getLanguagePartFromCode(code);
|
|
|
if (_this.isSupportedCode(lngOnly))
|
|
|
return found = lngOnly;
|
|
|
found = _this.options.supportedLngs.find(function(supportedLng) {
|
|
|
if (supportedLng.indexOf(lngOnly) === 0)
|
|
|
return supportedLng;
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
if (!found)
|
|
|
found = this.getFallbackCodes(this.options.fallbackLng)[0];
|
|
|
return found;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getFallbackCodes",
|
|
|
value: function getFallbackCodes(fallbacks, code) {
|
|
|
if (!fallbacks)
|
|
|
return [];
|
|
|
if (typeof fallbacks === "function")
|
|
|
fallbacks = fallbacks(code);
|
|
|
if (typeof fallbacks === "string")
|
|
|
fallbacks = [fallbacks];
|
|
|
if (Object.prototype.toString.apply(fallbacks) === "[object Array]")
|
|
|
return fallbacks;
|
|
|
if (!code)
|
|
|
return fallbacks["default"] || [];
|
|
|
var found = fallbacks[code];
|
|
|
if (!found)
|
|
|
found = fallbacks[this.getScriptPartFromCode(code)];
|
|
|
if (!found)
|
|
|
found = fallbacks[this.formatLanguageCode(code)];
|
|
|
if (!found)
|
|
|
found = fallbacks[this.getLanguagePartFromCode(code)];
|
|
|
if (!found)
|
|
|
found = fallbacks["default"];
|
|
|
return found || [];
|
|
|
}
|
|
|
}, {
|
|
|
key: "toResolveHierarchy",
|
|
|
value: function toResolveHierarchy(code, fallbackCode) {
|
|
|
var _this2 = this;
|
|
|
var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);
|
|
|
var codes = [];
|
|
|
var addCode = function addCode2(c) {
|
|
|
if (!c)
|
|
|
return;
|
|
|
if (_this2.isSupportedCode(c)) {
|
|
|
codes.push(c);
|
|
|
} else {
|
|
|
_this2.logger.warn("rejecting language code not found in supportedLngs: ".concat(c));
|
|
|
}
|
|
|
};
|
|
|
if (typeof code === "string" && code.indexOf("-") > -1) {
|
|
|
if (this.options.load !== "languageOnly")
|
|
|
addCode(this.formatLanguageCode(code));
|
|
|
if (this.options.load !== "languageOnly" && this.options.load !== "currentOnly")
|
|
|
addCode(this.getScriptPartFromCode(code));
|
|
|
if (this.options.load !== "currentOnly")
|
|
|
addCode(this.getLanguagePartFromCode(code));
|
|
|
} else if (typeof code === "string") {
|
|
|
addCode(this.formatLanguageCode(code));
|
|
|
}
|
|
|
fallbackCodes.forEach(function(fc2) {
|
|
|
if (codes.indexOf(fc2) < 0)
|
|
|
addCode(_this2.formatLanguageCode(fc2));
|
|
|
});
|
|
|
return codes;
|
|
|
}
|
|
|
}]);
|
|
|
return LanguageUtil2;
|
|
|
}();
|
|
|
var sets = [{
|
|
|
lngs: ["ach", "ak", "am", "arn", "br", "fil", "gun", "ln", "mfe", "mg", "mi", "oc", "pt", "pt-BR", "tg", "tl", "ti", "tr", "uz", "wa"],
|
|
|
nr: [1, 2],
|
|
|
fc: 1
|
|
|
}, {
|
|
|
lngs: ["af", "an", "ast", "az", "bg", "bn", "ca", "da", "de", "dev", "el", "en", "eo", "es", "et", "eu", "fi", "fo", "fur", "fy", "gl", "gu", "ha", "hi", "hu", "hy", "ia", "it", "kk", "kn", "ku", "lb", "mai", "ml", "mn", "mr", "nah", "nap", "nb", "ne", "nl", "nn", "no", "nso", "pa", "pap", "pms", "ps", "pt-PT", "rm", "sco", "se", "si", "so", "son", "sq", "sv", "sw", "ta", "te", "tk", "ur", "yo"],
|
|
|
nr: [1, 2],
|
|
|
fc: 2
|
|
|
}, {
|
|
|
lngs: ["ay", "bo", "cgg", "fa", "ht", "id", "ja", "jbo", "ka", "km", "ko", "ky", "lo", "ms", "sah", "su", "th", "tt", "ug", "vi", "wo", "zh"],
|
|
|
nr: [1],
|
|
|
fc: 3
|
|
|
}, {
|
|
|
lngs: ["be", "bs", "cnr", "dz", "hr", "ru", "sr", "uk"],
|
|
|
nr: [1, 2, 5],
|
|
|
fc: 4
|
|
|
}, {
|
|
|
lngs: ["ar"],
|
|
|
nr: [0, 1, 2, 3, 11, 100],
|
|
|
fc: 5
|
|
|
}, {
|
|
|
lngs: ["cs", "sk"],
|
|
|
nr: [1, 2, 5],
|
|
|
fc: 6
|
|
|
}, {
|
|
|
lngs: ["csb", "pl"],
|
|
|
nr: [1, 2, 5],
|
|
|
fc: 7
|
|
|
}, {
|
|
|
lngs: ["cy"],
|
|
|
nr: [1, 2, 3, 8],
|
|
|
fc: 8
|
|
|
}, {
|
|
|
lngs: ["fr"],
|
|
|
nr: [1, 2],
|
|
|
fc: 9
|
|
|
}, {
|
|
|
lngs: ["ga"],
|
|
|
nr: [1, 2, 3, 7, 11],
|
|
|
fc: 10
|
|
|
}, {
|
|
|
lngs: ["gd"],
|
|
|
nr: [1, 2, 3, 20],
|
|
|
fc: 11
|
|
|
}, {
|
|
|
lngs: ["is"],
|
|
|
nr: [1, 2],
|
|
|
fc: 12
|
|
|
}, {
|
|
|
lngs: ["jv"],
|
|
|
nr: [0, 1],
|
|
|
fc: 13
|
|
|
}, {
|
|
|
lngs: ["kw"],
|
|
|
nr: [1, 2, 3, 4],
|
|
|
fc: 14
|
|
|
}, {
|
|
|
lngs: ["lt"],
|
|
|
nr: [1, 2, 10],
|
|
|
fc: 15
|
|
|
}, {
|
|
|
lngs: ["lv"],
|
|
|
nr: [1, 2, 0],
|
|
|
fc: 16
|
|
|
}, {
|
|
|
lngs: ["mk"],
|
|
|
nr: [1, 2],
|
|
|
fc: 17
|
|
|
}, {
|
|
|
lngs: ["mnk"],
|
|
|
nr: [0, 1, 2],
|
|
|
fc: 18
|
|
|
}, {
|
|
|
lngs: ["mt"],
|
|
|
nr: [1, 2, 11, 20],
|
|
|
fc: 19
|
|
|
}, {
|
|
|
lngs: ["or"],
|
|
|
nr: [2, 1],
|
|
|
fc: 2
|
|
|
}, {
|
|
|
lngs: ["ro"],
|
|
|
nr: [1, 2, 20],
|
|
|
fc: 20
|
|
|
}, {
|
|
|
lngs: ["sl"],
|
|
|
nr: [5, 1, 2, 3],
|
|
|
fc: 21
|
|
|
}, {
|
|
|
lngs: ["he", "iw"],
|
|
|
nr: [1, 2, 20, 21],
|
|
|
fc: 22
|
|
|
}];
|
|
|
var _rulesPluralsTypes = {
|
|
|
1: function _(n2) {
|
|
|
return Number(n2 > 1);
|
|
|
},
|
|
|
2: function _2(n2) {
|
|
|
return Number(n2 != 1);
|
|
|
},
|
|
|
3: function _3(n2) {
|
|
|
return 0;
|
|
|
},
|
|
|
4: function _4(n2) {
|
|
|
return Number(n2 % 10 == 1 && n2 % 100 != 11 ? 0 : n2 % 10 >= 2 && n2 % 10 <= 4 && (n2 % 100 < 10 || n2 % 100 >= 20) ? 1 : 2);
|
|
|
},
|
|
|
5: function _5(n2) {
|
|
|
return Number(n2 == 0 ? 0 : n2 == 1 ? 1 : n2 == 2 ? 2 : n2 % 100 >= 3 && n2 % 100 <= 10 ? 3 : n2 % 100 >= 11 ? 4 : 5);
|
|
|
},
|
|
|
6: function _6(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 >= 2 && n2 <= 4 ? 1 : 2);
|
|
|
},
|
|
|
7: function _7(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 % 10 >= 2 && n2 % 10 <= 4 && (n2 % 100 < 10 || n2 % 100 >= 20) ? 1 : 2);
|
|
|
},
|
|
|
8: function _8(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 2 ? 1 : n2 != 8 && n2 != 11 ? 2 : 3);
|
|
|
},
|
|
|
9: function _9(n2) {
|
|
|
return Number(n2 >= 2);
|
|
|
},
|
|
|
10: function _10(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 2 ? 1 : n2 < 7 ? 2 : n2 < 11 ? 3 : 4);
|
|
|
},
|
|
|
11: function _11(n2) {
|
|
|
return Number(n2 == 1 || n2 == 11 ? 0 : n2 == 2 || n2 == 12 ? 1 : n2 > 2 && n2 < 20 ? 2 : 3);
|
|
|
},
|
|
|
12: function _12(n2) {
|
|
|
return Number(n2 % 10 != 1 || n2 % 100 == 11);
|
|
|
},
|
|
|
13: function _13(n2) {
|
|
|
return Number(n2 !== 0);
|
|
|
},
|
|
|
14: function _14(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 2 ? 1 : n2 == 3 ? 2 : 3);
|
|
|
},
|
|
|
15: function _15(n2) {
|
|
|
return Number(n2 % 10 == 1 && n2 % 100 != 11 ? 0 : n2 % 10 >= 2 && (n2 % 100 < 10 || n2 % 100 >= 20) ? 1 : 2);
|
|
|
},
|
|
|
16: function _16(n2) {
|
|
|
return Number(n2 % 10 == 1 && n2 % 100 != 11 ? 0 : n2 !== 0 ? 1 : 2);
|
|
|
},
|
|
|
17: function _17(n2) {
|
|
|
return Number(n2 == 1 || n2 % 10 == 1 && n2 % 100 != 11 ? 0 : 1);
|
|
|
},
|
|
|
18: function _18(n2) {
|
|
|
return Number(n2 == 0 ? 0 : n2 == 1 ? 1 : 2);
|
|
|
},
|
|
|
19: function _19(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 0 || n2 % 100 > 1 && n2 % 100 < 11 ? 1 : n2 % 100 > 10 && n2 % 100 < 20 ? 2 : 3);
|
|
|
},
|
|
|
20: function _20(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 0 || n2 % 100 > 0 && n2 % 100 < 20 ? 1 : 2);
|
|
|
},
|
|
|
21: function _21(n2) {
|
|
|
return Number(n2 % 100 == 1 ? 1 : n2 % 100 == 2 ? 2 : n2 % 100 == 3 || n2 % 100 == 4 ? 3 : 0);
|
|
|
},
|
|
|
22: function _22(n2) {
|
|
|
return Number(n2 == 1 ? 0 : n2 == 2 ? 1 : (n2 < 0 || n2 > 10) && n2 % 10 == 0 ? 2 : 3);
|
|
|
}
|
|
|
};
|
|
|
var deprecatedJsonVersions = ["v1", "v2", "v3"];
|
|
|
var suffixesOrder = {
|
|
|
zero: 0,
|
|
|
one: 1,
|
|
|
two: 2,
|
|
|
few: 3,
|
|
|
many: 4,
|
|
|
other: 5
|
|
|
};
|
|
|
function createRules() {
|
|
|
var rules = {};
|
|
|
sets.forEach(function(set) {
|
|
|
set.lngs.forEach(function(l2) {
|
|
|
rules[l2] = {
|
|
|
numbers: set.nr,
|
|
|
plurals: _rulesPluralsTypes[set.fc]
|
|
|
};
|
|
|
});
|
|
|
});
|
|
|
return rules;
|
|
|
}
|
|
|
var PluralResolver = function() {
|
|
|
function PluralResolver2(languageUtils) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
_classCallCheck(this, PluralResolver2);
|
|
|
this.languageUtils = languageUtils;
|
|
|
this.options = options;
|
|
|
this.logger = baseLogger.create("pluralResolver");
|
|
|
if ((!this.options.compatibilityJSON || this.options.compatibilityJSON === "v4") && (typeof Intl === "undefined" || !Intl.PluralRules)) {
|
|
|
this.options.compatibilityJSON = "v3";
|
|
|
this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.");
|
|
|
}
|
|
|
this.rules = createRules();
|
|
|
}
|
|
|
_createClass(PluralResolver2, [{
|
|
|
key: "addRule",
|
|
|
value: function addRule(lng, obj) {
|
|
|
this.rules[lng] = obj;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getRule",
|
|
|
value: function getRule(code) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
if (this.shouldUseIntlApi()) {
|
|
|
try {
|
|
|
return new Intl.PluralRules(code, {
|
|
|
type: options.ordinal ? "ordinal" : "cardinal"
|
|
|
});
|
|
|
} catch (_unused) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];
|
|
|
}
|
|
|
}, {
|
|
|
key: "needsPlural",
|
|
|
value: function needsPlural(code) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
var rule = this.getRule(code, options);
|
|
|
if (this.shouldUseIntlApi()) {
|
|
|
return rule && rule.resolvedOptions().pluralCategories.length > 1;
|
|
|
}
|
|
|
return rule && rule.numbers.length > 1;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getPluralFormsOfKey",
|
|
|
value: function getPluralFormsOfKey(code, key) {
|
|
|
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
|
return this.getSuffixes(code, options).map(function(suffix) {
|
|
|
return "".concat(key).concat(suffix);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSuffixes",
|
|
|
value: function getSuffixes(code) {
|
|
|
var _this = this;
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
var rule = this.getRule(code, options);
|
|
|
if (!rule) {
|
|
|
return [];
|
|
|
}
|
|
|
if (this.shouldUseIntlApi()) {
|
|
|
return rule.resolvedOptions().pluralCategories.sort(function(pluralCategory1, pluralCategory2) {
|
|
|
return suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2];
|
|
|
}).map(function(pluralCategory) {
|
|
|
return "".concat(_this.options.prepend).concat(pluralCategory);
|
|
|
});
|
|
|
}
|
|
|
return rule.numbers.map(function(number) {
|
|
|
return _this.getSuffix(code, number, options);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSuffix",
|
|
|
value: function getSuffix(code, count) {
|
|
|
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
|
var rule = this.getRule(code, options);
|
|
|
if (rule) {
|
|
|
if (this.shouldUseIntlApi()) {
|
|
|
return "".concat(this.options.prepend).concat(rule.select(count));
|
|
|
}
|
|
|
return this.getSuffixRetroCompatible(rule, count);
|
|
|
}
|
|
|
this.logger.warn("no plural rule found for: ".concat(code));
|
|
|
return "";
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSuffixRetroCompatible",
|
|
|
value: function getSuffixRetroCompatible(rule, count) {
|
|
|
var _this2 = this;
|
|
|
var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));
|
|
|
var suffix = rule.numbers[idx];
|
|
|
if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {
|
|
|
if (suffix === 2) {
|
|
|
suffix = "plural";
|
|
|
} else if (suffix === 1) {
|
|
|
suffix = "";
|
|
|
}
|
|
|
}
|
|
|
var returnSuffix = function returnSuffix2() {
|
|
|
return _this2.options.prepend && suffix.toString() ? _this2.options.prepend + suffix.toString() : suffix.toString();
|
|
|
};
|
|
|
if (this.options.compatibilityJSON === "v1") {
|
|
|
if (suffix === 1)
|
|
|
return "";
|
|
|
if (typeof suffix === "number")
|
|
|
return "_plural_".concat(suffix.toString());
|
|
|
return returnSuffix();
|
|
|
} else if (this.options.compatibilityJSON === "v2") {
|
|
|
return returnSuffix();
|
|
|
} else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {
|
|
|
return returnSuffix();
|
|
|
}
|
|
|
return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();
|
|
|
}
|
|
|
}, {
|
|
|
key: "shouldUseIntlApi",
|
|
|
value: function shouldUseIntlApi() {
|
|
|
return !deprecatedJsonVersions.includes(this.options.compatibilityJSON);
|
|
|
}
|
|
|
}]);
|
|
|
return PluralResolver2;
|
|
|
}();
|
|
|
function ownKeys$3(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$3(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$3(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$3(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
var Interpolator = function() {
|
|
|
function Interpolator2() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
_classCallCheck(this, Interpolator2);
|
|
|
this.logger = baseLogger.create("interpolator");
|
|
|
this.options = options;
|
|
|
this.format = options.interpolation && options.interpolation.format || function(value) {
|
|
|
return value;
|
|
|
};
|
|
|
this.init(options);
|
|
|
}
|
|
|
_createClass(Interpolator2, [{
|
|
|
key: "init",
|
|
|
value: function init() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
if (!options.interpolation)
|
|
|
options.interpolation = {
|
|
|
escapeValue: true
|
|
|
};
|
|
|
var iOpts = options.interpolation;
|
|
|
this.escape = iOpts.escape !== void 0 ? iOpts.escape : escape;
|
|
|
this.escapeValue = iOpts.escapeValue !== void 0 ? iOpts.escapeValue : true;
|
|
|
this.useRawValueToEscape = iOpts.useRawValueToEscape !== void 0 ? iOpts.useRawValueToEscape : false;
|
|
|
this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || "{{";
|
|
|
this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || "}}";
|
|
|
this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ",";
|
|
|
this.unescapePrefix = iOpts.unescapeSuffix ? "" : iOpts.unescapePrefix || "-";
|
|
|
this.unescapeSuffix = this.unescapePrefix ? "" : iOpts.unescapeSuffix || "";
|
|
|
this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape("$t(");
|
|
|
this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(")");
|
|
|
this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ",";
|
|
|
this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1e3;
|
|
|
this.alwaysFormat = iOpts.alwaysFormat !== void 0 ? iOpts.alwaysFormat : false;
|
|
|
this.resetRegExp();
|
|
|
}
|
|
|
}, {
|
|
|
key: "reset",
|
|
|
value: function reset() {
|
|
|
if (this.options)
|
|
|
this.init(this.options);
|
|
|
}
|
|
|
}, {
|
|
|
key: "resetRegExp",
|
|
|
value: function resetRegExp() {
|
|
|
var regexpStr = "".concat(this.prefix, "(.+?)").concat(this.suffix);
|
|
|
this.regexp = new RegExp(regexpStr, "g");
|
|
|
var regexpUnescapeStr = "".concat(this.prefix).concat(this.unescapePrefix, "(.+?)").concat(this.unescapeSuffix).concat(this.suffix);
|
|
|
this.regexpUnescape = new RegExp(regexpUnescapeStr, "g");
|
|
|
var nestingRegexpStr = "".concat(this.nestingPrefix, "(.+?)").concat(this.nestingSuffix);
|
|
|
this.nestingRegexp = new RegExp(nestingRegexpStr, "g");
|
|
|
}
|
|
|
}, {
|
|
|
key: "interpolate",
|
|
|
value: function interpolate(str, data, lng, options) {
|
|
|
var _this = this;
|
|
|
var match2;
|
|
|
var value;
|
|
|
var replaces;
|
|
|
var defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};
|
|
|
function regexSafe(val) {
|
|
|
return val.replace(/\$/g, "$$$$");
|
|
|
}
|
|
|
var handleFormat = function handleFormat2(key) {
|
|
|
if (key.indexOf(_this.formatSeparator) < 0) {
|
|
|
var path = getPathWithDefaults(data, defaultData, key);
|
|
|
return _this.alwaysFormat ? _this.format(path, void 0, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {
|
|
|
interpolationkey: key
|
|
|
})) : path;
|
|
|
}
|
|
|
var p2 = key.split(_this.formatSeparator);
|
|
|
var k = p2.shift().trim();
|
|
|
var f2 = p2.join(_this.formatSeparator).trim();
|
|
|
return _this.format(getPathWithDefaults(data, defaultData, k), f2, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {
|
|
|
interpolationkey: k
|
|
|
}));
|
|
|
};
|
|
|
this.resetRegExp();
|
|
|
var missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;
|
|
|
var skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables || this.options.interpolation.skipOnVariables;
|
|
|
var todos = [{
|
|
|
regex: this.regexpUnescape,
|
|
|
safeValue: function safeValue(val) {
|
|
|
return regexSafe(val);
|
|
|
}
|
|
|
}, {
|
|
|
regex: this.regexp,
|
|
|
safeValue: function safeValue(val) {
|
|
|
return _this.escapeValue ? regexSafe(_this.escape(val)) : regexSafe(val);
|
|
|
}
|
|
|
}];
|
|
|
todos.forEach(function(todo) {
|
|
|
replaces = 0;
|
|
|
while (match2 = todo.regex.exec(str)) {
|
|
|
value = handleFormat(match2[1].trim());
|
|
|
if (value === void 0) {
|
|
|
if (typeof missingInterpolationHandler === "function") {
|
|
|
var temp = missingInterpolationHandler(str, match2, options);
|
|
|
value = typeof temp === "string" ? temp : "";
|
|
|
} else if (skipOnVariables) {
|
|
|
value = match2[0];
|
|
|
continue;
|
|
|
} else {
|
|
|
_this.logger.warn("missed to pass in variable ".concat(match2[1], " for interpolating ").concat(str));
|
|
|
value = "";
|
|
|
}
|
|
|
} else if (typeof value !== "string" && !_this.useRawValueToEscape) {
|
|
|
value = makeString(value);
|
|
|
}
|
|
|
var safeValue = todo.safeValue(value);
|
|
|
str = str.replace(match2[0], safeValue);
|
|
|
if (skipOnVariables) {
|
|
|
todo.regex.lastIndex += safeValue.length;
|
|
|
todo.regex.lastIndex -= match2[0].length;
|
|
|
} else {
|
|
|
todo.regex.lastIndex = 0;
|
|
|
}
|
|
|
replaces++;
|
|
|
if (replaces >= _this.maxReplaces) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return str;
|
|
|
}
|
|
|
}, {
|
|
|
key: "nest",
|
|
|
value: function nest(str, fc2) {
|
|
|
var _this2 = this;
|
|
|
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
|
var match2;
|
|
|
var value;
|
|
|
var clonedOptions = _objectSpread$3({}, options);
|
|
|
clonedOptions.applyPostProcessor = false;
|
|
|
delete clonedOptions.defaultValue;
|
|
|
function handleHasOptions(key, inheritedOptions) {
|
|
|
var sep = this.nestingOptionsSeparator;
|
|
|
if (key.indexOf(sep) < 0)
|
|
|
return key;
|
|
|
var c = key.split(new RegExp("".concat(sep, "[ ]*{")));
|
|
|
var optionsString = "{".concat(c[1]);
|
|
|
key = c[0];
|
|
|
optionsString = this.interpolate(optionsString, clonedOptions);
|
|
|
optionsString = optionsString.replace(/'/g, '"');
|
|
|
try {
|
|
|
clonedOptions = JSON.parse(optionsString);
|
|
|
if (inheritedOptions)
|
|
|
clonedOptions = _objectSpread$3(_objectSpread$3({}, inheritedOptions), clonedOptions);
|
|
|
} catch (e) {
|
|
|
this.logger.warn("failed parsing options string in nesting for key ".concat(key), e);
|
|
|
return "".concat(key).concat(sep).concat(optionsString);
|
|
|
}
|
|
|
delete clonedOptions.defaultValue;
|
|
|
return key;
|
|
|
}
|
|
|
while (match2 = this.nestingRegexp.exec(str)) {
|
|
|
var formatters2 = [];
|
|
|
var doReduce = false;
|
|
|
if (match2[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match2[1])) {
|
|
|
var r2 = match2[1].split(this.formatSeparator).map(function(elem) {
|
|
|
return elem.trim();
|
|
|
});
|
|
|
match2[1] = r2.shift();
|
|
|
formatters2 = r2;
|
|
|
doReduce = true;
|
|
|
}
|
|
|
value = fc2(handleHasOptions.call(this, match2[1].trim(), clonedOptions), clonedOptions);
|
|
|
if (value && match2[0] === str && typeof value !== "string")
|
|
|
return value;
|
|
|
if (typeof value !== "string")
|
|
|
value = makeString(value);
|
|
|
if (!value) {
|
|
|
this.logger.warn("missed to resolve ".concat(match2[1], " for nesting ").concat(str));
|
|
|
value = "";
|
|
|
}
|
|
|
if (doReduce) {
|
|
|
value = formatters2.reduce(function(v2, f2) {
|
|
|
return _this2.format(v2, f2, options.lng, _objectSpread$3(_objectSpread$3({}, options), {}, {
|
|
|
interpolationkey: match2[1].trim()
|
|
|
}));
|
|
|
}, value.trim());
|
|
|
}
|
|
|
str = str.replace(match2[0], value);
|
|
|
this.regexp.lastIndex = 0;
|
|
|
}
|
|
|
return str;
|
|
|
}
|
|
|
}]);
|
|
|
return Interpolator2;
|
|
|
}();
|
|
|
function ownKeys$4(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$4(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$4(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$4(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function parseFormatStr(formatStr) {
|
|
|
var formatName = formatStr.toLowerCase().trim();
|
|
|
var formatOptions = {};
|
|
|
if (formatStr.indexOf("(") > -1) {
|
|
|
var p2 = formatStr.split("(");
|
|
|
formatName = p2[0].toLowerCase().trim();
|
|
|
var optStr = p2[1].substring(0, p2[1].length - 1);
|
|
|
if (formatName === "currency" && optStr.indexOf(":") < 0) {
|
|
|
if (!formatOptions.currency)
|
|
|
formatOptions.currency = optStr.trim();
|
|
|
} else if (formatName === "relativetime" && optStr.indexOf(":") < 0) {
|
|
|
if (!formatOptions.range)
|
|
|
formatOptions.range = optStr.trim();
|
|
|
} else {
|
|
|
var opts = optStr.split(";");
|
|
|
opts.forEach(function(opt) {
|
|
|
if (!opt)
|
|
|
return;
|
|
|
var _opt$split = opt.split(":"), _opt$split2 = _toArray(_opt$split), key = _opt$split2[0], rest = _opt$split2.slice(1);
|
|
|
var val = rest.join(":");
|
|
|
if (val.trim() === "false")
|
|
|
formatOptions[key.trim()] = false;
|
|
|
if (val.trim() === "true")
|
|
|
formatOptions[key.trim()] = true;
|
|
|
if (!isNaN(val.trim()))
|
|
|
formatOptions[key.trim()] = parseInt(val.trim(), 10);
|
|
|
if (!formatOptions[key.trim()])
|
|
|
formatOptions[key.trim()] = val.trim();
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
formatName,
|
|
|
formatOptions
|
|
|
};
|
|
|
}
|
|
|
var Formatter = function() {
|
|
|
function Formatter2() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
_classCallCheck(this, Formatter2);
|
|
|
this.logger = baseLogger.create("formatter");
|
|
|
this.options = options;
|
|
|
this.formats = {
|
|
|
number: function number(val, lng, options2) {
|
|
|
return new Intl.NumberFormat(lng, options2).format(val);
|
|
|
},
|
|
|
currency: function currency(val, lng, options2) {
|
|
|
return new Intl.NumberFormat(lng, _objectSpread$4(_objectSpread$4({}, options2), {}, {
|
|
|
style: "currency"
|
|
|
})).format(val);
|
|
|
},
|
|
|
datetime: function datetime(val, lng, options2) {
|
|
|
return new Intl.DateTimeFormat(lng, _objectSpread$4({}, options2)).format(val);
|
|
|
},
|
|
|
relativetime: function relativetime(val, lng, options2) {
|
|
|
return new Intl.RelativeTimeFormat(lng, _objectSpread$4({}, options2)).format(val, options2.range || "day");
|
|
|
},
|
|
|
list: function list(val, lng, options2) {
|
|
|
return new Intl.ListFormat(lng, _objectSpread$4({}, options2)).format(val);
|
|
|
}
|
|
|
};
|
|
|
this.init(options);
|
|
|
}
|
|
|
_createClass(Formatter2, [{
|
|
|
key: "init",
|
|
|
value: function init(services) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
|
|
|
interpolation: {}
|
|
|
};
|
|
|
var iOpts = options.interpolation;
|
|
|
this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ",";
|
|
|
}
|
|
|
}, {
|
|
|
key: "add",
|
|
|
value: function add(name, fc2) {
|
|
|
this.formats[name] = fc2;
|
|
|
}
|
|
|
}, {
|
|
|
key: "format",
|
|
|
value: function format2(value, _format, lng, options) {
|
|
|
var _this = this;
|
|
|
var formats = _format.split(this.formatSeparator);
|
|
|
var result = formats.reduce(function(mem, f2) {
|
|
|
var _parseFormatStr = parseFormatStr(f2), formatName = _parseFormatStr.formatName, formatOptions = _parseFormatStr.formatOptions;
|
|
|
if (_this.formats[formatName]) {
|
|
|
var formatted = mem;
|
|
|
try {
|
|
|
var valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};
|
|
|
var l2 = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;
|
|
|
formatted = _this.formats[formatName](mem, l2, _objectSpread$4(_objectSpread$4(_objectSpread$4({}, formatOptions), options), valOptions));
|
|
|
} catch (error2) {
|
|
|
_this.logger.warn(error2);
|
|
|
}
|
|
|
return formatted;
|
|
|
} else {
|
|
|
_this.logger.warn("there was no format function for ".concat(formatName));
|
|
|
}
|
|
|
return mem;
|
|
|
}, value);
|
|
|
return result;
|
|
|
}
|
|
|
}]);
|
|
|
return Formatter2;
|
|
|
}();
|
|
|
function ownKeys$5(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$5(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$5(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$5(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _createSuper$2(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct$2();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _isNativeReflectConstruct$2() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function remove(arr, what) {
|
|
|
var found = arr.indexOf(what);
|
|
|
while (found !== -1) {
|
|
|
arr.splice(found, 1);
|
|
|
found = arr.indexOf(what);
|
|
|
}
|
|
|
}
|
|
|
var Connector = function(_EventEmitter) {
|
|
|
_inherits(Connector2, _EventEmitter);
|
|
|
var _super = _createSuper$2(Connector2);
|
|
|
function Connector2(backend, store, services) {
|
|
|
var _this;
|
|
|
var options = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
|
|
|
_classCallCheck(this, Connector2);
|
|
|
_this = _super.call(this);
|
|
|
if (isIE10) {
|
|
|
EventEmitter.call(_assertThisInitialized(_this));
|
|
|
}
|
|
|
_this.backend = backend;
|
|
|
_this.store = store;
|
|
|
_this.services = services;
|
|
|
_this.languageUtils = services.languageUtils;
|
|
|
_this.options = options;
|
|
|
_this.logger = baseLogger.create("backendConnector");
|
|
|
_this.state = {};
|
|
|
_this.queue = [];
|
|
|
if (_this.backend && _this.backend.init) {
|
|
|
_this.backend.init(services, options.backend, options);
|
|
|
}
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass(Connector2, [{
|
|
|
key: "queueLoad",
|
|
|
value: function queueLoad(languages, namespaces, options, callback) {
|
|
|
var _this2 = this;
|
|
|
var toLoad = [];
|
|
|
var pending = [];
|
|
|
var toLoadLanguages = [];
|
|
|
var toLoadNamespaces = [];
|
|
|
languages.forEach(function(lng) {
|
|
|
var hasAllNamespaces = true;
|
|
|
namespaces.forEach(function(ns) {
|
|
|
var name = "".concat(lng, "|").concat(ns);
|
|
|
if (!options.reload && _this2.store.hasResourceBundle(lng, ns)) {
|
|
|
_this2.state[name] = 2;
|
|
|
} else if (_this2.state[name] < 0)
|
|
|
;
|
|
|
else if (_this2.state[name] === 1) {
|
|
|
if (pending.indexOf(name) < 0)
|
|
|
pending.push(name);
|
|
|
} else {
|
|
|
_this2.state[name] = 1;
|
|
|
hasAllNamespaces = false;
|
|
|
if (pending.indexOf(name) < 0)
|
|
|
pending.push(name);
|
|
|
if (toLoad.indexOf(name) < 0)
|
|
|
toLoad.push(name);
|
|
|
if (toLoadNamespaces.indexOf(ns) < 0)
|
|
|
toLoadNamespaces.push(ns);
|
|
|
}
|
|
|
});
|
|
|
if (!hasAllNamespaces)
|
|
|
toLoadLanguages.push(lng);
|
|
|
});
|
|
|
if (toLoad.length || pending.length) {
|
|
|
this.queue.push({
|
|
|
pending,
|
|
|
loaded: {},
|
|
|
errors: [],
|
|
|
callback
|
|
|
});
|
|
|
}
|
|
|
return {
|
|
|
toLoad,
|
|
|
pending,
|
|
|
toLoadLanguages,
|
|
|
toLoadNamespaces
|
|
|
};
|
|
|
}
|
|
|
}, {
|
|
|
key: "loaded",
|
|
|
value: function loaded(name, err, data) {
|
|
|
var s = name.split("|");
|
|
|
var lng = s[0];
|
|
|
var ns = s[1];
|
|
|
if (err)
|
|
|
this.emit("failedLoading", lng, ns, err);
|
|
|
if (data) {
|
|
|
this.store.addResourceBundle(lng, ns, data);
|
|
|
}
|
|
|
this.state[name] = err ? -1 : 2;
|
|
|
var loaded2 = {};
|
|
|
this.queue.forEach(function(q2) {
|
|
|
pushPath(q2.loaded, [lng], ns);
|
|
|
remove(q2.pending, name);
|
|
|
if (err)
|
|
|
q2.errors.push(err);
|
|
|
if (q2.pending.length === 0 && !q2.done) {
|
|
|
Object.keys(q2.loaded).forEach(function(l2) {
|
|
|
if (!loaded2[l2])
|
|
|
loaded2[l2] = [];
|
|
|
if (q2.loaded[l2].length) {
|
|
|
q2.loaded[l2].forEach(function(ns2) {
|
|
|
if (loaded2[l2].indexOf(ns2) < 0)
|
|
|
loaded2[l2].push(ns2);
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
q2.done = true;
|
|
|
if (q2.errors.length) {
|
|
|
q2.callback(q2.errors);
|
|
|
} else {
|
|
|
q2.callback();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
this.emit("loaded", loaded2);
|
|
|
this.queue = this.queue.filter(function(q2) {
|
|
|
return !q2.done;
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "read",
|
|
|
value: function read2(lng, ns, fcName) {
|
|
|
var _this3 = this;
|
|
|
var tried = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0;
|
|
|
var wait = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : 350;
|
|
|
var callback = arguments.length > 5 ? arguments[5] : void 0;
|
|
|
if (!lng.length)
|
|
|
return callback(null, {});
|
|
|
return this.backend[fcName](lng, ns, function(err, data) {
|
|
|
if (err && data && tried < 5) {
|
|
|
setTimeout(function() {
|
|
|
_this3.read.call(_this3, lng, ns, fcName, tried + 1, wait * 2, callback);
|
|
|
}, wait);
|
|
|
return;
|
|
|
}
|
|
|
callback(err, data);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "prepareLoading",
|
|
|
value: function prepareLoading(languages, namespaces) {
|
|
|
var _this4 = this;
|
|
|
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
|
var callback = arguments.length > 3 ? arguments[3] : void 0;
|
|
|
if (!this.backend) {
|
|
|
this.logger.warn("No backend was added via i18next.use. Will not load resources.");
|
|
|
return callback && callback();
|
|
|
}
|
|
|
if (typeof languages === "string")
|
|
|
languages = this.languageUtils.toResolveHierarchy(languages);
|
|
|
if (typeof namespaces === "string")
|
|
|
namespaces = [namespaces];
|
|
|
var toLoad = this.queueLoad(languages, namespaces, options, callback);
|
|
|
if (!toLoad.toLoad.length) {
|
|
|
if (!toLoad.pending.length)
|
|
|
callback();
|
|
|
return null;
|
|
|
}
|
|
|
toLoad.toLoad.forEach(function(name) {
|
|
|
_this4.loadOne(name);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "load",
|
|
|
value: function load(languages, namespaces, callback) {
|
|
|
this.prepareLoading(languages, namespaces, {}, callback);
|
|
|
}
|
|
|
}, {
|
|
|
key: "reload",
|
|
|
value: function reload(languages, namespaces, callback) {
|
|
|
this.prepareLoading(languages, namespaces, {
|
|
|
reload: true
|
|
|
}, callback);
|
|
|
}
|
|
|
}, {
|
|
|
key: "loadOne",
|
|
|
value: function loadOne(name) {
|
|
|
var _this5 = this;
|
|
|
var prefix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
|
|
|
var s = name.split("|");
|
|
|
var lng = s[0];
|
|
|
var ns = s[1];
|
|
|
this.read(lng, ns, "read", void 0, void 0, function(err, data) {
|
|
|
if (err)
|
|
|
_this5.logger.warn("".concat(prefix, "loading namespace ").concat(ns, " for language ").concat(lng, " failed"), err);
|
|
|
if (!err && data)
|
|
|
_this5.logger.log("".concat(prefix, "loaded namespace ").concat(ns, " for language ").concat(lng), data);
|
|
|
_this5.loaded(name, err, data);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "saveMissing",
|
|
|
value: function saveMissing(languages, namespace, key, fallbackValue, isUpdate) {
|
|
|
var options = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : {};
|
|
|
if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {
|
|
|
this.logger.warn('did not save key "'.concat(key, '" as the namespace "').concat(namespace, '" was not yet loaded'), "This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");
|
|
|
return;
|
|
|
}
|
|
|
if (key === void 0 || key === null || key === "")
|
|
|
return;
|
|
|
if (this.backend && this.backend.create) {
|
|
|
this.backend.create(languages, namespace, key, fallbackValue, null, _objectSpread$5(_objectSpread$5({}, options), {}, {
|
|
|
isUpdate
|
|
|
}));
|
|
|
}
|
|
|
if (!languages || !languages[0])
|
|
|
return;
|
|
|
this.store.addResource(languages[0], namespace, key, fallbackValue);
|
|
|
}
|
|
|
}]);
|
|
|
return Connector2;
|
|
|
}(EventEmitter);
|
|
|
function get() {
|
|
|
return {
|
|
|
debug: false,
|
|
|
initImmediate: true,
|
|
|
ns: ["translation"],
|
|
|
defaultNS: ["translation"],
|
|
|
fallbackLng: ["dev"],
|
|
|
fallbackNS: false,
|
|
|
supportedLngs: false,
|
|
|
nonExplicitSupportedLngs: false,
|
|
|
load: "all",
|
|
|
preload: false,
|
|
|
simplifyPluralSuffix: true,
|
|
|
keySeparator: ".",
|
|
|
nsSeparator: ":",
|
|
|
pluralSeparator: "_",
|
|
|
contextSeparator: "_",
|
|
|
partialBundledLanguages: false,
|
|
|
saveMissing: false,
|
|
|
updateMissing: false,
|
|
|
saveMissingTo: "fallback",
|
|
|
saveMissingPlurals: true,
|
|
|
missingKeyHandler: false,
|
|
|
missingInterpolationHandler: false,
|
|
|
postProcess: false,
|
|
|
postProcessPassResolved: false,
|
|
|
returnNull: true,
|
|
|
returnEmptyString: true,
|
|
|
returnObjects: false,
|
|
|
joinArrays: false,
|
|
|
returnedObjectHandler: false,
|
|
|
parseMissingKeyHandler: false,
|
|
|
appendNamespaceToMissingKey: false,
|
|
|
appendNamespaceToCIMode: false,
|
|
|
overloadTranslationOptionHandler: function handle2(args) {
|
|
|
var ret = {};
|
|
|
if (_typeof(args[1]) === "object")
|
|
|
ret = args[1];
|
|
|
if (typeof args[1] === "string")
|
|
|
ret.defaultValue = args[1];
|
|
|
if (typeof args[2] === "string")
|
|
|
ret.tDescription = args[2];
|
|
|
if (_typeof(args[2]) === "object" || _typeof(args[3]) === "object") {
|
|
|
var options = args[3] || args[2];
|
|
|
Object.keys(options).forEach(function(key) {
|
|
|
ret[key] = options[key];
|
|
|
});
|
|
|
}
|
|
|
return ret;
|
|
|
},
|
|
|
interpolation: {
|
|
|
escapeValue: true,
|
|
|
format: function format2(value, _format, lng, options) {
|
|
|
return value;
|
|
|
},
|
|
|
prefix: "{{",
|
|
|
suffix: "}}",
|
|
|
formatSeparator: ",",
|
|
|
unescapePrefix: "-",
|
|
|
nestingPrefix: "$t(",
|
|
|
nestingSuffix: ")",
|
|
|
nestingOptionsSeparator: ",",
|
|
|
maxReplaces: 1e3,
|
|
|
skipOnVariables: true
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
function transformOptions(options) {
|
|
|
if (typeof options.ns === "string")
|
|
|
options.ns = [options.ns];
|
|
|
if (typeof options.fallbackLng === "string")
|
|
|
options.fallbackLng = [options.fallbackLng];
|
|
|
if (typeof options.fallbackNS === "string")
|
|
|
options.fallbackNS = [options.fallbackNS];
|
|
|
if (options.supportedLngs && options.supportedLngs.indexOf("cimode") < 0) {
|
|
|
options.supportedLngs = options.supportedLngs.concat(["cimode"]);
|
|
|
}
|
|
|
return options;
|
|
|
}
|
|
|
function ownKeys$6(object, enumerableOnly) {
|
|
|
var keys = Object.keys(object);
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
|
if (enumerableOnly) {
|
|
|
symbols = symbols.filter(function(sym) {
|
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
|
});
|
|
|
}
|
|
|
keys.push.apply(keys, symbols);
|
|
|
}
|
|
|
return keys;
|
|
|
}
|
|
|
function _objectSpread$6(target) {
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
if (i % 2) {
|
|
|
ownKeys$6(Object(source), true).forEach(function(key) {
|
|
|
_defineProperty(target, key, source[key]);
|
|
|
});
|
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
|
} else {
|
|
|
ownKeys$6(Object(source)).forEach(function(key) {
|
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
return target;
|
|
|
}
|
|
|
function _createSuper$3(Derived) {
|
|
|
var hasNativeReflectConstruct = _isNativeReflectConstruct$3();
|
|
|
return function _createSuperInternal() {
|
|
|
var Super = _getPrototypeOf(Derived), result;
|
|
|
if (hasNativeReflectConstruct) {
|
|
|
var NewTarget = _getPrototypeOf(this).constructor;
|
|
|
result = Reflect.construct(Super, arguments, NewTarget);
|
|
|
} else {
|
|
|
result = Super.apply(this, arguments);
|
|
|
}
|
|
|
return _possibleConstructorReturn(this, result);
|
|
|
};
|
|
|
}
|
|
|
function _isNativeReflectConstruct$3() {
|
|
|
if (typeof Reflect === "undefined" || !Reflect.construct)
|
|
|
return false;
|
|
|
if (Reflect.construct.sham)
|
|
|
return false;
|
|
|
if (typeof Proxy === "function")
|
|
|
return true;
|
|
|
try {
|
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
|
|
}));
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
function noop() {
|
|
|
}
|
|
|
function bindMemberFunctions(inst) {
|
|
|
var mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));
|
|
|
mems.forEach(function(mem) {
|
|
|
if (typeof inst[mem] === "function") {
|
|
|
inst[mem] = inst[mem].bind(inst);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
var I18n = function(_EventEmitter) {
|
|
|
_inherits(I18n2, _EventEmitter);
|
|
|
var _super = _createSuper$3(I18n2);
|
|
|
function I18n2() {
|
|
|
var _this;
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
var callback = arguments.length > 1 ? arguments[1] : void 0;
|
|
|
_classCallCheck(this, I18n2);
|
|
|
_this = _super.call(this);
|
|
|
if (isIE10) {
|
|
|
EventEmitter.call(_assertThisInitialized(_this));
|
|
|
}
|
|
|
_this.options = transformOptions(options);
|
|
|
_this.services = {};
|
|
|
_this.logger = baseLogger;
|
|
|
_this.modules = {
|
|
|
external: []
|
|
|
};
|
|
|
bindMemberFunctions(_assertThisInitialized(_this));
|
|
|
if (callback && !_this.isInitialized && !options.isClone) {
|
|
|
if (!_this.options.initImmediate) {
|
|
|
_this.init(options, callback);
|
|
|
return _possibleConstructorReturn(_this, _assertThisInitialized(_this));
|
|
|
}
|
|
|
setTimeout(function() {
|
|
|
_this.init(options, callback);
|
|
|
}, 0);
|
|
|
}
|
|
|
return _this;
|
|
|
}
|
|
|
_createClass(I18n2, [{
|
|
|
key: "init",
|
|
|
value: function init() {
|
|
|
var _this2 = this;
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
var callback = arguments.length > 1 ? arguments[1] : void 0;
|
|
|
if (typeof options === "function") {
|
|
|
callback = options;
|
|
|
options = {};
|
|
|
}
|
|
|
if (!options.defaultNS && options.ns) {
|
|
|
if (typeof options.ns === "string") {
|
|
|
options.defaultNS = options.ns;
|
|
|
} else if (options.ns.indexOf("translation") < 0) {
|
|
|
options.defaultNS = options.ns[0];
|
|
|
}
|
|
|
}
|
|
|
var defOpts = get();
|
|
|
this.options = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, defOpts), this.options), transformOptions(options));
|
|
|
if (this.options.compatibilityAPI !== "v1") {
|
|
|
this.options.interpolation = _objectSpread$6(_objectSpread$6({}, defOpts.interpolation), this.options.interpolation);
|
|
|
}
|
|
|
if (options.keySeparator !== void 0) {
|
|
|
this.options.userDefinedKeySeparator = options.keySeparator;
|
|
|
}
|
|
|
if (options.nsSeparator !== void 0) {
|
|
|
this.options.userDefinedNsSeparator = options.nsSeparator;
|
|
|
}
|
|
|
function createClassOnDemand(ClassOrObject) {
|
|
|
if (!ClassOrObject)
|
|
|
return null;
|
|
|
if (typeof ClassOrObject === "function")
|
|
|
return new ClassOrObject();
|
|
|
return ClassOrObject;
|
|
|
}
|
|
|
if (!this.options.isClone) {
|
|
|
if (this.modules.logger) {
|
|
|
baseLogger.init(createClassOnDemand(this.modules.logger), this.options);
|
|
|
} else {
|
|
|
baseLogger.init(null, this.options);
|
|
|
}
|
|
|
var formatter;
|
|
|
if (this.modules.formatter) {
|
|
|
formatter = this.modules.formatter;
|
|
|
} else if (typeof Intl !== "undefined") {
|
|
|
formatter = Formatter;
|
|
|
}
|
|
|
var lu = new LanguageUtil(this.options);
|
|
|
this.store = new ResourceStore(this.options.resources, this.options);
|
|
|
var s = this.services;
|
|
|
s.logger = baseLogger;
|
|
|
s.resourceStore = this.store;
|
|
|
s.languageUtils = lu;
|
|
|
s.pluralResolver = new PluralResolver(lu, {
|
|
|
prepend: this.options.pluralSeparator,
|
|
|
compatibilityJSON: this.options.compatibilityJSON,
|
|
|
simplifyPluralSuffix: this.options.simplifyPluralSuffix
|
|
|
});
|
|
|
if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {
|
|
|
s.formatter = createClassOnDemand(formatter);
|
|
|
s.formatter.init(s, this.options);
|
|
|
this.options.interpolation.format = s.formatter.format.bind(s.formatter);
|
|
|
}
|
|
|
s.interpolator = new Interpolator(this.options);
|
|
|
s.utils = {
|
|
|
hasLoadedNamespace: this.hasLoadedNamespace.bind(this)
|
|
|
};
|
|
|
s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);
|
|
|
s.backendConnector.on("*", function(event) {
|
|
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
|
args[_key - 1] = arguments[_key];
|
|
|
}
|
|
|
_this2.emit.apply(_this2, [event].concat(args));
|
|
|
});
|
|
|
if (this.modules.languageDetector) {
|
|
|
s.languageDetector = createClassOnDemand(this.modules.languageDetector);
|
|
|
s.languageDetector.init(s, this.options.detection, this.options);
|
|
|
}
|
|
|
if (this.modules.i18nFormat) {
|
|
|
s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);
|
|
|
if (s.i18nFormat.init)
|
|
|
s.i18nFormat.init(this);
|
|
|
}
|
|
|
this.translator = new Translator(this.services, this.options);
|
|
|
this.translator.on("*", function(event) {
|
|
|
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
|
args[_key2 - 1] = arguments[_key2];
|
|
|
}
|
|
|
_this2.emit.apply(_this2, [event].concat(args));
|
|
|
});
|
|
|
this.modules.external.forEach(function(m2) {
|
|
|
if (m2.init)
|
|
|
m2.init(_this2);
|
|
|
});
|
|
|
}
|
|
|
this.format = this.options.interpolation.format;
|
|
|
if (!callback)
|
|
|
callback = noop;
|
|
|
if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {
|
|
|
var codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);
|
|
|
if (codes.length > 0 && codes[0] !== "dev")
|
|
|
this.options.lng = codes[0];
|
|
|
}
|
|
|
if (!this.services.languageDetector && !this.options.lng) {
|
|
|
this.logger.warn("init: no languageDetector is used and no lng is defined");
|
|
|
}
|
|
|
var storeApi = ["getResource", "hasResourceBundle", "getResourceBundle", "getDataByLanguage"];
|
|
|
storeApi.forEach(function(fcName) {
|
|
|
_this2[fcName] = function() {
|
|
|
var _this2$store;
|
|
|
return (_this2$store = _this2.store)[fcName].apply(_this2$store, arguments);
|
|
|
};
|
|
|
});
|
|
|
var storeApiChained = ["addResource", "addResources", "addResourceBundle", "removeResourceBundle"];
|
|
|
storeApiChained.forEach(function(fcName) {
|
|
|
_this2[fcName] = function() {
|
|
|
var _this2$store2;
|
|
|
(_this2$store2 = _this2.store)[fcName].apply(_this2$store2, arguments);
|
|
|
return _this2;
|
|
|
};
|
|
|
});
|
|
|
var deferred = defer();
|
|
|
var load = function load2() {
|
|
|
var finish = function finish2(err, t2) {
|
|
|
if (_this2.isInitialized && !_this2.initializedStoreOnce)
|
|
|
_this2.logger.warn("init: i18next is already initialized. You should call init just once!");
|
|
|
_this2.isInitialized = true;
|
|
|
if (!_this2.options.isClone)
|
|
|
_this2.logger.log("initialized", _this2.options);
|
|
|
_this2.emit("initialized", _this2.options);
|
|
|
deferred.resolve(t2);
|
|
|
callback(err, t2);
|
|
|
};
|
|
|
if (_this2.languages && _this2.options.compatibilityAPI !== "v1" && !_this2.isInitialized)
|
|
|
return finish(null, _this2.t.bind(_this2));
|
|
|
_this2.changeLanguage(_this2.options.lng, finish);
|
|
|
};
|
|
|
if (this.options.resources || !this.options.initImmediate) {
|
|
|
load();
|
|
|
} else {
|
|
|
setTimeout(load, 0);
|
|
|
}
|
|
|
return deferred;
|
|
|
}
|
|
|
}, {
|
|
|
key: "loadResources",
|
|
|
value: function loadResources(language) {
|
|
|
var _this3 = this;
|
|
|
var callback = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
|
|
|
var usedCallback = callback;
|
|
|
var usedLng = typeof language === "string" ? language : this.language;
|
|
|
if (typeof language === "function")
|
|
|
usedCallback = language;
|
|
|
if (!this.options.resources || this.options.partialBundledLanguages) {
|
|
|
if (usedLng && usedLng.toLowerCase() === "cimode")
|
|
|
return usedCallback();
|
|
|
var toLoad = [];
|
|
|
var append = function append2(lng) {
|
|
|
if (!lng)
|
|
|
return;
|
|
|
var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);
|
|
|
lngs.forEach(function(l2) {
|
|
|
if (toLoad.indexOf(l2) < 0)
|
|
|
toLoad.push(l2);
|
|
|
});
|
|
|
};
|
|
|
if (!usedLng) {
|
|
|
var fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);
|
|
|
fallbacks.forEach(function(l2) {
|
|
|
return append(l2);
|
|
|
});
|
|
|
} else {
|
|
|
append(usedLng);
|
|
|
}
|
|
|
if (this.options.preload) {
|
|
|
this.options.preload.forEach(function(l2) {
|
|
|
return append(l2);
|
|
|
});
|
|
|
}
|
|
|
this.services.backendConnector.load(toLoad, this.options.ns, usedCallback);
|
|
|
} else {
|
|
|
usedCallback(null);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "reloadResources",
|
|
|
value: function reloadResources(lngs, ns, callback) {
|
|
|
var deferred = defer();
|
|
|
if (!lngs)
|
|
|
lngs = this.languages;
|
|
|
if (!ns)
|
|
|
ns = this.options.ns;
|
|
|
if (!callback)
|
|
|
callback = noop;
|
|
|
this.services.backendConnector.reload(lngs, ns, function(err) {
|
|
|
deferred.resolve();
|
|
|
callback(err);
|
|
|
});
|
|
|
return deferred;
|
|
|
}
|
|
|
}, {
|
|
|
key: "use",
|
|
|
value: function use(module2) {
|
|
|
if (!module2)
|
|
|
throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");
|
|
|
if (!module2.type)
|
|
|
throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");
|
|
|
if (module2.type === "backend") {
|
|
|
this.modules.backend = module2;
|
|
|
}
|
|
|
if (module2.type === "logger" || module2.log && module2.warn && module2.error) {
|
|
|
this.modules.logger = module2;
|
|
|
}
|
|
|
if (module2.type === "languageDetector") {
|
|
|
this.modules.languageDetector = module2;
|
|
|
}
|
|
|
if (module2.type === "i18nFormat") {
|
|
|
this.modules.i18nFormat = module2;
|
|
|
}
|
|
|
if (module2.type === "postProcessor") {
|
|
|
postProcessor.addPostProcessor(module2);
|
|
|
}
|
|
|
if (module2.type === "formatter") {
|
|
|
this.modules.formatter = module2;
|
|
|
}
|
|
|
if (module2.type === "3rdParty") {
|
|
|
this.modules.external.push(module2);
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
}, {
|
|
|
key: "changeLanguage",
|
|
|
value: function changeLanguage(lng, callback) {
|
|
|
var _this4 = this;
|
|
|
this.isLanguageChangingTo = lng;
|
|
|
var deferred = defer();
|
|
|
this.emit("languageChanging", lng);
|
|
|
var setLngProps = function setLngProps2(l2) {
|
|
|
_this4.language = l2;
|
|
|
_this4.languages = _this4.services.languageUtils.toResolveHierarchy(l2);
|
|
|
_this4.resolvedLanguage = void 0;
|
|
|
if (["cimode", "dev"].indexOf(l2) > -1)
|
|
|
return;
|
|
|
for (var li2 = 0; li2 < _this4.languages.length; li2++) {
|
|
|
var lngInLngs = _this4.languages[li2];
|
|
|
if (["cimode", "dev"].indexOf(lngInLngs) > -1)
|
|
|
continue;
|
|
|
if (_this4.store.hasLanguageSomeTranslations(lngInLngs)) {
|
|
|
_this4.resolvedLanguage = lngInLngs;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
var done = function done2(err, l2) {
|
|
|
if (l2) {
|
|
|
setLngProps(l2);
|
|
|
_this4.translator.changeLanguage(l2);
|
|
|
_this4.isLanguageChangingTo = void 0;
|
|
|
_this4.emit("languageChanged", l2);
|
|
|
_this4.logger.log("languageChanged", l2);
|
|
|
} else {
|
|
|
_this4.isLanguageChangingTo = void 0;
|
|
|
}
|
|
|
deferred.resolve(function() {
|
|
|
return _this4.t.apply(_this4, arguments);
|
|
|
});
|
|
|
if (callback)
|
|
|
callback(err, function() {
|
|
|
return _this4.t.apply(_this4, arguments);
|
|
|
});
|
|
|
};
|
|
|
var setLng = function setLng2(lngs) {
|
|
|
if (!lng && !lngs && _this4.services.languageDetector)
|
|
|
lngs = [];
|
|
|
var l2 = typeof lngs === "string" ? lngs : _this4.services.languageUtils.getBestMatchFromCodes(lngs);
|
|
|
if (l2) {
|
|
|
if (!_this4.language) {
|
|
|
setLngProps(l2);
|
|
|
}
|
|
|
if (!_this4.translator.language)
|
|
|
_this4.translator.changeLanguage(l2);
|
|
|
if (_this4.services.languageDetector)
|
|
|
_this4.services.languageDetector.cacheUserLanguage(l2);
|
|
|
}
|
|
|
_this4.loadResources(l2, function(err) {
|
|
|
done(err, l2);
|
|
|
});
|
|
|
};
|
|
|
if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {
|
|
|
setLng(this.services.languageDetector.detect());
|
|
|
} else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {
|
|
|
this.services.languageDetector.detect(setLng);
|
|
|
} else {
|
|
|
setLng(lng);
|
|
|
}
|
|
|
return deferred;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getFixedT",
|
|
|
value: function getFixedT(lng, ns, keyPrefix) {
|
|
|
var _this5 = this;
|
|
|
var fixedT = function fixedT2(key, opts) {
|
|
|
var options;
|
|
|
if (_typeof(opts) !== "object") {
|
|
|
for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
|
|
|
rest[_key3 - 2] = arguments[_key3];
|
|
|
}
|
|
|
options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest));
|
|
|
} else {
|
|
|
options = _objectSpread$6({}, opts);
|
|
|
}
|
|
|
options.lng = options.lng || fixedT2.lng;
|
|
|
options.lngs = options.lngs || fixedT2.lngs;
|
|
|
options.ns = options.ns || fixedT2.ns;
|
|
|
var keySeparator = _this5.options.keySeparator || ".";
|
|
|
var resultKey = keyPrefix ? "".concat(keyPrefix).concat(keySeparator).concat(key) : key;
|
|
|
return _this5.t(resultKey, options);
|
|
|
};
|
|
|
if (typeof lng === "string") {
|
|
|
fixedT.lng = lng;
|
|
|
} else {
|
|
|
fixedT.lngs = lng;
|
|
|
}
|
|
|
fixedT.ns = ns;
|
|
|
fixedT.keyPrefix = keyPrefix;
|
|
|
return fixedT;
|
|
|
}
|
|
|
}, {
|
|
|
key: "t",
|
|
|
value: function t2() {
|
|
|
var _this$translator;
|
|
|
return this.translator && (_this$translator = this.translator).translate.apply(_this$translator, arguments);
|
|
|
}
|
|
|
}, {
|
|
|
key: "exists",
|
|
|
value: function exists() {
|
|
|
var _this$translator2;
|
|
|
return this.translator && (_this$translator2 = this.translator).exists.apply(_this$translator2, arguments);
|
|
|
}
|
|
|
}, {
|
|
|
key: "setDefaultNamespace",
|
|
|
value: function setDefaultNamespace(ns) {
|
|
|
this.options.defaultNS = ns;
|
|
|
}
|
|
|
}, {
|
|
|
key: "hasLoadedNamespace",
|
|
|
value: function hasLoadedNamespace(ns) {
|
|
|
var _this6 = this;
|
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
|
if (!this.isInitialized) {
|
|
|
this.logger.warn("hasLoadedNamespace: i18next was not initialized", this.languages);
|
|
|
return false;
|
|
|
}
|
|
|
if (!this.languages || !this.languages.length) {
|
|
|
this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty", this.languages);
|
|
|
return false;
|
|
|
}
|
|
|
var lng = this.resolvedLanguage || this.languages[0];
|
|
|
var fallbackLng = this.options ? this.options.fallbackLng : false;
|
|
|
var lastLng = this.languages[this.languages.length - 1];
|
|
|
if (lng.toLowerCase() === "cimode")
|
|
|
return true;
|
|
|
var loadNotPending = function loadNotPending2(l2, n2) {
|
|
|
var loadState = _this6.services.backendConnector.state["".concat(l2, "|").concat(n2)];
|
|
|
return loadState === -1 || loadState === 2;
|
|
|
};
|
|
|
if (options.precheck) {
|
|
|
var preResult = options.precheck(this, loadNotPending);
|
|
|
if (preResult !== void 0)
|
|
|
return preResult;
|
|
|
}
|
|
|
if (this.hasResourceBundle(lng, ns))
|
|
|
return true;
|
|
|
if (!this.services.backendConnector.backend)
|
|
|
return true;
|
|
|
if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns)))
|
|
|
return true;
|
|
|
return false;
|
|
|
}
|
|
|
}, {
|
|
|
key: "loadNamespaces",
|
|
|
value: function loadNamespaces(ns, callback) {
|
|
|
var _this7 = this;
|
|
|
var deferred = defer();
|
|
|
if (!this.options.ns) {
|
|
|
callback && callback();
|
|
|
return Promise.resolve();
|
|
|
}
|
|
|
if (typeof ns === "string")
|
|
|
ns = [ns];
|
|
|
ns.forEach(function(n2) {
|
|
|
if (_this7.options.ns.indexOf(n2) < 0)
|
|
|
_this7.options.ns.push(n2);
|
|
|
});
|
|
|
this.loadResources(function(err) {
|
|
|
deferred.resolve();
|
|
|
if (callback)
|
|
|
callback(err);
|
|
|
});
|
|
|
return deferred;
|
|
|
}
|
|
|
}, {
|
|
|
key: "loadLanguages",
|
|
|
value: function loadLanguages(lngs, callback) {
|
|
|
var deferred = defer();
|
|
|
if (typeof lngs === "string")
|
|
|
lngs = [lngs];
|
|
|
var preloaded = this.options.preload || [];
|
|
|
var newLngs = lngs.filter(function(lng) {
|
|
|
return preloaded.indexOf(lng) < 0;
|
|
|
});
|
|
|
if (!newLngs.length) {
|
|
|
if (callback)
|
|
|
callback();
|
|
|
return Promise.resolve();
|
|
|
}
|
|
|
this.options.preload = preloaded.concat(newLngs);
|
|
|
this.loadResources(function(err) {
|
|
|
deferred.resolve();
|
|
|
if (callback)
|
|
|
callback(err);
|
|
|
});
|
|
|
return deferred;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dir",
|
|
|
value: function dir(lng) {
|
|
|
if (!lng)
|
|
|
lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);
|
|
|
if (!lng)
|
|
|
return "rtl";
|
|
|
var rtlLngs = ["ar", "shu", "sqr", "ssh", "xaa", "yhd", "yud", "aao", "abh", "abv", "acm", "acq", "acw", "acx", "acy", "adf", "ads", "aeb", "aec", "afb", "ajp", "apc", "apd", "arb", "arq", "ars", "ary", "arz", "auz", "avl", "ayh", "ayl", "ayn", "ayp", "bbz", "pga", "he", "iw", "ps", "pbt", "pbu", "pst", "prp", "prd", "ug", "ur", "ydd", "yds", "yih", "ji", "yi", "hbo", "men", "xmn", "fa", "jpr", "peo", "pes", "prs", "dv", "sam", "ckb"];
|
|
|
return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf("-arab") > 1 ? "rtl" : "ltr";
|
|
|
}
|
|
|
}, {
|
|
|
key: "cloneInstance",
|
|
|
value: function cloneInstance() {
|
|
|
var _this8 = this;
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
var callback = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
|
|
|
var mergedOptions = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, this.options), options), {
|
|
|
isClone: true
|
|
|
});
|
|
|
var clone = new I18n2(mergedOptions);
|
|
|
var membersToCopy = ["store", "services", "language"];
|
|
|
membersToCopy.forEach(function(m2) {
|
|
|
clone[m2] = _this8[m2];
|
|
|
});
|
|
|
clone.services = _objectSpread$6({}, this.services);
|
|
|
clone.services.utils = {
|
|
|
hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)
|
|
|
};
|
|
|
clone.translator = new Translator(clone.services, clone.options);
|
|
|
clone.translator.on("*", function(event) {
|
|
|
for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
|
|
args[_key4 - 1] = arguments[_key4];
|
|
|
}
|
|
|
clone.emit.apply(clone, [event].concat(args));
|
|
|
});
|
|
|
clone.init(mergedOptions, callback);
|
|
|
clone.translator.options = clone.options;
|
|
|
clone.translator.backendConnector.services.utils = {
|
|
|
hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)
|
|
|
};
|
|
|
return clone;
|
|
|
}
|
|
|
}, {
|
|
|
key: "toJSON",
|
|
|
value: function toJSON() {
|
|
|
return {
|
|
|
options: this.options,
|
|
|
store: this.store,
|
|
|
language: this.language,
|
|
|
languages: this.languages,
|
|
|
resolvedLanguage: this.resolvedLanguage
|
|
|
};
|
|
|
}
|
|
|
}]);
|
|
|
return I18n2;
|
|
|
}(EventEmitter);
|
|
|
_defineProperty(I18n, "createInstance", function() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
|
var callback = arguments.length > 1 ? arguments[1] : void 0;
|
|
|
return new I18n(options, callback);
|
|
|
});
|
|
|
var instance = I18n.createInstance();
|
|
|
instance.createInstance = I18n.createInstance;
|
|
|
instance.createInstance;
|
|
|
instance.init;
|
|
|
instance.loadResources;
|
|
|
instance.reloadResources;
|
|
|
instance.use;
|
|
|
instance.changeLanguage;
|
|
|
instance.getFixedT;
|
|
|
instance.t;
|
|
|
instance.exists;
|
|
|
instance.setDefaultNamespace;
|
|
|
instance.hasLoadedNamespace;
|
|
|
instance.loadNamespaces;
|
|
|
instance.loadLanguages;
|
|
|
var copy = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMyAxMi40MzE2VjcuODEyNUMxMyA2LjI1OTIgMTQuMjU5MiA1IDE1LjgxMjUgNUg0MC4xODc1QzQxLjc0MDggNSA0MyA2LjI1OTIgNDMgNy44MTI1VjMyLjE4NzVDNDMgMzMuNzQwOCA0MS43NDA4IDM1IDQwLjE4NzUgMzVIMzUuNTE2MyIgc3Ryb2tlPSIjMzMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zMi4xODc1IDEzSDcuODEyNUM2LjI1OTIgMTMgNSAxNC4yNTkyIDUgMTUuODEyNVY0MC4xODc1QzUgNDEuNzQwOCA2LjI1OTIgNDMgNy44MTI1IDQzSDMyLjE4NzVDMzMuNzQwOCA0MyAzNSA0MS43NDA4IDM1IDQwLjE4NzVWMTUuODEyNUMzNSAxNC4yNTkyIDMzLjc0MDggMTMgMzIuMTg3NSAxM1oiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+";
|
|
|
const CODE_BLOCK_REG = /```([\s\S]*?)```/g;
|
|
|
const BOLD_TEXT_REG = /\*\*(.+?)\*\*/g;
|
|
|
const EM_TEXT_REG = /\*(.+?)\*/g;
|
|
|
const TODO_BLOCK_REG = /\[ \] /g;
|
|
|
const DONE_BLOCK_REG = /\[x\] /g;
|
|
|
const DOT_LI_REG = /[*] /g;
|
|
|
const NUM_LI_REG = /(\d+)\. /g;
|
|
|
const INTERNAL_MD_REG = /\[\[([^\]]+)\]\]/g;
|
|
|
const EXRERNAL_MD_REG = /\[([^\]]+)\]\((([^\]]+).md)\)/g;
|
|
|
const parseMarkedToHtml = (markedStr, memoid) => {
|
|
|
const htmlText = markedStr.replace(CODE_BLOCK_REG, "<pre lang=''>$1</pre>").replace(DOT_LI_REG, "<span class='counter-block'>\u2022</span>").replace(NUM_LI_REG, "<span class='counter-block'>$1.</span>").replace(TODO_BLOCK_REG, "<span class='todo-block' data-type='todo'>\u2B1C</span>").replace(DONE_BLOCK_REG, "<span class='todo-block' data-type='done'>\u2705</span>").replace(BOLD_TEXT_REG, "<strong>$1</strong>").replace(EM_TEXT_REG, "<em>$1</em>").replace(/<br>/g, "</p><p>").replace(/&/g, "&");
|
|
|
let newHtmlText = htmlText;
|
|
|
if (memoid) {
|
|
|
if (INTERNAL_MD_REG.test(htmlText)) {
|
|
|
const internalMD = htmlText.match(INTERNAL_MD_REG);
|
|
|
for (let i = 0; i < internalMD.length; i++) {
|
|
|
if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(internalMD[i])) {
|
|
|
const internalContent = getContentFromInternalLink(internalMD[i]);
|
|
|
if (/\|/g.test(internalContent)) {
|
|
|
const [link, label] = internalContent.split("|");
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = htmlText.replace(internalMD[i], replaceMent);
|
|
|
} else {
|
|
|
const link = internalContent;
|
|
|
const label = "";
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = newHtmlText.replace(internalMD[i], replaceMent);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (EXRERNAL_MD_REG.test(htmlText)) {
|
|
|
const externalMD = htmlText.match(EXRERNAL_MD_REG);
|
|
|
for (let i = 0; i < externalMD.length; i++) {
|
|
|
if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(externalMD[i])) {
|
|
|
const link = getContentFromExternalLink(externalMD[i]);
|
|
|
const label = getLabelFromExternalLink(externalMD[i]);
|
|
|
const replaceMent = replaceMd(link, label);
|
|
|
newHtmlText = htmlText.replace(externalMD[i], replaceMent);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return newHtmlText;
|
|
|
};
|
|
|
const replaceMd = (internalLink, label) => {
|
|
|
const { metadataCache } = appStore.getState().dailyNotesState.app;
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalLink), "");
|
|
|
if (file instanceof require$$0.TFile) {
|
|
|
if (label) {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link">${label}</a>`;
|
|
|
} else {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link">${internalLink}</a>`;
|
|
|
}
|
|
|
} else if (label) {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link is-unresolved">${label}</a>`;
|
|
|
} else {
|
|
|
return `<a data-href="${internalLink}" data-type="link" data-filepath="${internalLink}" class="internal-link is-unresolved">${internalLink}</a>`;
|
|
|
}
|
|
|
};
|
|
|
const getContentFromInternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /\[\[([^\]]+)\]\]/g.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getLabelFromExternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = EXRERNAL_MD_REG.exec(line)) == null ? void 0 : _a[1];
|
|
|
};
|
|
|
const getContentFromExternalLink = (line) => {
|
|
|
var _a;
|
|
|
return (_a = /\[([^\]]+)\]\((([^\]]+).md)\)/g.exec(line)) == null ? void 0 : _a[3];
|
|
|
};
|
|
|
const parseHtmlToRawText = (htmlStr) => {
|
|
|
const tempEl = document.createElement("div");
|
|
|
tempEl.className = "memo-content-text";
|
|
|
tempEl.innerHTML = htmlStr;
|
|
|
const text = tempEl.innerText;
|
|
|
return text;
|
|
|
};
|
|
|
const parseRawTextToHtml = (rawTextStr) => {
|
|
|
const htmlText = rawTextStr.replace(/\n/g, "<br>");
|
|
|
return htmlText;
|
|
|
};
|
|
|
const encodeHtml = (htmlStr) => {
|
|
|
const t2 = document.createElement("div");
|
|
|
t2.textContent = htmlStr;
|
|
|
return t2.innerHTML;
|
|
|
};
|
|
|
const Provider = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
store,
|
|
|
context: Context
|
|
|
} = props;
|
|
|
const [appState, setAppState] = _react_17_0_2_react.exports.useState(store.getState());
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const unsubscribe = store.subscribe((ns) => {
|
|
|
setAppState(ns);
|
|
|
});
|
|
|
return () => {
|
|
|
unsubscribe();
|
|
|
};
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Context.Provider, {
|
|
|
value: appState,
|
|
|
children
|
|
|
});
|
|
|
};
|
|
|
var dialog = "";
|
|
|
const BaseDialog = (props) => {
|
|
|
const {
|
|
|
children,
|
|
|
className,
|
|
|
clickSpaceDestroy,
|
|
|
destroy
|
|
|
} = props;
|
|
|
const handleSpaceClicked = () => {
|
|
|
if (clickSpaceDestroy) {
|
|
|
destroy();
|
|
|
}
|
|
|
};
|
|
|
const handleEscClicked = (e) => {
|
|
|
const {
|
|
|
key
|
|
|
} = e;
|
|
|
if (key === "Escape") {
|
|
|
destroy();
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: `dialog-wrapper ${className}`,
|
|
|
onClick: handleSpaceClicked,
|
|
|
onKeyPress: handleEscClicked,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "dialog-container",
|
|
|
onClick: (e) => e.stopPropagation(),
|
|
|
children
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
function showDialog(config, DialogComponent, props) {
|
|
|
const tempDiv = document.createElement("div");
|
|
|
document.body.append(tempDiv);
|
|
|
setTimeout(() => {
|
|
|
var _a;
|
|
|
(_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.add("showup");
|
|
|
}, 0);
|
|
|
const cbs = {
|
|
|
destroy: () => {
|
|
|
var _a, _b;
|
|
|
(_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.remove("showup");
|
|
|
(_b = tempDiv.firstElementChild) == null ? void 0 : _b.classList.add("showoff");
|
|
|
setTimeout(() => {
|
|
|
tempDiv.remove();
|
|
|
ReactDOM$1.unmountComponentAtNode(tempDiv);
|
|
|
}, ANIMATION_DURATION);
|
|
|
}
|
|
|
};
|
|
|
const dialogProps = __spreadProps(__spreadValues({}, props), {
|
|
|
destroy: cbs.destroy
|
|
|
});
|
|
|
let Fragment2 = /* @__PURE__ */ jsx(BaseDialog, __spreadProps(__spreadValues({
|
|
|
destroy: cbs.destroy,
|
|
|
clickSpaceDestroy: true
|
|
|
}, config), {
|
|
|
children: /* @__PURE__ */ jsx(DialogComponent, __spreadValues({}, dialogProps))
|
|
|
}));
|
|
|
if (config.useAppContext) {
|
|
|
Fragment2 = /* @__PURE__ */ jsx(Provider, {
|
|
|
store: appStore,
|
|
|
context: appContext,
|
|
|
children: Fragment2
|
|
|
});
|
|
|
}
|
|
|
ReactDOM$1.render(Fragment2, tempDiv);
|
|
|
return cbs;
|
|
|
}
|
|
|
var previewImageDialog = "";
|
|
|
var close = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMiAxOSA2LjQxeiIvPjwvc3ZnPg==";
|
|
|
const PreviewImageDialog = ({
|
|
|
destroy,
|
|
|
imgUrl,
|
|
|
filepath
|
|
|
}) => {
|
|
|
const imgRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const [imgWidth, setImgWidth] = _react_17_0_2_react.exports.useState(-1);
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
utils$1.getImageSize(imgUrl).then(({
|
|
|
width
|
|
|
}) => {
|
|
|
if (width !== 0) {
|
|
|
setImgWidth(80);
|
|
|
} else {
|
|
|
setImgWidth(0);
|
|
|
}
|
|
|
});
|
|
|
}, []);
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
const handleDecreaseImageSize = () => {
|
|
|
if (imgWidth > 30) {
|
|
|
setImgWidth(imgWidth - 10);
|
|
|
}
|
|
|
};
|
|
|
const handleIncreaseImageSize = () => {
|
|
|
setImgWidth(imgWidth + 10);
|
|
|
};
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
var bytes = window.atob(base64);
|
|
|
var ab2 = new ArrayBuffer(bytes.length);
|
|
|
var ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const copyImageToClipboard = async () => {
|
|
|
if ((filepath === null || filepath === void 0) && imgUrl !== null) {
|
|
|
const myBase64 = imgUrl.split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
const clipboardItemInput = new ClipboardItem({
|
|
|
"image/png": blobInput
|
|
|
});
|
|
|
window.navigator["clipboard"].write([clipboardItemInput]);
|
|
|
new require$$0.Notice("Send to clipboard successfully");
|
|
|
} else {
|
|
|
var buffer = await vault.adapter.readBinary(filepath);
|
|
|
var arr = new Uint8Array(buffer);
|
|
|
var blob = new Blob([arr], {
|
|
|
type: "image/png"
|
|
|
});
|
|
|
const item = new ClipboardItem({
|
|
|
"image/png": blob
|
|
|
});
|
|
|
window.navigator["clipboard"].write([item]);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "img-container internal-embed image-embed is-loaded",
|
|
|
children: [/* @__PURE__ */ jsx("img", {
|
|
|
className: imgWidth <= 0 ? "hidden" : "",
|
|
|
ref: imgRef,
|
|
|
width: imgWidth + "%",
|
|
|
src: imgUrl
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "loading-text " + (imgWidth === -1 ? "" : "hidden"),
|
|
|
children: t("Image is loading...")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "loading-text " + (imgWidth === 0 ? "" : "hidden"),
|
|
|
children: t("\u{1F61F} Cannot load image, image link maybe broken")
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: handleDecreaseImageSize,
|
|
|
children: "\u2796"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: handleIncreaseImageSize,
|
|
|
children: "\u2795"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: () => setImgWidth(80),
|
|
|
children: "\u2B55"
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn",
|
|
|
onClick: copyImageToClipboard,
|
|
|
children: "\u{1F4C4}"
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showPreviewImageDialog(imgUrl, filepath) {
|
|
|
if (filepath) {
|
|
|
showDialog({
|
|
|
className: "preview-image-dialog"
|
|
|
}, PreviewImageDialog, {
|
|
|
imgUrl,
|
|
|
filepath
|
|
|
});
|
|
|
} else {
|
|
|
showDialog({
|
|
|
className: "preview-image-dialog"
|
|
|
}, PreviewImageDialog, {
|
|
|
imgUrl
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
var image = "";
|
|
|
const Image$1 = (props) => {
|
|
|
const {
|
|
|
className,
|
|
|
imgUrl,
|
|
|
alt,
|
|
|
referrerPolicy,
|
|
|
filepath
|
|
|
} = props;
|
|
|
const handleImageClick = () => {
|
|
|
if (filepath) {
|
|
|
showPreviewImageDialog(imgUrl, filepath);
|
|
|
} else {
|
|
|
showPreviewImageDialog(imgUrl);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: "image-container " + className,
|
|
|
onClick: handleImageClick,
|
|
|
referrerPolicy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl,
|
|
|
alt,
|
|
|
decoding: "async",
|
|
|
loading: "lazy"
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
var memoCardDialog = "";
|
|
|
var edit = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE0LjA2IDkuMDJsLjkyLjkyTDUuOTIgMTlINXYtLjkybDkuMDYtOS4wNk0xNy42NiAzYy0uMjUgMC0uNTEuMS0uNy4yOWwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODNjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMi0uMi0uNDUtLjI5LS43MS0uMjl6bS0zLjYgMy4xOUwzIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1eiIvPjwvc3ZnPg==";
|
|
|
const getPathOfImage$4 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$4 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$4(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$4 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$4(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const MemoCardDialog = (props) => {
|
|
|
var _a;
|
|
|
const [memo2, setMemo] = _react_17_0_2_react.exports.useState(__spreadProps(__spreadValues({}, props.memo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(props.memo.createdAt)
|
|
|
}));
|
|
|
const [linkMemos, setLinkMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const [linkedMemos, setLinkedMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$4(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$4(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const fetchLinkedMemos = async () => {
|
|
|
try {
|
|
|
const linkMemos2 = [];
|
|
|
const matchedArr = [...memo2.content.matchAll(MEMO_LINK_REG)];
|
|
|
for (const matchRes of matchedArr) {
|
|
|
if (matchRes && matchRes.length === 3) {
|
|
|
const id2 = matchRes[2];
|
|
|
const memoTemp = memoService.getMemoById(id2);
|
|
|
if (memoTemp) {
|
|
|
linkMemos2.push(__spreadProps(__spreadValues({}, memoTemp), {
|
|
|
createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt),
|
|
|
dateStr: utils$1.getDateString(memoTemp.createdAt)
|
|
|
}));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
setLinkMemos([...linkMemos2]);
|
|
|
const linkedMemos2 = await memoService.getLinkedMemos(memo2.id);
|
|
|
setLinkedMemos(linkedMemos2.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).map((m2) => __spreadProps(__spreadValues({}, m2), {
|
|
|
createdAtStr: utils$1.getDateTimeString(m2.createdAt),
|
|
|
dateStr: utils$1.getDateString(m2.createdAt)
|
|
|
})));
|
|
|
} catch (error2) {
|
|
|
}
|
|
|
};
|
|
|
fetchLinkedMemos();
|
|
|
}, [memo2.id]);
|
|
|
const handleMemoContentClick = _react_17_0_2_react.exports.useCallback(async (e) => {
|
|
|
var _a2;
|
|
|
const targetEl = e.target;
|
|
|
if (targetEl.className === "memo-link-text") {
|
|
|
const nextMemoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value;
|
|
|
const memoTemp = memoService.getMemoById(nextMemoId != null ? nextMemoId : "");
|
|
|
if (memoTemp) {
|
|
|
const nextMemo = __spreadProps(__spreadValues({}, memoTemp), {
|
|
|
createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt)
|
|
|
});
|
|
|
setLinkMemos([]);
|
|
|
setLinkedMemos([]);
|
|
|
setMemo(nextMemo);
|
|
|
} else {
|
|
|
new require$$0.Notice("MEMO Not Found");
|
|
|
targetEl.classList.remove("memo-link-text");
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
const handleLinkedMemoClick = _react_17_0_2_react.exports.useCallback((memo22) => {
|
|
|
setLinkMemos([]);
|
|
|
setLinkedMemos([]);
|
|
|
setMemo(memo22);
|
|
|
}, []);
|
|
|
const handleEditMemoBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
props.destroy();
|
|
|
globalStateService.setEditMemoId(memo2.id);
|
|
|
}, [memo2.id]);
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-card-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "header-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "time-text",
|
|
|
children: memo2.createdAtStr
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn edit-btn",
|
|
|
onClick: handleEditMemoBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: edit
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: props.destroy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
onClick: handleMemoContentClick,
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
alt: "",
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "layer-container"
|
|
|
}), linkMemos.map((_23, idx) => {
|
|
|
if (idx < 4) {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: "background-layer-container",
|
|
|
style: {
|
|
|
bottom: (idx + 1) * -3 + "px",
|
|
|
left: (idx + 1) * 5 + "px",
|
|
|
width: `calc(100% - ${(idx + 1) * 10}px)`,
|
|
|
zIndex: -idx - 1
|
|
|
}
|
|
|
}, idx);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
})]
|
|
|
}), linkMemos.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memos-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: [t("LINKED"), " ", linkMemos.length, " MEMO "]
|
|
|
}), linkMemos.map((m2) => {
|
|
|
const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " ");
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memo-container",
|
|
|
onClick: () => handleLinkedMemoClick(m2),
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [m2.dateStr, " "]
|
|
|
}), rawtext]
|
|
|
}, m2.id);
|
|
|
})]
|
|
|
}) : null, linkedMemos.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memos-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: [linkedMemos.length, " MEMO ", t("LINK TO THE"), " MEMO"]
|
|
|
}), linkedMemos.map((m2) => {
|
|
|
const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " ");
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "linked-memo-container",
|
|
|
onClick: () => handleLinkedMemoClick(m2),
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [m2.dateStr, " "]
|
|
|
}), rawtext]
|
|
|
}, m2.id);
|
|
|
})]
|
|
|
}) : null]
|
|
|
});
|
|
|
};
|
|
|
function showMemoCardDialog(memo2) {
|
|
|
showDialog({
|
|
|
className: "memo-card-dialog"
|
|
|
}, MemoCardDialog, {
|
|
|
memo: memo2
|
|
|
});
|
|
|
}
|
|
|
const cachedResourceMap = new Map();
|
|
|
const convertResourceToDataURL = async (url, useCache = true) => {
|
|
|
const { vault } = dailyNotesService.getState().app;
|
|
|
if (useCache && cachedResourceMap.has(url)) {
|
|
|
return Promise.resolve(cachedResourceMap.get(url));
|
|
|
}
|
|
|
if (!/(http|https)/g.test(url)) {
|
|
|
if (await vault.adapter.exists(url)) {
|
|
|
const buffer = await vault.adapter.readBinary(url);
|
|
|
const arr = new Uint8Array(buffer);
|
|
|
const blob = new Blob([arr], { type: "image/png" });
|
|
|
return new Promise((resolve) => {
|
|
|
const reader = new FileReader();
|
|
|
reader.onloadend = () => {
|
|
|
const base64Url = reader.result;
|
|
|
cachedResourceMap.set(url, base64Url);
|
|
|
resolve(base64Url);
|
|
|
};
|
|
|
reader.readAsDataURL(blob);
|
|
|
});
|
|
|
}
|
|
|
} else {
|
|
|
try {
|
|
|
const download = await require$$0.request({
|
|
|
method: "GET",
|
|
|
url,
|
|
|
contentType: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"
|
|
|
});
|
|
|
const enc = new TextEncoder().encode(download);
|
|
|
const bf2 = enc;
|
|
|
const blob = new Blob([bf2], { type: "image/png" });
|
|
|
return new Promise((resolve) => {
|
|
|
const reader = new FileReader();
|
|
|
reader.onloadend = () => {
|
|
|
const base64Url = reader.result;
|
|
|
cachedResourceMap.set(url, base64Url);
|
|
|
resolve(base64Url);
|
|
|
};
|
|
|
reader.readAsDataURL(blob);
|
|
|
});
|
|
|
} catch (error2) {
|
|
|
console.log("error in grabReleaseFileFromRepository", URL, error2);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const getCloneStyledElement = async (element) => {
|
|
|
const clonedElementContainer = document.createElement(element.tagName);
|
|
|
clonedElementContainer.innerHTML = element.innerHTML;
|
|
|
const applyStyles2 = async (sourceElement, clonedElement) => {
|
|
|
var _a;
|
|
|
if (!sourceElement || !clonedElement) {
|
|
|
return;
|
|
|
}
|
|
|
const sourceStyles = window.getComputedStyle(sourceElement);
|
|
|
if (sourceElement.tagName === "IMG") {
|
|
|
try {
|
|
|
const url = await convertResourceToDataURL((_a = sourceElement.getAttribute("path")) != null ? _a : sourceElement.getAttribute("src"));
|
|
|
clonedElement.src = url;
|
|
|
} catch (error2) {
|
|
|
}
|
|
|
}
|
|
|
for (const item of sourceStyles) {
|
|
|
clonedElement.style.setProperty(item, sourceStyles.getPropertyValue(item), sourceStyles.getPropertyPriority(item));
|
|
|
}
|
|
|
for (let i = 0; i < clonedElement.childElementCount; i++) {
|
|
|
await applyStyles2(sourceElement.children[i], clonedElement.children[i]);
|
|
|
}
|
|
|
};
|
|
|
await applyStyles2(element, clonedElementContainer);
|
|
|
return clonedElementContainer;
|
|
|
};
|
|
|
const getFontsStyleElement = async (element) => {
|
|
|
const styleSheets = element.ownerDocument.styleSheets;
|
|
|
const fontFamilyStyles = [];
|
|
|
for (const sheet of styleSheets) {
|
|
|
for (const rule of sheet.cssRules) {
|
|
|
if (rule.constructor.name === "CSSFontFaceRule") {
|
|
|
fontFamilyStyles.push(rule.style);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
const styleElement = document.createElement("style");
|
|
|
return styleElement;
|
|
|
};
|
|
|
const getElementSize = (element) => {
|
|
|
const { width, height } = window.getComputedStyle(element);
|
|
|
return {
|
|
|
width: parseInt(width.replace("px", "")),
|
|
|
height: parseInt(height.replace("px", ""))
|
|
|
};
|
|
|
};
|
|
|
const convertSVGToDataURL = (svg) => {
|
|
|
const xml = new XMLSerializer().serializeToString(svg);
|
|
|
const url = encodeURIComponent(xml);
|
|
|
return `data:image/svg+xml;charset=utf-8,${url}`;
|
|
|
};
|
|
|
const generateSVGElement = (width, height, element) => {
|
|
|
const xmlNS = "http://www.w3.org/2000/svg";
|
|
|
const svgElement = document.createElementNS(xmlNS, "svg");
|
|
|
svgElement.setAttribute("width", `${width}`);
|
|
|
svgElement.setAttribute("height", `${height}`);
|
|
|
svgElement.setAttribute("viewBox", `0 0 ${width} ${height}`);
|
|
|
const foreignObject = document.createElementNS(xmlNS, "foreignObject");
|
|
|
foreignObject.setAttribute("width", "100%");
|
|
|
foreignObject.setAttribute("height", "100%");
|
|
|
foreignObject.setAttribute("x", "0");
|
|
|
foreignObject.setAttribute("y", "0");
|
|
|
foreignObject.setAttribute("externalResourcesRequired", "true");
|
|
|
foreignObject.appendChild(element);
|
|
|
svgElement.appendChild(foreignObject);
|
|
|
return svgElement;
|
|
|
};
|
|
|
const toSVG = async (element, options) => {
|
|
|
const { width, height } = getElementSize(element);
|
|
|
const clonedElement = await getCloneStyledElement(element);
|
|
|
if (options == null ? void 0 : options.backgroundColor) {
|
|
|
clonedElement.style.backgroundColor = options.backgroundColor;
|
|
|
}
|
|
|
const svg = generateSVGElement(width, height, clonedElement);
|
|
|
svg.prepend(await getFontsStyleElement(element));
|
|
|
const url = convertSVGToDataURL(svg);
|
|
|
return url;
|
|
|
};
|
|
|
const toCanvas = async (element, options) => {
|
|
|
const url = await toSVG(element, options);
|
|
|
const imageEl = new Image();
|
|
|
imageEl.src = url;
|
|
|
const ratio = (options == null ? void 0 : options.pixelRatio) || 1;
|
|
|
const { width, height } = getElementSize(element);
|
|
|
const canvas = document.createElement("canvas");
|
|
|
const context = canvas.getContext("2d");
|
|
|
if (!context) {
|
|
|
return Promise.reject("Canvas error");
|
|
|
}
|
|
|
canvas.width = width * ratio;
|
|
|
canvas.height = height * ratio;
|
|
|
canvas.style.width = `${width}`;
|
|
|
canvas.style.height = `${height}`;
|
|
|
if (options == null ? void 0 : options.backgroundColor) {
|
|
|
context.fillStyle = options.backgroundColor;
|
|
|
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
|
}
|
|
|
return new Promise((resolve) => {
|
|
|
imageEl.onload = () => {
|
|
|
context.drawImage(imageEl, 0, 0, canvas.width, canvas.height);
|
|
|
resolve(canvas);
|
|
|
};
|
|
|
});
|
|
|
};
|
|
|
const toImage = async (element, options) => {
|
|
|
const canvas = await toCanvas(element, options);
|
|
|
return canvas.toDataURL();
|
|
|
};
|
|
|
var shareMemoImageDialog = "";
|
|
|
var share = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMzNzM1MmYiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMTYsNWwtMS40MiwxLjQybC0xLjU5LTEuNTlWMTZoLTEuOThWNC44M0w5LjQyLDYuNDJMOCw1bDQtNEwxNiw1eiBNMjAsMTB2MTFjMCwxLjEtMC45LDItMiwySDZjLTEuMTEsMC0yLTAuOS0yLTJWMTAgYzAtMS4xMSwwLjg5LTIsMi0yaDN2Mkg2djExaDEyVjEwaC0zVjhoM0MxOS4xLDgsMjAsOC44OSwyMCwxMHoiLz48L2c+PC9zdmc+";
|
|
|
const getPathOfImage$3 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$3 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$3(vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$3 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$3(vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const ShareMemoImageDialog = (props) => {
|
|
|
var _a;
|
|
|
const {
|
|
|
memo: propsMemo,
|
|
|
destroy
|
|
|
} = props;
|
|
|
const {
|
|
|
memos
|
|
|
} = appStore.getState().memoState;
|
|
|
let memosLength;
|
|
|
let createdDays;
|
|
|
if (memos.length) {
|
|
|
memosLength = memos.length - 1;
|
|
|
createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) : 0;
|
|
|
}
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
const footerEnd = ShareFooterEnd.replace("{UserName}", UserName);
|
|
|
const footerStart = ShareFooterStart.replace("{MemosNum}", memos.length.toString()).replace("{UsedDay}", createdDays.toString());
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$3(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$3(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const [shortcutImgUrl, setShortcutImgUrl] = _react_17_0_2_react.exports.useState("");
|
|
|
const [imgAmount, setImgAmount] = _react_17_0_2_react.exports.useState(externalImageUrls.length);
|
|
|
const memoElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (imgAmount > 0) {
|
|
|
return;
|
|
|
}
|
|
|
setTimeout(() => {
|
|
|
if (!memoElRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
toImage(memoElRef.current, {
|
|
|
backgroundColor: "#eaeaea",
|
|
|
pixelRatio: window.devicePixelRatio * 2
|
|
|
}).then((url) => {
|
|
|
setShortcutImgUrl(url);
|
|
|
}).catch(() => {
|
|
|
});
|
|
|
}, ANIMATION_DURATION);
|
|
|
}, [imgAmount]);
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
var bytes = window.atob(base64);
|
|
|
var ab2 = new ArrayBuffer(bytes.length);
|
|
|
var ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const handleCopytoClipboardBtnClick = async () => {
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const divs = document.querySelector(".memo-shortcut-img");
|
|
|
const myBase64 = divs.getAttribute("src").split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) {
|
|
|
blobInput.arrayBuffer().then(async (buffer) => {
|
|
|
let aFile;
|
|
|
const ext = "png";
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
aFile = dailyNotes[string];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (aFile !== void 0) {
|
|
|
await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
const clipboardItemInput = new ClipboardItem({
|
|
|
"image/png": blobInput
|
|
|
});
|
|
|
window.navigator["clipboard"].write([clipboardItemInput]);
|
|
|
new require$$0.Notice("Send to clipboard successfully");
|
|
|
};
|
|
|
const handleImageOnLoad = (ev) => {
|
|
|
if (ev.type === "error") {
|
|
|
new require$$0.Notice("\u6709\u4E2A\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\u4E86\u{1F61F}");
|
|
|
ev.target.remove();
|
|
|
}
|
|
|
setImgAmount(imgAmount - 1);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F970}"
|
|
|
}), t("Share Memo Image")]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btn-group",
|
|
|
children: [/* @__PURE__ */ jsx("button", {
|
|
|
className: "btn copy-btn",
|
|
|
onClick: handleCopytoClipboardBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: share
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: `tip-words-container ${shortcutImgUrl ? "finish" : "loading"}`,
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: shortcutImgUrl ? t("\u2197Click the button to save") : t("Image is generating...")
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-container",
|
|
|
ref: memoElRef,
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: shortcutImgUrl !== "",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "memo-shortcut-img",
|
|
|
src: shortcutImgUrl
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "time-text",
|
|
|
children: memo2.createdAtStr
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
crossOrigin: "anonymous",
|
|
|
decoding: "async",
|
|
|
src: imgUrl,
|
|
|
alt: "",
|
|
|
referrerPolicy: "no-referrer",
|
|
|
onLoad: handleImageOnLoad,
|
|
|
onError: handleImageOnLoad
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
className: "memo-img",
|
|
|
src: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
path: imgUrl.filePath
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "watermark-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text footer-start",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "name-text",
|
|
|
children: footerStart
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text footer-end",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "name-text",
|
|
|
children: footerEnd
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showShareMemoImageDialog(memo2) {
|
|
|
showDialog({
|
|
|
className: "share-memo-image-dialog"
|
|
|
}, ShareMemoImageDialog, {
|
|
|
memo: memo2
|
|
|
});
|
|
|
}
|
|
|
var memo = "";
|
|
|
const showMemoInDailyNotes = async (memoId) => {
|
|
|
const { app: app2, dailyNotes } = dailyNotesService.getState();
|
|
|
const lineNum = parseInt(memoId.slice(14));
|
|
|
const memoDateString = memoId.slice(0, 13);
|
|
|
const date = require$$0.moment(memoDateString, "YYYYMMDDHHmmss");
|
|
|
const file = getDailyNote_1(date, dailyNotes);
|
|
|
if (!require$$0.Platform.isMobile) {
|
|
|
const leaf = app2.workspace.splitActiveLeaf();
|
|
|
leaf.openFile(file, { eState: { line: lineNum } });
|
|
|
} else {
|
|
|
let leaf = app2.workspace.activeLeaf;
|
|
|
if (leaf === null) {
|
|
|
leaf = app2.workspace.getLeaf(true);
|
|
|
}
|
|
|
leaf.openFile(file, { eState: { line: lineNum } });
|
|
|
}
|
|
|
return;
|
|
|
};
|
|
|
var more = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
const getPathOfImage$2 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$2 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$2(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$2 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$2(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const Memo = (props) => {
|
|
|
var _a;
|
|
|
const {
|
|
|
memo: propsMemo
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$2(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$2(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const handleShowMemoStoryDialog = () => {
|
|
|
showMemoCardDialog(memo2);
|
|
|
};
|
|
|
const handleMarkMemoClick = () => {
|
|
|
if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") {
|
|
|
let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button");
|
|
|
if (typeof elem.onclick == "function" && elem !== void 0) {
|
|
|
elem.onclick.apply(elem);
|
|
|
}
|
|
|
}
|
|
|
globalStateService.setMarkMemoId(memo2.id);
|
|
|
};
|
|
|
const handleEditMemoClick = () => {
|
|
|
if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") {
|
|
|
let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button");
|
|
|
if (typeof elem.onclick == "function" && elem !== void 0) {
|
|
|
elem.onclick.apply(elem);
|
|
|
}
|
|
|
}
|
|
|
globalStateService.setEditMemoId(memo2.id);
|
|
|
};
|
|
|
const handleSourceMemoClick = () => {
|
|
|
showMemoInDailyNotes(memo2.id);
|
|
|
};
|
|
|
const handleDeleteMemoClick = async () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await memoService.hideMemoById(memo2.id);
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
if (globalStateService.getState().editMemoId === memo2.id) {
|
|
|
globalStateService.setEditMemoId("");
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleMouseLeaveMemoWrapper = () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
}
|
|
|
};
|
|
|
const handleGenMemoImageBtnClick = () => {
|
|
|
showShareMemoImageDialog(memo2);
|
|
|
};
|
|
|
const handleMemoKeyDown = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
if (event.ctrlKey || event.metaKey) {
|
|
|
handleSourceMemoClick();
|
|
|
}
|
|
|
}, []);
|
|
|
const handleMemoDoubleKeyDown = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
if (event) {
|
|
|
handleEditMemoClick();
|
|
|
}
|
|
|
}, []);
|
|
|
const handleMemoContentClick = async (e) => {
|
|
|
var _a2;
|
|
|
const targetEl = e.target;
|
|
|
if (targetEl.className === "memo-link-text") {
|
|
|
const memoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value;
|
|
|
const memoTemp = memoService.getMemoById(memoId != null ? memoId : "");
|
|
|
if (memoTemp) {
|
|
|
showMemoCardDialog(memoTemp);
|
|
|
} else {
|
|
|
new require$$0.Notice("MEMO Not Found");
|
|
|
targetEl.classList.remove("memo-link-text");
|
|
|
}
|
|
|
} else if (targetEl.className === "todo-block")
|
|
|
;
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-wrapper ${"memos-" + memo2.id} ${memo2.memoType}`,
|
|
|
onMouseLeave: handleMouseLeaveMemoWrapper,
|
|
|
onMouseDown: handleMemoKeyDown,
|
|
|
onDoubleClick: handleMemoDoubleKeyDown,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-top-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "time-text",
|
|
|
onClick: handleShowMemoStoryDialog,
|
|
|
children: memo2.createdAtStr
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn more-action-btn",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "more-action-btns-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "more-action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleShowMemoStoryDialog,
|
|
|
children: t("READ")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleMarkMemoClick,
|
|
|
children: t("MARK")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleGenMemoImageBtnClick,
|
|
|
children: t("SHARE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleEditMemoClick,
|
|
|
children: t("EDIT")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleSourceMemoClick,
|
|
|
children: t("SOURCE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
onClick: handleMemoContentClick,
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content, memo2.id)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
alt: "",
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function formatMemoContent(content, memoid) {
|
|
|
var _a;
|
|
|
content = encodeHtml(content);
|
|
|
content = parseRawTextToHtml(content).split("<br>").map((t2) => {
|
|
|
return `<p>${t2 !== "" ? t2 : "<br>"}</p>`;
|
|
|
}).join("");
|
|
|
const {
|
|
|
shouldUseMarkdownParser,
|
|
|
shouldHideImageUrl
|
|
|
} = globalStateService.getState();
|
|
|
if (shouldUseMarkdownParser) {
|
|
|
content = parseMarkedToHtml(content, memoid);
|
|
|
}
|
|
|
if (shouldHideImageUrl) {
|
|
|
content = content.replace(WIKI_IMAGE_URL_REG, "").replace(MARKDOWN_URL_REG, "").replace(IMAGE_URL_REG, "");
|
|
|
}
|
|
|
content = content.replace(TAG_REG, "<span class='tag-span'>#$1</span>").replace(FIRST_TAG_REG, "<p><span class='tag-span'>#$2</span>").replace(LINK_REG, "$1<a class='link' target='_blank' rel='noreferrer' href='$2'>$2</a>").replace(MD_LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$2'>$1</a>").replace(MEMO_LINK_REG, "<span class='memo-link-text' data-value='$2'>$1</span>");
|
|
|
const tempDivContainer = document.createElement("div");
|
|
|
tempDivContainer.innerHTML = content;
|
|
|
for (let i = 0; i < tempDivContainer.children.length; i++) {
|
|
|
const c = tempDivContainer.children[i];
|
|
|
if (c.tagName === "P" && c.textContent === "" && ((_a = c.firstElementChild) == null ? void 0 : _a.tagName) !== "BR") {
|
|
|
c.remove();
|
|
|
i--;
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
return tempDivContainer.innerHTML;
|
|
|
}
|
|
|
var Memo$1 = _react_17_0_2_react.exports.memo(Memo);
|
|
|
var memolist = "";
|
|
|
let copyShownMemos;
|
|
|
const MemoList = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
},
|
|
|
memoState: {
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [isFetching, setFetchStatus] = _react_17_0_2_react.exports.useState(true);
|
|
|
const wrapperElement = _react_17_0_2_react.exports.useRef(null);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoType,
|
|
|
text: textQuery,
|
|
|
filter: queryId
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(queryId);
|
|
|
const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter);
|
|
|
const shownMemos = showMemoFilter || queryFilter || HideDoneTasks ? memos.filter((memo2) => {
|
|
|
var _a, _b, _c;
|
|
|
let shouldShow = true;
|
|
|
if (memo2.memoType !== void 0) {
|
|
|
if (HideDoneTasks && memo2.memoType === "TASK-DONE") {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (queryFilter) {
|
|
|
const filters = JSON.parse(queryFilter.querystring);
|
|
|
if (Array.isArray(filters)) {
|
|
|
shouldShow = checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}
|
|
|
}
|
|
|
if (tagQuery) {
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_c = memo2.content.match(FIRST_TAG_REG)) != null ? _c : [])) {
|
|
|
const tag2 = t2.replace(FIRST_TAG_REG, "$2").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(tagQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
if (memoType) {
|
|
|
if (memoType === "NOT_TAGGED" && (memo2.content.match(TAG_REG) !== null || memo2.content.match(NOP_FIRST_TAG_REG) !== null)) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "LINKED" && memo2.content.match(LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (textQuery && !memo2.content.includes(textQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
}) : memos;
|
|
|
copyShownMemos = shownMemos;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos().then(() => {
|
|
|
setFetchStatus(false);
|
|
|
}).catch(() => {
|
|
|
new require$$0.Notice("\u{1F62D} Fetch Error");
|
|
|
});
|
|
|
dailyNotesService.getMyAllDailyNotes().then(() => {
|
|
|
setFetchStatus(false);
|
|
|
}).catch(() => {
|
|
|
new require$$0.Notice("\u{1F62D} Fetch DailyNotes Error");
|
|
|
});
|
|
|
dailyNotesService.getState();
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
var _a;
|
|
|
(_a = wrapperElement.current) == null ? void 0 : _a.scrollTo({
|
|
|
top: 0
|
|
|
});
|
|
|
}, [query]);
|
|
|
const handleMemoListClick = _react_17_0_2_react.exports.useCallback((event) => {
|
|
|
const {
|
|
|
workspace
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const targetEl = event.target;
|
|
|
if (targetEl.tagName === "SPAN" && targetEl.className === "tag-span") {
|
|
|
const tagName = targetEl.innerText.slice(1);
|
|
|
const currTagQuery = locationService.getState().query.tag;
|
|
|
if (currTagQuery === tagName) {
|
|
|
locationService.setTagQuery("");
|
|
|
} else {
|
|
|
locationService.setTagQuery(tagName);
|
|
|
}
|
|
|
} else if (targetEl.tagName === "A" && targetEl.className === "internal-link") {
|
|
|
const sourcePath = targetEl.getAttribute("data-filepath");
|
|
|
if (require$$0.Platform.isMobile) {
|
|
|
workspace.openLinkText(sourcePath, sourcePath, false);
|
|
|
} else {
|
|
|
workspace.openLinkText(sourcePath, sourcePath, true);
|
|
|
}
|
|
|
}
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memolist-wrapper ${isFetching ? "" : "completed"}`,
|
|
|
onClick: handleMemoListClick,
|
|
|
ref: wrapperElement,
|
|
|
children: [shownMemos.map((memo2) => /* @__PURE__ */ jsx(Memo$1, {
|
|
|
memo: memo2
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`)), /* @__PURE__ */ jsx("div", {
|
|
|
className: "status-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "status-text",
|
|
|
children: isFetching ? t("Fetching data...") : shownMemos.length === 0 ? t("Noooop!") : showMemoFilter ? "" : t("All Data is Loaded \u{1F389}")
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const getMemosByDate = (memos) => {
|
|
|
const dataArr = [];
|
|
|
memos.map((mapItem) => {
|
|
|
if (dataArr.length == 0) {
|
|
|
dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] });
|
|
|
} else {
|
|
|
const res = dataArr.some((item) => {
|
|
|
if (item.date == require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD")) {
|
|
|
item.have.push(mapItem);
|
|
|
return true;
|
|
|
}
|
|
|
});
|
|
|
if (!res) {
|
|
|
dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] });
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
return dataArr;
|
|
|
};
|
|
|
const transferMemosIntoText = (dailyMemos) => {
|
|
|
let outputText = "";
|
|
|
let dataArr = [];
|
|
|
let indent = "";
|
|
|
const { format: format2 } = getDailyNoteSettings_1();
|
|
|
dailyMemos.map((mapItem) => {
|
|
|
dataArr = mapItem.have;
|
|
|
if (ShowDate) {
|
|
|
outputText = outputText + "- [[" + require$$0.moment(mapItem.date, "YYYY-MM-DD").format(format2) + "]]\n";
|
|
|
indent = " ";
|
|
|
}
|
|
|
if (ShowTime) {
|
|
|
for (let i = 0; i < dataArr.length; i++) {
|
|
|
const time = require$$0.moment(dataArr[i].createdAt, "YYYY/MM/DD HH:mm:ss").format("HH:mm");
|
|
|
if (dataArr[i].memoType === "JOURNAL") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- " + time + " " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- " + time + " " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else {
|
|
|
if (dataArr[i].memoType === "TASK-TODO") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replaceAll(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [ ] " + time + " " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [ ] " + time + " " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else if (dataArr[i].memoType === "TASK-DONE") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [x] " + time + " " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [x] " + time + " " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else {
|
|
|
const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1];
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + time + " " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + time + " " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
for (let i = 0; i < dataArr.length; i++) {
|
|
|
if (dataArr[i].memoType === "JOURNAL") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else {
|
|
|
if (dataArr[i].memoType === "TASK-TODO") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replaceAll(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [ ] " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [ ] " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else if (dataArr[i].memoType === "TASK-DONE") {
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [x] " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [x] " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
} else {
|
|
|
const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1];
|
|
|
if (/<br>/g.test(dataArr[i].content)) {
|
|
|
const formatedContent = dataArr[i].content.replace(/<br>/g, "\n ");
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + formatedContent + "\n";
|
|
|
} else {
|
|
|
outputText = outputText + indent + "- [" + taskMark + "] " + dataArr[i].content + "\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (ShowDate && AddBlankLineWhenDate) {
|
|
|
outputText = outputText + "\n";
|
|
|
}
|
|
|
});
|
|
|
return outputText;
|
|
|
};
|
|
|
const MemoFilter = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoType,
|
|
|
text: textQuery,
|
|
|
filter
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(filter);
|
|
|
const showFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter);
|
|
|
const handleCopyClick = async () => {
|
|
|
if (copyShownMemos.length > 0) {
|
|
|
const memosByDate = getMemosByDate(copyShownMemos);
|
|
|
const queryDailyMemos = transferMemosIntoText(memosByDate);
|
|
|
await utils$1.copyTextToClipboard(queryDailyMemos);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `filter-query-container ${showFilter ? "" : "hidden"}`,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-query",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: "FILTER: "
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (queryFilter ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setMemoFilter("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F516}"
|
|
|
}), " ", queryFilter == null ? void 0 : queryFilter.title]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (tagQuery ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setTagQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F3F7}\uFE0F"
|
|
|
}), " ", tagQuery]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (memoType ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setMemoTypeQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F4E6}"
|
|
|
}), " ", getTextWithMemoType(memoType)]
|
|
|
}), duration && duration.from < duration.to ? /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container",
|
|
|
onClick: () => {
|
|
|
locationService.setFromAndToQuery(0, 0);
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F5D3}\uFE0F"
|
|
|
}), " ", utils$1.getDateString(duration.from), " ", instance.t("to"), " ", require$$0.moment(duration.to, "x").add(1, "days").format("YYYY/MM/DD")]
|
|
|
}) : null, /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filter-item-container " + (textQuery ? "" : "hidden"),
|
|
|
onClick: () => {
|
|
|
locationService.setTextQuery("");
|
|
|
},
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F50D}"
|
|
|
}), " ", textQuery]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "copy-memo",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: copy,
|
|
|
onClick: handleCopyClick
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function Memos$1() {
|
|
|
if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") {
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {}), /* @__PURE__ */ jsx(MemoEditor, {})]
|
|
|
});
|
|
|
} else {
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoEditor, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {})]
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
function useLoading(initialState = true) {
|
|
|
const [state, setState] = _react_17_0_2_react.exports.useState({ isLoading: initialState, isFailed: false, isSucceed: false });
|
|
|
return __spreadProps(__spreadValues({}, state), {
|
|
|
setLoading: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: true,
|
|
|
isFailed: false,
|
|
|
isSucceed: false
|
|
|
}));
|
|
|
},
|
|
|
setFinish: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: false,
|
|
|
isFailed: false,
|
|
|
isSucceed: true
|
|
|
}));
|
|
|
},
|
|
|
setError: () => {
|
|
|
setState(__spreadProps(__spreadValues({}, state), {
|
|
|
isLoading: false,
|
|
|
isFailed: true,
|
|
|
isSucceed: false
|
|
|
}));
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
const getPathOfImage$1 = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink$1 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$1(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink$1 = (lineText) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
metadataCache,
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filepath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage$1(vault, file);
|
|
|
const filePath = file.path;
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filepath: filePath
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const DeletedMemo = (props) => {
|
|
|
var _a, _b;
|
|
|
const {
|
|
|
memo: propsMemo,
|
|
|
handleDeletedMemoAction
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt),
|
|
|
deletedAtStr: utils$1.getDateTimeString((_a = propsMemo.deletedAt) != null ? _a : Date.now())
|
|
|
});
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink$1(one));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_b = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _b[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink$1(two));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
const handleDeleteMemoClick = async () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await memoService.deleteMemoById(memo2.id);
|
|
|
handleDeletedMemoAction(memo2.id);
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleRestoreMemoClick = async () => {
|
|
|
try {
|
|
|
await memoService.restoreMemoById(memo2.id);
|
|
|
handleDeletedMemoAction(memo2.id);
|
|
|
new require$$0.Notice("RESTORE SUCCEED");
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
};
|
|
|
const handleMouseLeaveMemoWrapper = () => {
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
}
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `memo-wrapper ${"memos-" + memo2.id}`,
|
|
|
onMouseLeave: handleMouseLeaveMemoWrapper,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-top-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "time-text",
|
|
|
children: [t("DELETE AT"), " ", memo2.deletedAtStr]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn more-action-btn",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "more-action-btns-wrapper",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "more-action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn restore-btn",
|
|
|
onClick: handleRestoreMemoClick,
|
|
|
children: t("RESTORE")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
alt: "",
|
|
|
className: "memo-img",
|
|
|
imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-wrapper internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, {
|
|
|
className: "memo-img",
|
|
|
imgUrl: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
filepath: imgUrl.filepath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var memoTrash = "";
|
|
|
const MemoTrash = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query
|
|
|
},
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
const [deletedMemos, setDeletedMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const {
|
|
|
tag: tagQuery,
|
|
|
duration,
|
|
|
type: memoType,
|
|
|
text: textQuery,
|
|
|
filter: queryId
|
|
|
} = query;
|
|
|
const queryFilter = queryService.getQueryById(queryId);
|
|
|
const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter);
|
|
|
const shownMemos = showMemoFilter || queryFilter ? deletedMemos.filter((memo2) => {
|
|
|
var _a, _b;
|
|
|
let shouldShow = true;
|
|
|
if (queryFilter) {
|
|
|
const filters = JSON.parse(queryFilter.querystring);
|
|
|
if (Array.isArray(filters)) {
|
|
|
shouldShow = checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}
|
|
|
}
|
|
|
if (tagQuery) {
|
|
|
const tagsSet = new Set();
|
|
|
for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) {
|
|
|
const tag2 = t2.replace(TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) {
|
|
|
const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim();
|
|
|
const items = tag2.split("/");
|
|
|
let temp = "";
|
|
|
for (const i of items) {
|
|
|
temp += i;
|
|
|
tagsSet.add(temp);
|
|
|
temp += "/";
|
|
|
}
|
|
|
}
|
|
|
if (!tagsSet.has(tagQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
if (memoType) {
|
|
|
if (memoType === "NOT_TAGGED" && memo2.content.match(TAG_REG) !== null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "LINKED" && memo2.content.match(LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
} else if (memoType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
}
|
|
|
if (textQuery && !memo2.content.includes(textQuery)) {
|
|
|
shouldShow = false;
|
|
|
}
|
|
|
return shouldShow;
|
|
|
}) : deletedMemos;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos();
|
|
|
memoService.fetchDeletedMemos().then((result) => {
|
|
|
if (result.length !== 0) {
|
|
|
setDeletedMemos(result);
|
|
|
}
|
|
|
}).catch((error2) => {
|
|
|
new require$$0.Notice("Failed to fetch deleted memos: ", error2);
|
|
|
}).finally(() => {
|
|
|
loadingState.setFinish();
|
|
|
});
|
|
|
locationService.clearQuery();
|
|
|
}, []);
|
|
|
const handleDeletedMemoAction = _react_17_0_2_react.exports.useCallback((memoId) => {
|
|
|
setDeletedMemos((deletedMemos2) => deletedMemos2.filter((memo2) => memo2.id !== memoId));
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-trash-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "section-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("Recycle bin")
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(MemoFilter, {}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Fetching data...")
|
|
|
})
|
|
|
}) : deletedMemos.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-text-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Here is No Zettels.")
|
|
|
})
|
|
|
}) : /* @__PURE__ */ jsx("div", {
|
|
|
className: "deleted-memos-container",
|
|
|
children: shownMemos.map((memo2) => /* @__PURE__ */ jsx(DeletedMemo, {
|
|
|
memo: memo2,
|
|
|
handleDeletedMemoAction
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`))
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var preferencesSection = "";
|
|
|
var checkboxActive = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHpNMTcuOTkgOWwtMS40MS0xLjQyLTYuNTkgNi41OS0yLjU4LTIuNTctMS40MiAxLjQxIDQgMy45OXoiLz48L3N2Zz4=";
|
|
|
var checkbox = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
const PreferencesSection = () => {
|
|
|
const {
|
|
|
globalState
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const {
|
|
|
useTinyUndoHistoryCache,
|
|
|
shouldHideImageUrl,
|
|
|
shouldSplitMemoWord,
|
|
|
shouldUseMarkdownParser
|
|
|
} = globalState;
|
|
|
const demoMemoContent = "\u{1F44B} \u4F60\u597D\u5440\uFF5E\u6B22\u8FCE\u4F7F\u7528memos!\n* \u2728 **\u5F00\u6E90\u9879\u76EE**\uFF1B\n* \u{1F60B} \u7CBE\u7F8E\u4E14\u7EC6\u8282\u7684\u89C6\u89C9\u6837\u5F0F\uFF1B\n* \u{1F4D1} \u4F53\u9A8C\u4F18\u826F\u7684\u4EA4\u4E92\u903B\u8F91\uFF1B";
|
|
|
const handleOpenTinyUndoChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
useTinyUndoHistoryCache: !useTinyUndoHistoryCache
|
|
|
});
|
|
|
};
|
|
|
const handleSplitWordsValueChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldSplitMemoWord: !shouldSplitMemoWord
|
|
|
});
|
|
|
};
|
|
|
const handleHideImageUrlValueChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldHideImageUrl: !shouldHideImageUrl
|
|
|
});
|
|
|
};
|
|
|
const handleUseMarkdownParserChanged = () => {
|
|
|
globalStateService.setAppSetting({
|
|
|
shouldUseMarkdownParser: !shouldUseMarkdownParser
|
|
|
});
|
|
|
};
|
|
|
const handleExportBtnClick = async () => {
|
|
|
const formatedMemos = memoService.getState().memos.map((m2) => {
|
|
|
return __spreadValues({}, m2);
|
|
|
});
|
|
|
const jsonStr = JSON.stringify(formatedMemos);
|
|
|
const element = document.createElement("a");
|
|
|
element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(jsonStr));
|
|
|
element.setAttribute("download", "data.json");
|
|
|
element.style.display = "none";
|
|
|
document.body.appendChild(element);
|
|
|
element.click();
|
|
|
document.body.removeChild(element);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container preferences-section-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "Memo \u663E\u793A\u76F8\u5173"
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "demo-content-container memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(demoMemoContent)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleSplitWordsValueChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u4E2D\u82F1\u6587\u5185\u5BB9\u81EA\u52A8\u95F4\u9694"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldSplitMemoWord ? checkboxActive : checkbox
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleUseMarkdownParserChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u90E8\u5206 markdown \u683C\u5F0F\u89E3\u6790"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldUseMarkdownParser ? checkboxActive : checkbox
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleHideImageUrlValueChanged,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u9690\u85CF\u56FE\u7247\u94FE\u63A5\u5730\u5740"
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: shouldHideImageUrl ? checkboxActive : checkbox
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container preferences-section-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "\u7F16\u8F91\u5668"
|
|
|
}), /* @__PURE__ */ jsxs("label", {
|
|
|
className: "form-label checkbox-form-label",
|
|
|
onClick: handleOpenTinyUndoChanged,
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: "normal-text",
|
|
|
children: ["\u542F\u7528", " ", /* @__PURE__ */ jsx("a", {
|
|
|
target: "_blank",
|
|
|
href: "https://github.com/boojack/tiny-undo",
|
|
|
onClick: (e) => e.stopPropagation(),
|
|
|
rel: "noreferrer",
|
|
|
children: "tiny-undo"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: useTinyUndoHistoryCache ? checkboxActive : checkbox
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "section-container hidden",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: "\u5176\u4ED6"
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "btn-container",
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn export-btn",
|
|
|
onClick: handleExportBtnClick,
|
|
|
children: "\u5BFC\u51FA\u6570\u636E(JSON)"
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var setting = "";
|
|
|
const Setting = () => {
|
|
|
const {
|
|
|
globalState: {
|
|
|
isMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.fetchAllMemos();
|
|
|
}, []);
|
|
|
const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(true);
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "preference-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "section-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx(Only, {
|
|
|
when: isMobileView,
|
|
|
children: /* @__PURE__ */ jsx("button", {
|
|
|
className: "action-btn",
|
|
|
onClick: handleShowSidebarBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: menuSvg,
|
|
|
alt: "menu"
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: "\u8D26\u53F7\u4E0E\u8BBE\u7F6E"
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "sections-wrapper",
|
|
|
children: /* @__PURE__ */ jsx(PreferencesSection, {})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const homeRouter = {
|
|
|
"/recycle": /* @__PURE__ */ jsx(MemoTrash, {}),
|
|
|
"/setting": /* @__PURE__ */ jsx(Setting, {}),
|
|
|
"*": /* @__PURE__ */ jsx(Memos$1, {})
|
|
|
};
|
|
|
const routerSwitch = (router) => {
|
|
|
return (pathname) => {
|
|
|
for (const key of Object.keys(router)) {
|
|
|
if (key === pathname) {
|
|
|
return router[key];
|
|
|
}
|
|
|
}
|
|
|
return router["*"];
|
|
|
};
|
|
|
};
|
|
|
const homeRouterSwitch = routerSwitch(homeRouter);
|
|
|
var aboutSiteDialog = "";
|
|
|
const AboutSiteDialog = ({
|
|
|
destroy
|
|
|
}) => {
|
|
|
const handleCloseBtnClick = () => {
|
|
|
destroy();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F920}"
|
|
|
}), "About ", /* @__PURE__ */ jsx("b", {
|
|
|
children: "Obsidian-Memos"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: handleCloseBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: ["Hi, I am Quorafind(Boninall), if you are interested in this project, please support my work and enthusiasm by buying me a coffee on ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://www.buymeacoffee.com/boninall",
|
|
|
children: "https://www.buymeacoffee.com/boninall"
|
|
|
}), /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://www.buymeacoffee.com/boninall",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: `https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00`
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
children: ["\u57FA\u4E8E ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/justmemos/memos",
|
|
|
children: "memos"
|
|
|
}), " \u5F00\u6E90\u9879\u76EE\u6240\u6784\u5EFA\u7684\u9879\u76EE\u3002 NOTE: Based on", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/justmemos/memos",
|
|
|
children: "memos"
|
|
|
}), " project to build."]
|
|
|
}), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
children: ["\u{1F3D7} This project is working in progress, ", /* @__PURE__ */ jsx("br", {}), " and very pleasure to welcome your", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/Quorafind/obsidian-memos/issues",
|
|
|
children: "issues"
|
|
|
}), " and", " ", /* @__PURE__ */ jsx("a", {
|
|
|
href: "https://github.com/Quorafind/obsidian-memos/pulls",
|
|
|
children: "Pull Request"
|
|
|
}), "."]
|
|
|
}), /* @__PURE__ */ jsx("hr", {}), /* @__PURE__ */ jsxs("p", {
|
|
|
className: "normal-text",
|
|
|
children: ["Last updated on ", /* @__PURE__ */ jsx("span", {
|
|
|
className: "pre-text",
|
|
|
children: "2022/01/04 22:55:15"
|
|
|
}), " \u{1F389}"]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showAboutSiteDialog() {
|
|
|
showDialog({
|
|
|
className: "about-site-dialog"
|
|
|
}, AboutSiteDialog);
|
|
|
}
|
|
|
var menuBtnsPopup = "";
|
|
|
const MenuBtnsPopup = (props) => {
|
|
|
const {
|
|
|
shownStatus,
|
|
|
setShownStatus
|
|
|
} = props;
|
|
|
const {
|
|
|
app: app2
|
|
|
} = dailyNotesService.getState();
|
|
|
const popupElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (shownStatus) {
|
|
|
const handleClickOutside = (event) => {
|
|
|
var _a;
|
|
|
if (!((_a = popupElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
event.stopPropagation();
|
|
|
}
|
|
|
setShownStatus(false);
|
|
|
};
|
|
|
window.addEventListener("click", handleClickOutside, {
|
|
|
capture: true,
|
|
|
once: true
|
|
|
});
|
|
|
}
|
|
|
}, [shownStatus]);
|
|
|
const handleMyAccountBtnClick = () => {
|
|
|
app2.setting.open();
|
|
|
app2.setting.openTabById("obsidian-memos");
|
|
|
};
|
|
|
const handleMemosTrashBtnClick = () => {
|
|
|
locationService.pushHistory("/recycle");
|
|
|
};
|
|
|
const handleAboutBtnClick = () => {
|
|
|
showAboutSiteDialog();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `menu-btns-popup ${shownStatus ? "" : "hidden"}`,
|
|
|
ref: popupElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleMyAccountBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F464}"
|
|
|
}), " ", t("Settings")]
|
|
|
}), /* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleMemosTrashBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F5D1}\uFE0F"
|
|
|
}), " ", t("Recycle bin")]
|
|
|
}), /* @__PURE__ */ jsxs("button", {
|
|
|
className: "btn action-btn",
|
|
|
onClick: handleAboutBtnClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon",
|
|
|
children: "\u{1F920}"
|
|
|
}), " ", t("About Me")]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var dailyMemo = "";
|
|
|
const getPathOfImage = (vault, image2) => {
|
|
|
return vault.getResourcePath(image2);
|
|
|
};
|
|
|
const detectWikiInternalLink = (lineText, app2) => {
|
|
|
var _a, _b;
|
|
|
const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1];
|
|
|
const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5];
|
|
|
const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage(app2.vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const detectMDInternalLink = (lineText, app2) => {
|
|
|
var _a, _b;
|
|
|
const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5];
|
|
|
const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2];
|
|
|
const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), "");
|
|
|
if (file === null) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: "",
|
|
|
filePath: ""
|
|
|
};
|
|
|
} else {
|
|
|
const imagePath = getPathOfImage(app2.vault, file);
|
|
|
if (internalAltName) {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: internalAltName,
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
} else {
|
|
|
return {
|
|
|
linkText: internalFileName,
|
|
|
altText: "",
|
|
|
path: imagePath,
|
|
|
filePath: file.path
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
const DailyMemo = (props) => {
|
|
|
var _a;
|
|
|
const {
|
|
|
app: app2
|
|
|
} = appStore.getState().dailyNotesState;
|
|
|
const {
|
|
|
memo: propsMemo
|
|
|
} = props;
|
|
|
const memo2 = __spreadProps(__spreadValues({}, propsMemo), {
|
|
|
createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt),
|
|
|
timeStr: utils$1.getTimeString(propsMemo.createdAt)
|
|
|
});
|
|
|
let externalImageUrls = [];
|
|
|
let internalImageUrls = [];
|
|
|
let allMarkdownLink = [];
|
|
|
let allInternalLink = [];
|
|
|
if (IMAGE_URL_REG.test(memo2.content)) {
|
|
|
let allExternalImageUrls = [];
|
|
|
let anotherExternalImageUrls = [];
|
|
|
if (MARKDOWN_URL_REG.test(memo2.content)) {
|
|
|
allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG));
|
|
|
}
|
|
|
if (WIKI_IMAGE_URL_REG.test(memo2.content)) {
|
|
|
allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG));
|
|
|
}
|
|
|
if (MARKDOWN_WEB_URL_REG.test(memo2.content)) {
|
|
|
allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG));
|
|
|
}
|
|
|
if (allInternalLink.length) {
|
|
|
for (let i = 0; i < allInternalLink.length; i++) {
|
|
|
let one = allInternalLink[i];
|
|
|
internalImageUrls.push(detectWikiInternalLink(one, app2));
|
|
|
}
|
|
|
}
|
|
|
if (allMarkdownLink.length) {
|
|
|
for (let i = 0; i < allMarkdownLink.length; i++) {
|
|
|
let two = allMarkdownLink[i];
|
|
|
if (/(.*)http[s]?(.*)/.test(two)) {
|
|
|
anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]);
|
|
|
} else {
|
|
|
internalImageUrls.push(detectMDInternalLink(two, app2));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls);
|
|
|
}
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "daily-memo-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "time-wrapper",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: memo2.timeStr
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-content-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "memo-content-text",
|
|
|
dangerouslySetInnerHTML: {
|
|
|
__html: formatMemoContent(memo2.content)
|
|
|
}
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: externalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container",
|
|
|
children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl,
|
|
|
referrerPolicy: "no-referrer"
|
|
|
}, idx))
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: internalImageUrls.length > 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "images-container internal-embed image-embed is-loaded",
|
|
|
children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", {
|
|
|
src: imgUrl.path,
|
|
|
alt: imgUrl.altText,
|
|
|
path: imgUrl.filePath
|
|
|
}, idx))
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var datePicker = "";
|
|
|
var arrowLeft = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJsNC41OC00LjU5eiIvPjwvc3ZnPg==";
|
|
|
var arrowRight = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02LTYtNnoiLz48L3N2Zz4=";
|
|
|
const DatePicker = (props) => {
|
|
|
const {
|
|
|
className,
|
|
|
datestamp,
|
|
|
handleDateStampChange
|
|
|
} = props;
|
|
|
const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(getMonthFirstDayDateStamp(datestamp));
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
setCurrentDateStamp(getMonthFirstDayDateStamp(datestamp));
|
|
|
}, [datestamp]);
|
|
|
const firstDate = new Date(currentDateStamp);
|
|
|
const firstDateDay = firstDate.getDay() === 0 ? 7 : firstDate.getDay();
|
|
|
const dayList = [];
|
|
|
for (let i = 1; i < firstDateDay; i++) {
|
|
|
dayList.push({
|
|
|
date: 0,
|
|
|
datestamp: firstDate.getTime() - DAILY_TIMESTAMP * (7 - i)
|
|
|
});
|
|
|
}
|
|
|
const dayAmount = getMonthDayAmount(currentDateStamp);
|
|
|
for (let i = 1; i <= dayAmount; i++) {
|
|
|
dayList.push({
|
|
|
date: i,
|
|
|
datestamp: firstDate.getTime() + DAILY_TIMESTAMP * (i - 1)
|
|
|
});
|
|
|
}
|
|
|
const handleDateItemClick = (datestamp2) => {
|
|
|
handleDateStampChange(datestamp2);
|
|
|
};
|
|
|
const handleChangeMonthBtnClick = (i) => {
|
|
|
const year = firstDate.getFullYear();
|
|
|
const month = firstDate.getMonth() + 1;
|
|
|
let nextDateStamp = 0;
|
|
|
if (month === 1 && i === -1) {
|
|
|
nextDateStamp = new Date(`${year - 1}/12/1`).getTime();
|
|
|
} else if (month === 12 && i === 1) {
|
|
|
nextDateStamp = new Date(`${year + 1}/1/1`).getTime();
|
|
|
} else {
|
|
|
nextDateStamp = new Date(`${year}/${month + i}/1`).getTime();
|
|
|
}
|
|
|
setCurrentDateStamp(getMonthFirstDayDateStamp(nextDateStamp));
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `date-picker-wrapper ${className}`,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-header",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => handleChangeMonthBtnClick(-1),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowLeft
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("span", {
|
|
|
className: "normal-text",
|
|
|
children: [firstDate.getFullYear(), " \u5E74 ", firstDate.getMonth() + 1, " \u6708"]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => handleChangeMonthBtnClick(1),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-day-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-picker-day-header",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u4E00"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u4E8C"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u4E09"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u56DB"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u4E94"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u516D"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item",
|
|
|
children: "\u5468\u65E5"
|
|
|
})]
|
|
|
}), dayList.map((d) => {
|
|
|
if (d.date === 0) {
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: "day-item null",
|
|
|
children: ""
|
|
|
}, d.datestamp);
|
|
|
} else {
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: `day-item ${d.datestamp === datestamp ? "current" : ""}`,
|
|
|
onClick: () => handleDateItemClick(d.datestamp),
|
|
|
children: d.date
|
|
|
}, d.datestamp);
|
|
|
}
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function getMonthDayAmount(datestamp) {
|
|
|
const dateTemp = new Date(datestamp);
|
|
|
const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`);
|
|
|
const nextMonthDate = currentDate.getMonth() === 11 ? new Date(`${currentDate.getFullYear() + 1}/1/1`) : new Date(`${currentDate.getFullYear()}/${currentDate.getMonth() + 2}/1`);
|
|
|
return (nextMonthDate.getTime() - currentDate.getTime()) / DAILY_TIMESTAMP;
|
|
|
}
|
|
|
function getMonthFirstDayDateStamp(timestamp) {
|
|
|
const dateTemp = new Date(timestamp);
|
|
|
const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`);
|
|
|
return currentDate.getTime();
|
|
|
}
|
|
|
var dailyMemoDiaryDialog = "";
|
|
|
const DailyMemoDiaryDialog = (props) => {
|
|
|
const loadingState = useLoading();
|
|
|
const [memos, setMemos] = _react_17_0_2_react.exports.useState([]);
|
|
|
const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(utils$1.getDateStampByDate(utils$1.getDateString(props.currentDateStamp)));
|
|
|
const [showDatePicker, toggleShowDatePicker] = useToggle(false);
|
|
|
const memosElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const currentDate = new Date(currentDateStamp);
|
|
|
const {
|
|
|
vault
|
|
|
} = appStore.getState().dailyNotesState.app;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const setDailyMemos = () => {
|
|
|
const dailyMemos = memoService.getState().memos.filter((a) => utils$1.getTimeStampByDate(a.createdAt) >= currentDateStamp && utils$1.getTimeStampByDate(a.createdAt) < currentDateStamp + DAILY_TIMESTAMP).sort((a, b) => utils$1.getTimeStampByDate(a.createdAt) - utils$1.getTimeStampByDate(b.createdAt));
|
|
|
setMemos(dailyMemos);
|
|
|
loadingState.setFinish();
|
|
|
};
|
|
|
setDailyMemos();
|
|
|
}, [currentDateStamp]);
|
|
|
const convertBase64ToBlob = (base64, type) => {
|
|
|
var bytes = window.atob(base64);
|
|
|
var ab2 = new ArrayBuffer(bytes.length);
|
|
|
var ia2 = new Uint8Array(ab2);
|
|
|
for (var i = 0; i < bytes.length; i++) {
|
|
|
ia2[i] = bytes.charCodeAt(i);
|
|
|
}
|
|
|
return new Blob([ab2], {
|
|
|
type
|
|
|
});
|
|
|
};
|
|
|
const handleShareBtnClick = async () => {
|
|
|
toggleShowDatePicker(false);
|
|
|
setTimeout(() => {
|
|
|
if (!memosElRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
toImage(memosElRef.current, {
|
|
|
backgroundColor: "#ffffff",
|
|
|
pixelRatio: window.devicePixelRatio * 2
|
|
|
}).then((url) => {
|
|
|
if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) {
|
|
|
const myBase64 = url.split("base64,")[1];
|
|
|
const blobInput = convertBase64ToBlob(myBase64, "image/png");
|
|
|
blobInput.arrayBuffer().then(async (buffer) => {
|
|
|
let aFile;
|
|
|
const ext = "png";
|
|
|
const dailyNotes = getAllDailyNotes_1();
|
|
|
for (const string in dailyNotes) {
|
|
|
if (dailyNotes[string] instanceof require$$0.TFile) {
|
|
|
aFile = dailyNotes[string];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (aFile !== void 0) {
|
|
|
await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
showPreviewImageDialog(url);
|
|
|
}).catch(() => {
|
|
|
});
|
|
|
}, 0);
|
|
|
};
|
|
|
const handleDataPickerChange = (datestamp) => {
|
|
|
setCurrentDateStamp(datestamp);
|
|
|
toggleShowDatePicker(false);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "header-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Daily Memos")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => setCurrentDateStamp(currentDateStamp - DAILY_TIMESTAMP),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowLeft
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => setCurrentDateStamp(currentDateStamp + DAILY_TIMESTAMP),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text share-btn",
|
|
|
onClick: handleShareBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: share
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn-text",
|
|
|
onClick: () => props.destroy(),
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
ref: memosElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-card-container",
|
|
|
onClick: () => toggleShowDatePicker(),
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "year-text",
|
|
|
children: currentDate.getFullYear()
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "date-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {
|
|
|
className: "month-text",
|
|
|
children: instance.t("months", {
|
|
|
returnObjects: true
|
|
|
})[currentDate.getMonth()]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "date-text",
|
|
|
children: currentDate.getDate()
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "day-text",
|
|
|
children: instance.t("weekDays", {
|
|
|
returnObjects: true
|
|
|
})[currentDate.getDay()]
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(DatePicker, {
|
|
|
className: `date-picker ${showDatePicker ? "" : "hidden"}`,
|
|
|
datestamp: currentDateStamp,
|
|
|
handleDateStampChange: handleDataPickerChange
|
|
|
}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Loading...")
|
|
|
})
|
|
|
}) : memos.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
|
className: "tip-container",
|
|
|
children: /* @__PURE__ */ jsx("p", {
|
|
|
className: "tip-text",
|
|
|
children: t("Noooop!")
|
|
|
})
|
|
|
}) : /* @__PURE__ */ jsx("div", {
|
|
|
className: "dailymemos-wrapper",
|
|
|
children: memos.map((memo2) => /* @__PURE__ */ jsx(DailyMemo, {
|
|
|
memo: memo2
|
|
|
}, `${memo2.id}-${memo2.updatedAt}`))
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
function showDailyMemoDiaryDialog(datestamp = Date.now()) {
|
|
|
showDialog({
|
|
|
className: "daily-memo-diary-dialog"
|
|
|
}, DailyMemoDiaryDialog, {
|
|
|
currentDateStamp: datestamp
|
|
|
});
|
|
|
}
|
|
|
var userBanner = "";
|
|
|
const UserBanner = () => {
|
|
|
const {
|
|
|
memoState: {
|
|
|
memos,
|
|
|
tags
|
|
|
},
|
|
|
userState: {
|
|
|
user
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const username = user ? user.username : UserName;
|
|
|
let memosLength;
|
|
|
let createdDays;
|
|
|
if (memos.length) {
|
|
|
memosLength = memos.length - 1;
|
|
|
createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) + 1 : 0;
|
|
|
}
|
|
|
const [shouldShowPopupBtns, setShouldShowPopupBtns] = _react_17_0_2_react.exports.useState(false);
|
|
|
const handleUsernameClick = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
locationService.pushHistory("/");
|
|
|
locationService.clearQuery();
|
|
|
}, []);
|
|
|
const handlePopupBtnClick = () => {
|
|
|
const sidebarEl = document.querySelector(".memos-sidebar-wrapper");
|
|
|
const popupEl = document.querySelector(".menu-btns-popup");
|
|
|
popupEl.style.top = 70 - sidebarEl.scrollTop + "px";
|
|
|
setShouldShowPopupBtns(true);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "user-banner-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "userinfo-header-container",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "username-text",
|
|
|
onClick: handleUsernameClick,
|
|
|
children: username
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "action-btn menu-popup-btn",
|
|
|
onClick: handlePopupBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
src: more,
|
|
|
className: "icon-img"
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx(MenuBtnsPopup, {
|
|
|
shownStatus: shouldShowPopupBtns,
|
|
|
setShownStatus: setShouldShowPopupBtns
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text memos-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: memos.length
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: "MEMO"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text tags-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: tags.length
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: t("TAG")
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "status-text duration-text",
|
|
|
onClick: () => showDailyMemoDiaryDialog(),
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "amount-text",
|
|
|
children: createdDays
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "type-text",
|
|
|
children: t("DAY")
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var selector = "";
|
|
|
const nullItem = {
|
|
|
text: t("SELECT"),
|
|
|
value: ""
|
|
|
};
|
|
|
const Selector = (props) => {
|
|
|
const {
|
|
|
className,
|
|
|
dataSource,
|
|
|
handleValueChanged,
|
|
|
value
|
|
|
} = props;
|
|
|
const [showSelector, toggleSelectorStatus] = useToggle(false);
|
|
|
const seletorElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
let currentItem = nullItem;
|
|
|
for (const d of dataSource) {
|
|
|
if (d.value === value) {
|
|
|
currentItem = d;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (showSelector) {
|
|
|
const handleClickOutside = (event) => {
|
|
|
var _a;
|
|
|
if (!((_a = seletorElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
toggleSelectorStatus(false);
|
|
|
}
|
|
|
};
|
|
|
window.addEventListener("click", handleClickOutside, {
|
|
|
capture: true,
|
|
|
once: true
|
|
|
});
|
|
|
}
|
|
|
}, [showSelector]);
|
|
|
const handleItemClick = (item) => {
|
|
|
if (handleValueChanged) {
|
|
|
handleValueChanged(item.value);
|
|
|
}
|
|
|
toggleSelectorStatus(false);
|
|
|
};
|
|
|
const handleCurrentValueClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleSelectorStatus();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: `selector-wrapper ${className != null ? className : ""}`,
|
|
|
ref: seletorElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: `current-value-container ${showSelector ? "active" : ""}`,
|
|
|
onClick: handleCurrentValueClick,
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "value-text",
|
|
|
children: currentItem.text
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "arrow-text",
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: `items-wrapper ${showSelector ? "" : "hidden"}`,
|
|
|
children: dataSource.map((d) => {
|
|
|
return /* @__PURE__ */ jsx("div", {
|
|
|
className: `item-container ${d.value === value ? "selected" : ""}`,
|
|
|
onClick: () => {
|
|
|
handleItemClick(d);
|
|
|
},
|
|
|
children: d.text
|
|
|
}, d.value);
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var Selector$1 = _react_17_0_2_react.exports.memo(Selector);
|
|
|
var createQueryDialog = "";
|
|
|
const CreateQueryDialog = (props) => {
|
|
|
const {
|
|
|
destroy,
|
|
|
queryId
|
|
|
} = props;
|
|
|
const [title, setTitle] = _react_17_0_2_react.exports.useState("");
|
|
|
const [filters, setFilters] = _react_17_0_2_react.exports.useState([]);
|
|
|
const requestState = useLoading(false);
|
|
|
const shownMemoLength = memoService.getState().memos.filter((memo2) => {
|
|
|
return checkShouldShowMemoWithFilters(memo2, filters);
|
|
|
}).length;
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const queryTemp = queryService.getQueryById(queryId != null ? queryId : "");
|
|
|
if (queryTemp) {
|
|
|
setTitle(queryTemp.title);
|
|
|
const temp = JSON.parse(queryTemp.querystring);
|
|
|
if (Array.isArray(temp)) {
|
|
|
setFilters(temp);
|
|
|
}
|
|
|
}
|
|
|
}, [queryId]);
|
|
|
const handleTitleInputChange = (e) => {
|
|
|
const text = e.target.value;
|
|
|
setTitle(text);
|
|
|
};
|
|
|
const handleSaveBtnClick = async () => {
|
|
|
if (!title) {
|
|
|
new require$$0.Notice("TITLE CANNOT BE NULL\uFF01");
|
|
|
return;
|
|
|
} else if (filters.length === 0) {
|
|
|
new require$$0.Notice("FILTER CANNOT BE NULL\uFF01");
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
if (queryId) {
|
|
|
const editedQuery = await queryService.updateQuery(queryId, title, JSON.stringify(filters));
|
|
|
queryService.editQuery(editedQuery);
|
|
|
queryService.getMyAllQueries();
|
|
|
} else {
|
|
|
const query = await queryService.createQuery(title, JSON.stringify(filters));
|
|
|
queryService.pushQuery(query);
|
|
|
queryService.getMyAllQueries();
|
|
|
}
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
destroy();
|
|
|
};
|
|
|
const handleAddFilterBenClick = () => {
|
|
|
if (filters.length > 0) {
|
|
|
const lastFilter = filters[filters.length - 1];
|
|
|
if (lastFilter.value.value === "") {
|
|
|
new require$$0.Notice("\u5148\u5B8C\u5584\u4E0A\u4E00\u4E2A\u8FC7\u6EE4\u5668\u5427");
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
setFilters([...filters, getDefaultFilter()]);
|
|
|
};
|
|
|
const handleFilterChange = _react_17_0_2_react.exports.useCallback((index, filter) => {
|
|
|
setFilters((filters2) => {
|
|
|
const temp = [...filters2];
|
|
|
temp[index] = filter;
|
|
|
return temp;
|
|
|
});
|
|
|
}, []);
|
|
|
const handleFilterRemove = _react_17_0_2_react.exports.useCallback((index) => {
|
|
|
setFilters((filters2) => {
|
|
|
const temp = filters2.filter((_23, i) => i !== index);
|
|
|
return temp;
|
|
|
});
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-header-container",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "\u{1F516}"
|
|
|
}), queryId ? t("EDIT QUERY") : t("CREATE QUERY")]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: "btn close-btn",
|
|
|
onClick: destroy,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: close
|
|
|
})
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-content-container",
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "form-item-container input-form-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("TITLE")
|
|
|
}), /* @__PURE__ */ jsx("input", {
|
|
|
className: "title-input",
|
|
|
type: "text",
|
|
|
value: title,
|
|
|
onChange: handleTitleInputChange
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "form-item-container filter-form-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("FILTER")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "filters-wrapper",
|
|
|
children: [filters.map((f2, index) => {
|
|
|
return /* @__PURE__ */ jsx(MemoFilterInputer, {
|
|
|
index,
|
|
|
filter: f2,
|
|
|
handleFilterChange,
|
|
|
handleFilterRemove
|
|
|
}, index);
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "create-filter-btn",
|
|
|
onClick: handleAddFilterBenClick,
|
|
|
children: t("ADD FILTER TERMS")
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "dialog-footer-container",
|
|
|
children: [/* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
|
className: `tip-text ${filters.length === 0 && "hidden"}`,
|
|
|
children: [t("MATCH"), " Memo ", /* @__PURE__ */ jsx("strong", {
|
|
|
children: shownMemoLength
|
|
|
}), " ", t("TIMES")]
|
|
|
}), /* @__PURE__ */ jsx("button", {
|
|
|
className: `btn save-btn ${requestState.isLoading ? "requesting" : ""}`,
|
|
|
onClick: handleSaveBtnClick,
|
|
|
children: "SAVE"
|
|
|
})]
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const FilterInputer = (props) => {
|
|
|
const {
|
|
|
index,
|
|
|
filter,
|
|
|
handleFilterChange,
|
|
|
handleFilterRemove
|
|
|
} = props;
|
|
|
const {
|
|
|
type
|
|
|
} = filter;
|
|
|
const [inputElements, setInputElements] = _react_17_0_2_react.exports.useState(/* @__PURE__ */ jsx(Fragment, {}));
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
let operatorElement = /* @__PURE__ */ jsx(Fragment, {});
|
|
|
if (Object.keys(filterConsts).includes(type)) {
|
|
|
operatorElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "operator-selector",
|
|
|
dataSource: Object.values(filterConsts[type].operators),
|
|
|
value: filter.value.operator,
|
|
|
handleValueChanged: handleOperatorChange
|
|
|
});
|
|
|
}
|
|
|
let valueElement = /* @__PURE__ */ jsx(Fragment, {});
|
|
|
switch (type) {
|
|
|
case "TYPE": {
|
|
|
valueElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "value-selector",
|
|
|
dataSource: filterConsts["TYPE"].values,
|
|
|
value: filter.value.value,
|
|
|
handleValueChanged: handleValueChange
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
case "TAG": {
|
|
|
valueElement = /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "value-selector",
|
|
|
dataSource: memoService.getState().tags.sort().map((t2) => {
|
|
|
return {
|
|
|
text: t2,
|
|
|
value: t2
|
|
|
};
|
|
|
}),
|
|
|
value: filter.value.value,
|
|
|
handleValueChanged: handleValueChange
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
case "TEXT": {
|
|
|
valueElement = /* @__PURE__ */ jsx("input", {
|
|
|
type: "text",
|
|
|
className: "value-inputer",
|
|
|
value: filter.value.value,
|
|
|
onChange: (event) => {
|
|
|
handleValueChange(event.target.value);
|
|
|
event.target.focus();
|
|
|
}
|
|
|
});
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
setInputElements(/* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [operatorElement, valueElement]
|
|
|
}));
|
|
|
}, [type, filter]);
|
|
|
const handleRelationChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
if (["AND", "OR"].includes(value)) {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
relation: value
|
|
|
}));
|
|
|
}
|
|
|
}, [filter]);
|
|
|
const handleTypeChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
if (filter.type !== value) {
|
|
|
const ops = Object.values(filterConsts[value].operators);
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
type: value,
|
|
|
value: {
|
|
|
operator: ops[0].value,
|
|
|
value: ""
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
}, [filter]);
|
|
|
const handleOperatorChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
value: __spreadProps(__spreadValues({}, filter.value), {
|
|
|
operator: value
|
|
|
})
|
|
|
}));
|
|
|
}, [filter]);
|
|
|
const handleValueChange = _react_17_0_2_react.exports.useCallback((value) => {
|
|
|
handleFilterChange(index, __spreadProps(__spreadValues({}, filter), {
|
|
|
value: __spreadProps(__spreadValues({}, filter.value), {
|
|
|
value
|
|
|
})
|
|
|
}));
|
|
|
}, [filter]);
|
|
|
const handleRemoveBtnClick = () => {
|
|
|
handleFilterRemove(index);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "memo-filter-input-wrapper",
|
|
|
children: [index > 0 ? /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "relation-selector",
|
|
|
dataSource: relationConsts,
|
|
|
value: filter.relation,
|
|
|
handleValueChanged: handleRelationChange
|
|
|
}) : null, /* @__PURE__ */ jsx(Selector$1, {
|
|
|
className: "type-selector",
|
|
|
dataSource: Object.values(filterConsts),
|
|
|
value: filter.type,
|
|
|
handleValueChanged: handleTypeChange
|
|
|
}), inputElements, /* @__PURE__ */ jsx("img", {
|
|
|
className: "remove-btn",
|
|
|
src: close,
|
|
|
onClick: handleRemoveBtnClick
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const MemoFilterInputer = _react_17_0_2_react.exports.memo(FilterInputer);
|
|
|
function showCreateQueryDialog(queryId) {
|
|
|
showDialog({
|
|
|
className: "create-query-dialog"
|
|
|
}, CreateQueryDialog, {
|
|
|
queryId
|
|
|
});
|
|
|
}
|
|
|
var queryList = "";
|
|
|
var moreWhite = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+";
|
|
|
const QueryList = () => {
|
|
|
const {
|
|
|
queryState: {
|
|
|
queries
|
|
|
},
|
|
|
locationState: {
|
|
|
query: {
|
|
|
filter
|
|
|
}
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
const sortedQueries = queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => {
|
|
|
var _a, _b;
|
|
|
return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0);
|
|
|
});
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
queryService.getMyAllQueries().catch(() => {
|
|
|
}).finally(() => {
|
|
|
loadingState.setFinish();
|
|
|
});
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "queries-wrapper",
|
|
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
|
className: "title-text",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "normal-text",
|
|
|
children: t("QUERY")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: () => showCreateQueryDialog(),
|
|
|
children: "+"
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx(Only, {
|
|
|
when: loadingState.isSucceed && sortedQueries.length === 0,
|
|
|
children: /* @__PURE__ */ jsx("div", {
|
|
|
className: "create-query-btn-container",
|
|
|
children: /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: () => showCreateQueryDialog(),
|
|
|
children: t("CREATE FILTER")
|
|
|
})
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "queries-container",
|
|
|
children: sortedQueries.map((q2) => {
|
|
|
return /* @__PURE__ */ jsx(QueryItemContainer, {
|
|
|
query: q2,
|
|
|
isActive: q2.id === filter
|
|
|
}, q2.id);
|
|
|
})
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const QueryItemContainer = (props) => {
|
|
|
const {
|
|
|
query,
|
|
|
isActive
|
|
|
} = props;
|
|
|
const [showActionBtns, toggleShowActionBtns] = useToggle(false);
|
|
|
const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false);
|
|
|
const handleQueryClick = () => {
|
|
|
if (isActive) {
|
|
|
locationService.setMemoFilter("");
|
|
|
} else {
|
|
|
locationService.setMemoFilter(query.id);
|
|
|
}
|
|
|
};
|
|
|
const handleShowActionBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleShowActionBtns();
|
|
|
};
|
|
|
const handleActionBtnContainerMouseLeave = () => {
|
|
|
toggleShowActionBtns(false);
|
|
|
};
|
|
|
const handleDeleteMemoClick = async (event) => {
|
|
|
event.stopPropagation();
|
|
|
if (showConfirmDeleteBtn) {
|
|
|
try {
|
|
|
await queryService.deleteQuery(query.id);
|
|
|
} catch (error2) {
|
|
|
new require$$0.Notice(error2.message);
|
|
|
}
|
|
|
} else {
|
|
|
toggleConfirmDeleteBtn();
|
|
|
}
|
|
|
};
|
|
|
const handleEditQueryBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
showCreateQueryDialog(query.id);
|
|
|
};
|
|
|
const handlePinQueryBtnClick = async (event) => {
|
|
|
event.stopPropagation();
|
|
|
try {
|
|
|
if (query.pinnedAt) {
|
|
|
await queryService.unpinQuery(query.id);
|
|
|
queryService.editQuery(__spreadProps(__spreadValues({}, query), {
|
|
|
pinnedAt: ""
|
|
|
}));
|
|
|
} else {
|
|
|
await queryService.pinQuery(query.id);
|
|
|
queryService.editQuery(__spreadProps(__spreadValues({}, query), {
|
|
|
pinnedAt: utils$1.getDateTimeString(Date.now())
|
|
|
}));
|
|
|
}
|
|
|
} catch (error2) {
|
|
|
}
|
|
|
};
|
|
|
const handleDeleteBtnMouseLeave = () => {
|
|
|
toggleConfirmDeleteBtn(false);
|
|
|
};
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: `query-item-container ${isActive ? "active" : ""}`,
|
|
|
onClick: handleQueryClick,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "query-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "#"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "query-text",
|
|
|
children: query.title
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "action-btn toggle-btn",
|
|
|
onClick: handleShowActionBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: isActive ? moreWhite : more
|
|
|
})
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: `action-btns-wrapper ${showActionBtns ? "" : "hidden"}`,
|
|
|
onMouseLeave: handleActionBtnContainerMouseLeave,
|
|
|
children: /* @__PURE__ */ jsxs("div", {
|
|
|
className: "action-btns-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handlePinQueryBtnClick,
|
|
|
children: query.pinnedAt ? t("UNPIN") : t("PIN")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "btn",
|
|
|
onClick: handleEditQueryBtnClick,
|
|
|
children: t("EDIT")
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`,
|
|
|
onClick: handleDeleteMemoClick,
|
|
|
onMouseLeave: handleDeleteBtnMouseLeave,
|
|
|
children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE")
|
|
|
})]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
})
|
|
|
});
|
|
|
};
|
|
|
var tagList = "";
|
|
|
const TagList = () => {
|
|
|
const {
|
|
|
locationState: {
|
|
|
query: {
|
|
|
tag: tagQuery
|
|
|
}
|
|
|
},
|
|
|
memoState: {
|
|
|
tags: tagsText,
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [tags, setTags] = _react_17_0_2_react.exports.useState([]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
memoService.updateTagsState();
|
|
|
}, [memos]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const sortedTags = Array.from(tagsText).sort();
|
|
|
const root = {
|
|
|
subTags: []
|
|
|
};
|
|
|
for (const tag2 of sortedTags) {
|
|
|
const subtags = tag2.split("/");
|
|
|
let tempObj = root;
|
|
|
let tagText = "";
|
|
|
for (let i = 0; i < subtags.length; i++) {
|
|
|
const key = subtags[i];
|
|
|
if (i === 0) {
|
|
|
tagText += key;
|
|
|
} else {
|
|
|
tagText += "/" + key;
|
|
|
}
|
|
|
let obj = null;
|
|
|
for (const t2 of tempObj.subTags) {
|
|
|
if (t2.text === tagText) {
|
|
|
obj = t2;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!obj) {
|
|
|
obj = {
|
|
|
key,
|
|
|
text: tagText,
|
|
|
subTags: []
|
|
|
};
|
|
|
tempObj.subTags.push(obj);
|
|
|
}
|
|
|
tempObj = obj;
|
|
|
}
|
|
|
}
|
|
|
setTags(root.subTags);
|
|
|
}, [tagsText]);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "tags-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx("p", {
|
|
|
className: "title-text",
|
|
|
children: t("Frequently Used Tags")
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "tags-container",
|
|
|
children: [tags.map((t2, idx) => /* @__PURE__ */ jsx(TagItemContainer, {
|
|
|
tag: t2,
|
|
|
tagQuery
|
|
|
}, t2.text + "-" + idx)), /* @__PURE__ */ jsx(Only, {
|
|
|
when: tags.length < 5 && memoService.initialized,
|
|
|
children: /* @__PURE__ */ jsxs("p", {
|
|
|
className: "tag-tip-container",
|
|
|
children: ["Input", /* @__PURE__ */ jsx("span", {
|
|
|
className: "code-text",
|
|
|
children: "#Tag "
|
|
|
}), "to create tag..."]
|
|
|
})
|
|
|
})]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
const TagItemContainer = (props) => {
|
|
|
const {
|
|
|
tag: tag2,
|
|
|
tagQuery
|
|
|
} = props;
|
|
|
const isActive = tagQuery === tag2.text;
|
|
|
const hasSubTags = tag2.subTags.length > 0;
|
|
|
const [showSubTags, toggleSubTags] = useToggle(false);
|
|
|
const handleTagClick = () => {
|
|
|
if (isActive) {
|
|
|
locationService.setTagQuery("");
|
|
|
} else {
|
|
|
utils$1.copyTextToClipboard(`#${tag2.text} `);
|
|
|
if (!["/", "/recycle"].includes(locationService.getState().pathname)) {
|
|
|
locationService.setPathname("/");
|
|
|
}
|
|
|
locationService.setTagQuery(tag2.text);
|
|
|
}
|
|
|
};
|
|
|
const handleToggleBtnClick = (event) => {
|
|
|
event.stopPropagation();
|
|
|
toggleSubTags();
|
|
|
};
|
|
|
return /* @__PURE__ */ jsxs(Fragment, {
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: `tag-item-container ${isActive ? "active" : ""}`,
|
|
|
onClick: handleTagClick,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "tag-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "icon-text",
|
|
|
children: "#"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tag-text",
|
|
|
children: tag2.key
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsx("div", {
|
|
|
className: "btns-container",
|
|
|
children: hasSubTags ? /* @__PURE__ */ jsx("span", {
|
|
|
className: `action-btn toggle-btn ${showSubTags ? "shown" : ""}`,
|
|
|
onClick: handleToggleBtnClick,
|
|
|
children: /* @__PURE__ */ jsx("img", {
|
|
|
className: "icon-img",
|
|
|
src: arrowRight
|
|
|
})
|
|
|
}) : null
|
|
|
})]
|
|
|
}), hasSubTags ? /* @__PURE__ */ jsx("div", {
|
|
|
className: `subtags-container ${showSubTags ? "" : "hidden"}`,
|
|
|
children: tag2.subTags.map((st, idx) => /* @__PURE__ */ jsx(TagItemContainer, {
|
|
|
tag: st,
|
|
|
tagQuery
|
|
|
}, st.text + "-" + idx))
|
|
|
}) : null]
|
|
|
});
|
|
|
};
|
|
|
var usageHeatMap = "";
|
|
|
const tableConfig = {
|
|
|
width: 12,
|
|
|
height: 7
|
|
|
};
|
|
|
const getInitialUsageStat = (usedDaysAmount, beginDayTimestamp) => {
|
|
|
const initialUsageStat = [];
|
|
|
for (let i = 1; i <= usedDaysAmount; i++) {
|
|
|
initialUsageStat.push({
|
|
|
timestamp: parseInt(require$$0.moment(beginDayTimestamp).add(i, "days").format("x")),
|
|
|
count: 0
|
|
|
});
|
|
|
}
|
|
|
return initialUsageStat;
|
|
|
};
|
|
|
const UsageHeatMap = () => {
|
|
|
const todayTimeStamp = utils$1.getDateStampByDate(require$$0.moment().format("YYYY-MM-DD HH:mm:ss"));
|
|
|
const todayDay = new Date(todayTimeStamp).getDay() || 7;
|
|
|
const nullCell = new Array(7 - todayDay).fill(0);
|
|
|
const usedDaysAmount = (tableConfig.width - 1) * tableConfig.height + todayDay;
|
|
|
const beginDayTimestamp = utils$1.getDateStampByDate(todayTimeStamp - usedDaysAmount * DAILY_TIMESTAMP);
|
|
|
const startDate = require$$0.moment().subtract(usedDaysAmount, "days").endOf("day");
|
|
|
const {
|
|
|
memoState: {
|
|
|
memos
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const [allStat, setAllStat] = _react_17_0_2_react.exports.useState(getInitialUsageStat(usedDaysAmount, beginDayTimestamp));
|
|
|
const [popupStat, setPopupStat] = _react_17_0_2_react.exports.useState(null);
|
|
|
const [currentStat, setCurrentStat] = _react_17_0_2_react.exports.useState(null);
|
|
|
const containerElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const popupRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const newStat = getInitialUsageStat(usedDaysAmount, beginDayTimestamp);
|
|
|
for (const m2 of memos) {
|
|
|
const creationDate = require$$0.moment(m2.createdAt.replaceAll("/", "-"));
|
|
|
const index = creationDate.diff(startDate, "days");
|
|
|
if (index >= 0 && index < newStat.length) {
|
|
|
newStat[index].count += 1;
|
|
|
}
|
|
|
}
|
|
|
setAllStat([...newStat]);
|
|
|
}, [memos]);
|
|
|
const handleUsageStatItemMouseEnter = _react_17_0_2_react.exports.useCallback((event, item) => {
|
|
|
var _a, _b;
|
|
|
setPopupStat(item);
|
|
|
if (!popupRef.current) {
|
|
|
return;
|
|
|
}
|
|
|
const {
|
|
|
isMobileView
|
|
|
} = globalStateService.getState();
|
|
|
const targetEl = event.target;
|
|
|
const sidebarEl = document.querySelector(".memos-sidebar-wrapper");
|
|
|
popupRef.current.style.left = targetEl.offsetLeft - ((_b = (_a = containerElRef.current) == null ? void 0 : _a.offsetLeft) != null ? _b : 0) + "px";
|
|
|
let topValue = targetEl.offsetTop;
|
|
|
if (!isMobileView) {
|
|
|
topValue -= sidebarEl.scrollTop;
|
|
|
}
|
|
|
popupRef.current.style.top = topValue + "px";
|
|
|
}, []);
|
|
|
const handleUsageStatItemMouseLeave = _react_17_0_2_react.exports.useCallback(() => {
|
|
|
setPopupStat(null);
|
|
|
}, []);
|
|
|
const handleUsageStatItemClick = _react_17_0_2_react.exports.useCallback((item) => {
|
|
|
var _a;
|
|
|
if (((_a = locationService.getState().query.duration) == null ? void 0 : _a.from) === item.timestamp) {
|
|
|
locationService.setFromAndToQuery(0, 0);
|
|
|
setCurrentStat(null);
|
|
|
} else if (item.count > 0) {
|
|
|
if (!["/", "/recycle"].includes(locationService.getState().pathname)) {
|
|
|
locationService.setPathname("/");
|
|
|
}
|
|
|
locationService.setFromAndToQuery(item.timestamp, utils$1.getTimeStampByDate(require$$0.moment(item.timestamp + DAILY_TIMESTAMP).subtract(1, "days").endOf("day").format("YYYY-MM-DD HH:mm:ss")));
|
|
|
setCurrentStat(item);
|
|
|
}
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsxs("div", {
|
|
|
className: "usage-heat-map-wrapper",
|
|
|
ref: containerElRef,
|
|
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
|
className: "day-tip-text-container",
|
|
|
children: [/* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: instance.t("weekDaysShort", {
|
|
|
returnObjects: true
|
|
|
})[0]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: instance.t("weekDaysShort", {
|
|
|
returnObjects: true
|
|
|
})[2]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: instance.t("weekDaysShort", {
|
|
|
returnObjects: true
|
|
|
})[4]
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text"
|
|
|
}), /* @__PURE__ */ jsx("span", {
|
|
|
className: "tip-text",
|
|
|
children: instance.t("weekDaysShort", {
|
|
|
returnObjects: true
|
|
|
})[6]
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
ref: popupRef,
|
|
|
className: "usage-detail-container pop-up " + (popupStat ? "" : "hidden"),
|
|
|
children: [popupStat == null ? void 0 : popupStat.count, " memos on", " ", /* @__PURE__ */ jsx("span", {
|
|
|
className: "date-text",
|
|
|
children: new Date(popupStat == null ? void 0 : popupStat.timestamp).toDateString()
|
|
|
})]
|
|
|
}), /* @__PURE__ */ jsxs("div", {
|
|
|
className: "usage-heat-map",
|
|
|
children: [allStat.map((v2, i) => {
|
|
|
const count = v2.count;
|
|
|
const colorLevel = count <= 0 ? "" : count <= 1 ? "stat-day-L1-bg" : count <= 2 ? "stat-day-L2-bg" : count <= 4 ? "stat-day-L3-bg" : "stat-day-L4-bg";
|
|
|
return /* @__PURE__ */ jsx("span", {
|
|
|
className: `stat-container ${colorLevel} ${currentStat === v2 ? "current" : ""} ${todayTimeStamp === v2.timestamp ? "today" : ""}`,
|
|
|
onMouseEnter: (e) => handleUsageStatItemMouseEnter(e, v2),
|
|
|
onMouseLeave: handleUsageStatItemMouseLeave,
|
|
|
onClick: () => handleUsageStatItemClick(v2)
|
|
|
}, i);
|
|
|
}), nullCell.map((v2, i) => /* @__PURE__ */ jsx("span", {
|
|
|
className: "stat-container null"
|
|
|
}, i))]
|
|
|
})]
|
|
|
});
|
|
|
};
|
|
|
var siderbar = "";
|
|
|
const Sidebar = () => {
|
|
|
const {
|
|
|
locationState,
|
|
|
globalState: {
|
|
|
isMobileView,
|
|
|
showSiderbarInMobileView
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const wrapperElRef = _react_17_0_2_react.exports.useRef(null);
|
|
|
const handleClickOutsideOfWrapper = _react_17_0_2_react.exports.useMemo(() => {
|
|
|
return (event) => {
|
|
|
var _a, _b, _c;
|
|
|
const siderbarShown = globalStateService.getState().showSiderbarInMobileView;
|
|
|
if (!siderbarShown) {
|
|
|
window.removeEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
if (!((_a = wrapperElRef.current) == null ? void 0 : _a.contains(event.target))) {
|
|
|
if ((_c = (_b = wrapperElRef.current) == null ? void 0 : _b.parentNode) == null ? void 0 : _c.contains(event.target)) {
|
|
|
if (siderbarShown) {
|
|
|
event.stopPropagation();
|
|
|
}
|
|
|
globalStateService.setShowSiderbarInMobileView(false);
|
|
|
window.removeEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}, []);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
globalStateService.setShowSiderbarInMobileView(false);
|
|
|
}, [locationState]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (showSiderbarInMobileView) {
|
|
|
document.body.classList.add(SHOW_SIDERBAR_MOBILE_CLASSNAME);
|
|
|
} else {
|
|
|
document.body.classList.remove(SHOW_SIDERBAR_MOBILE_CLASSNAME);
|
|
|
}
|
|
|
}, [showSiderbarInMobileView]);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
if (isMobileView && showSiderbarInMobileView) {
|
|
|
window.addEventListener("click", handleClickOutsideOfWrapper, {
|
|
|
capture: true
|
|
|
});
|
|
|
}
|
|
|
}, [isMobileView, showSiderbarInMobileView]);
|
|
|
return /* @__PURE__ */ jsxs("aside", {
|
|
|
className: "memos-sidebar-wrapper",
|
|
|
ref: wrapperElRef,
|
|
|
children: [/* @__PURE__ */ jsx(UserBanner, {}), /* @__PURE__ */ jsx(UsageHeatMap, {}), /* @__PURE__ */ jsx(QueryList, {}), /* @__PURE__ */ jsx(TagList, {})]
|
|
|
});
|
|
|
};
|
|
|
var home = "";
|
|
|
function Home() {
|
|
|
const {
|
|
|
locationState: {
|
|
|
pathname
|
|
|
}
|
|
|
} = _react_17_0_2_react.exports.useContext(appContext);
|
|
|
const loadingState = useLoading();
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
loadingState.setFinish();
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsxs("section", {
|
|
|
id: "page-wrapper",
|
|
|
children: [/* @__PURE__ */ jsx(Sidebar, {}), /* @__PURE__ */ jsx("main", {
|
|
|
className: "content-wrapper",
|
|
|
children: homeRouterSwitch(pathname)
|
|
|
})]
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
var app = "";
|
|
|
(() => {
|
|
|
if (!String.prototype.replaceAll) {
|
|
|
String.prototype.replaceAll = function(str, newStr) {
|
|
|
if (Object.prototype.toString.call(str).toLowerCase() === "[object regexp]") {
|
|
|
return this.replace(str, newStr);
|
|
|
}
|
|
|
return this.replace(new RegExp(str, "g"), newStr);
|
|
|
};
|
|
|
}
|
|
|
})();
|
|
|
var global$1 = "";
|
|
|
function StrictApp() {
|
|
|
return /* @__PURE__ */ jsx(Provider, {
|
|
|
store: appStore,
|
|
|
context: appContext,
|
|
|
children: /* @__PURE__ */ jsx(App, {})
|
|
|
});
|
|
|
}
|
|
|
function App() {
|
|
|
_react_17_0_2_react.exports.useContext(appContext);
|
|
|
_react_17_0_2_react.exports.useEffect(() => {
|
|
|
const handleWindowResize = () => {
|
|
|
globalStateService.setIsMobileView(document.body.clientWidth <= 875);
|
|
|
};
|
|
|
handleWindowResize();
|
|
|
window.addEventListener("resize", handleWindowResize);
|
|
|
return () => {
|
|
|
window.removeEventListener("resize", handleWindowResize);
|
|
|
};
|
|
|
}, []);
|
|
|
return /* @__PURE__ */ jsx(Fragment, {
|
|
|
children: /* @__PURE__ */ jsx(Home, {})
|
|
|
});
|
|
|
}
|
|
|
class Memos extends require$$0.ItemView {
|
|
|
constructor(leaf, plugin) {
|
|
|
super(leaf);
|
|
|
__publicField(this, "plugin");
|
|
|
__publicField(this, "hoverPopover");
|
|
|
__publicField(this, "memosComponent");
|
|
|
this.plugin = plugin;
|
|
|
}
|
|
|
getDisplayText() {
|
|
|
return "Memos";
|
|
|
}
|
|
|
getIcon() {
|
|
|
return "Memos";
|
|
|
}
|
|
|
getViewType() {
|
|
|
return MEMOS_VIEW_TYPE;
|
|
|
}
|
|
|
onMemosSettingsUpdate() {
|
|
|
memoService.clearMemos();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
async onFileDeleted(file) {
|
|
|
if (getDateFromFile_1(file, "day")) {
|
|
|
await dailyNotesService.getMyAllDailyNotes();
|
|
|
memoService.clearMemos();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
async onFileModified(file) {
|
|
|
const date = getDateFromFile_1(file, "day");
|
|
|
if (date && this.memosComponent) {
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
onFileCreated(file) {
|
|
|
if (this.app.workspace.layoutReady && this.memosComponent) {
|
|
|
if (getDateFromFile_1(file, "day")) {
|
|
|
dailyNotesService.getMyAllDailyNotes();
|
|
|
memoService.fetchAllMemos();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async onOpen() {
|
|
|
this.onMemosSettingsUpdate = this.onMemosSettingsUpdate.bind(this);
|
|
|
this.onFileCreated = this.onFileCreated.bind(this);
|
|
|
this.onFileDeleted = this.onFileDeleted.bind(this);
|
|
|
this.onFileModified = this.onFileModified.bind(this);
|
|
|
this.registerEvent(this.plugin.app.workspace.on("layout-change", () => {
|
|
|
if (!this.memosComponent)
|
|
|
return;
|
|
|
const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (!(leaves.length > 0)) {
|
|
|
return;
|
|
|
}
|
|
|
const leaf = leaves[0];
|
|
|
const side = leaf.getRoot().side;
|
|
|
let sidebar;
|
|
|
let page;
|
|
|
if (leaf.view.containerEl.querySelector(".memos-sidebar-wrapper")) {
|
|
|
sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper");
|
|
|
} else {
|
|
|
sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper-display");
|
|
|
}
|
|
|
if (leaf.view.containerEl.querySelector(".content-wrapper")) {
|
|
|
page = leaf.view.containerEl.querySelector(".content-wrapper");
|
|
|
} else {
|
|
|
page = leaf.view.containerEl.querySelector(".content-wrapper-padding-fix");
|
|
|
}
|
|
|
if (side !== void 0 && (side === "left" || side === "right")) {
|
|
|
if (!(sidebar == null ? void 0 : sidebar.className.contains("memos-sidebar-wrapper-display")) && page !== void 0) {
|
|
|
sidebar.className = "memos-sidebar-wrapper-display";
|
|
|
page.className = "content-wrapper-padding-fix";
|
|
|
}
|
|
|
} else {
|
|
|
if ((sidebar == null ? void 0 : sidebar.classList.contains("memos-sidebar-wrapper-display")) && page !== void 0) {
|
|
|
sidebar.className = "memos-sidebar-wrapper";
|
|
|
page.className = "content-wrapper";
|
|
|
}
|
|
|
}
|
|
|
}));
|
|
|
this.registerEvent(this.app.workspace.on("obsidian-memos:settings-updated", this.onMemosSettingsUpdate));
|
|
|
this.registerEvent(this.app.vault.on("create", this.onFileCreated));
|
|
|
this.registerEvent(this.app.vault.on("delete", this.onFileDeleted));
|
|
|
this.registerEvent(this.app.vault.on("modify", this.onFileModified));
|
|
|
dailyNotesService.getApp(this.app);
|
|
|
InsertAfter = this.plugin.settings.InsertAfter;
|
|
|
UserName = this.plugin.settings.UserName;
|
|
|
ProcessEntriesBelow = this.plugin.settings.ProcessEntriesBelow;
|
|
|
SaveMemoButtonLabel = this.plugin.settings.SaveMemoButtonLabel;
|
|
|
DefaultPrefix = this.plugin.settings.DefaultPrefix;
|
|
|
InsertDateFormat = this.plugin.settings.InsertDateFormat;
|
|
|
DefaultEditorLocation = this.plugin.settings.DefaultEditorLocation;
|
|
|
UseButtonToShowEditor = this.plugin.settings.UseButtonToShowEditor;
|
|
|
FocusOnEditor = this.plugin.settings.FocusOnEditor;
|
|
|
OpenDailyMemosWithMemos = this.plugin.settings.OpenDailyMemosWithMemos;
|
|
|
HideDoneTasks = this.plugin.settings.HideDoneTasks;
|
|
|
ShareFooterStart = this.plugin.settings.ShareFooterStart;
|
|
|
ShareFooterEnd = this.plugin.settings.ShareFooterEnd;
|
|
|
this.plugin.settings.OpenMemosAutomatically;
|
|
|
ShowTime = this.plugin.settings.ShowTime;
|
|
|
ShowDate = this.plugin.settings.ShowDate;
|
|
|
AddBlankLineWhenDate = this.plugin.settings.AddBlankLineWhenDate;
|
|
|
AutoSaveWhenOnMobile = this.plugin.settings.AutoSaveWhenOnMobile;
|
|
|
this.memosComponent = React$1.createElement(StrictApp);
|
|
|
ReactDOM$1.render(this.memosComponent, this.contentEl);
|
|
|
}
|
|
|
async onClose() {
|
|
|
}
|
|
|
}
|
|
|
let InsertAfter;
|
|
|
let UserName;
|
|
|
let ProcessEntriesBelow;
|
|
|
let SaveMemoButtonLabel;
|
|
|
let DefaultPrefix;
|
|
|
let InsertDateFormat;
|
|
|
let DefaultEditorLocation;
|
|
|
let UseButtonToShowEditor;
|
|
|
let FocusOnEditor;
|
|
|
let OpenDailyMemosWithMemos;
|
|
|
let HideDoneTasks;
|
|
|
let ShareFooterStart;
|
|
|
let ShareFooterEnd;
|
|
|
let ShowTime;
|
|
|
let ShowDate;
|
|
|
let AddBlankLineWhenDate;
|
|
|
let AutoSaveWhenOnMobile;
|
|
|
const icons = {
|
|
|
Memos: `<svg t="1641348507339" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2120" width="100" height="100"><path d="M126.692653 478.099639l-90.757281 0c-19.019408 0-34.437336 15.423923-34.437336 34.417356 0 18.992434 15.416929 34.477297 34.437336 34.477297l90.757281 0c19.013414 0 34.42335-15.484863 34.42335-34.477297C161.116003 493.523561 145.706067 478.099639 126.692653 478.099639zM244.662333 243.526943c13.742566-13.110184 14.310011-34.948836 1.185841-48.706388l-62.644762-65.668806c-13.128167-13.762547-34.974811-14.229091-48.717377-1.118906s-14.261059 34.911872-1.132893 48.674419l62.644762 65.668806C209.123074 256.13262 230.919767 256.637127 244.662333 243.526943zM543.066631 957.422083l-60.603757 0c-18.654764 0-33.794964 15.147193-33.794964 33.862898 0 18.661757 15.1402 32.71502 33.794964 32.71502l60.603757 0c18.654764 0 33.794964-14.053262 33.794964-32.71502C576.861595 972.568277 561.721395 957.422083 543.066631 957.422083zM988.076617 479.050709l-90.757281 0c-19.019408 0-34.437336 15.423923-34.437336 34.417356s15.416929 34.477297 34.437336 34.477297l90.757281 0c19.013414 0 34.42335-15.484863 34.42335-34.477297S1007.09003 479.050709 988.076617 479.050709zM512.268737 192.765564c-172.737143 0-312.75527 150.079292-312.75527 322.746503 0 125.630192 74.080583 233.957298 180.936128 283.703669l0 84.51838c0 16.762614 15.410935 31.35435 34.42335 31.35435 0.598415 0 1.193833-0.014985 1.785255-0.042958 0.618395 0.026974 1.239788 0.042958 1.867175 0.042958l187.479731 0c5.905227 0 11.455802-1.220807 16.288078-3.477601 12.231044-4.657447 20.795671-15.383962 20.795671-27.87575l0-84.052835c107.391021-49.534578 181.935151-158.147405 181.935151-284.168214C825.024007 342.843857 684.997888 192.765564 512.268737 192.765564zM574.863548 742.713968l0 80.17063c0 3.159911-0.221783 5.976158-0.642372 8.496694l0 19.092336-124.910895 0 0-17.71768c-0.423586-2.856208-0.642372-6.123015-0.642372-9.870351l0-80.443363c-99.204024-27.75387-171.970892-118.821847-171.970892-226.930167 0-130.094827 105.4689-245.507007 235.571719-245.507007s235.563727 115.41218 235.563727 245.507007C747.832465 623.984031 674.578074 715.293772 574.863548 742.713968zM895.407204 129.328576c-13.429872-13.429872-35.233558-13.439862-48.677416 0.004995l-64.174267 64.175266c-13.448853 13.448853-13.443858 35.257534-0.013986 48.687406 13.429872 13.429872 35.281511 13.477825 48.730364 0.028972l64.175266-64.175266C908.889025 164.605092 908.837076 142.758448 895.407204 129.328576zM511.796199 159.617967c18.992434 0 34.417356-15.410935 34.417356-34.42335l0-90.757281c0-19.019408-15.423923-34.437336-34.417356-34.437336-18.992434 0-34.477297 15.416929-34.477297 34.437336l0 90.757281C477.317903 144.208031 492.802766 159.617967 511.796199 159.617967z" fill="currentColor" p-id="2121"></path></svg>`
|
|
|
};
|
|
|
function addIcons() {
|
|
|
Object.keys(icons).forEach((key) => {
|
|
|
require$$0.addIcon(key, icons[key]);
|
|
|
});
|
|
|
}
|
|
|
const DEFAULT_SETTINGS = {
|
|
|
StartDate: "Sunday",
|
|
|
InsertAfter: "# Journal",
|
|
|
UserName: "MEMO \u{1F609}",
|
|
|
ProcessEntriesBelow: "",
|
|
|
Language: "en",
|
|
|
SaveMemoButtonLabel: "NOTEIT",
|
|
|
ShareFooterStart: "{MemosNum} Memos {UsedDay} Day",
|
|
|
ShareFooterEnd: "\u270D\uFE0F by {UserName}",
|
|
|
DefaultPrefix: "List",
|
|
|
InsertDateFormat: "Tasks",
|
|
|
DefaultEditorLocation: "Top",
|
|
|
UseButtonToShowEditor: false,
|
|
|
FocusOnEditor: true,
|
|
|
OpenDailyMemosWithMemos: true,
|
|
|
HideDoneTasks: false,
|
|
|
OpenMemosAutomatically: false,
|
|
|
ShowTime: true,
|
|
|
ShowDate: true,
|
|
|
AddBlankLineWhenDate: false,
|
|
|
AutoSaveWhenOnMobile: false
|
|
|
};
|
|
|
class MemosSettingTab extends require$$0.PluginSettingTab {
|
|
|
constructor(app2, plugin) {
|
|
|
super(app2, plugin);
|
|
|
__publicField(this, "plugin");
|
|
|
__publicField(this, "applyDebounceTimer", 0);
|
|
|
this.plugin = plugin;
|
|
|
}
|
|
|
applySettingsUpdate() {
|
|
|
clearTimeout(this.applyDebounceTimer);
|
|
|
const plugin = this.plugin;
|
|
|
this.applyDebounceTimer = window.setTimeout(() => {
|
|
|
plugin.saveSettings();
|
|
|
}, 100);
|
|
|
memoService.updateTagsState();
|
|
|
}
|
|
|
async hide() {
|
|
|
}
|
|
|
async display() {
|
|
|
await this.plugin.loadSettings();
|
|
|
const { containerEl } = this;
|
|
|
this.containerEl.empty();
|
|
|
this.containerEl.createEl("h1", { text: t("Basic Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("User name in Memos")).setDesc(t("Set your user name here. 'Memos \u{1F60F}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.UserName).setValue(this.plugin.settings.UserName).onChange(async (value) => {
|
|
|
this.plugin.settings.UserName = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Insert after heading")).setDesc(t("You should set the same heading below if you want to insert and process memos below the same heading.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.InsertAfter).setValue(this.plugin.settings.InsertAfter).onChange(async (value) => {
|
|
|
this.plugin.settings.InsertAfter = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Process Memos below")).setDesc(t("Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ProcessEntriesBelow).setValue(this.plugin.settings.ProcessEntriesBelow).onChange(async (value) => {
|
|
|
this.plugin.settings.ProcessEntriesBelow = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Save Memo button label")).setDesc(t("The text shown on the save Memo button in the UI. 'NOTEIT' by default.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.SaveMemoButtonLabel).setValue(this.plugin.settings.SaveMemoButtonLabel).onChange(async (value) => {
|
|
|
this.plugin.settings.SaveMemoButtonLabel = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Focus on editor when open memos")).setDesc(t("Focus on editor when open memos. Focus by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.FocusOnEditor).onChange(async (value) => {
|
|
|
this.plugin.settings.FocusOnEditor = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Open daily memos with open memos")).setDesc(t("Open daily memos with open memos. Open by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenDailyMemosWithMemos).onChange(async (value) => {
|
|
|
this.plugin.settings.OpenDailyMemosWithMemos = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Open Memos when obsidian opens")).setDesc(t("When enable this, Memos will open when Obsidian opens. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenMemosAutomatically).onChange(async (value) => {
|
|
|
this.plugin.settings.OpenMemosAutomatically = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Hide done tasks in Memo list")).setDesc(t("Hide all done tasks in Memo list. Show done tasks by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.HideDoneTasks).onChange(async (value) => {
|
|
|
this.plugin.settings.HideDoneTasks = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Advanced Options") });
|
|
|
let dropdown;
|
|
|
new require$$0.Setting(containerEl).setName(t("UI language for date")).setDesc(t("Translates the date UI language. Only 'en' and 'zh' are available.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("zh", "\u4E2D\u6587");
|
|
|
dropdown.addOption("en", "English");
|
|
|
dropdown.setValue(this.plugin.settings.Language).onChange(async (value) => {
|
|
|
this.plugin.settings.Language = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Default prefix")).setDesc(t("Set the default prefix when create memo, 'List' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("List", t("List"));
|
|
|
dropdown.addOption("Task", t("Task"));
|
|
|
dropdown.setValue(this.plugin.settings.DefaultPrefix).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultPrefix = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Default insert date format")).setDesc(t("Set the default date format when insert date by @, 'Tasks' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("Tasks", "Tasks");
|
|
|
dropdown.addOption("Dataview", "Dataview");
|
|
|
dropdown.setValue(this.plugin.settings.InsertDateFormat).onChange(async (value) => {
|
|
|
this.plugin.settings.InsertDateFormat = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Default editor position on mobile")).setDesc(t("Set the default editor position on Mobile, 'Top' by default.")).addDropdown(async (d) => {
|
|
|
dropdown = d;
|
|
|
dropdown.addOption("Top", t("Top"));
|
|
|
dropdown.addOption("Bottom", t("Bottom"));
|
|
|
dropdown.setValue(this.plugin.settings.DefaultEditorLocation).onChange(async (value) => {
|
|
|
this.plugin.settings.DefaultEditorLocation = value;
|
|
|
this.applySettingsUpdate();
|
|
|
});
|
|
|
});
|
|
|
new require$$0.Setting(containerEl).setName(t("Use button to show editor on mobile")).setDesc(t("Set a float button to call editor on mobile. Only when editor located at the bottom works.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseButtonToShowEditor).onChange(async (value) => {
|
|
|
this.plugin.settings.UseButtonToShowEditor = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Show Time When Copy Results")).setDesc(t("Show time when you copy results, like 12:00. Copy time by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTime).onChange(async (value) => {
|
|
|
this.plugin.settings.ShowTime = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Show Date When Copy Results")).setDesc(t("Show date when you copy results, like [[2022-01-01]]. Copy date by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowDate).onChange(async (value) => {
|
|
|
this.plugin.settings.ShowDate = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Add Blank Line Between Different Date")).setDesc(t("Add blank line when copy result with date. No blank line by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AddBlankLineWhenDate).onChange(async (value) => {
|
|
|
this.plugin.settings.AddBlankLineWhenDate = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Share Options") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer Start")).setDesc(t("Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterStart).setValue(this.plugin.settings.ShareFooterStart).onChange(async (value) => {
|
|
|
this.plugin.settings.ShareFooterStart = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer End")).setDesc(t("Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterEnd).setValue(this.plugin.settings.ShareFooterEnd).onChange(async (value) => {
|
|
|
this.plugin.settings.ShareFooterEnd = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
new require$$0.Setting(containerEl).setName(t("Save Shared Image To Folder For Mobile")).setDesc(t("Save image to folder for mobile. False by Default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AutoSaveWhenOnMobile).onChange(async (value) => {
|
|
|
this.plugin.settings.AutoSaveWhenOnMobile = value;
|
|
|
this.applySettingsUpdate();
|
|
|
}));
|
|
|
this.containerEl.createEl("h1", { text: t("Say Thank You") });
|
|
|
new require$$0.Setting(containerEl).setName(t("Donate")).setDesc(t("If you like this plugin, consider donating to support continued development:")).addButton((bt) => {
|
|
|
bt.buttonEl.outerHTML = `<a href="https://www.buymeacoffee.com/boninall"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Inter&outline_colour=000000&coffee_colour=FFDD00"></a>`;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
const TRANSLATIONS_ZH = {
|
|
|
welcome: "\u6B22\u8FCE\u4F7F\u7528 Memos ",
|
|
|
ribbonIconTitle: "Memos",
|
|
|
months: ["\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"],
|
|
|
weekDays: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D"],
|
|
|
weekDaysShort: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D"],
|
|
|
to: "\u81F3"
|
|
|
};
|
|
|
const TRANSLATIONS_EN = {
|
|
|
welcome: "Welcome to the Memos",
|
|
|
ribbonIconTitle: "Memos",
|
|
|
months: [
|
|
|
"January",
|
|
|
"February",
|
|
|
"March",
|
|
|
"April",
|
|
|
"May",
|
|
|
"June",
|
|
|
"July",
|
|
|
"August",
|
|
|
"September",
|
|
|
"October",
|
|
|
"November",
|
|
|
"December"
|
|
|
],
|
|
|
weekDays: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
|
|
|
weekDaysShort: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
|
|
|
to: "to"
|
|
|
};
|
|
|
class MemosPlugin extends require$$0.Plugin {
|
|
|
constructor() {
|
|
|
super(...arguments);
|
|
|
__publicField(this, "settings");
|
|
|
}
|
|
|
async onload() {
|
|
|
console.log("obsidian-memos loading...");
|
|
|
await this.loadSettings();
|
|
|
await this.initLocalization();
|
|
|
this.registerView(MEMOS_VIEW_TYPE, (leaf) => new Memos(leaf, this));
|
|
|
this.addSettingTab(new MemosSettingTab(this.app, this));
|
|
|
addIcons();
|
|
|
this.addRibbonIcon("Memos", instance.t("ribbonIconTitle"), () => {
|
|
|
new require$$0.Notice("Open Memos Successfully");
|
|
|
this.openMemos();
|
|
|
});
|
|
|
if (appHasDailyNotesPluginLoaded_1()) {
|
|
|
new require$$0.Notice("Check if you opened Daily Notes Plugin");
|
|
|
}
|
|
|
this.addCommand({
|
|
|
id: "open-memos",
|
|
|
name: "Open Memos",
|
|
|
callback: () => this.openMemos(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "focus-on-memos-editor",
|
|
|
name: "Focus On Memos Editor",
|
|
|
callback: () => this.focusOnEditor(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "show-daily-memo",
|
|
|
name: "Show Daily Memo",
|
|
|
callback: () => this.openDailyMemo(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "note-it",
|
|
|
name: "Note It",
|
|
|
callback: () => this.noteIt(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "focus-on-search-bar",
|
|
|
name: "Search It",
|
|
|
callback: () => this.searchIt(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.addCommand({
|
|
|
id: "change-status",
|
|
|
name: "Change Status Between Task Or List",
|
|
|
callback: () => this.changeStatus(),
|
|
|
hotkeys: []
|
|
|
});
|
|
|
this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this));
|
|
|
console.log(instance.t("welcome"));
|
|
|
console.log("obsidian-memos loaded");
|
|
|
}
|
|
|
async loadSettings() {
|
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
|
}
|
|
|
async saveSettings() {
|
|
|
await this.saveData(this.settings);
|
|
|
}
|
|
|
onunload() {
|
|
|
this.app.workspace.detachLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
new require$$0.Notice("Close Memos Successfully");
|
|
|
}
|
|
|
async onLayoutReady() {
|
|
|
const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
if (this.settings.FocusOnEditor) {
|
|
|
const leaf = leaves[0];
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
if (!this.settings.OpenMemosAutomatically) {
|
|
|
return;
|
|
|
}
|
|
|
this.openMemos();
|
|
|
}
|
|
|
async openDailyMemo() {
|
|
|
const workspaceLeaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (OpenDailyMemosWithMemos === true) {
|
|
|
if (workspaceLeaves !== void 0 && workspaceLeaves.length === 0) {
|
|
|
this.openMemos();
|
|
|
showDailyMemoDiaryDialog();
|
|
|
} else {
|
|
|
showDailyMemoDiaryDialog();
|
|
|
}
|
|
|
} else {
|
|
|
showDailyMemoDiaryDialog();
|
|
|
}
|
|
|
}
|
|
|
async openMemos() {
|
|
|
const workspace = this.app.workspace;
|
|
|
workspace.detachLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
const leaf = workspace.getLeaf(!require$$0.Platform.isMobile && workspace.activeLeaf && workspace.activeLeaf.view instanceof require$$0.FileView);
|
|
|
await leaf.setViewState({ type: MEMOS_VIEW_TYPE });
|
|
|
workspace.revealLeaf(leaf);
|
|
|
if (FocusOnEditor) {
|
|
|
if (leaf.view.containerEl.querySelector("textarea") !== void 0) {
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
searchIt() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".search-bar-inputer .text-input").focus();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
focusOnEditor() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector("textarea").focus();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
noteIt() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".memo-editor .confirm-btn").click();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
changeStatus() {
|
|
|
const workspace = this.app.workspace;
|
|
|
const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE);
|
|
|
if (leaves.length > 0) {
|
|
|
const leaf = leaves[0];
|
|
|
workspace.setActiveLeaf(leaf);
|
|
|
leaf.view.containerEl.querySelector(".list-or-task").click();
|
|
|
} else {
|
|
|
this.openMemos();
|
|
|
}
|
|
|
}
|
|
|
async initLocalization() {
|
|
|
instance.init({
|
|
|
resources: {
|
|
|
en: {
|
|
|
translation: TRANSLATIONS_EN
|
|
|
},
|
|
|
zh: {
|
|
|
translation: TRANSLATIONS_ZH
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
instance.changeLanguage(this.settings.Language);
|
|
|
}
|
|
|
}
|
|
|
module.exports = MemosPlugin;
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsic3JjL2NvbnN0YW50cy50cyIsIm5vZGVfbW9kdWxlcy9fb2JqZWN0LWFzc2lnbkA0LjEuMUBvYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9pbmRleC5qcyIsInNyYy9sYWJzL2NvbWJpbmVSZWR1Y2Vycy50cyIsInNyYy9sYWJzL2NyZWF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9nbG9iYWxTdGF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9sb2NhdGlvblN0b3JlLnRzIiwic3JjL2hlbHBlcnMvdXRpbHMudHMiLCJzcmMvc3RvcmVzL21lbW9TdG9yZS50cyIsInNyYy9zdG9yZXMvdXNlclN0b3JlLnRzIiwic3JjL3N0b3Jlcy9xdWVyeVN0b3JlLnRzIiwibm9kZV9tb2R1bGVzL19vYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2VAMC45LjRAb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlL2Rpc3QvbWFpbi5qcyIsInNyYy9zdG9yZXMvZGFpbHlOb3Rlc1N0b3JlLnRzIiwic3JjL3N0b3Jlcy9hcHBTdG9yZS50cyIsInNyYy9zdG9yZXMvYXBwQ29udGV4dC50cyIsInNyYy9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZS50cyIsInNyYy9oZWxwZXJzL3N0b3JhZ2UudHMiLCJzcmMvc2VydmljZXMvZ2xvYmFsU3RhdGVTZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL2xvY2F0aW9uU2VydmljZS50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkdldFF1ZXJpZXMudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iR2V0TWVtb3MudHMiLCJzcmMvb2JDb21wb25lbnRzL29iVXBkYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlTWVtby50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JEZWxldGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5LnRzIiwic3JjL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5LnRzIiwic3JjL2hlbHBlcnMvYXBpLnRzIiwic3JjL2hlbHBlcnMvY29uc3RzLnRzIiwic3JjL3NlcnZpY2VzL21lbW9TZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL3F1ZXJ5U2VydmljZS50cyIsInNyYy9zZXJ2aWNlcy9yZXNvdXJjZVNlcnZpY2UudHMiLCJub2RlX21vZHVsZXMvX3RpbnktdW5kb0AwLjAuOEB0aW55LXVuZG8vZGlzdC9UaW55VW5kby5qcyIsInNyYy9ob29rcy91c2VSZWZyZXNoLnRzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJyZWFjdC9qc3gtcnVudGltZSIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9Pbmx5V2hlbi50c3giLCJub2RlX21vZHVsZXMvX3RleHRhcmVhLWNhcmV0QDMuMC4yQHRleHRhcmVhLWNhcmV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19jdXN0b20tZXZlbnRAMS4wLjFAY3VzdG9tLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19Ad2Vic2NvcGVpb19yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGVANC45LjFAQHdlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlL2Rpc3QvcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlLmVzLmpzIiwic3JjL29iQ29tcG9uZW50cy9vYlRhZ1N1Z2dlc3Rlci50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvYXIudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9jei50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2RhLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZGUudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9lbi50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2VuLWdiLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZXMudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9mci50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2hpLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvaWQudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9pdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2phLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUva28udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ubC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL25vLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcGwudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9wdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3B0LWJyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcm8udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ydS50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3RyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvemgtY24udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS96aC10dy50cyIsInNyYy90cmFuc2xhdGlvbnMvaGVscGVyLnRzIiwic3JjL2NvbXBvbmVudHMvRWRpdG9yL0VkaXRvci50c3giLCJub2RlX21vZHVsZXMvX3RzbGliQDIuMy4xQHRzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX3V0aWxzQDAuMTYuMEBAcmVhY2gvdXRpbHMvY2FuLXVzZS1kb20vZGlzdC9yZWFjaC11dGlscy1jYW4tdXNlLWRvbS5lc20uanMiLCJub2RlX21vZHVsZXMvX0ByZWFjaF91dGlsc0AwLjE2LjBAQHJlYWNoL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QvZGlzdC9yZWFjaC11dGlscy11c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0LmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX2F1dG8taWRAMC4xNi4wQEByZWFjaC9hdXRvLWlkL2Rpc3QvcmVhY2gtYXV0by1pZC5lc20uanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3RvRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZERheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mV2Vlay9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZkRheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkWWVhcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vaXNTYW1lRGF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc1ZhbGlkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZNb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mTW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZlllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbWF0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFVUQ0RheU9mWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvYWRkTGVhZGluZ1plcm9zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcHJvdGVjdGVkVG9rZW5zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2Zvcm1hdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXREYXlzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFVuaXhUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtZZWFyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N0YXJ0T2ZXZWVrWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xhc3REYXlPZk1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc0FmdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzQmVmb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZU1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZVllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0TW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0WWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9Nb250aHNEcm9wZG93bi9Nb250aHNEcm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9CdXR0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL05hdmlnYXRpb24vTmF2aWdhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9ZZWFyc0Ryb3Bkb3duL1llYXJzRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZUNvbnRyb2xsZWRWYWx1ZS91c2VDb250cm9sbGVkVmFsdWUuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL05hdmlnYXRpb24vdXRpbHMvZ2V0SW5pdGlhbE1vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb25TdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXREaXNwbGF5TW9udGhzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3V0aWxzL2dldE5leHRNb250aC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXRQcmV2aW91c01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL05hdmlnYXRpb25Db250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvQ2FwdGlvbi9DYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0NhcHRpb25MYWJlbC9DYXB0aW9uTGFiZWwuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL0RheVBpY2tlck11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RNdWx0aXBsZS9TZWxlY3RNdWx0aXBsZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlL3VzZVNlbGVjdE11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9EYXlQaWNrZXJSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvdXRpbHMvYWRkVG9SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvU2VsZWN0UmFuZ2VDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RSYW5nZS91c2VTZWxlY3RSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvdHlwZXMvRGF5UGlja2VyU2luZ2xlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RTaW5nbGUvU2VsZWN0U2luZ2xlQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0U2luZ2xlL3VzZVNlbGVjdFNpbmdsZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL3V0aWxzL3RvTWF0Y2hlckFycmF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Nb2RpZmllcnMvdXRpbHMvZ2V0Q3VzdG9tTW9kaWZpZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9Nb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91dGlscy9nZXRJbnRlcm5hbE1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL01vZGlmaWVyc0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91c2VNb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL01hdGNoZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9ob29rcy91c2VEYXlNb2RpZmllcnMvdXRpbHMvaXNEYXRlSW5SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3V0aWxzL2lzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZURheU1vZGlmaWVycy91dGlscy9nZXRNb2RpZmllclN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3VzZURheU1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRm9jdXMvZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Gb2N1cy9Gb2N1c0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0ZvY3VzL3VzZUZvY3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9ob29rcy91c2VEYXlGb2N1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9EYXkvaG9va3MvdXNlRGF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9EYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvRGF5Q29udGVudC9EYXlDb250ZW50LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Ryb3Bkb3duL0Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Zvb3Rlci9Gb290ZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSGVhZC91dGlscy9nZXRXZWVrZGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9IZWFkL0hlYWQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSWNvbkRyb3Bkb3duL0ljb25Ecm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uTGVmdC9JY29uTGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uUmlnaHQvSWNvblJpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvdy9Sb3cuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvV2Vla051bWJlci9XZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZGVmYXVsdENsYXNzTmFtZXMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdENhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdERheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0TW9udGhDYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrZGF5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0WWVhckNhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxEYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxNb250aERyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsTmV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFByZXZpb3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsV2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFdlZWtOdW1iZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxZZWFyRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci91dGlscy9wYXJzZUZyb21Ub1Byb3BzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvRGF5UGlja2VyQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL3VzZURheVBpY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlRW5kRGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlU3RhcnREYXlzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL3V0aWxzL2dldFdlZWtzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL01vbnRoL01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvb3QvUm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvUm9vdFByb3ZpZGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9EYXlQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LXBvcHBlckAyLjIuNUByZWFjdC1wb3BwZXIvbGliL2VzbS91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9lbnVtcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tYXRoLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1mYXN0LWNvbXBhcmVAMy4yLjBAcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1wb3BwZXJAMi4yLjVAcmVhY3QtcG9wcGVyL2xpYi9lc20vdXNlUG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19wcm9wLXR5cGVzQDE1LjguMUBwcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIm5vZGVfbW9kdWxlcy9fcHJvcC10eXBlc0AxNS44LjFAcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJub2RlX21vZHVsZXMvX3Byb3AtdHlwZXNAMTUuOC4xQHByb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3RhYmJhYmxlQDUuMi4xQHRhYmJhYmxlL2Rpc3QvaW5kZXguZXNtLmpzIiwibm9kZV9tb2R1bGVzL19mb2N1cy10cmFwQDYuNy4yQGZvY3VzLXRyYXAvZGlzdC9mb2N1cy10cmFwLmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fZm9jdXMtdHJhcC1yZWFjdEA4LjkuMUBmb2N1cy10cmFwLXJlYWN0L2Rpc3QvZm9jdXMtdHJhcC1yZWFjdC5qcyIsInNyYy9ob29rcy91c2VUb2dnbGUudHMiLCJzcmMvY29tcG9uZW50cy9NZW1vRWRpdG9yLnRzeCIsInNyYy9oZWxwZXJzL2ZpbHRlci50cyIsInNyYy9jb21wb25lbnRzL1NlYXJjaEJhci50c3giLCJzcmMvY29tcG9uZW50cy9NZW1vc0hlYWRlci50c3giLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9fQGJhYmVsX3J1bnRpbWVANy4xNi43QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjE2LjdAQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwibm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjE2LjdAQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0cy5qcyIsIm5vZGVfbW9kdWxlcy9fQGJhYmVsX3J1bnRpbWVANy4xNi43QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZi5qcyIsIm5vZGVfbW9kdWxlcy9fQGJhYmVsX3J1bnRpbWVANy4xNi43QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjE2LjdAQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjE2LjdAQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVJlc3QuanMiLCJub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuMTYuN0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL19pMThuZXh0QDIxLjYuNkBpMThuZXh0L2Rpc3QvZXNtL2kxOG5leHQuanMiLCJzcmMvaGVscGVycy9tYXJrZWQudHMiLCJzcmMvbGFicy9Qcm92aWRlci50c3giLCJzcmMvY29tcG9uZW50cy9EaWFsb2cudHN4Iiwic3JjL2NvbXBvbmVudHMvUHJldmlld0ltYWdlRGlhbG9nLnRzeCIsInNyYy9jb21wb25lbnRzL0ltYWdlLnRzeCIsInNyYy9jb21wb25lbnRzL01lbW9DYXJkRGlhbG9nLnRzeCIsInNyYy9sYWJzL2h0bWwyaW1hZ2UvY29udmVydFJlc291cmNlVG9EYXRhVVJMLnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9nZXRDbG9uZVN0eWxlZEVsZW1lbnQudHMiLCJzcmMvbGFicy9odG1sMmltYWdlL2dldEZvbnRzU3R5bGVFbGVtZW50LnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL1NoYXJlTWVtb0ltYWdlRGlhbG9nLnRzeCIsInNyYy9vYkNvbXBvbmVudHMvb2JTaG93TWVtby50cyIsInNyYy9jb21wb25lbnRzL01lbW8udHN4Iiwic3JjL2NvbXBvbmVudHMvTWVtb0xpc3QudHN4Iiwic3JjL29iQ29tcG9uZW50cy9vYkNvcHlNZW1vcy50cyIsInNyYy9jb21wb25lbnRzL01lbW9GaWx0ZXIudHN4Iiwic3JjL3BhZ2VzL01lbW9zLnRzeCIsInNyYy9ob29rcy91c2VMb2FkaW5nLnRzIiwic3JjL2NvbXBvbmVudHMvRGVsZXRlZE1lbW8udHN4Iiwic3JjL3BhZ2VzL01lbW9UcmFzaC50c3giLCJzcmMvY29tcG9uZW50cy9QcmVmZXJlbmNlc1NlY3Rpb24udHN4Iiwic3JjL3BhZ2VzL1NldHRpbmcudHN4Iiwic3JjL3JvdXRlcnMvaG9tZVJvdXRlci50c3giLCJzcmMvcm91dGVycy9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL0Fib3V0U2l0ZURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9NZW51QnRuc1BvcHVwLnRzeCIsInNyYy9jb21wb25lbnRzL0RhaWx5TWVtby50c3giLCJzcmMvY29tcG9uZW50cy9jb21tb24vRGF0ZVBpY2tlci50c3giLCJzcmMvY29tcG9uZW50cy9EYWlseU1lbW9EaWFyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9Vc2VyQmFubmVyLnRzeCIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9TZWxlY3Rvci50c3giLCJzcmMvY29tcG9uZW50cy9DcmVhdGVRdWVyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9RdWVyeUxpc3QudHN4Iiwic3JjL2NvbXBvbmVudHMvVGFnTGlzdC50c3giLCJzcmMvY29tcG9uZW50cy9Vc2FnZUhlYXRNYXAudHN4Iiwic3JjL2NvbXBvbmVudHMvU2lkZWJhci50c3giLCJzcmMvcGFnZXMvSG9tZS50c3giLCJzcmMvaGVscGVycy9wb2x5ZmlsbC50cyIsInNyYy9BcHAudHN4Iiwic3JjL21lbW9zLnRzIiwic3JjL29iQ29tcG9uZW50cy9jdXN0b21JY29ucy50cyIsInNyYy9zZXR0aW5nLnRzIiwic3JjL3RyYW5zbGF0aW9ucy96aC90cmFuc2xhdGlvbnMudHMiLCJzcmMvdHJhbnNsYXRpb25zL2VuL3RyYW5zbGF0aW9ucy50cyIsInNyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTUVNT1NfVklFV19UWVBFID0gJ21lbW9zX3ZpZXcnO1xuZXhwb3J0IGNvbnN0IFZJRVdfVFlQRSA9ICdyZWFjdC12aWV3JztcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBsPXJlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpLG49NjAxMDMscD02MDEwNjtleHBvcnRzLkZyYWdtZW50PTYwMTA3O2V4cG9ydHMuU3RyaWN0TW9kZT02MDEwODtleHBvcnRzLlByb2ZpbGVyPTYwMTE0O3ZhciBxPTYwMTA5LHI9NjAxMTAsdD02MDExMjtleHBvcnRzLlN1c3BlbnNlPTYwMTEzO3ZhciB1PTYwMTE1LHY9NjAxMTY7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgdz1TeW1ib2wuZm9yO249dyhcInJlYWN0LmVsZW1lbnRcIik7cD13KFwicmVhY3QucG9ydGFsXCIpO2V4cG9ydHMuRnJhZ21lbnQ9dyhcInJlYWN0LmZyYWdtZW50XCIpO2V4cG9ydHMuU3RyaWN0TW9kZT13KFwicmVhY3Quc3RyaWN0X21vZGVcIik7ZXhwb3J0cy5Qcm9maWxlcj13KFwicmVhY3QucHJvZmlsZXJcIik7cT13KFwicmVhY3QucHJvdmlkZXJcIik7cj13KFwicmVhY3QuY29udGV4dFwiKTt0PXcoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTtleHBvcnRzLlN1c3BlbnNlPXcoXCJyZWFjdC5zdXNwZW5zZVwiKTt1PXcoXCJyZWFjdC5tZW1vXCIpO3Y9dyhcInJlYWN0LmxhenlcIil9dmFyIHg9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuZnVuY3Rpb24geShhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9eCYmYVt4XXx8YVtcIkBAaXRlcmF0b3JcIl07cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGE/YTpudWxsfWZ1bmN0aW9uIHooYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9XG52YXIgQT17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sQj17fTtmdW5jdGlvbiBDKGEsYixjKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPUI7dGhpcy51cGRhdGVyPWN8fEF9Qy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtDLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJm51bGwhPWEpdGhyb3cgRXJyb3Ioeig4NSkpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxhLGIsXCJzZXRTdGF0ZVwiKX07Qy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGEsXCJmb3JjZVVwZGF0ZVwiKX07XG5mdW5jdGlvbiBEKCl7fUQucHJvdG90eXBlPUMucHJvdG90eXBlO2Z1bmN0aW9uIEUoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9Qjt0aGlzLnVwZGF0ZXI9Y3x8QX12YXIgRj1FLnByb3RvdHlwZT1uZXcgRDtGLmNvbnN0cnVjdG9yPUU7bChGLEMucHJvdG90eXBlKTtGLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwO3ZhciBHPXtjdXJyZW50Om51bGx9LEg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBKKGEsYixjKXt2YXIgZSxkPXt9LGs9bnVsbCxoPW51bGw7aWYobnVsbCE9Yilmb3IoZSBpbiB2b2lkIDAhPT1iLnJlZiYmKGg9Yi5yZWYpLHZvaWQgMCE9PWIua2V5JiYoaz1cIlwiK2Iua2V5KSxiKUguY2FsbChiLGUpJiYhSS5oYXNPd25Qcm9wZXJ0eShlKSYmKGRbZV09YltlXSk7dmFyIGc9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1nKWQuY2hpbGRyZW49YztlbHNlIGlmKDE8Zyl7Zm9yKHZhciBmPUFycmF5KGcpLG09MDttPGc7bSsrKWZbbV09YXJndW1lbnRzW20rMl07ZC5jaGlsZHJlbj1mfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihlIGluIGc9YS5kZWZhdWx0UHJvcHMsZyl2b2lkIDA9PT1kW2VdJiYoZFtlXT1nW2VdKTtyZXR1cm57JCR0eXBlb2Y6bix0eXBlOmEsa2V5OmsscmVmOmgscHJvcHM6ZCxfb3duZXI6Ry5jdXJyZW50fX1cbmZ1bmN0aW9uIEsoYSxiKXtyZXR1cm57JCR0eXBlb2Y6bix0eXBlOmEudHlwZSxrZXk6YixyZWY6YS5yZWYscHJvcHM6YS5wcm9wcyxfb3duZXI6YS5fb3duZXJ9fWZ1bmN0aW9uIEwoYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PW59ZnVuY3Rpb24gZXNjYXBlKGEpe3ZhciBiPXtcIj1cIjpcIj0wXCIsXCI6XCI6XCI9MlwifTtyZXR1cm5cIiRcIithLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBNPS9cXC8rL2c7ZnVuY3Rpb24gTihhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShcIlwiK2Eua2V5KTpiLnRvU3RyaW5nKDM2KX1cbmZ1bmN0aW9uIE8oYSxiLGMsZSxkKXt2YXIgaz10eXBlb2YgYTtpZihcInVuZGVmaW5lZFwiPT09a3x8XCJib29sZWFuXCI9PT1rKWE9bnVsbDt2YXIgaD0hMTtpZihudWxsPT09YSloPSEwO2Vsc2Ugc3dpdGNoKGspe2Nhc2UgXCJzdHJpbmdcIjpjYXNlIFwibnVtYmVyXCI6aD0hMDticmVhaztjYXNlIFwib2JqZWN0XCI6c3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgbjpjYXNlIHA6aD0hMH19aWYoaClyZXR1cm4gaD1hLGQ9ZChoKSxhPVwiXCI9PT1lP1wiLlwiK04oaCwwKTplLEFycmF5LmlzQXJyYXkoZCk/KGM9XCJcIixudWxsIT1hJiYoYz1hLnJlcGxhY2UoTSxcIiQmL1wiKStcIi9cIiksTyhkLGIsYyxcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkpOm51bGwhPWQmJihMKGQpJiYoZD1LKGQsYysoIWQua2V5fHxoJiZoLmtleT09PWQua2V5P1wiXCI6KFwiXCIrZC5rZXkpLnJlcGxhY2UoTSxcIiQmL1wiKStcIi9cIikrYSkpLGIucHVzaChkKSksMTtoPTA7ZT1cIlwiPT09ZT9cIi5cIjplK1wiOlwiO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBnPVxuMDtnPGEubGVuZ3RoO2crKyl7az1hW2ddO3ZhciBmPWUrTihrLGcpO2grPU8oayxiLGMsZixkKX1lbHNlIGlmKGY9eShhKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZilmb3IoYT1mLmNhbGwoYSksZz0wOyEoaz1hLm5leHQoKSkuZG9uZTspaz1rLnZhbHVlLGY9ZStOKGssZysrKSxoKz1PKGssYixjLGYsZCk7ZWxzZSBpZihcIm9iamVjdFwiPT09ayl0aHJvdyBiPVwiXCIrYSxFcnJvcih6KDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1iP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYSkuam9pbihcIiwgXCIpK1wifVwiOmIpKTtyZXR1cm4gaH1mdW5jdGlvbiBQKGEsYixjKXtpZihudWxsPT1hKXJldHVybiBhO3ZhciBlPVtdLGQ9MDtPKGEsZSxcIlwiLFwiXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuY2FsbChjLGEsZCsrKX0pO3JldHVybiBlfVxuZnVuY3Rpb24gUShhKXtpZigtMT09PWEuX3N0YXR1cyl7dmFyIGI9YS5fcmVzdWx0O2I9YigpO2EuX3N0YXR1cz0wO2EuX3Jlc3VsdD1iO2IudGhlbihmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYj1iLmRlZmF1bHQsYS5fc3RhdHVzPTEsYS5fcmVzdWx0PWIpfSxmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWIpfSl9aWYoMT09PWEuX3N0YXR1cylyZXR1cm4gYS5fcmVzdWx0O3Rocm93IGEuX3Jlc3VsdDt9dmFyIFI9e2N1cnJlbnQ6bnVsbH07ZnVuY3Rpb24gUygpe3ZhciBhPVIuY3VycmVudDtpZihudWxsPT09YSl0aHJvdyBFcnJvcih6KDMyMSkpO3JldHVybiBhfXZhciBUPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOlIsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6e3RyYW5zaXRpb246MH0sUmVhY3RDdXJyZW50T3duZXI6RyxJc1NvbWVSZW5kZXJlckFjdGluZzp7Y3VycmVudDohMX0sYXNzaWduOmx9O1xuZXhwb3J0cy5DaGlsZHJlbj17bWFwOlAsZm9yRWFjaDpmdW5jdGlvbihhLGIsYyl7UChhLGZ1bmN0aW9uKCl7Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMpfSxjb3VudDpmdW5jdGlvbihhKXt2YXIgYj0wO1AoYSxmdW5jdGlvbigpe2IrK30pO3JldHVybiBifSx0b0FycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBQKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KXx8W119LG9ubHk6ZnVuY3Rpb24oYSl7aWYoIUwoYSkpdGhyb3cgRXJyb3IoeigxNDMpKTtyZXR1cm4gYX19O2V4cG9ydHMuQ29tcG9uZW50PUM7ZXhwb3J0cy5QdXJlQ29tcG9uZW50PUU7ZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1UO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PT1hfHx2b2lkIDA9PT1hKXRocm93IEVycm9yKHooMjY3LGEpKTt2YXIgZT1sKHt9LGEucHJvcHMpLGQ9YS5rZXksaz1hLnJlZixoPWEuX293bmVyO2lmKG51bGwhPWIpe3ZvaWQgMCE9PWIucmVmJiYoaz1iLnJlZixoPUcuY3VycmVudCk7dm9pZCAwIT09Yi5rZXkmJihkPVwiXCIrYi5rZXkpO2lmKGEudHlwZSYmYS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgZz1hLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihmIGluIGIpSC5jYWxsKGIsZikmJiFJLmhhc093blByb3BlcnR5KGYpJiYoZVtmXT12b2lkIDA9PT1iW2ZdJiZ2b2lkIDAhPT1nP2dbZl06YltmXSl9dmFyIGY9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1mKWUuY2hpbGRyZW49YztlbHNlIGlmKDE8Zil7Zz1BcnJheShmKTtmb3IodmFyIG09MDttPGY7bSsrKWdbbV09YXJndW1lbnRzW20rMl07ZS5jaGlsZHJlbj1nfXJldHVybnskJHR5cGVvZjpuLHR5cGU6YS50eXBlLFxua2V5OmQscmVmOmsscHJvcHM6ZSxfb3duZXI6aH19O2V4cG9ydHMuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPW51bGwpO2E9eyQkdHlwZW9mOnIsX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOmIsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjpxLF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2V4cG9ydHMuY3JlYXRlRWxlbWVudD1KO2V4cG9ydHMuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj1KLmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07ZXhwb3J0cy5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07ZXhwb3J0cy5mb3J3YXJkUmVmPWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp0LHJlbmRlcjphfX07ZXhwb3J0cy5pc1ZhbGlkRWxlbWVudD1MO1xuZXhwb3J0cy5sYXp5PWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp2LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6YX0sX2luaXQ6UX19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp1LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy51c2VDYWxsYmFjaz1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlQ2FsbGJhY2soYSxiKX07ZXhwb3J0cy51c2VDb250ZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoKS51c2VDb250ZXh0KGEsYil9O2V4cG9ydHMudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe307ZXhwb3J0cy51c2VFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUygpLnVzZUVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTKCkudXNlSW1wZXJhdGl2ZUhhbmRsZShhLGIsYyl9O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUygpLnVzZUxheW91dEVmZmVjdChhLGIpfTtleHBvcnRzLnVzZU1lbW89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUygpLnVzZU1lbW8oYSxiKX07ZXhwb3J0cy51c2VSZWR1Y2VyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUygpLnVzZVJlZHVjZXIoYSxiLGMpfTtleHBvcnRzLnVzZVJlZj1mdW5jdGlvbihhKXtyZXR1cm4gUygpLnVzZVJlZihhKX07ZXhwb3J0cy51c2VTdGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gUygpLnVzZVN0YXRlKGEpfTtleHBvcnRzLnZlcnNpb249XCIxNy4wLjJcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjIwLjJcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGYsZyxoLGs7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGw9cGVyZm9ybWFuY2U7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gbC5ub3coKX19ZWxzZXt2YXIgcD1EYXRlLHE9cC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBwLm5vdygpLXF9fVxuaWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIHQ9bnVsbCx1PW51bGwsdz1mdW5jdGlvbigpe2lmKG51bGwhPT10KXRyeXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO3QoITAsYSk7dD1udWxsfWNhdGNoKGIpe3Rocm93IHNldFRpbWVvdXQodywwKSxiO319O2Y9ZnVuY3Rpb24oYSl7bnVsbCE9PXQ/c2V0VGltZW91dChmLDAsYSk6KHQ9YSxzZXRUaW1lb3V0KHcsMCkpfTtnPWZ1bmN0aW9uKGEsYil7dT1zZXRUaW1lb3V0KGEsYil9O2g9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodSl9O2V4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07az1leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKCl7fX1lbHNle3ZhciB4PXdpbmRvdy5zZXRUaW1lb3V0LHk9d2luZG93LmNsZWFyVGltZW91dDtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUpe3ZhciB6PVxud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHNcIik7XCJmdW5jdGlvblwiIT09dHlwZW9mIHomJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzXCIpfXZhciBBPSExLEI9bnVsbCxDPS0xLEQ9NSxFPTA7ZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpPj1cbkV9O2s9ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCIpOkQ9MDxhP01hdGguZmxvb3IoMUUzL2EpOjV9O3ZhciBGPW5ldyBNZXNzYWdlQ2hhbm5lbCxHPUYucG9ydDI7Ri5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtpZihudWxsIT09Qil7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtFPWErRDt0cnl7QighMCxhKT9HLnBvc3RNZXNzYWdlKG51bGwpOihBPSExLEI9bnVsbCl9Y2F0Y2goYil7dGhyb3cgRy5wb3N0TWVzc2FnZShudWxsKSxiO319ZWxzZSBBPSExfTtmPWZ1bmN0aW9uKGEpe0I9YTtBfHwoQT0hMCxHLnBvc3RNZXNzYWdlKG51bGwpKX07Zz1mdW5jdGlvbihhLGIpe0M9XG54KGZ1bmN0aW9uKCl7YShleHBvcnRzLnVuc3RhYmxlX25vdygpKX0sYil9O2g9ZnVuY3Rpb24oKXt5KEMpO0M9LTF9fWZ1bmN0aW9uIEgoYSxiKXt2YXIgYz1hLmxlbmd0aDthLnB1c2goYik7YTpmb3IoOzspe3ZhciBkPWMtMT4+PjEsZT1hW2RdO2lmKHZvaWQgMCE9PWUmJjA8SShlLGIpKWFbZF09YixhW2NdPWUsYz1kO2Vsc2UgYnJlYWsgYX19ZnVuY3Rpb24gSihhKXthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bnVsbDphfVxuZnVuY3Rpb24gSyhhKXt2YXIgYj1hWzBdO2lmKHZvaWQgMCE9PWIpe3ZhciBjPWEucG9wKCk7aWYoYyE9PWIpe2FbMF09YzthOmZvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlOyl7dmFyIG09MiooZCsxKS0xLG49YVttXSx2PW0rMSxyPWFbdl07aWYodm9pZCAwIT09biYmMD5JKG4sYykpdm9pZCAwIT09ciYmMD5JKHIsbik/KGFbZF09cixhW3ZdPWMsZD12KTooYVtkXT1uLGFbbV09YyxkPW0pO2Vsc2UgaWYodm9pZCAwIT09ciYmMD5JKHIsYykpYVtkXT1yLGFbdl09YyxkPXY7ZWxzZSBicmVhayBhfX1yZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBJKGEsYil7dmFyIGM9YS5zb3J0SW5kZXgtYi5zb3J0SW5kZXg7cmV0dXJuIDAhPT1jP2M6YS5pZC1iLmlkfXZhciBMPVtdLE09W10sTj0xLE89bnVsbCxQPTMsUT0hMSxSPSExLFM9ITE7XG5mdW5jdGlvbiBUKGEpe2Zvcih2YXIgYj1KKE0pO251bGwhPT1iOyl7aWYobnVsbD09PWIuY2FsbGJhY2spSyhNKTtlbHNlIGlmKGIuc3RhcnRUaW1lPD1hKUsoTSksYi5zb3J0SW5kZXg9Yi5leHBpcmF0aW9uVGltZSxIKEwsYik7ZWxzZSBicmVhaztiPUooTSl9fWZ1bmN0aW9uIFUoYSl7Uz0hMTtUKGEpO2lmKCFSKWlmKG51bGwhPT1KKEwpKVI9ITAsZihWKTtlbHNle3ZhciBiPUooTSk7bnVsbCE9PWImJmcoVSxiLnN0YXJ0VGltZS1hKX19XG5mdW5jdGlvbiBWKGEsYil7Uj0hMTtTJiYoUz0hMSxoKCkpO1E9ITA7dmFyIGM9UDt0cnl7VChiKTtmb3IoTz1KKEwpO251bGwhPT1PJiYoIShPLmV4cGlyYXRpb25UaW1lPmIpfHxhJiYhZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCgpKTspe3ZhciBkPU8uY2FsbGJhY2s7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe08uY2FsbGJhY2s9bnVsbDtQPU8ucHJpb3JpdHlMZXZlbDt2YXIgZT1kKE8uZXhwaXJhdGlvblRpbWU8PWIpO2I9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT9PLmNhbGxiYWNrPWU6Tz09PUooTCkmJksoTCk7VChiKX1lbHNlIEsoTCk7Tz1KKEwpfWlmKG51bGwhPT1PKXZhciBtPSEwO2Vsc2V7dmFyIG49SihNKTtudWxsIT09biYmZyhVLG4uc3RhcnRUaW1lLWIpO209ITF9cmV0dXJuIG19ZmluYWxseXtPPW51bGwsUD1jLFE9ITF9fXZhciBXPWs7ZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MTtleHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQ7ZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO2V4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nPW51bGw7ZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yO2V4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7YS5jYWxsYmFjaz1udWxsfTtleHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7Unx8UXx8KFI9ITAsZihWKSl9O2V4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gUH07ZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBKKEwpfTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dD1mdW5jdGlvbihhKXtzd2l0Y2goUCl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIGI9MzticmVhaztkZWZhdWx0OmI9UH12YXIgYz1QO1A9Yjt0cnl7cmV0dXJuIGEoKX1maW5hbGx5e1A9Y319O2V4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PVc7ZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OmE9M312YXIgYz1QO1A9YTt0cnl7cmV0dXJuIGIoKX1maW5hbGx5e1A9Y319O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWM/KGM9Yy5kZWxheSxjPVwibnVtYmVyXCI9PT10eXBlb2YgYyYmMDxjP2QrYzpkKTpjPWQ7c3dpdGNoKGEpe2Nhc2UgMTp2YXIgZT0tMTticmVhaztjYXNlIDI6ZT0yNTA7YnJlYWs7Y2FzZSA1OmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6ZT0xRTQ7YnJlYWs7ZGVmYXVsdDplPTVFM31lPWMrZTthPXtpZDpOKyssY2FsbGJhY2s6Yixwcmlvcml0eUxldmVsOmEsc3RhcnRUaW1lOmMsZXhwaXJhdGlvblRpbWU6ZSxzb3J0SW5kZXg6LTF9O2M+ZD8oYS5zb3J0SW5kZXg9YyxIKE0sYSksbnVsbD09PUooTCkmJmE9PT1KKE0pJiYoUz9oKCk6Uz0hMCxnKFUsYy1kKSkpOihhLnNvcnRJbmRleD1lLEgoTCxhKSxSfHxRfHwoUj0hMCxmKFYpKSk7cmV0dXJuIGF9O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9UDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1QO1A9Yjt0cnl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7UD1jfX19O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxtPXJlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpLHI9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiB5KGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifWlmKCFhYSl0aHJvdyBFcnJvcih5KDIyNykpO3ZhciBiYT1uZXcgU2V0LGNhPXt9O2Z1bmN0aW9uIGRhKGEsYil7ZWEoYSxiKTtlYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gZWEoYSxiKXtjYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYmEuYWRkKGJbYV0pfVxudmFyIGZhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxoYT0vXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJC8saWE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmphPXt9LGthPXt9O2Z1bmN0aW9uIGxhKGEpe2lmKGlhLmNhbGwoa2EsYSkpcmV0dXJuITA7aWYoaWEuY2FsbChqYSxhKSlyZXR1cm4hMTtpZihoYS50ZXN0KGEpKXJldHVybiBrYVthXT0hMDtqYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBtYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIG5hKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fG1hKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gQihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIEQ9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07RFtiXT1uZXcgQihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBvYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHBhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLFxucGEpO0RbYl09bmV3IEIoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuRC54bGlua0hyZWY9bmV3IEIoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gcWEoYSxiLGMsZCl7dmFyIGU9RC5oYXNPd25Qcm9wZXJ0eShiKT9EW2JdOm51bGw7dmFyIGY9bnVsbCE9PWU/MD09PWUudHlwZTpkPyExOiEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXT8hMTohMDtmfHwobmEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP2xhKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKSl9XG52YXIgcmE9YWEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsc2E9NjAxMDMsdGE9NjAxMDYsdWE9NjAxMDcsd2E9NjAxMDgseGE9NjAxMTQseWE9NjAxMDksemE9NjAxMTAsQWE9NjAxMTIsQmE9NjAxMTMsQ2E9NjAxMjAsRGE9NjAxMTUsRWE9NjAxMTYsRmE9NjAxMjEsR2E9NjAxMjgsSGE9NjAxMjksSWE9NjAxMzAsSmE9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgRT1TeW1ib2wuZm9yO3NhPUUoXCJyZWFjdC5lbGVtZW50XCIpO3RhPUUoXCJyZWFjdC5wb3J0YWxcIik7dWE9RShcInJlYWN0LmZyYWdtZW50XCIpO3dhPUUoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTt4YT1FKFwicmVhY3QucHJvZmlsZXJcIik7eWE9RShcInJlYWN0LnByb3ZpZGVyXCIpO3phPUUoXCJyZWFjdC5jb250ZXh0XCIpO0FhPUUoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTtCYT1FKFwicmVhY3Quc3VzcGVuc2VcIik7Q2E9RShcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7RGE9RShcInJlYWN0Lm1lbW9cIik7RWE9RShcInJlYWN0LmxhenlcIik7RmE9RShcInJlYWN0LmJsb2NrXCIpO0UoXCJyZWFjdC5zY29wZVwiKTtHYT1FKFwicmVhY3Qub3BhcXVlLmlkXCIpO0hhPUUoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO0lhPUUoXCJyZWFjdC5vZmZzY3JlZW5cIik7SmE9RShcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIil9XG52YXIgS2E9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIExhKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT1LYSYmYVtLYV18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH12YXIgTWE7ZnVuY3Rpb24gTmEoYSl7aWYodm9pZCAwPT09TWEpdHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGMpe3ZhciBiPWMuc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7TWE9YiYmYlsxXXx8XCJcIn1yZXR1cm5cIlxcblwiK01hK2F9dmFyIE9hPSExO1xuZnVuY3Rpb24gUGEoYSxiKXtpZighYXx8T2EpcmV0dXJuXCJcIjtPYT0hMDt2YXIgYz1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKGIpaWYoYj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsXCJwcm9wc1wiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO319KSxcIm9iamVjdFwiPT09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QoYixbXSl9Y2F0Y2goayl7dmFyIGQ9a31SZWZsZWN0LmNvbnN0cnVjdChhLFtdLGIpfWVsc2V7dHJ5e2IuY2FsbCgpfWNhdGNoKGspe2Q9a31hLmNhbGwoYi5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGspe2Q9a31hKCl9fWNhdGNoKGspe2lmKGsmJmQmJlwic3RyaW5nXCI9PT10eXBlb2Ygay5zdGFjayl7Zm9yKHZhciBlPWsuc3RhY2suc3BsaXQoXCJcXG5cIiksXG5mPWQuc3RhY2suc3BsaXQoXCJcXG5cIiksZz1lLmxlbmd0aC0xLGg9Zi5sZW5ndGgtMTsxPD1nJiYwPD1oJiZlW2ddIT09ZltoXTspaC0tO2Zvcig7MTw9ZyYmMDw9aDtnLS0saC0tKWlmKGVbZ10hPT1mW2hdKXtpZigxIT09Z3x8MSE9PWgpe2RvIGlmKGctLSxoLS0sMD5ofHxlW2ddIT09ZltoXSlyZXR1cm5cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO3doaWxlKDE8PWcmJjA8PWgpfWJyZWFrfX19ZmluYWxseXtPYT0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1jfXJldHVybihhPWE/YS5kaXNwbGF5TmFtZXx8YS5uYW1lOlwiXCIpP05hKGEpOlwiXCJ9XG5mdW5jdGlvbiBRYShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTpyZXR1cm4gTmEoYS50eXBlKTtjYXNlIDE2OnJldHVybiBOYShcIkxhenlcIik7Y2FzZSAxMzpyZXR1cm4gTmEoXCJTdXNwZW5zZVwiKTtjYXNlIDE5OnJldHVybiBOYShcIlN1c3BlbnNlTGlzdFwiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGE9UGEoYS50eXBlLCExKSxhO2Nhc2UgMTE6cmV0dXJuIGE9UGEoYS50eXBlLnJlbmRlciwhMSksYTtjYXNlIDIyOnJldHVybiBhPVBhKGEudHlwZS5fcmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1QYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFJhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgdWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2UgdGE6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIHhhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHdhOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgQmE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgQ2E6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgemE6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgeWE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgQWE6dmFyIGI9YS5yZW5kZXI7Yj1iLmRpc3BsYXlOYW1lfHxiLm5hbWV8fFwiXCI7XG5yZXR1cm4gYS5kaXNwbGF5TmFtZXx8KFwiXCIhPT1iP1wiRm9yd2FyZFJlZihcIitiK1wiKVwiOlwiRm9yd2FyZFJlZlwiKTtjYXNlIERhOnJldHVybiBSYShhLnR5cGUpO2Nhc2UgRmE6cmV0dXJuIFJhKGEuX3JlbmRlcik7Y2FzZSBFYTpiPWEuX3BheWxvYWQ7YT1hLl9pbml0O3RyeXtyZXR1cm4gUmEoYShiKSl9Y2F0Y2goYyl7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwic3RyaW5nXCI6Y2FzZSBcInVuZGVmaW5lZFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19ZnVuY3Rpb24gVGEoYSl7dmFyIGI9YS50eXBlO3JldHVybihhPWEubm9kZU5hbWUpJiZcImlucHV0XCI9PT1hLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1ifHxcInJhZGlvXCI9PT1iKX1cbmZ1bmN0aW9uIFVhKGEpe3ZhciBiPVRhKGEpP1wiY2hlY2tlZFwiOlwidmFsdWVcIixjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsYiksZD1cIlwiK2FbYl07aWYoIWEuaGFzT3duUHJvcGVydHkoYikmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZ2V0JiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5zZXQpe3ZhciBlPWMuZ2V0LGY9Yy5zZXQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihhKXtkPVwiXCIrYTtmLmNhbGwodGhpcyxhKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZX0pO3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBkfSxzZXRWYWx1ZTpmdW5jdGlvbihhKXtkPVwiXCIrYX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7YS5fdmFsdWVUcmFja2VyPVxubnVsbDtkZWxldGUgYVtiXX19fX1mdW5jdGlvbiBWYShhKXthLl92YWx1ZVRyYWNrZXJ8fChhLl92YWx1ZVRyYWNrZXI9VWEoYSkpfWZ1bmN0aW9uIFdhKGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEuX3ZhbHVlVHJhY2tlcjtpZighYilyZXR1cm4hMDt2YXIgYz1iLmdldFZhbHVlKCk7dmFyIGQ9XCJcIjthJiYoZD1UYShhKT9hLmNoZWNrZWQ/XCJ0cnVlXCI6XCJmYWxzZVwiOmEudmFsdWUpO2E9ZDtyZXR1cm4gYSE9PWM/KGIuc2V0VmFsdWUoYSksITApOiExfWZ1bmN0aW9uIFhhKGEpe2E9YXx8KFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR8fGEuYm9keX1jYXRjaChiKXtyZXR1cm4gYS5ib2R5fX1cbmZ1bmN0aW9uIFlhKGEsYil7dmFyIGM9Yi5jaGVja2VkO3JldHVybiBtKHt9LGIse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm51bGwhPWM/YzphLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBaYShhLGIpe3ZhciBjPW51bGw9PWIuZGVmYXVsdFZhbHVlP1wiXCI6Yi5kZWZhdWx0VmFsdWUsZD1udWxsIT1iLmNoZWNrZWQ/Yi5jaGVja2VkOmIuZGVmYXVsdENoZWNrZWQ7Yz1TYShudWxsIT1iLnZhbHVlP2IudmFsdWU6Yyk7YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpkLGluaXRpYWxWYWx1ZTpjLGNvbnRyb2xsZWQ6XCJjaGVja2JveFwiPT09Yi50eXBlfHxcInJhZGlvXCI9PT1iLnR5cGU/bnVsbCE9Yi5jaGVja2VkOm51bGwhPWIudmFsdWV9fWZ1bmN0aW9uICRhKGEsYil7Yj1iLmNoZWNrZWQ7bnVsbCE9YiYmcWEoYSxcImNoZWNrZWRcIixiLCExKX1cbmZ1bmN0aW9uIGFiKGEsYil7JGEoYSxiKTt2YXIgYz1TYShiLnZhbHVlKSxkPWIudHlwZTtpZihudWxsIT1jKWlmKFwibnVtYmVyXCI9PT1kKXtpZigwPT09YyYmXCJcIj09PWEudmFsdWV8fGEudmFsdWUhPWMpYS52YWx1ZT1cIlwiK2N9ZWxzZSBhLnZhbHVlIT09XCJcIitjJiYoYS52YWx1ZT1cIlwiK2MpO2Vsc2UgaWYoXCJzdWJtaXRcIj09PWR8fFwicmVzZXRcIj09PWQpe2EucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7cmV0dXJufWIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKT9iYihhLGIudHlwZSxjKTpiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpJiZiYihhLGIudHlwZSxTYShiLmRlZmF1bHRWYWx1ZSkpO251bGw9PWIuY2hlY2tlZCYmbnVsbCE9Yi5kZWZhdWx0Q2hlY2tlZCYmKGEuZGVmYXVsdENoZWNrZWQ9ISFiLmRlZmF1bHRDaGVja2VkKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihiLmhhc093blByb3BlcnR5KFwidmFsdWVcIil8fGIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpe3ZhciBkPWIudHlwZTtpZighKFwic3VibWl0XCIhPT1kJiZcInJlc2V0XCIhPT1kfHx2b2lkIDAhPT1iLnZhbHVlJiZudWxsIT09Yi52YWx1ZSkpcmV0dXJuO2I9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlO2N8fGI9PT1hLnZhbHVlfHwoYS52YWx1ZT1iKTthLmRlZmF1bHRWYWx1ZT1ifWM9YS5uYW1lO1wiXCIhPT1jJiYoYS5uYW1lPVwiXCIpO2EuZGVmYXVsdENoZWNrZWQ9ISFhLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XCJcIiE9PWMmJihhLm5hbWU9Yyl9XG5mdW5jdGlvbiBiYihhLGIsYyl7aWYoXCJudW1iZXJcIiE9PWJ8fFhhKGEub3duZXJEb2N1bWVudCkhPT1hKW51bGw9PWM/YS5kZWZhdWx0VmFsdWU9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmEuZGVmYXVsdFZhbHVlIT09XCJcIitjJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitjKX1mdW5jdGlvbiBkYihhKXt2YXIgYj1cIlwiO2FhLkNoaWxkcmVuLmZvckVhY2goYSxmdW5jdGlvbihhKXtudWxsIT1hJiYoYis9YSl9KTtyZXR1cm4gYn1mdW5jdGlvbiBlYihhLGIpe2E9bSh7Y2hpbGRyZW46dm9pZCAwfSxiKTtpZihiPWRiKGIuY2hpbGRyZW4pKWEuY2hpbGRyZW49YjtyZXR1cm4gYX1cbmZ1bmN0aW9uIGZiKGEsYixjLGQpe2E9YS5vcHRpb25zO2lmKGIpe2I9e307Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYltcIiRcIitjW2VdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWU9Yi5oYXNPd25Qcm9wZXJ0eShcIiRcIithW2NdLnZhbHVlKSxhW2NdLnNlbGVjdGVkIT09ZSYmKGFbY10uc2VsZWN0ZWQ9ZSksZSYmZCYmKGFbY10uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2M9XCJcIitTYShjKTtiPW51bGw7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKyl7aWYoYVtlXS52YWx1ZT09PWMpe2FbZV0uc2VsZWN0ZWQ9ITA7ZCYmKGFbZV0uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59bnVsbCE9PWJ8fGFbZV0uZGlzYWJsZWR8fChiPWFbZV0pfW51bGwhPT1iJiYoYi5zZWxlY3RlZD0hMCl9fVxuZnVuY3Rpb24gZ2IoYSxiKXtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXRocm93IEVycm9yKHkoOTEpKTtyZXR1cm4gbSh7fSxiLHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjpcIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBoYihhLGIpe3ZhciBjPWIudmFsdWU7aWYobnVsbD09Yyl7Yz1iLmNoaWxkcmVuO2I9Yi5kZWZhdWx0VmFsdWU7aWYobnVsbCE9Yyl7aWYobnVsbCE9Yil0aHJvdyBFcnJvcih5KDkyKSk7aWYoQXJyYXkuaXNBcnJheShjKSl7aWYoISgxPj1jLmxlbmd0aCkpdGhyb3cgRXJyb3IoeSg5MykpO2M9Y1swXX1iPWN9bnVsbD09YiYmKGI9XCJcIik7Yz1ifWEuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOlNhKGMpfX1cbmZ1bmN0aW9uIGliKGEsYil7dmFyIGM9U2EoYi52YWx1ZSksZD1TYShiLmRlZmF1bHRWYWx1ZSk7bnVsbCE9YyYmKGM9XCJcIitjLGMhPT1hLnZhbHVlJiYoYS52YWx1ZT1jKSxudWxsPT1iLmRlZmF1bHRWYWx1ZSYmYS5kZWZhdWx0VmFsdWUhPT1jJiYoYS5kZWZhdWx0VmFsdWU9YykpO251bGwhPWQmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2QpfWZ1bmN0aW9uIGpiKGEpe3ZhciBiPWEudGV4dENvbnRlbnQ7Yj09PWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJlwiXCIhPT1iJiZudWxsIT09YiYmKGEudmFsdWU9Yil9dmFyIGtiPXtodG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiLG1hdGhtbDpcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIixzdmc6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wifTtcbmZ1bmN0aW9uIGxiKGEpe3N3aXRjaChhKXtjYXNlIFwic3ZnXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2Nhc2UgXCJtYXRoXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7ZGVmYXVsdDpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIn19ZnVuY3Rpb24gbWIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2xiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG5iLG9iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihhLm5hbWVzcGFjZVVSSSE9PWtiLnN2Z3x8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle25iPW5ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO25iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW5iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIHBiKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcWI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLFxuZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scmI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHFiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cWJbYl09cWJbYV19KX0pO2Z1bmN0aW9uIHNiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxxYi5oYXNPd25Qcm9wZXJ0eShhKSYmcWJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gdGIoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9c2IoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdWI9bSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHZiKGEsYil7aWYoYil7aWYodWJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcih5KDYwKSk7aWYoIShcIm9iamVjdFwiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJlwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcih5KDYyKSk7fX1cbmZ1bmN0aW9uIHdiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX1mdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHkoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKGEsYixjLGQsZSl7cmV0dXJuIGEoYixjLGQsZSl9ZnVuY3Rpb24gSWIoKXt9dmFyIEpiPUdiLEtiPSExLExiPSExO2Z1bmN0aW9uIE1iKCl7aWYobnVsbCE9PXpifHxudWxsIT09QWIpSWIoKSxGYigpfVxuZnVuY3Rpb24gTmIoYSxiLGMpe2lmKExiKXJldHVybiBhKGIsYyk7TGI9ITA7dHJ5e3JldHVybiBKYihhLGIsYyl9ZmluYWxseXtMYj0hMSxNYigpfX1cbmZ1bmN0aW9uIE9iKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9RGIoYyk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgXCJvbkNsaWNrXCI6Y2FzZSBcIm9uQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpjYXNlIFwib25Eb3VibGVDbGlja0NhcHR1cmVcIjpjYXNlIFwib25Nb3VzZURvd25cIjpjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlVXBcIjpjYXNlIFwib25Nb3VzZVVwQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRW50ZXJcIjooZD0hZC5kaXNhYmxlZCl8fChhPWEudHlwZSxkPSEoXCJidXR0b25cIj09PWF8fFwiaW5wdXRcIj09PWF8fFwic2VsZWN0XCI9PT1hfHxcInRleHRhcmVhXCI9PT1hKSk7YT0hZDticmVhayBhO2RlZmF1bHQ6YT0hMX1pZihhKXJldHVybiBudWxsO2lmKGMmJlwiZnVuY3Rpb25cIiE9PVxudHlwZW9mIGMpdGhyb3cgRXJyb3IoeSgyMzEsYix0eXBlb2YgYykpO3JldHVybiBjfXZhciBQYj0hMTtpZihmYSl0cnl7dmFyIFFiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShRYixcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7UGI9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsUWIsUWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLFFiLFFiKX1jYXRjaChhKXtQYj0hMX1mdW5jdGlvbiBSYihhLGIsYyxkLGUsZixnLGgsayl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtiLmFwcGx5KGMsbCl9Y2F0Y2gobil7dGhpcy5vbkVycm9yKG4pfX12YXIgU2I9ITEsVGI9bnVsbCxVYj0hMSxWYj1udWxsLFdiPXtvbkVycm9yOmZ1bmN0aW9uKGEpe1NiPSEwO1RiPWF9fTtmdW5jdGlvbiBYYihhLGIsYyxkLGUsZixnLGgsayl7U2I9ITE7VGI9bnVsbDtSYi5hcHBseShXYixhcmd1bWVudHMpfVxuZnVuY3Rpb24gWWIoYSxiLGMsZCxlLGYsZyxoLGspe1hiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihTYil7aWYoU2Ipe3ZhciBsPVRiO1NiPSExO1RiPW51bGx9ZWxzZSB0aHJvdyBFcnJvcih5KDE5OCkpO1VifHwoVWI9ITAsVmI9bCl9fWZ1bmN0aW9uIFpiKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5mbGFncyYxMDI2KSYmKGM9Yi5yZXR1cm4pLGE9Yi5yZXR1cm47d2hpbGUoYSl9cmV0dXJuIDM9PT1iLnRhZz9jOm51bGx9ZnVuY3Rpb24gJGIoYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9YS5tZW1vaXplZFN0YXRlO251bGw9PT1iJiYoYT1hLmFsdGVybmF0ZSxudWxsIT09YSYmKGI9YS5tZW1vaXplZFN0YXRlKSk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhYyhhKXtpZihaYihhKSE9PWEpdGhyb3cgRXJyb3IoeSgxODgpKTt9XG5mdW5jdGlvbiBiYyhhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYil7Yj1aYihhKTtpZihudWxsPT09Yil0aHJvdyBFcnJvcih5KDE4OCkpO3JldHVybiBiIT09YT9udWxsOmF9Zm9yKHZhciBjPWEsZD1iOzspe3ZhciBlPWMucmV0dXJuO2lmKG51bGw9PT1lKWJyZWFrO3ZhciBmPWUuYWx0ZXJuYXRlO2lmKG51bGw9PT1mKXtkPWUucmV0dXJuO2lmKG51bGwhPT1kKXtjPWQ7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PWYuY2hpbGQpe2ZvcihmPWUuY2hpbGQ7Zjspe2lmKGY9PT1jKXJldHVybiBhYyhlKSxhO2lmKGY9PT1kKXJldHVybiBhYyhlKSxiO2Y9Zi5zaWJsaW5nfXRocm93IEVycm9yKHkoMTg4KSk7fWlmKGMucmV0dXJuIT09ZC5yZXR1cm4pYz1lLGQ9ZjtlbHNle2Zvcih2YXIgZz0hMSxoPWUuY2hpbGQ7aDspe2lmKGg9PT1jKXtnPSEwO2M9ZTtkPWY7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1lO2M9ZjticmVha31oPWguc2libGluZ31pZighZyl7Zm9yKGg9Zi5jaGlsZDtoOyl7aWYoaD09PVxuYyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpdGhyb3cgRXJyb3IoeSgxODkpKTt9fWlmKGMuYWx0ZXJuYXRlIT09ZCl0aHJvdyBFcnJvcih5KDE5MCkpO31pZigzIT09Yy50YWcpdGhyb3cgRXJyb3IoeSgxODgpKTtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIGNjKGEpe2E9YmMoYSk7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKHZhciBiPWE7Oyl7aWYoNT09PWIudGFnfHw2PT09Yi50YWcpcmV0dXJuIGI7aWYoYi5jaGlsZCliLmNoaWxkLnJldHVybj1iLGI9Yi5jaGlsZDtlbHNle2lmKGI9PT1hKWJyZWFrO2Zvcig7IWIuc2libGluZzspe2lmKCFiLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBkYyhhLGIpe2Zvcih2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09Yjspe2lmKGI9PT1hfHxiPT09YylyZXR1cm4hMDtiPWIucmV0dXJufXJldHVybiExfXZhciBlYyxmYyxnYyxoYyxpYz0hMSxqYz1bXSxrYz1udWxsLGxjPW51bGwsbWM9bnVsbCxuYz1uZXcgTWFwLG9jPW5ldyBNYXAscGM9W10scWM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gcmMoYSxiLGMsZCxlKXtyZXR1cm57YmxvY2tlZE9uOmEsZG9tRXZlbnROYW1lOmIsZXZlbnRTeXN0ZW1GbGFnczpjfDE2LG5hdGl2ZUV2ZW50OmUsdGFyZ2V0Q29udGFpbmVyczpbZF19fWZ1bmN0aW9uIHNjKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6Y2FzZSBcImZvY3Vzb3V0XCI6a2M9bnVsbDticmVhaztjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmxjPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJtb3VzZW91dFwiOm1jPW51bGw7YnJlYWs7Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpuYy5kZWxldGUoYi5wb2ludGVySWQpO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpvYy5kZWxldGUoYi5wb2ludGVySWQpfX1cbmZ1bmN0aW9uIHRjKGEsYixjLGQsZSxmKXtpZihudWxsPT09YXx8YS5uYXRpdmVFdmVudCE9PWYpcmV0dXJuIGE9cmMoYixjLGQsZSxmKSxudWxsIT09YiYmKGI9Q2IoYiksbnVsbCE9PWImJmZjKGIpKSxhO2EuZXZlbnRTeXN0ZW1GbGFnc3w9ZDtiPWEudGFyZ2V0Q29udGFpbmVycztudWxsIT09ZSYmLTE9PT1iLmluZGV4T2YoZSkmJmIucHVzaChlKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHVjKGEsYixjLGQsZSl7c3dpdGNoKGIpe2Nhc2UgXCJmb2N1c2luXCI6cmV0dXJuIGtjPXRjKGtjLGEsYixjLGQsZSksITA7Y2FzZSBcImRyYWdlbnRlclwiOnJldHVybiBsYz10YyhsYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJtb3VzZW92ZXJcIjpyZXR1cm4gbWM9dGMobWMsYSxiLGMsZCxlKSwhMDtjYXNlIFwicG9pbnRlcm92ZXJcIjp2YXIgZj1lLnBvaW50ZXJJZDtuYy5zZXQoZix0YyhuYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSk7cmV0dXJuITA7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6cmV0dXJuIGY9ZS5wb2ludGVySWQsb2Muc2V0KGYsdGMob2MuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpLCEwfXJldHVybiExfVxuZnVuY3Rpb24gdmMoYSl7dmFyIGI9d2MoYS50YXJnZXQpO2lmKG51bGwhPT1iKXt2YXIgYz1aYihiKTtpZihudWxsIT09YylpZihiPWMudGFnLDEzPT09Yil7aWYoYj0kYihjKSxudWxsIT09Yil7YS5ibG9ja2VkT249YjtoYyhhLmxhbmVQcmlvcml0eSxmdW5jdGlvbigpe3IudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KGEucHJpb3JpdHksZnVuY3Rpb24oKXtnYyhjKX0pfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5oeWRyYXRlKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1cbmZ1bmN0aW9uIHhjKGEpe2lmKG51bGwhPT1hLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz15YyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09YylyZXR1cm4gYj1DYihjKSxudWxsIT09YiYmZmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gemMoYSxiLGMpe3hjKGEpJiZjLmRlbGV0ZShiKX1cbmZ1bmN0aW9uIEFjKCl7Zm9yKGljPSExOzA8amMubGVuZ3RoOyl7dmFyIGE9amNbMF07aWYobnVsbCE9PWEuYmxvY2tlZE9uKXthPUNiKGEuYmxvY2tlZE9uKTtudWxsIT09YSYmZWMoYSk7YnJlYWt9Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9eWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbCE9PWMpe2EuYmxvY2tlZE9uPWM7YnJlYWt9Yi5zaGlmdCgpfW51bGw9PT1hLmJsb2NrZWRPbiYmamMuc2hpZnQoKX1udWxsIT09a2MmJnhjKGtjKSYmKGtjPW51bGwpO251bGwhPT1sYyYmeGMobGMpJiYobGM9bnVsbCk7bnVsbCE9PW1jJiZ4YyhtYykmJihtYz1udWxsKTtuYy5mb3JFYWNoKHpjKTtvYy5mb3JFYWNoKHpjKX1cbmZ1bmN0aW9uIEJjKGEsYil7YS5ibG9ja2VkT249PT1iJiYoYS5ibG9ja2VkT249bnVsbCxpY3x8KGljPSEwLHIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEFjKSkpfVxuZnVuY3Rpb24gQ2MoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gQmMoYixhKX1pZigwPGpjLmxlbmd0aCl7QmMoamNbMF0sYSk7Zm9yKHZhciBjPTE7YzxqYy5sZW5ndGg7YysrKXt2YXIgZD1qY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PWtjJiZCYyhrYyxhKTtudWxsIT09bGMmJkJjKGxjLGEpO251bGwhPT1tYyYmQmMobWMsYSk7bmMuZm9yRWFjaChiKTtvYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxwYy5sZW5ndGg7YysrKWQ9cGNbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPHBjLmxlbmd0aCYmKGM9cGNbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspdmMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZwYy5zaGlmdCgpfVxuZnVuY3Rpb24gRGMoYSxiKXt2YXIgYz17fTtjW2EudG9Mb3dlckNhc2UoKV09Yi50b0xvd2VyQ2FzZSgpO2NbXCJXZWJraXRcIithXT1cIndlYmtpdFwiK2I7Y1tcIk1velwiK2FdPVwibW96XCIrYjtyZXR1cm4gY312YXIgRWM9e2FuaW1hdGlvbmVuZDpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uRW5kXCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uSXRlcmF0aW9uXCIpLGFuaW1hdGlvbnN0YXJ0OkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25TdGFydFwiKSx0cmFuc2l0aW9uZW5kOkRjKFwiVHJhbnNpdGlvblwiLFwiVHJhbnNpdGlvbkVuZFwiKX0sRmM9e30sR2M9e307XG5mYSYmKEdjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJBbmltYXRpb25FdmVudFwiaW4gd2luZG93fHwoZGVsZXRlIEVjLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksXCJUcmFuc2l0aW9uRXZlbnRcImluIHdpbmRvd3x8ZGVsZXRlIEVjLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gSGMoYSl7aWYoRmNbYV0pcmV0dXJuIEZjW2FdO2lmKCFFY1thXSlyZXR1cm4gYTt2YXIgYj1FY1thXSxjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSYmYyBpbiBHYylyZXR1cm4gRmNbYV09YltjXTtyZXR1cm4gYX1cbnZhciBJYz1IYyhcImFuaW1hdGlvbmVuZFwiKSxKYz1IYyhcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxLYz1IYyhcImFuaW1hdGlvbnN0YXJ0XCIpLExjPUhjKFwidHJhbnNpdGlvbmVuZFwiKSxNYz1uZXcgTWFwLE5jPW5ldyBNYXAsT2M9W1wiYWJvcnRcIixcImFib3J0XCIsSWMsXCJhbmltYXRpb25FbmRcIixKYyxcImFuaW1hdGlvbkl0ZXJhdGlvblwiLEtjLFwiYW5pbWF0aW9uU3RhcnRcIixcImNhbnBsYXlcIixcImNhblBsYXlcIixcImNhbnBsYXl0aHJvdWdoXCIsXCJjYW5QbGF5VGhyb3VnaFwiLFwiZHVyYXRpb25jaGFuZ2VcIixcImR1cmF0aW9uQ2hhbmdlXCIsXCJlbXB0aWVkXCIsXCJlbXB0aWVkXCIsXCJlbmNyeXB0ZWRcIixcImVuY3J5cHRlZFwiLFwiZW5kZWRcIixcImVuZGVkXCIsXCJlcnJvclwiLFwiZXJyb3JcIixcImdvdHBvaW50ZXJjYXB0dXJlXCIsXCJnb3RQb2ludGVyQ2FwdHVyZVwiLFwibG9hZFwiLFwibG9hZFwiLFwibG9hZGVkZGF0YVwiLFwibG9hZGVkRGF0YVwiLFwibG9hZGVkbWV0YWRhdGFcIixcImxvYWRlZE1ldGFkYXRhXCIsXCJsb2Fkc3RhcnRcIixcImxvYWRTdGFydFwiLFxuXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcImxvc3RQb2ludGVyQ2FwdHVyZVwiLFwicGxheWluZ1wiLFwicGxheWluZ1wiLFwicHJvZ3Jlc3NcIixcInByb2dyZXNzXCIsXCJzZWVraW5nXCIsXCJzZWVraW5nXCIsXCJzdGFsbGVkXCIsXCJzdGFsbGVkXCIsXCJzdXNwZW5kXCIsXCJzdXNwZW5kXCIsXCJ0aW1ldXBkYXRlXCIsXCJ0aW1lVXBkYXRlXCIsTGMsXCJ0cmFuc2l0aW9uRW5kXCIsXCJ3YWl0aW5nXCIsXCJ3YWl0aW5nXCJdO2Z1bmN0aW9uIFBjKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKz0yKXt2YXIgZD1hW2NdLGU9YVtjKzFdO2U9XCJvblwiKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSk7TmMuc2V0KGQsYik7TWMuc2V0KGQsZSk7ZGEoZSxbZF0pfX12YXIgUWM9ci51bnN0YWJsZV9ub3c7UWMoKTt2YXIgRj04O1xuZnVuY3Rpb24gUmMoYSl7aWYoMCE9PSgxJmEpKXJldHVybiBGPTE1LDE7aWYoMCE9PSgyJmEpKXJldHVybiBGPTE0LDI7aWYoMCE9PSg0JmEpKXJldHVybiBGPTEzLDQ7dmFyIGI9MjQmYTtpZigwIT09YilyZXR1cm4gRj0xMixiO2lmKDAhPT0oYSYzMikpcmV0dXJuIEY9MTEsMzI7Yj0xOTImYTtpZigwIT09YilyZXR1cm4gRj0xMCxiO2lmKDAhPT0oYSYyNTYpKXJldHVybiBGPTksMjU2O2I9MzU4NCZhO2lmKDAhPT1iKXJldHVybiBGPTgsYjtpZigwIT09KGEmNDA5NikpcmV0dXJuIEY9Nyw0MDk2O2I9NDE4NjExMiZhO2lmKDAhPT1iKXJldHVybiBGPTYsYjtiPTYyOTE0NTYwJmE7aWYoMCE9PWIpcmV0dXJuIEY9NSxiO2lmKGEmNjcxMDg4NjQpcmV0dXJuIEY9NCw2NzEwODg2NDtpZigwIT09KGEmMTM0MjE3NzI4KSlyZXR1cm4gRj0zLDEzNDIxNzcyODtiPTgwNTMwNjM2OCZhO2lmKDAhPT1iKXJldHVybiBGPTIsYjtpZigwIT09KDEwNzM3NDE4MjQmYSkpcmV0dXJuIEY9MSwxMDczNzQxODI0O1xuRj04O3JldHVybiBhfWZ1bmN0aW9uIFNjKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiAxNTtjYXNlIDk4OnJldHVybiAxMDtjYXNlIDk3OmNhc2UgOTY6cmV0dXJuIDg7Y2FzZSA5NTpyZXR1cm4gMjtkZWZhdWx0OnJldHVybiAwfX1mdW5jdGlvbiBUYyhhKXtzd2l0Y2goYSl7Y2FzZSAxNTpjYXNlIDE0OnJldHVybiA5OTtjYXNlIDEzOmNhc2UgMTI6Y2FzZSAxMTpjYXNlIDEwOnJldHVybiA5ODtjYXNlIDk6Y2FzZSA4OmNhc2UgNzpjYXNlIDY6Y2FzZSA0OmNhc2UgNTpyZXR1cm4gOTc7Y2FzZSAzOmNhc2UgMjpjYXNlIDE6cmV0dXJuIDk1O2Nhc2UgMDpyZXR1cm4gOTA7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDM1OCxhKSk7fX1cbmZ1bmN0aW9uIFVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIEY9MDt2YXIgZD0wLGU9MCxmPWEuZXhwaXJlZExhbmVzLGc9YS5zdXNwZW5kZWRMYW5lcyxoPWEucGluZ2VkTGFuZXM7aWYoMCE9PWYpZD1mLGU9Rj0xNTtlbHNlIGlmKGY9YyYxMzQyMTc3MjcsMCE9PWYpe3ZhciBrPWYmfmc7MCE9PWs/KGQ9UmMoayksZT1GKTooaCY9ZiwwIT09aCYmKGQ9UmMoaCksZT1GKSl9ZWxzZSBmPWMmfmcsMCE9PWY/KGQ9UmMoZiksZT1GKTowIT09aCYmKGQ9UmMoaCksZT1GKTtpZigwPT09ZClyZXR1cm4gMDtkPTMxLVZjKGQpO2Q9YyYoKDA+ZD8wOjE8PGQpPDwxKS0xO2lmKDAhPT1iJiZiIT09ZCYmMD09PShiJmcpKXtSYyhiKTtpZihlPD1GKXJldHVybiBiO0Y9ZX1iPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLVZjKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gV2MoYSl7YT1hLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNTtyZXR1cm4gMCE9PWE/YTphJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIFhjKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTU6cmV0dXJuIDE7Y2FzZSAxNDpyZXR1cm4gMjtjYXNlIDEyOnJldHVybiBhPVljKDI0Jn5iKSwwPT09YT9YYygxMCxiKTphO2Nhc2UgMTA6cmV0dXJuIGE9WWMoMTkyJn5iKSwwPT09YT9YYyg4LGIpOmE7Y2FzZSA4OnJldHVybiBhPVljKDM1ODQmfmIpLDA9PT1hJiYoYT1ZYyg0MTg2MTEyJn5iKSwwPT09YSYmKGE9NTEyKSksYTtjYXNlIDI6cmV0dXJuIGI9WWMoODA1MzA2MzY4Jn5iKSwwPT09YiYmKGI9MjY4NDM1NDU2KSxifXRocm93IEVycm9yKHkoMzU4LGEpKTt9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGEmLWF9ZnVuY3Rpb24gWmMoYSl7Zm9yKHZhciBiPVtdLGM9MDszMT5jO2MrKyliLnB1c2goYSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiAkYyhhLGIsYyl7YS5wZW5kaW5nTGFuZXN8PWI7dmFyIGQ9Yi0xO2Euc3VzcGVuZGVkTGFuZXMmPWQ7YS5waW5nZWRMYW5lcyY9ZDthPWEuZXZlbnRUaW1lcztiPTMxLVZjKGIpO2FbYl09Y312YXIgVmM9TWF0aC5jbHozMj9NYXRoLmNsejMyOmFkLGJkPU1hdGgubG9nLGNkPU1hdGguTE4yO2Z1bmN0aW9uIGFkKGEpe3JldHVybiAwPT09YT8zMjozMS0oYmQoYSkvY2R8MCl8MH12YXIgZGQ9ci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxlZD1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxmZD0hMDtmdW5jdGlvbiBnZChhLGIsYyxkKXtLYnx8SWIoKTt2YXIgZT1oZCxmPUtiO0tiPSEwO3RyeXtIYihlLGEsYixjLGQpfWZpbmFsbHl7KEtiPWYpfHxNYigpfX1mdW5jdGlvbiBpZChhLGIsYyxkKXtlZChkZCxoZC5iaW5kKG51bGwsYSxiLGMsZCkpfVxuZnVuY3Rpb24gaGQoYSxiLGMsZCl7aWYoZmQpe3ZhciBlO2lmKChlPTA9PT0oYiY0KSkmJjA8amMubGVuZ3RoJiYtMTxxYy5pbmRleE9mKGEpKWE9cmMobnVsbCxhLGIsYyxkKSxqYy5wdXNoKGEpO2Vsc2V7dmFyIGY9eWMoYSxiLGMsZCk7aWYobnVsbD09PWYpZSYmc2MoYSxkKTtlbHNle2lmKGUpe2lmKC0xPHFjLmluZGV4T2YoYSkpe2E9cmMoZixhLGIsYyxkKTtqYy5wdXNoKGEpO3JldHVybn1pZih1YyhmLGEsYixjLGQpKXJldHVybjtzYyhhLGQpfWpkKGEsYixkLG51bGwsYyl9fX19XG5mdW5jdGlvbiB5YyhhLGIsYyxkKXt2YXIgZT14YihkKTtlPXdjKGUpO2lmKG51bGwhPT1lKXt2YXIgZj1aYihlKTtpZihudWxsPT09ZillPW51bGw7ZWxzZXt2YXIgZz1mLnRhZztpZigxMz09PWcpe2U9JGIoZik7aWYobnVsbCE9PWUpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYoMz09PWcpe2lmKGYuc3RhdGVOb2RlLmh5ZHJhdGUpcmV0dXJuIDM9PT1mLnRhZz9mLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgZiE9PWUmJihlPW51bGwpfX1qZChhLGIsZCxlLGMpO3JldHVybiBudWxsfXZhciBrZD1udWxsLGxkPW51bGwsbWQ9bnVsbDtcbmZ1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1mdW5jdGlvbiBvZChhKXt2YXIgYj1hLmtleUNvZGU7XCJjaGFyQ29kZVwiaW4gYT8oYT1hLmNoYXJDb2RlLDA9PT1hJiYxMz09PWImJihhPTEzKSk6YT1iOzEwPT09YSYmKGE9MTMpO3JldHVybiAzMjw9YXx8MTM9PT1hP2E6MH1mdW5jdGlvbiBwZCgpe3JldHVybiEwfWZ1bmN0aW9uIHFkKCl7cmV0dXJuITF9XG5mdW5jdGlvbiByZChhKXtmdW5jdGlvbiBiKGIsZCxlLGYsZyl7dGhpcy5fcmVhY3ROYW1lPWI7dGhpcy5fdGFyZ2V0SW5zdD1lO3RoaXMudHlwZT1kO3RoaXMubmF0aXZlRXZlbnQ9Zjt0aGlzLnRhcmdldD1nO3RoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihiPWFbY10sdGhpc1tjXT1iP2IoZik6ZltjXSk7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG51bGwhPWYuZGVmYXVsdFByZXZlbnRlZD9mLmRlZmF1bHRQcmV2ZW50ZWQ6ITE9PT1mLnJldHVyblZhbHVlKT9wZDpxZDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFkO3JldHVybiB0aGlzfW0oYi5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOlwidW5rbm93blwiIT09dHlwZW9mIGEucmV0dXJuVmFsdWUmJlxuKGEucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXBkKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5zdG9wUHJvcGFnYXRpb24/YS5zdG9wUHJvcGFnYXRpb24oKTpcInVua25vd25cIiE9PXR5cGVvZiBhLmNhbmNlbEJ1YmJsZSYmKGEuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXBkKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OnBkfSk7cmV0dXJuIGJ9XG52YXIgc2Q9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sdGQ9cmQoc2QpLHVkPW0oe30sc2Qse3ZpZXc6MCxkZXRhaWw6MH0pLHZkPXJkKHVkKSx3ZCx4ZCx5ZCxBZD1tKHt9LHVkLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkLGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hLnJlbGF0ZWRUYXJnZXQ/YS5mcm9tRWxlbWVudD09PWEuc3JjRWxlbWVudD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50OmEucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGEpe2lmKFwibW92ZW1lbnRYXCJpblxuYSlyZXR1cm4gYS5tb3ZlbWVudFg7YSE9PXlkJiYoeWQmJlwibW91c2Vtb3ZlXCI9PT1hLnR5cGU/KHdkPWEuc2NyZWVuWC15ZC5zY3JlZW5YLHhkPWEuc2NyZWVuWS15ZC5zY3JlZW5ZKTp4ZD13ZD0wLHlkPWEpO3JldHVybiB3ZH0sbW92ZW1lbnRZOmZ1bmN0aW9uKGEpe3JldHVyblwibW92ZW1lbnRZXCJpbiBhP2EubW92ZW1lbnRZOnhkfX0pLEJkPXJkKEFkKSxDZD1tKHt9LEFkLHtkYXRhVHJhbnNmZXI6MH0pLERkPXJkKENkKSxFZD1tKHt9LHVkLHtyZWxhdGVkVGFyZ2V0OjB9KSxGZD1yZChFZCksR2Q9bSh7fSxzZCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksSGQ9cmQoR2QpLElkPW0oe30sc2Qse2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuXCJjbGlwYm9hcmREYXRhXCJpbiBhP2EuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxKZD1yZChJZCksS2Q9bSh7fSxzZCx7ZGF0YTowfSksTGQ9cmQoS2QpLE1kPXtFc2M6XCJFc2NhcGVcIixcblNwYWNlYmFyOlwiIFwiLExlZnQ6XCJBcnJvd0xlZnRcIixVcDpcIkFycm93VXBcIixSaWdodDpcIkFycm93UmlnaHRcIixEb3duOlwiQXJyb3dEb3duXCIsRGVsOlwiRGVsZXRlXCIsV2luOlwiT1NcIixNZW51OlwiQ29udGV4dE1lbnVcIixBcHBzOlwiQ29udGV4dE1lbnVcIixTY3JvbGw6XCJTY3JvbGxMb2NrXCIsTW96UHJpbnRhYmxlS2V5OlwiVW5pZGVudGlmaWVkXCJ9LE5kPXs4OlwiQmFja3NwYWNlXCIsOTpcIlRhYlwiLDEyOlwiQ2xlYXJcIiwxMzpcIkVudGVyXCIsMTY6XCJTaGlmdFwiLDE3OlwiQ29udHJvbFwiLDE4OlwiQWx0XCIsMTk6XCJQYXVzZVwiLDIwOlwiQ2Fwc0xvY2tcIiwyNzpcIkVzY2FwZVwiLDMyOlwiIFwiLDMzOlwiUGFnZVVwXCIsMzQ6XCJQYWdlRG93blwiLDM1OlwiRW5kXCIsMzY6XCJIb21lXCIsMzc6XCJBcnJvd0xlZnRcIiwzODpcIkFycm93VXBcIiwzOTpcIkFycm93UmlnaHRcIiw0MDpcIkFycm93RG93blwiLDQ1OlwiSW5zZXJ0XCIsNDY6XCJEZWxldGVcIiwxMTI6XCJGMVwiLDExMzpcIkYyXCIsMTE0OlwiRjNcIiwxMTU6XCJGNFwiLDExNjpcIkY1XCIsMTE3OlwiRjZcIiwxMTg6XCJGN1wiLFxuMTE5OlwiRjhcIiwxMjA6XCJGOVwiLDEyMTpcIkYxMFwiLDEyMjpcIkYxMVwiLDEyMzpcIkYxMlwiLDE0NDpcIk51bUxvY2tcIiwxNDU6XCJTY3JvbGxMb2NrXCIsMjI0OlwiTWV0YVwifSxPZD17QWx0OlwiYWx0S2V5XCIsQ29udHJvbDpcImN0cmxLZXlcIixNZXRhOlwibWV0YUtleVwiLFNoaWZ0Olwic2hpZnRLZXlcIn07ZnVuY3Rpb24gUGQoYSl7dmFyIGI9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gYi5nZXRNb2RpZmllclN0YXRlP2IuZ2V0TW9kaWZpZXJTdGF0ZShhKTooYT1PZFthXSk/ISFiW2FdOiExfWZ1bmN0aW9uIHpkKCl7cmV0dXJuIFBkfVxudmFyIFFkPW0oe30sdWQse2tleTpmdW5jdGlvbihhKXtpZihhLmtleSl7dmFyIGI9TWRbYS5rZXldfHxhLmtleTtpZihcIlVuaWRlbnRpZmllZFwiIT09YilyZXR1cm4gYn1yZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/KGE9b2QoYSksMTM9PT1hP1wiRW50ZXJcIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP05kW2Eua2V5Q29kZV18fFwiVW5pZGVudGlmaWVkXCI6XCJcIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6emQsY2hhckNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlP29kKGEpOjB9LGtleUNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09XG5hLnR5cGU/b2QoYSk6XCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH19KSxSZD1yZChRZCksU2Q9bSh7fSxBZCx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxUZD1yZChTZCksVWQ9bSh7fSx1ZCx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkfSksVmQ9cmQoVWQpLFdkPW0oe30sc2Qse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksWGQ9cmQoV2QpLFlkPW0oe30sQWQse2RlbHRhWDpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWFwiaW4gYT9hLmRlbHRhWDpcIndoZWVsRGVsdGFYXCJpbiBhPy1hLndoZWVsRGVsdGFYOjB9LFxuZGVsdGFZOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFZXCJpbiBhP2EuZGVsdGFZOlwid2hlZWxEZWx0YVlcImluIGE/LWEud2hlZWxEZWx0YVk6XCJ3aGVlbERlbHRhXCJpbiBhPy1hLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxaZD1yZChZZCksJGQ9WzksMTMsMjcsMzJdLGFlPWZhJiZcIkNvbXBvc2l0aW9uRXZlbnRcImluIHdpbmRvdyxiZT1udWxsO2ZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJihiZT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBjZT1mYSYmXCJUZXh0RXZlbnRcImluIHdpbmRvdyYmIWJlLGRlPWZhJiYoIWFlfHxiZSYmODxiZSYmMTE+PWJlKSxlZT1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxmZT0hMTtcbmZ1bmN0aW9uIGdlKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJrZXl1cFwiOnJldHVybi0xIT09JGQuaW5kZXhPZihiLmtleUNvZGUpO2Nhc2UgXCJrZXlkb3duXCI6cmV0dXJuIDIyOSE9PWIua2V5Q29kZTtjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcImZvY3Vzb3V0XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gaGUoYSl7YT1hLmRldGFpbDtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJlwiZGF0YVwiaW4gYT9hLmRhdGE6bnVsbH12YXIgaWU9ITE7ZnVuY3Rpb24gamUoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIGhlKGIpO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKDMyIT09Yi53aGljaClyZXR1cm4gbnVsbDtmZT0hMDtyZXR1cm4gZWU7Y2FzZSBcInRleHRJbnB1dFwiOnJldHVybiBhPWIuZGF0YSxhPT09ZWUmJmZlP251bGw6YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbmZ1bmN0aW9uIGtlKGEsYil7aWYoaWUpcmV0dXJuXCJjb21wb3NpdGlvbmVuZFwiPT09YXx8IWFlJiZnZShhLGIpPyhhPW5kKCksbWQ9bGQ9a2Q9bnVsbCxpZT0hMSxhKTpudWxsO3N3aXRjaChhKXtjYXNlIFwicGFzdGVcIjpyZXR1cm4gbnVsbDtjYXNlIFwia2V5cHJlc3NcIjppZighKGIuY3RybEtleXx8Yi5hbHRLZXl8fGIubWV0YUtleSl8fGIuY3RybEtleSYmYi5hbHRLZXkpe2lmKGIuY2hhciYmMTxiLmNoYXIubGVuZ3RoKXJldHVybiBiLmNoYXI7aWYoYi53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiLndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gZGUmJlwia29cIiE9PWIubG9jYWxlP251bGw6Yi5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxudmFyIGxlPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLFwiZGF0ZXRpbWUtbG9jYWxcIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIG1lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT1iPyEhbGVbYS50eXBlXTpcInRleHRhcmVhXCI9PT1iPyEwOiExfWZ1bmN0aW9uIG5lKGEsYixjLGQpe0ViKGQpO2I9b2UoYixcIm9uQ2hhbmdlXCIpOzA8Yi5sZW5ndGgmJihjPW5ldyB0ZChcIm9uQ2hhbmdlXCIsXCJjaGFuZ2VcIixudWxsLGMsZCksYS5wdXNoKHtldmVudDpjLGxpc3RlbmVyczpifSkpfXZhciBwZT1udWxsLHFlPW51bGw7ZnVuY3Rpb24gcmUoYSl7c2UoYSwwKX1mdW5jdGlvbiB0ZShhKXt2YXIgYj11ZShhKTtpZihXYShiKSlyZXR1cm4gYX1cbmZ1bmN0aW9uIHZlKGEsYil7aWYoXCJjaGFuZ2VcIj09PWEpcmV0dXJuIGJ9dmFyIHdlPSExO2lmKGZhKXt2YXIgeGU7aWYoZmEpe3ZhciB5ZT1cIm9uaW5wdXRcImluIGRvY3VtZW50O2lmKCF5ZSl7dmFyIHplPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7emUuc2V0QXR0cmlidXRlKFwib25pbnB1dFwiLFwicmV0dXJuO1wiKTt5ZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgemUub25pbnB1dH14ZT15ZX1lbHNlIHhlPSExO3dlPXhlJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpfWZ1bmN0aW9uIEFlKCl7cGUmJihwZS5kZXRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkscWU9cGU9bnVsbCl9ZnVuY3Rpb24gQmUoYSl7aWYoXCJ2YWx1ZVwiPT09YS5wcm9wZXJ0eU5hbWUmJnRlKHFlKSl7dmFyIGI9W107bmUoYixxZSxhLHhiKGEpKTthPXJlO2lmKEtiKWEoYik7ZWxzZXtLYj0hMDt0cnl7R2IoYSxiKX1maW5hbGx5e0tiPSExLE1iKCl9fX19XG5mdW5jdGlvbiBDZShhLGIsYyl7XCJmb2N1c2luXCI9PT1hPyhBZSgpLHBlPWIscWU9YyxwZS5hdHRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkpOlwiZm9jdXNvdXRcIj09PWEmJkFlKCl9ZnVuY3Rpb24gRGUoYSl7aWYoXCJzZWxlY3Rpb25jaGFuZ2VcIj09PWF8fFwia2V5dXBcIj09PWF8fFwia2V5ZG93blwiPT09YSlyZXR1cm4gdGUocWUpfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJjbGlja1wiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gRmUoYSxiKXtpZihcImlucHV0XCI9PT1hfHxcImNoYW5nZVwiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gR2UoYSxiKXtyZXR1cm4gYT09PWImJigwIT09YXx8MS9hPT09MS9iKXx8YSE9PWEmJmIhPT1ifXZhciBIZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpHZSxJZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gSmUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIUllLmNhbGwoYixjW2RdKXx8IUhlKGFbY1tkXV0sYltjW2RdXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gS2UoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gTGUoYSxiKXt2YXIgYz1LZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1LZShjKX19ZnVuY3Rpb24gTWUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9NZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBOZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBPZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxudmFyIFBlPWZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsUWU9bnVsbCxSZT1udWxsLFNlPW51bGwsVGU9ITE7XG5mdW5jdGlvbiBVZShhLGIsYyl7dmFyIGQ9Yy53aW5kb3c9PT1jP2MuZG9jdW1lbnQ6OT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQ7VGV8fG51bGw9PVFlfHxRZSE9PVhhKGQpfHwoZD1RZSxcInNlbGVjdGlvblN0YXJ0XCJpbiBkJiZPZShkKT9kPXtzdGFydDpkLnNlbGVjdGlvblN0YXJ0LGVuZDpkLnNlbGVjdGlvbkVuZH06KGQ9KGQub3duZXJEb2N1bWVudCYmZC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLGQ9e2FuY2hvck5vZGU6ZC5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpkLmFuY2hvck9mZnNldCxmb2N1c05vZGU6ZC5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6ZC5mb2N1c09mZnNldH0pLFNlJiZKZShTZSxkKXx8KFNlPWQsZD1vZShSZSxcIm9uU2VsZWN0XCIpLDA8ZC5sZW5ndGgmJihiPW5ldyB0ZChcIm9uU2VsZWN0XCIsXCJzZWxlY3RcIixudWxsLGIsYyksYS5wdXNoKHtldmVudDpiLGxpc3RlbmVyczpkfSksYi50YXJnZXQ9UWUpKSl9XG5QYyhcImNhbmNlbCBjYW5jZWwgY2xpY2sgY2xpY2sgY2xvc2UgY2xvc2UgY29udGV4dG1lbnUgY29udGV4dE1lbnUgY29weSBjb3B5IGN1dCBjdXQgYXV4Y2xpY2sgYXV4Q2xpY2sgZGJsY2xpY2sgZG91YmxlQ2xpY2sgZHJhZ2VuZCBkcmFnRW5kIGRyYWdzdGFydCBkcmFnU3RhcnQgZHJvcCBkcm9wIGZvY3VzaW4gZm9jdXMgZm9jdXNvdXQgYmx1ciBpbnB1dCBpbnB1dCBpbnZhbGlkIGludmFsaWQga2V5ZG93biBrZXlEb3duIGtleXByZXNzIGtleVByZXNzIGtleXVwIGtleVVwIG1vdXNlZG93biBtb3VzZURvd24gbW91c2V1cCBtb3VzZVVwIHBhc3RlIHBhc3RlIHBhdXNlIHBhdXNlIHBsYXkgcGxheSBwb2ludGVyY2FuY2VsIHBvaW50ZXJDYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlckRvd24gcG9pbnRlcnVwIHBvaW50ZXJVcCByYXRlY2hhbmdlIHJhdGVDaGFuZ2UgcmVzZXQgcmVzZXQgc2Vla2VkIHNlZWtlZCBzdWJtaXQgc3VibWl0IHRvdWNoY2FuY2VsIHRvdWNoQ2FuY2VsIHRvdWNoZW5kIHRvdWNoRW5kIHRvdWNoc3RhcnQgdG91Y2hTdGFydCB2b2x1bWVjaGFuZ2Ugdm9sdW1lQ2hhbmdlXCIuc3BsaXQoXCIgXCIpLFxuMCk7UGMoXCJkcmFnIGRyYWcgZHJhZ2VudGVyIGRyYWdFbnRlciBkcmFnZXhpdCBkcmFnRXhpdCBkcmFnbGVhdmUgZHJhZ0xlYXZlIGRyYWdvdmVyIGRyYWdPdmVyIG1vdXNlbW92ZSBtb3VzZU1vdmUgbW91c2VvdXQgbW91c2VPdXQgbW91c2VvdmVyIG1vdXNlT3ZlciBwb2ludGVybW92ZSBwb2ludGVyTW92ZSBwb2ludGVyb3V0IHBvaW50ZXJPdXQgcG9pbnRlcm92ZXIgcG9pbnRlck92ZXIgc2Nyb2xsIHNjcm9sbCB0b2dnbGUgdG9nZ2xlIHRvdWNobW92ZSB0b3VjaE1vdmUgd2hlZWwgd2hlZWxcIi5zcGxpdChcIiBcIiksMSk7UGMoT2MsMik7Zm9yKHZhciBWZT1cImNoYW5nZSBzZWxlY3Rpb25jaGFuZ2UgdGV4dElucHV0IGNvbXBvc2l0aW9uc3RhcnQgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb251cGRhdGVcIi5zcGxpdChcIiBcIiksV2U9MDtXZTxWZS5sZW5ndGg7V2UrKylOYy5zZXQoVmVbV2VdLDApO2VhKFwib25Nb3VzZUVudGVyXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7XG5lYShcIm9uTW91c2VMZWF2ZVwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2VhKFwib25Qb2ludGVyRW50ZXJcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZWEoXCJvblBvaW50ZXJMZWF2ZVwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtkYShcIm9uQ2hhbmdlXCIsXCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZGEoXCJvblNlbGVjdFwiLFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtkYShcIm9uQmVmb3JlSW5wdXRcIixbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl0pO2RhKFwib25Db21wb3NpdGlvbkVuZFwiLFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO1xuZGEoXCJvbkNvbXBvc2l0aW9uU3RhcnRcIixcImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO2RhKFwib25Db21wb3NpdGlvblVwZGF0ZVwiLFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO3ZhciBYZT1cImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2Ugc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmdcIi5zcGxpdChcIiBcIiksWWU9bmV3IFNldChcImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZVwiLnNwbGl0KFwiIFwiKS5jb25jYXQoWGUpKTtcbmZ1bmN0aW9uIFplKGEsYixjKXt2YXIgZD1hLnR5cGV8fFwidW5rbm93bi1ldmVudFwiO2EuY3VycmVudFRhcmdldD1jO1liKGQsYix2b2lkIDAsYSk7YS5jdXJyZW50VGFyZ2V0PW51bGx9XG5mdW5jdGlvbiBzZShhLGIpe2I9MCE9PShiJjQpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdLGU9ZC5ldmVudDtkPWQubGlzdGVuZXJzO2E6e3ZhciBmPXZvaWQgMDtpZihiKWZvcih2YXIgZz1kLmxlbmd0aC0xOzA8PWc7Zy0tKXt2YXIgaD1kW2ddLGs9aC5pbnN0YW5jZSxsPWguY3VycmVudFRhcmdldDtoPWgubGlzdGVuZXI7aWYoayE9PWYmJmUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBhO1plKGUsaCxsKTtmPWt9ZWxzZSBmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKXtoPWRbZ107az1oLmluc3RhbmNlO2w9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7WmUoZSxoLGwpO2Y9a319fWlmKFViKXRocm93IGE9VmIsVWI9ITEsVmI9bnVsbCxhO31cbmZ1bmN0aW9uIEcoYSxiKXt2YXIgYz0kZShiKSxkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwoYWYoYixhLDIsITEpLGMuYWRkKGQpKX12YXIgYmY9XCJfcmVhY3RMaXN0ZW5pbmdcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBjZihhKXthW2JmXXx8KGFbYmZdPSEwLGJhLmZvckVhY2goZnVuY3Rpb24oYil7WWUuaGFzKGIpfHxkZihiLCExLGEsbnVsbCk7ZGYoYiwhMCxhLG51bGwpfSkpfVxuZnVuY3Rpb24gZGYoYSxiLGMsZCl7dmFyIGU9NDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsZj1jO1wic2VsZWN0aW9uY2hhbmdlXCI9PT1hJiY5IT09Yy5ub2RlVHlwZSYmKGY9Yy5vd25lckRvY3VtZW50KTtpZihudWxsIT09ZCYmIWImJlllLmhhcyhhKSl7aWYoXCJzY3JvbGxcIiE9PWEpcmV0dXJuO2V8PTI7Zj1kfXZhciBnPSRlKGYpLGg9YStcIl9fXCIrKGI/XCJjYXB0dXJlXCI6XCJidWJibGVcIik7Zy5oYXMoaCl8fChiJiYoZXw9NCksYWYoZixhLGUsYiksZy5hZGQoaCkpfVxuZnVuY3Rpb24gYWYoYSxiLGMsZCl7dmFyIGU9TmMuZ2V0KGIpO3N3aXRjaCh2b2lkIDA9PT1lPzI6ZSl7Y2FzZSAwOmU9Z2Q7YnJlYWs7Y2FzZSAxOmU9aWQ7YnJlYWs7ZGVmYXVsdDplPWhkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFQYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBqZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPXdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1OYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9TWMuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLHg9YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6eD1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjp4PVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSBJYzpjYXNlIEpjOmNhc2UgS2M6az1IZDticmVhaztjYXNlIExjOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHc9MCE9PShiJjQpLHo9IXcmJlwic2Nyb2xsXCI9PT1hLHU9dz9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt3PVtdO2Zvcih2YXIgdD1kLHE7bnVsbCE9PVxudDspe3E9dDt2YXIgdj1xLnN0YXRlTm9kZTs1PT09cS50YWcmJm51bGwhPT12JiYocT12LG51bGwhPT11JiYodj1PYih0LHUpLG51bGwhPXYmJncucHVzaChlZih0LHYscSkpKSk7aWYoeilicmVhazt0PXQucmV0dXJufTA8dy5sZW5ndGgmJihoPW5ldyBrKGgseCxudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp3fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmMD09PShiJjE2KSYmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLmZyb21FbGVtZW50KSYmKHdjKHgpfHx4W2ZmXSkpYnJlYWsgYTtpZihrfHxoKXtoPWUud2luZG93PT09ZT9lOihoPWUub3duZXJEb2N1bWVudCk/aC5kZWZhdWx0Vmlld3x8aC5wYXJlbnRXaW5kb3c6d2luZG93O2lmKGspe2lmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLnRvRWxlbWVudCxrPWQseD14P3djKHgpOm51bGwsbnVsbCE9PVxueCYmKHo9WmIoeCkseCE9PXp8fDUhPT14LnRhZyYmNiE9PXgudGFnKSl4PW51bGx9ZWxzZSBrPW51bGwseD1kO2lmKGshPT14KXt3PUJkO3Y9XCJvbk1vdXNlTGVhdmVcIjt1PVwib25Nb3VzZUVudGVyXCI7dD1cIm1vdXNlXCI7aWYoXCJwb2ludGVyb3V0XCI9PT1hfHxcInBvaW50ZXJvdmVyXCI9PT1hKXc9VGQsdj1cIm9uUG9pbnRlckxlYXZlXCIsdT1cIm9uUG9pbnRlckVudGVyXCIsdD1cInBvaW50ZXJcIjt6PW51bGw9PWs/aDp1ZShrKTtxPW51bGw9PXg/aDp1ZSh4KTtoPW5ldyB3KHYsdCtcImxlYXZlXCIsayxjLGUpO2gudGFyZ2V0PXo7aC5yZWxhdGVkVGFyZ2V0PXE7dj1udWxsO3djKGUpPT09ZCYmKHc9bmV3IHcodSx0K1wiZW50ZXJcIix4LGMsZSksdy50YXJnZXQ9cSx3LnJlbGF0ZWRUYXJnZXQ9eix2PXcpO3o9djtpZihrJiZ4KWI6e3c9azt1PXg7dD0wO2ZvcihxPXc7cTtxPWdmKHEpKXQrKztxPTA7Zm9yKHY9dTt2O3Y9Z2YodikpcSsrO2Zvcig7MDx0LXE7KXc9Z2YodyksdC0tO2Zvcig7MDxxLXQ7KXU9XG5nZih1KSxxLS07Zm9yKDt0LS07KXtpZih3PT09dXx8bnVsbCE9PXUmJnc9PT11LmFsdGVybmF0ZSlicmVhayBiO3c9Z2Yodyk7dT1nZih1KX13PW51bGx9ZWxzZSB3PW51bGw7bnVsbCE9PWsmJmhmKGcsaCxrLHcsITEpO251bGwhPT14JiZudWxsIT09eiYmaGYoZyx6LHgsdywhMCl9fX1hOntoPWQ/dWUoZCk6d2luZG93O2s9aC5ub2RlTmFtZSYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKFwic2VsZWN0XCI9PT1rfHxcImlucHV0XCI9PT1rJiZcImZpbGVcIj09PWgudHlwZSl2YXIgSj12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKUo9RmU7ZWxzZXtKPURlO3ZhciBLPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYoSj1FZSk7aWYoSiYmKEo9SihhLGQpKSl7bmUoZyxKLGMsZSk7YnJlYWsgYX1LJiZLKGEsaCxkKTtcImZvY3Vzb3V0XCI9PT1hJiYoSz1oLl93cmFwcGVyU3RhdGUpJiZcbksuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmYmIoaCxcIm51bWJlclwiLGgudmFsdWUpfUs9ZD91ZShkKTp3aW5kb3c7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6aWYobWUoSyl8fFwidHJ1ZVwiPT09Sy5jb250ZW50RWRpdGFibGUpUWU9SyxSZT1kLFNlPW51bGw7YnJlYWs7Y2FzZSBcImZvY3Vzb3V0XCI6U2U9UmU9UWU9bnVsbDticmVhaztjYXNlIFwibW91c2Vkb3duXCI6VGU9ITA7YnJlYWs7Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwiZHJhZ2VuZFwiOlRlPSExO1VlKGcsYyxlKTticmVhaztjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6aWYoUGUpYnJlYWs7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjpVZShnLGMsZSl9dmFyIFE7aWYoYWUpYjp7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbnN0YXJ0XCI6dmFyIEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOkw9XCJvbkNvbXBvc2l0aW9uRW5kXCI7YnJlYWsgYjtcbmNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOkw9XCJvbkNvbXBvc2l0aW9uVXBkYXRlXCI7YnJlYWsgYn1MPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihMPVwib25Db21wb3NpdGlvbkVuZFwiKTpcImtleWRvd25cIj09PWEmJjIyOT09PWMua2V5Q29kZSYmKEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIik7TCYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09TD9cIm9uQ29tcG9zaXRpb25FbmRcIj09PUwmJmllJiYoUT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLEs9b2UoZCxMKSwwPEsubGVuZ3RoJiYoTD1uZXcgTGQoTCxhLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OkwsbGlzdGVuZXJzOkt9KSxRP0wuZGF0YT1ROihRPWhlKGMpLG51bGwhPT1RJiYoTC5kYXRhPVEpKSkpO2lmKFE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksMDxkLmxlbmd0aCYmKGU9bmV3IExkKFwib25CZWZvcmVJbnB1dFwiLFxuXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9USl9c2UoZyxiKX0pfWZ1bmN0aW9uIGVmKGEsYixjKXtyZXR1cm57aW5zdGFuY2U6YSxsaXN0ZW5lcjpiLGN1cnJlbnRUYXJnZXQ6Y319ZnVuY3Rpb24gb2UoYSxiKXtmb3IodmFyIGM9YitcIkNhcHR1cmVcIixkPVtdO251bGwhPT1hOyl7dmFyIGU9YSxmPWUuc3RhdGVOb2RlOzU9PT1lLnRhZyYmbnVsbCE9PWYmJihlPWYsZj1PYihhLGMpLG51bGwhPWYmJmQudW5zaGlmdChlZihhLGYsZSkpLGY9T2IoYSxiKSxudWxsIT1mJiZkLnB1c2goZWYoYSxmLGUpKSk7YT1hLnJldHVybn1yZXR1cm4gZH1mdW5jdGlvbiBnZihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDtkbyBhPWEucmV0dXJuO3doaWxlKGEmJjUhPT1hLnRhZyk7cmV0dXJuIGE/YTpudWxsfVxuZnVuY3Rpb24gaGYoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yi5fcmVhY3ROYW1lLGc9W107bnVsbCE9PWMmJmMhPT1kOyl7dmFyIGg9YyxrPWguYWx0ZXJuYXRlLGw9aC5zdGF0ZU5vZGU7aWYobnVsbCE9PWsmJms9PT1kKWJyZWFrOzU9PT1oLnRhZyYmbnVsbCE9PWwmJihoPWwsZT8oaz1PYihjLGYpLG51bGwhPWsmJmcudW5zaGlmdChlZihjLGssaCkpKTplfHwoaz1PYihjLGYpLG51bGwhPWsmJmcucHVzaChlZihjLGssaCkpKSk7Yz1jLnJldHVybn0wIT09Zy5sZW5ndGgmJmEucHVzaCh7ZXZlbnQ6YixsaXN0ZW5lcnM6Z30pfWZ1bmN0aW9uIGpmKCl7fXZhciBrZj1udWxsLGxmPW51bGw7ZnVuY3Rpb24gbWYoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjpyZXR1cm4hIWIuYXV0b0ZvY3VzfXJldHVybiExfVxuZnVuY3Rpb24gbmYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm9wdGlvblwiPT09YXx8XCJub3NjcmlwdFwiPT09YXx8XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNoaWxkcmVufHxcIm51bWJlclwiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwib2JqZWN0XCI9PT10eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9PWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sfXZhciBvZj1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnZvaWQgMCxwZj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDp2b2lkIDA7ZnVuY3Rpb24gcWYoYSl7MT09PWEubm9kZVR5cGU/YS50ZXh0Q29udGVudD1cIlwiOjk9PT1hLm5vZGVUeXBlJiYoYT1hLmJvZHksbnVsbCE9YSYmKGEudGV4dENvbnRlbnQ9XCJcIikpfVxuZnVuY3Rpb24gcmYoYSl7Zm9yKDtudWxsIT1hO2E9YS5uZXh0U2libGluZyl7dmFyIGI9YS5ub2RlVHlwZTtpZigxPT09Ynx8Mz09PWIpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gc2YoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHRmPTA7ZnVuY3Rpb24gdWYoYSl7cmV0dXJueyQkdHlwZW9mOkdhLHRvU3RyaW5nOmEsdmFsdWVPZjphfX12YXIgdmY9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksd2Y9XCJfX3JlYWN0RmliZXIkXCIrdmYseGY9XCJfX3JlYWN0UHJvcHMkXCIrdmYsZmY9XCJfX3JlYWN0Q29udGFpbmVyJFwiK3ZmLHlmPVwiX19yZWFjdEV2ZW50cyRcIit2ZjtcbmZ1bmN0aW9uIHdjKGEpe3ZhciBiPWFbd2ZdO2lmKGIpcmV0dXJuIGI7Zm9yKHZhciBjPWEucGFyZW50Tm9kZTtjOyl7aWYoYj1jW2ZmXXx8Y1t3Zl0pe2M9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWIuY2hpbGR8fG51bGwhPT1jJiZudWxsIT09Yy5jaGlsZClmb3IoYT1zZihhKTtudWxsIT09YTspe2lmKGM9YVt3Zl0pcmV0dXJuIGM7YT1zZihhKX1yZXR1cm4gYn1hPWM7Yz1hLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQ2IoYSl7YT1hW3dmXXx8YVtmZl07cmV0dXJuIWF8fDUhPT1hLnRhZyYmNiE9PWEudGFnJiYxMyE9PWEudGFnJiYzIT09YS50YWc/bnVsbDphfWZ1bmN0aW9uIHVlKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhLnN0YXRlTm9kZTt0aHJvdyBFcnJvcih5KDMzKSk7fWZ1bmN0aW9uIERiKGEpe3JldHVybiBhW3hmXXx8bnVsbH1cbmZ1bmN0aW9uICRlKGEpe3ZhciBiPWFbeWZdO3ZvaWQgMD09PWImJihiPWFbeWZdPW5ldyBTZXQpO3JldHVybiBifXZhciB6Zj1bXSxBZj0tMTtmdW5jdGlvbiBCZihhKXtyZXR1cm57Y3VycmVudDphfX1mdW5jdGlvbiBIKGEpezA+QWZ8fChhLmN1cnJlbnQ9emZbQWZdLHpmW0FmXT1udWxsLEFmLS0pfWZ1bmN0aW9uIEkoYSxiKXtBZisrO3pmW0FmXT1hLmN1cnJlbnQ7YS5jdXJyZW50PWJ9dmFyIENmPXt9LE09QmYoQ2YpLE49QmYoITEpLERmPUNmO1xuZnVuY3Rpb24gRWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBDZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1mdW5jdGlvbiBGZihhKXthPWEuY2hpbGRDb250ZXh0VHlwZXM7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfWZ1bmN0aW9uIEdmKCl7SChOKTtIKE0pfWZ1bmN0aW9uIEhmKGEsYixjKXtpZihNLmN1cnJlbnQhPT1DZil0aHJvdyBFcnJvcih5KDE2OCkpO0koTSxiKTtJKE4sYyl9XG5mdW5jdGlvbiBJZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7YT1iLmNoaWxkQ29udGV4dFR5cGVzO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBkLmdldENoaWxkQ29udGV4dClyZXR1cm4gYztkPWQuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBlIGluIGQpaWYoIShlIGluIGEpKXRocm93IEVycm9yKHkoMTA4LFJhKGIpfHxcIlVua25vd25cIixlKSk7cmV0dXJuIG0oe30sYyxkKX1mdW5jdGlvbiBKZihhKXthPShhPWEuc3RhdGVOb2RlKSYmYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8Q2Y7RGY9TS5jdXJyZW50O0koTSxhKTtJKE4sTi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBLZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IoeSgxNjkpKTtjPyhhPUlmKGEsYixEZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEgoTiksSChNKSxJKE0sYSkpOkgoTik7SShOLGMpfVxudmFyIExmPW51bGwsTWY9bnVsbCxOZj1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxPZj1yLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssUGY9ci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxRZj1yLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFJmPXIudW5zdGFibGVfcmVxdWVzdFBhaW50LFNmPXIudW5zdGFibGVfbm93LFRmPXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsVWY9ci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxWZj1yLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LFdmPXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksWGY9ci51bnN0YWJsZV9Mb3dQcmlvcml0eSxZZj1yLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxaZj17fSwkZj12b2lkIDAhPT1SZj9SZjpmdW5jdGlvbigpe30sYWc9bnVsbCxiZz1udWxsLGNnPSExLGRnPVNmKCksTz0xRTQ+ZGc/U2Y6ZnVuY3Rpb24oKXtyZXR1cm4gU2YoKS1kZ307XG5mdW5jdGlvbiBlZygpe3N3aXRjaChUZigpKXtjYXNlIFVmOnJldHVybiA5OTtjYXNlIFZmOnJldHVybiA5ODtjYXNlIFdmOnJldHVybiA5NztjYXNlIFhmOnJldHVybiA5NjtjYXNlIFlmOnJldHVybiA5NTtkZWZhdWx0OnRocm93IEVycm9yKHkoMzMyKSk7fX1mdW5jdGlvbiBmZyhhKXtzd2l0Y2goYSl7Y2FzZSA5OTpyZXR1cm4gVWY7Y2FzZSA5ODpyZXR1cm4gVmY7Y2FzZSA5NzpyZXR1cm4gV2Y7Y2FzZSA5NjpyZXR1cm4gWGY7Y2FzZSA5NTpyZXR1cm4gWWY7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDMzMikpO319ZnVuY3Rpb24gZ2coYSxiKXthPWZnKGEpO3JldHVybiBOZihhLGIpfWZ1bmN0aW9uIGhnKGEsYixjKXthPWZnKGEpO3JldHVybiBPZihhLGIsYyl9ZnVuY3Rpb24gaWcoKXtpZihudWxsIT09Ymcpe3ZhciBhPWJnO2JnPW51bGw7UGYoYSl9amcoKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWNnJiZudWxsIT09YWcpe2NnPSEwO3ZhciBhPTA7dHJ5e3ZhciBiPWFnO2dnKDk5LGZ1bmN0aW9uKCl7Zm9yKDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9YlthXTtkbyBjPWMoITApO3doaWxlKG51bGwhPT1jKX19KTthZz1udWxsfWNhdGNoKGMpe3Rocm93IG51bGwhPT1hZyYmKGFnPWFnLnNsaWNlKGErMSkpLE9mKFVmLGlnKSxjO31maW5hbGx5e2NnPSExfX19dmFyIGtnPXJhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIGxnKGEsYil7aWYoYSYmYS5kZWZhdWx0UHJvcHMpe2I9bSh7fSxiKTthPWEuZGVmYXVsdFByb3BzO2Zvcih2YXIgYyBpbiBhKXZvaWQgMD09PWJbY10mJihiW2NdPWFbY10pO3JldHVybiBifXJldHVybiBifXZhciBtZz1CZihudWxsKSxuZz1udWxsLG9nPW51bGwscGc9bnVsbDtmdW5jdGlvbiBxZygpe3BnPW9nPW5nPW51bGx9XG5mdW5jdGlvbiByZyhhKXt2YXIgYj1tZy5jdXJyZW50O0gobWcpO2EudHlwZS5fY29udGV4dC5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gc2coYSxiKXtmb3IoO251bGwhPT1hOyl7dmFyIGM9YS5hbHRlcm5hdGU7aWYoKGEuY2hpbGRMYW5lcyZiKT09PWIpaWYobnVsbD09PWN8fChjLmNoaWxkTGFuZXMmYik9PT1iKWJyZWFrO2Vsc2UgYy5jaGlsZExhbmVzfD1iO2Vsc2UgYS5jaGlsZExhbmVzfD1iLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKTthPWEucmV0dXJufX1mdW5jdGlvbiB0ZyhhLGIpe25nPWE7cGc9b2c9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJih1Zz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiB2ZyhhLGIpe2lmKHBnIT09YSYmITEhPT1iJiYwIT09Yil7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBifHwxMDczNzQxODIzPT09YilwZz1hLGI9MTA3Mzc0MTgyMztiPXtjb250ZXh0OmEsb2JzZXJ2ZWRCaXRzOmIsbmV4dDpudWxsfTtpZihudWxsPT09b2cpe2lmKG51bGw9PT1uZyl0aHJvdyBFcnJvcih5KDMwOCkpO29nPWI7bmcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDpiLHJlc3BvbmRlcnM6bnVsbH19ZWxzZSBvZz1vZy5uZXh0PWJ9cmV0dXJuIGEuX2N1cnJlbnRWYWx1ZX12YXIgd2c9ITE7ZnVuY3Rpb24geGcoYSl7YS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24geWcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmEuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmEubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gemcoYSxiKXtyZXR1cm57ZXZlbnRUaW1lOmEsbGFuZTpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gQWcoYSxiKXthPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWEpe2E9YS5zaGFyZWQ7dmFyIGM9YS5wZW5kaW5nO251bGw9PT1jP2IubmV4dD1iOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKTthLnBlbmRpbmc9Yn19XG5mdW5jdGlvbiBCZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWUsZD1hLmFsdGVybmF0ZTtpZihudWxsIT09ZCYmKGQ9ZC51cGRhdGVRdWV1ZSxjPT09ZCkpe3ZhciBlPW51bGwsZj1udWxsO2M9Yy5maXJzdEJhc2VVcGRhdGU7aWYobnVsbCE9PWMpe2Rve3ZhciBnPXtldmVudFRpbWU6Yy5ldmVudFRpbWUsbGFuZTpjLmxhbmUsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOmMuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Zj9lPWY9ZzpmPWYubmV4dD1nO2M9Yy5uZXh0fXdoaWxlKG51bGwhPT1jKTtudWxsPT09Zj9lPWY9YjpmPWYubmV4dD1ifWVsc2UgZT1mPWI7Yz17YmFzZVN0YXRlOmQuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOmYsc2hhcmVkOmQuc2hhcmVkLGVmZmVjdHM6ZC5lZmZlY3RzfTthLnVwZGF0ZVF1ZXVlPWM7cmV0dXJufWE9Yy5sYXN0QmFzZVVwZGF0ZTtudWxsPT09YT9jLmZpcnN0QmFzZVVwZGF0ZT1iOmEubmV4dD1cbmI7Yy5sYXN0QmFzZVVwZGF0ZT1ifVxuZnVuY3Rpb24gQ2coYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt3Zz0hMTt2YXIgZj1lLmZpcnN0QmFzZVVwZGF0ZSxnPWUubGFzdEJhc2VVcGRhdGUsaD1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1oKXtlLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGs9aCxsPWsubmV4dDtrLm5leHQ9bnVsbDtudWxsPT09Zz9mPWw6Zy5uZXh0PWw7Zz1rO3ZhciBuPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1uKXtuPW4udXBkYXRlUXVldWU7dmFyIEE9bi5sYXN0QmFzZVVwZGF0ZTtBIT09ZyYmKG51bGw9PT1BP24uZmlyc3RCYXNlVXBkYXRlPWw6QS5uZXh0PWwsbi5sYXN0QmFzZVVwZGF0ZT1rKX19aWYobnVsbCE9PWYpe0E9ZS5iYXNlU3RhdGU7Zz0wO249bD1rPW51bGw7ZG97aD1mLmxhbmU7dmFyIHA9Zi5ldmVudFRpbWU7aWYoKGQmaCk9PT1oKXtudWxsIT09biYmKG49bi5uZXh0PXtldmVudFRpbWU6cCxsYW5lOjAsdGFnOmYudGFnLHBheWxvYWQ6Zi5wYXlsb2FkLGNhbGxiYWNrOmYuY2FsbGJhY2ssXG5uZXh0Om51bGx9KTthOnt2YXIgQz1hLHg9ZjtoPWI7cD1jO3N3aXRjaCh4LnRhZyl7Y2FzZSAxOkM9eC5wYXlsb2FkO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBDKXtBPUMuY2FsbChwLEEsaCk7YnJlYWsgYX1BPUM7YnJlYWsgYTtjYXNlIDM6Qy5mbGFncz1DLmZsYWdzJi00MDk3fDY0O2Nhc2UgMDpDPXgucGF5bG9hZDtoPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDP0MuY2FsbChwLEEsaCk6QztpZihudWxsPT09aHx8dm9pZCAwPT09aClicmVhayBhO0E9bSh7fSxBLGgpO2JyZWFrIGE7Y2FzZSAyOndnPSEwfX1udWxsIT09Zi5jYWxsYmFjayYmKGEuZmxhZ3N8PTMyLGg9ZS5lZmZlY3RzLG51bGw9PT1oP2UuZWZmZWN0cz1bZl06aC5wdXNoKGYpKX1lbHNlIHA9e2V2ZW50VGltZTpwLGxhbmU6aCx0YWc6Zi50YWcscGF5bG9hZDpmLnBheWxvYWQsY2FsbGJhY2s6Zi5jYWxsYmFjayxuZXh0Om51bGx9LG51bGw9PT1uPyhsPW49cCxrPUEpOm49bi5uZXh0PXAsZ3w9aDtmPWYubmV4dDtpZihudWxsPT09XG5mKWlmKGg9ZS5zaGFyZWQucGVuZGluZyxudWxsPT09aClicmVhaztlbHNlIGY9aC5uZXh0LGgubmV4dD1udWxsLGUubGFzdEJhc2VVcGRhdGU9aCxlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSk7bnVsbD09PW4mJihrPUEpO2UuYmFzZVN0YXRlPWs7ZS5maXJzdEJhc2VVcGRhdGU9bDtlLmxhc3RCYXNlVXBkYXRlPW47RGd8PWc7YS5sYW5lcz1nO2EubWVtb2l6ZWRTdGF0ZT1BfX1mdW5jdGlvbiBFZyhhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGUpdGhyb3cgRXJyb3IoeSgxOTEsZSkpO2UuY2FsbChkKX19fXZhciBGZz0obmV3IGFhLkNvbXBvbmVudCkucmVmcztcbmZ1bmN0aW9uIEdnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjptKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEubGFuZXMmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBLZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxzKT9aYihhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO0pnKGEsZSxkKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YudGFnPTE7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO0FnKGEsZik7SmcoYSxlLGQpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oYSxiKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBjPUhnKCksZD1JZyhhKSxlPXpnKGMsZCk7ZS50YWc9Mjt2b2lkIDAhPT1iJiZudWxsIT09YiYmKGUuY2FsbGJhY2s9XG5iKTtBZyhhLGUpO0pnKGEsZCxjKX19O2Z1bmN0aW9uIExnKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IUplKGMsZCl8fCFKZShlLGYpOiEwfVxuZnVuY3Rpb24gTWcoYSxiLGMpe3ZhciBkPSExLGU9Q2Y7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9dmcoZik6KGU9RmYoYik/RGY6TS5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/RWYoYSxlKTpDZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPUtnO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbHM9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gTmcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gT2coYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1GZzt4ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXZnKGYpOihmPUZmKGIpP0RmOk0uY3VycmVudCxlLmNvbnRleHQ9RWYoYSxmKSk7Q2coYSxjLGUsZCk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKEdnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fFxuKGI9ZS5zdGF0ZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLENnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZmxhZ3N8PTQpfXZhciBQZz1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gUWcoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHkoMTQ3LGEpKTt2YXIgZT1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZSlyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1kLnJlZnM7Yj09PUZnJiYoYj1kLnJlZnM9e30pO251bGw9PT1hP2RlbGV0ZSBiW2VdOmJbZV09YX07Yi5fc3RyaW5nUmVmPWU7cmV0dXJuIGJ9aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKHkoMjg0KSk7aWYoIWMuX293bmVyKXRocm93IEVycm9yKHkoMjkwLGEpKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiBSZyhhLGIpe2lmKFwidGV4dGFyZWFcIiE9PWEudHlwZSl0aHJvdyBFcnJvcih5KDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhiKS5qb2luKFwiLCBcIikrXCJ9XCI6YikpO31cbmZ1bmN0aW9uIFNnKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmxhc3RFZmZlY3Q7bnVsbCE9PWQ/KGQubmV4dEVmZmVjdD1jLGIubGFzdEVmZmVjdD1jKTpiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1jO2MubmV4dEVmZmVjdD1udWxsO2MuZmxhZ3M9OH19ZnVuY3Rpb24gYyhjLGQpe2lmKCFhKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWQ7KWIoYyxkKSxkPWQuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGEsYil7Zm9yKGE9bmV3IE1hcDtudWxsIT09YjspbnVsbCE9PWIua2V5P2Euc2V0KGIua2V5LGIpOmEuc2V0KGIuaW5kZXgsYiksYj1iLnNpYmxpbmc7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2E9VGcoYSxiKTthLmluZGV4PTA7YS5zaWJsaW5nPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gZihiLGMsZCl7Yi5pbmRleD1kO2lmKCFhKXJldHVybiBjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZmxhZ3M9MixcbmMpOmQ7Yi5mbGFncz0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmbnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5mbGFncz0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9VWcoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXtpZihudWxsIT09YiYmYi5lbGVtZW50VHlwZT09PWMudHlwZSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9UWcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVZnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPVFnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPVxuV2coYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG4oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVhnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gQShhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9VWcoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGM9VmcoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksYy5yZWY9UWcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlIHRhOnJldHVybiBiPVdnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYn1pZihQZyhiKXx8TGEoYikpcmV0dXJuIGI9WGcoYixcbmEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtSZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGMua2V5PT09ZT9jLnR5cGU9PT11YT9uKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsZSk6ayhhLGIsYyxkKTpudWxsO2Nhc2UgdGE6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGx9aWYoUGcoYyl8fExhKGMpKXJldHVybiBudWxsIT09ZT9udWxsOm4oYSxiLGMsZCxudWxsKTtSZyhhLGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIEMoYSxiLGMsZCxlKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1hLmdldChjKXx8XG5udWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsZC50eXBlPT09dWE/bihiLGEsZC5wcm9wcy5jaGlsZHJlbixlLGQua2V5KTprKGIsYSxkLGUpO2Nhc2UgdGE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGwoYixhLGQsZSl9aWYoUGcoZCl8fExhKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLG4oYixhLGQsZSxudWxsKTtSZyhiLGQpfXJldHVybiBudWxsfWZ1bmN0aW9uIHgoZSxnLGgsayl7Zm9yKHZhciBsPW51bGwsdD1udWxsLHU9Zyx6PWc9MCxxPW51bGw7bnVsbCE9PXUmJno8aC5sZW5ndGg7eisrKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciBuPXAoZSx1LGhbel0sayk7aWYobnVsbD09PW4pe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09XG5uLmFsdGVybmF0ZSYmYihlLHUpO2c9ZihuLGcseik7bnVsbD09PXQ/bD1uOnQuc2libGluZz1uO3Q9bjt1PXF9aWYoej09PWgubGVuZ3RoKXJldHVybiBjKGUsdSksbDtpZihudWxsPT09dSl7Zm9yKDt6PGgubGVuZ3RoO3orKyl1PUEoZSxoW3pdLGspLG51bGwhPT11JiYoZz1mKHUsZyx6KSxudWxsPT09dD9sPXU6dC5zaWJsaW5nPXUsdD11KTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7ejxoLmxlbmd0aDt6KyspcT1DKHUsZSx6LGhbel0sayksbnVsbCE9PXEmJihhJiZudWxsIT09cS5hbHRlcm5hdGUmJnUuZGVsZXRlKG51bGw9PT1xLmtleT96OnEua2V5KSxnPWYocSxnLHopLG51bGw9PT10P2w9cTp0LnNpYmxpbmc9cSx0PXEpO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGx9ZnVuY3Rpb24gdyhlLGcsaCxrKXt2YXIgbD1MYShoKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgbCl0aHJvdyBFcnJvcih5KDE1MCkpO2g9bC5jYWxsKGgpO2lmKG51bGw9PVxuaCl0aHJvdyBFcnJvcih5KDE1MSkpO2Zvcih2YXIgdD1sPW51bGwsdT1nLHo9Zz0wLHE9bnVsbCxuPWgubmV4dCgpO251bGwhPT11JiYhbi5kb25lO3orKyxuPWgubmV4dCgpKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciB3PXAoZSx1LG4udmFsdWUsayk7aWYobnVsbD09PXcpe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09dy5hbHRlcm5hdGUmJmIoZSx1KTtnPWYodyxnLHopO251bGw9PT10P2w9dzp0LnNpYmxpbmc9dzt0PXc7dT1xfWlmKG4uZG9uZSlyZXR1cm4gYyhlLHUpLGw7aWYobnVsbD09PXUpe2Zvcig7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUEoZSxuLnZhbHVlLGspLG51bGwhPT1uJiYoZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUModSxlLHosbi52YWx1ZSxrKSxudWxsIT09biYmKGEmJm51bGwhPT1uLmFsdGVybmF0ZSYmXG51LmRlbGV0ZShudWxsPT09bi5rZXk/ejpuLmtleSksZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTthJiZ1LmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO3JldHVybiBsfXJldHVybiBmdW5jdGlvbihhLGQsZixoKXt2YXIgaz1cIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLnR5cGU9PT11YSYmbnVsbD09PWYua2V5O2smJihmPWYucHJvcHMuY2hpbGRyZW4pO3ZhciBsPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY7aWYobClzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSBzYTphOntsPWYua2V5O2ZvcihrPWQ7bnVsbCE9PWs7KXtpZihrLmtleT09PWwpe3N3aXRjaChrLnRhZyl7Y2FzZSA3OmlmKGYudHlwZT09PXVhKXtjKGEsay5zaWJsaW5nKTtkPWUoayxmLnByb3BzLmNoaWxkcmVuKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWJyZWFrO2RlZmF1bHQ6aWYoay5lbGVtZW50VHlwZT09PWYudHlwZSl7YyhhLGsuc2libGluZyk7XG5kPWUoayxmLnByb3BzKTtkLnJlZj1RZyhhLGssZik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX19YyhhLGspO2JyZWFrfWVsc2UgYihhLGspO2s9ay5zaWJsaW5nfWYudHlwZT09PXVhPyhkPVhnKGYucHJvcHMuY2hpbGRyZW4sYS5tb2RlLGgsZi5rZXkpLGQucmV0dXJuPWEsYT1kKTooaD1WZyhmLnR5cGUsZi5rZXksZi5wcm9wcyxudWxsLGEubW9kZSxoKSxoLnJlZj1RZyhhLGQsZiksaC5yZXR1cm49YSxhPWgpfXJldHVybiBnKGEpO2Nhc2UgdGE6YTp7Zm9yKGs9Zi5rZXk7bnVsbCE9PWQ7KXtpZihkLmtleT09PWspaWYoND09PWQudGFnJiZkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09Zi5jb250YWluZXJJbmZvJiZkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWYuaW1wbGVtZW50YXRpb24pe2MoYSxkLnNpYmxpbmcpO2Q9ZShkLGYuY2hpbGRyZW58fFtdKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWVsc2V7YyhhLGQpO2JyZWFrfWVsc2UgYihhLGQpO2Q9ZC5zaWJsaW5nfWQ9XG5XZyhmLGEubW9kZSxoKTtkLnJldHVybj1hO2E9ZH1yZXR1cm4gZyhhKX1pZihcInN0cmluZ1wiPT09dHlwZW9mIGZ8fFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZj1cIlwiK2YsbnVsbCE9PWQmJjY9PT1kLnRhZz8oYyhhLGQuc2libGluZyksZD1lKGQsZiksZC5yZXR1cm49YSxhPWQpOihjKGEsZCksZD1VZyhmLGEubW9kZSxoKSxkLnJldHVybj1hLGE9ZCksZyhhKTtpZihQZyhmKSlyZXR1cm4geChhLGQsZixoKTtpZihMYShmKSlyZXR1cm4gdyhhLGQsZixoKTtsJiZSZyhhLGYpO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmIWspc3dpdGNoKGEudGFnKXtjYXNlIDE6Y2FzZSAyMjpjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnRocm93IEVycm9yKHkoMTUyLFJhKGEudHlwZSl8fFwiQ29tcG9uZW50XCIpKTt9cmV0dXJuIGMoYSxkKX19dmFyIFlnPVNnKCEwKSxaZz1TZyghMSksJGc9e30sYWg9QmYoJGcpLGJoPUJmKCRnKSxjaD1CZigkZyk7XG5mdW5jdGlvbiBkaChhKXtpZihhPT09JGcpdGhyb3cgRXJyb3IoeSgxNzQpKTtyZXR1cm4gYX1mdW5jdGlvbiBlaChhLGIpe0koY2gsYik7SShiaCxhKTtJKGFoLCRnKTthPWIubm9kZVR5cGU7c3dpdGNoKGEpe2Nhc2UgOTpjYXNlIDExOmI9KGI9Yi5kb2N1bWVudEVsZW1lbnQpP2IubmFtZXNwYWNlVVJJOm1iKG51bGwsXCJcIik7YnJlYWs7ZGVmYXVsdDphPTg9PT1hP2IucGFyZW50Tm9kZTpiLGI9YS5uYW1lc3BhY2VVUkl8fG51bGwsYT1hLnRhZ05hbWUsYj1tYihiLGEpfUgoYWgpO0koYWgsYil9ZnVuY3Rpb24gZmgoKXtIKGFoKTtIKGJoKTtIKGNoKX1mdW5jdGlvbiBnaChhKXtkaChjaC5jdXJyZW50KTt2YXIgYj1kaChhaC5jdXJyZW50KTt2YXIgYz1tYihiLGEudHlwZSk7YiE9PWMmJihJKGJoLGEpLEkoYWgsYykpfWZ1bmN0aW9uIGhoKGEpe2JoLmN1cnJlbnQ9PT1hJiYoSChhaCksSChiaCkpfXZhciBQPUJmKDApO1xuZnVuY3Rpb24gaWgoYSl7Zm9yKHZhciBiPWE7bnVsbCE9PWI7KXtpZigxMz09PWIudGFnKXt2YXIgYz1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsPT09Y3x8XCIkP1wiPT09Yy5kYXRhfHxcIiQhXCI9PT1jLmRhdGEpKXJldHVybiBifWVsc2UgaWYoMTk9PT1iLnRhZyYmdm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKXtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH12YXIgamg9bnVsbCxraD1udWxsLGxoPSExO1xuZnVuY3Rpb24gbWgoYSxiKXt2YXIgYz1uaCg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2MudHlwZT1cIkRFTEVURURcIjtjLnN0YXRlTm9kZT1iO2MucmV0dXJuPWE7Yy5mbGFncz04O251bGwhPT1hLmxhc3RFZmZlY3Q/KGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWMsYS5sYXN0RWZmZWN0PWMpOmEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PWN9ZnVuY3Rpb24gb2goYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgNjpyZXR1cm4gYj1cIlwiPT09YS5wZW5kaW5nUHJvcHN8fDMhPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHBoKGEpe2lmKGxoKXt2YXIgYj1raDtpZihiKXt2YXIgYz1iO2lmKCFvaChhLGIpKXtiPXJmKGMubmV4dFNpYmxpbmcpO2lmKCFifHwhb2goYSxiKSl7YS5mbGFncz1hLmZsYWdzJi0xMDI1fDI7bGg9ITE7amg9YTtyZXR1cm59bWgoamgsYyl9amg9YTtraD1yZihiLmZpcnN0Q2hpbGQpfWVsc2UgYS5mbGFncz1hLmZsYWdzJi0xMDI1fDIsbGg9ITEsamg9YX19ZnVuY3Rpb24gcWgoYSl7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWEmJjUhPT1hLnRhZyYmMyE9PWEudGFnJiYxMyE9PWEudGFnOylhPWEucmV0dXJuO2poPWF9XG5mdW5jdGlvbiByaChhKXtpZihhIT09amgpcmV0dXJuITE7aWYoIWxoKXJldHVybiBxaChhKSxsaD0hMCwhMTt2YXIgYj1hLnR5cGU7aWYoNSE9PWEudGFnfHxcImhlYWRcIiE9PWImJlwiYm9keVwiIT09YiYmIW5mKGIsYS5tZW1vaXplZFByb3BzKSlmb3IoYj1raDtiOyltaChhLGIpLGI9cmYoYi5uZXh0U2libGluZyk7cWgoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcih5KDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXtraD1yZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfWtoPW51bGx9fWVsc2Uga2g9amg/cmYoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9XG5mdW5jdGlvbiBzaCgpe2toPWpoPW51bGw7bGg9ITF9dmFyIHRoPVtdO2Z1bmN0aW9uIHVoKCl7Zm9yKHZhciBhPTA7YTx0aC5sZW5ndGg7YSsrKXRoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7dGgubGVuZ3RoPTB9dmFyIHZoPXJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsd2g9cmEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcseGg9MCxSPW51bGwsUz1udWxsLFQ9bnVsbCx5aD0hMSx6aD0hMTtmdW5jdGlvbiBBaCgpe3Rocm93IEVycm9yKHkoMzIxKSk7fWZ1bmN0aW9uIEJoKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoIUhlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBDaChhLGIsYyxkLGUsZil7eGg9ZjtSPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IubGFuZXM9MDt2aC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP0RoOkVoO2E9YyhkLGUpO2lmKHpoKXtmPTA7ZG97emg9ITE7aWYoISgyNT5mKSl0aHJvdyBFcnJvcih5KDMwMSkpO2YrPTE7VD1TPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO3ZoLmN1cnJlbnQ9Rmg7YT1jKGQsZSl9d2hpbGUoemgpfXZoLmN1cnJlbnQ9R2g7Yj1udWxsIT09UyYmbnVsbCE9PVMubmV4dDt4aD0wO1Q9Uz1SPW51bGw7eWg9ITE7aWYoYil0aHJvdyBFcnJvcih5KDMwMCkpO3JldHVybiBhfWZ1bmN0aW9uIEhoKCl7dmFyIGE9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlPVQ9YTpUPVQubmV4dD1hO3JldHVybiBUfVxuZnVuY3Rpb24gSWgoKXtpZihudWxsPT09Uyl7dmFyIGE9Ui5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Uy5uZXh0O3ZhciBiPW51bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZTpULm5leHQ7aWYobnVsbCE9PWIpVD1iLFM9YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHkoMzEwKSk7Uz1hO2E9e21lbW9pemVkU3RhdGU6Uy5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpTLmJhc2VTdGF0ZSxiYXNlUXVldWU6Uy5iYXNlUXVldWUscXVldWU6Uy5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZT1UPWE6VD1ULm5leHQ9YX1yZXR1cm4gVH1mdW5jdGlvbiBKaChhLGIpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yn1cbmZ1bmN0aW9uIEtoKGEpe3ZhciBiPUloKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHkoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9UyxlPWQuYmFzZVF1ZXVlLGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXtpZihudWxsIT09ZSl7dmFyIGc9ZS5uZXh0O2UubmV4dD1mLm5leHQ7Zi5uZXh0PWd9ZC5iYXNlUXVldWU9ZT1mO2MucGVuZGluZz1udWxsfWlmKG51bGwhPT1lKXtlPWUubmV4dDtkPWQuYmFzZVN0YXRlO3ZhciBoPWc9Zj1udWxsLGs9ZTtkb3t2YXIgbD1rLmxhbmU7aWYoKHhoJmwpPT09bCludWxsIT09aCYmKGg9aC5uZXh0PXtsYW5lOjAsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixlYWdlclN0YXRlOmsuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxkPWsuZWFnZXJSZWR1Y2VyPT09YT9rLmVhZ2VyU3RhdGU6YShkLGsuYWN0aW9uKTtlbHNle3ZhciBuPXtsYW5lOmwsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixcbmVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH07bnVsbD09PWg/KGc9aD1uLGY9ZCk6aD1oLm5leHQ9bjtSLmxhbmVzfD1sO0RnfD1sfWs9ay5uZXh0fXdoaWxlKG51bGwhPT1rJiZrIT09ZSk7bnVsbD09PWg/Zj1kOmgubmV4dD1nO0hlKGQsYi5tZW1vaXplZFN0YXRlKXx8KHVnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZDtiLmJhc2VTdGF0ZT1mO2IuYmFzZVF1ZXVlPWg7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1kfXJldHVybltiLm1lbW9pemVkU3RhdGUsYy5kaXNwYXRjaF19XG5mdW5jdGlvbiBMaChhKXt2YXIgYj1JaCgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcih5KDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPWMuZGlzcGF0Y2gsZT1jLnBlbmRpbmcsZj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWUpe2MucGVuZGluZz1udWxsO3ZhciBnPWU9ZS5uZXh0O2RvIGY9YShmLGcuYWN0aW9uKSxnPWcubmV4dDt3aGlsZShnIT09ZSk7SGUoZixiLm1lbW9pemVkU3RhdGUpfHwodWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1mO251bGw9PT1iLmJhc2VRdWV1ZSYmKGIuYmFzZVN0YXRlPWYpO2MubGFzdFJlbmRlcmVkU3RhdGU9Zn1yZXR1cm5bZixkXX1cbmZ1bmN0aW9uIE1oKGEsYixjKXt2YXIgZD1iLl9nZXRWZXJzaW9uO2Q9ZChiLl9zb3VyY2UpO3ZhciBlPWIuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7aWYobnVsbCE9PWUpYT1lPT09ZDtlbHNlIGlmKGE9YS5tdXRhYmxlUmVhZExhbmVzLGE9KHhoJmEpPT09YSliLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PWQsdGgucHVzaChiKTtpZihhKXJldHVybiBjKGIuX3NvdXJjZSk7dGgucHVzaChiKTt0aHJvdyBFcnJvcih5KDM1MCkpO31cbmZ1bmN0aW9uIE5oKGEsYixjLGQpe3ZhciBlPVU7aWYobnVsbD09PWUpdGhyb3cgRXJyb3IoeSgzNDkpKTt2YXIgZj1iLl9nZXRWZXJzaW9uLGc9ZihiLl9zb3VyY2UpLGg9dmguY3VycmVudCxrPWgudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gTWgoZSxiLGMpfSksbD1rWzFdLG49a1swXTtrPVQ7dmFyIEE9YS5tZW1vaXplZFN0YXRlLHA9QS5yZWZzLEM9cC5nZXRTbmFwc2hvdCx4PUEuc291cmNlO0E9QS5zdWJzY3JpYmU7dmFyIHc9UjthLm1lbW9pemVkU3RhdGU9e3JlZnM6cCxzb3VyY2U6YixzdWJzY3JpYmU6ZH07aC51c2VFZmZlY3QoZnVuY3Rpb24oKXtwLmdldFNuYXBzaG90PWM7cC5zZXRTbmFwc2hvdD1sO3ZhciBhPWYoYi5fc291cmNlKTtpZighSGUoZyxhKSl7YT1jKGIuX3NvdXJjZSk7SGUobixhKXx8KGwoYSksYT1JZyh3KSxlLm11dGFibGVSZWFkTGFuZXN8PWEmZS5wZW5kaW5nTGFuZXMpO2E9ZS5tdXRhYmxlUmVhZExhbmVzO2UuZW50YW5nbGVkTGFuZXN8PWE7Zm9yKHZhciBkPVxuZS5lbnRhbmdsZW1lbnRzLGg9YTswPGg7KXt2YXIgaz0zMS1WYyhoKSx2PTE8PGs7ZFtrXXw9YTtoJj1+dn19fSxbYyxiLGRdKTtoLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBkKGIuX3NvdXJjZSxmdW5jdGlvbigpe3ZhciBhPXAuZ2V0U25hcHNob3QsYz1wLnNldFNuYXBzaG90O3RyeXtjKGEoYi5fc291cmNlKSk7dmFyIGQ9SWcodyk7ZS5tdXRhYmxlUmVhZExhbmVzfD1kJmUucGVuZGluZ0xhbmVzfWNhdGNoKHEpe2MoZnVuY3Rpb24oKXt0aHJvdyBxO30pfX0pfSxbYixkXSk7SGUoQyxjKSYmSGUoeCxiKSYmSGUoQSxkKXx8KGE9e3BlbmRpbmc6bnVsbCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6SmgsbGFzdFJlbmRlcmVkU3RhdGU6bn0sYS5kaXNwYXRjaD1sPU9oLmJpbmQobnVsbCxSLGEpLGsucXVldWU9YSxrLmJhc2VRdWV1ZT1udWxsLG49TWgoZSxiLGMpLGsubWVtb2l6ZWRTdGF0ZT1rLmJhc2VTdGF0ZT1uKTtyZXR1cm4gbn1cbmZ1bmN0aW9uIFBoKGEsYixjKXt2YXIgZD1JaCgpO3JldHVybiBOaChkLGEsYixjKX1mdW5jdGlvbiBRaChhKXt2YXIgYj1IaCgpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiYoYT1hKCkpO2IubWVtb2l6ZWRTdGF0ZT1iLmJhc2VTdGF0ZT1hO2E9Yi5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpKaCxsYXN0UmVuZGVyZWRTdGF0ZTphfTthPWEuZGlzcGF0Y2g9T2guYmluZChudWxsLFIsYSk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxhXX1cbmZ1bmN0aW9uIFJoKGEsYixjLGQpe2E9e3RhZzphLGNyZWF0ZTpiLGRlc3Ryb3k6YyxkZXBzOmQsbmV4dDpudWxsfTtiPVIudXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbH0sUi51cGRhdGVRdWV1ZT1iLGIubGFzdEVmZmVjdD1hLm5leHQ9YSk6KGM9Yi5sYXN0RWZmZWN0LG51bGw9PT1jP2IubGFzdEVmZmVjdD1hLm5leHQ9YTooZD1jLm5leHQsYy5uZXh0PWEsYS5uZXh0PWQsYi5sYXN0RWZmZWN0PWEpKTtyZXR1cm4gYX1mdW5jdGlvbiBTaChhKXt2YXIgYj1IaCgpO2E9e2N1cnJlbnQ6YX07cmV0dXJuIGIubWVtb2l6ZWRTdGF0ZT1hfWZ1bmN0aW9uIFRoKCl7cmV0dXJuIEloKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiBVaChhLGIsYyxkKXt2YXIgZT1IaCgpO1IuZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPVJoKDF8YixjLHZvaWQgMCx2b2lkIDA9PT1kP251bGw6ZCl9XG5mdW5jdGlvbiBWaChhLGIsYyxkKXt2YXIgZT1JaCgpO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGY9dm9pZCAwO2lmKG51bGwhPT1TKXt2YXIgZz1TLm1lbW9pemVkU3RhdGU7Zj1nLmRlc3Ryb3k7aWYobnVsbCE9PWQmJkJoKGQsZy5kZXBzKSl7UmgoYixjLGYsZCk7cmV0dXJufX1SLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1SaCgxfGIsYyxmLGQpfWZ1bmN0aW9uIFdoKGEsYil7cmV0dXJuIFVoKDUxNiw0LGEsYil9ZnVuY3Rpb24gWGgoYSxiKXtyZXR1cm4gVmgoNTE2LDQsYSxiKX1mdW5jdGlvbiBZaChhLGIpe3JldHVybiBWaCg0LDIsYSxiKX1mdW5jdGlvbiBaaChhLGIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBhPWEoKSxiKGEpLGZ1bmN0aW9uKCl7YihudWxsKX07aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpcmV0dXJuIGE9YSgpLGIuY3VycmVudD1hLGZ1bmN0aW9uKCl7Yi5jdXJyZW50PW51bGx9fVxuZnVuY3Rpb24gJGgoYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBWaCg0LDIsWmguYmluZChudWxsLGIsYSksYyl9ZnVuY3Rpb24gYWkoKXt9ZnVuY3Rpb24gYmkoYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9ZnVuY3Rpb24gY2koYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTthPWEoKTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9XG5mdW5jdGlvbiBkaShhLGIpe3ZhciBjPWVnKCk7Z2coOTg+Yz85ODpjLGZ1bmN0aW9uKCl7YSghMCl9KTtnZyg5NzxjPzk3OmMsZnVuY3Rpb24oKXt2YXIgYz13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7YSghMSksYigpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1jfX0pfVxuZnVuY3Rpb24gT2goYSxiLGMpe3ZhciBkPUhnKCksZT1JZyhhKSxmPXtsYW5lOmUsYWN0aW9uOmMsZWFnZXJSZWR1Y2VyOm51bGwsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH0sZz1iLnBlbmRpbmc7bnVsbD09PWc/Zi5uZXh0PWY6KGYubmV4dD1nLm5leHQsZy5uZXh0PWYpO2IucGVuZGluZz1mO2c9YS5hbHRlcm5hdGU7aWYoYT09PVJ8fG51bGwhPT1nJiZnPT09Uil6aD15aD0hMDtlbHNle2lmKDA9PT1hLmxhbmVzJiYobnVsbD09PWd8fDA9PT1nLmxhbmVzKSYmKGc9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1nKSl0cnl7dmFyIGg9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxrPWcoaCxjKTtmLmVhZ2VyUmVkdWNlcj1nO2YuZWFnZXJTdGF0ZT1rO2lmKEhlKGssaCkpcmV0dXJufWNhdGNoKGwpe31maW5hbGx5e31KZyhhLGUsZCl9fVxudmFyIEdoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpBaCx1c2VDb250ZXh0OkFoLHVzZUVmZmVjdDpBaCx1c2VJbXBlcmF0aXZlSGFuZGxlOkFoLHVzZUxheW91dEVmZmVjdDpBaCx1c2VNZW1vOkFoLHVzZVJlZHVjZXI6QWgsdXNlUmVmOkFoLHVzZVN0YXRlOkFoLHVzZURlYnVnVmFsdWU6QWgsdXNlRGVmZXJyZWRWYWx1ZTpBaCx1c2VUcmFuc2l0aW9uOkFoLHVzZU11dGFibGVTb3VyY2U6QWgsdXNlT3BhcXVlSWRlbnRpZmllcjpBaCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LERoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpe0hoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OldoLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBVaCg0LDIsWmguYmluZChudWxsLFxuYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFVoKDQsMixhLGIpfSx1c2VNZW1vOmZ1bmN0aW9uKGEsYil7dmFyIGM9SGgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX0sdXNlUmVkdWNlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9SGgoKTtiPXZvaWQgMCE9PWM/YyhiKTpiO2QubWVtb2l6ZWRTdGF0ZT1kLmJhc2VTdGF0ZT1iO2E9ZC5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjphLGxhc3RSZW5kZXJlZFN0YXRlOmJ9O2E9YS5kaXNwYXRjaD1PaC5iaW5kKG51bGwsUixhKTtyZXR1cm5bZC5tZW1vaXplZFN0YXRlLGFdfSx1c2VSZWY6U2gsdXNlU3RhdGU6UWgsdXNlRGVidWdWYWx1ZTphaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVFoKGEpLGM9YlswXSxkPWJbMV07V2goZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO1xud2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPVFoKCExKSxiPWFbMF07YT1kaS5iaW5kKG51bGwsYVsxXSk7U2goYSk7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUhoKCk7ZC5tZW1vaXplZFN0YXRlPXtyZWZzOntnZXRTbmFwc2hvdDpiLHNldFNuYXBzaG90Om51bGx9LHNvdXJjZTphLHN1YnNjcmliZTpjfTtyZXR1cm4gTmgoZCxhLGIsYyl9LHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtpZihsaCl7dmFyIGE9ITEsYj11ZihmdW5jdGlvbigpe2F8fChhPSEwLGMoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpKTt0aHJvdyBFcnJvcih5KDM1NSkpO30pLGM9UWgoYilbMV07MD09PShSLm1vZGUmMikmJihSLmZsYWdzfD01MTYsUmgoNSxmdW5jdGlvbigpe2MoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpfSxcbnZvaWQgMCxudWxsKSk7cmV0dXJuIGJ9Yj1cInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KTtRaChiKTtyZXR1cm4gYn0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxFaD17cmVhZENvbnRleHQ6dmcsdXNlQ2FsbGJhY2s6YmksdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6WGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTokaCx1c2VMYXlvdXRFZmZlY3Q6WWgsdXNlTWVtbzpjaSx1c2VSZWR1Y2VyOktoLHVzZVJlZjpUaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBLaChKaCl9LHVzZURlYnVnVmFsdWU6YWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1LaChKaCksYz1iWzBdLGQ9YlsxXTtYaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPUtoKEpoKVswXTtyZXR1cm5bVGgoKS5jdXJyZW50LFxuYV19LHVzZU11dGFibGVTb3VyY2U6UGgsdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe3JldHVybiBLaChKaClbMF19LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sRmg9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOmJpLHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OlhoLHVzZUltcGVyYXRpdmVIYW5kbGU6JGgsdXNlTGF5b3V0RWZmZWN0OlloLHVzZU1lbW86Y2ksdXNlUmVkdWNlcjpMaCx1c2VSZWY6VGgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpfSx1c2VEZWJ1Z1ZhbHVlOmFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9TGgoSmgpLGM9YlswXSxkPWJbMV07WGgoZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7ZChhKX1maW5hbGx5e3doLnRyYW5zaXRpb249Yn19LFthXSk7cmV0dXJuIGN9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1MaChKaClbMF07cmV0dXJuW1RoKCkuY3VycmVudCxcbmFdfSx1c2VNdXRhYmxlU291cmNlOlBoLHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpWzBdfSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGVpPXJhLlJlYWN0Q3VycmVudE93bmVyLHVnPSExO2Z1bmN0aW9uIGZpKGEsYixjLGQpe2IuY2hpbGQ9bnVsbD09PWE/WmcoYixudWxsLGMsZCk6WWcoYixhLmNoaWxkLGMsZCl9ZnVuY3Rpb24gZ2koYSxiLGMsZCxlKXtjPWMucmVuZGVyO3ZhciBmPWIucmVmO3RnKGIsZSk7ZD1DaChhLGIsYyxkLGYsZSk7aWYobnVsbCE9PWEmJiF1ZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS01MTcsYS5sYW5lcyY9fmUsaGkoYSxiLGUpO2IuZmxhZ3N8PTE7ZmkoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBpaShhLGIsYyxkLGUsZil7aWYobnVsbD09PWEpe3ZhciBnPWMudHlwZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmIWppKGcpJiZ2b2lkIDA9PT1nLmRlZmF1bHRQcm9wcyYmbnVsbD09PWMuY29tcGFyZSYmdm9pZCAwPT09Yy5kZWZhdWx0UHJvcHMpcmV0dXJuIGIudGFnPTE1LGIudHlwZT1nLGtpKGEsYixnLGQsZSxmKTthPVZnKGMudHlwZSxudWxsLGQsYixiLm1vZGUsZik7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfWc9YS5jaGlsZDtpZigwPT09KGUmZikmJihlPWcubWVtb2l6ZWRQcm9wcyxjPWMuY29tcGFyZSxjPW51bGwhPT1jP2M6SmUsYyhlLGQpJiZhLnJlZj09PWIucmVmKSlyZXR1cm4gaGkoYSxiLGYpO2IuZmxhZ3N8PTE7YT1UZyhnLGQpO2EucmVmPWIucmVmO2EucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9YX1cbmZ1bmN0aW9uIGtpKGEsYixjLGQsZSxmKXtpZihudWxsIT09YSYmSmUoYS5tZW1vaXplZFByb3BzLGQpJiZhLnJlZj09PWIucmVmKWlmKHVnPSExLDAhPT0oZiZlKSkwIT09KGEuZmxhZ3MmMTYzODQpJiYodWc9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxoaShhLGIsZik7cmV0dXJuIGxpKGEsYixjLGQsZil9XG5mdW5jdGlvbiBtaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZXx8XCJ1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZ1wiPT09ZC5tb2RlKWlmKDA9PT0oYi5tb2RlJjQpKWIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjB9LG5pKGIsYyk7ZWxzZSBpZigwIT09KGMmMTA3Mzc0MTgyNCkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MH0sbmkoYixudWxsIT09Zj9mLmJhc2VMYW5lczpjKTtlbHNlIHJldHVybiBhPW51bGwhPT1mP2YuYmFzZUxhbmVzfGM6YyxiLmxhbmVzPWIuY2hpbGRMYW5lcz0xMDczNzQxODI0LGIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmF9LG5pKGIsYSksbnVsbDtlbHNlIG51bGwhPT1mPyhkPWYuYmFzZUxhbmVzfGMsYi5tZW1vaXplZFN0YXRlPW51bGwpOmQ9YyxuaShiLGQpO2ZpKGEsYixlLGMpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gb2koYSxiKXt2YXIgYz1iLnJlZjtpZihudWxsPT09YSYmbnVsbCE9PWN8fG51bGwhPT1hJiZhLnJlZiE9PWMpYi5mbGFnc3w9MTI4fWZ1bmN0aW9uIGxpKGEsYixjLGQsZSl7dmFyIGY9RmYoYyk/RGY6TS5jdXJyZW50O2Y9RWYoYixmKTt0ZyhiLGUpO2M9Q2goYSxiLGMsZCxmLGUpO2lmKG51bGwhPT1hJiYhdWcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmZsYWdzJj0tNTE3LGEubGFuZXMmPX5lLGhpKGEsYixlKTtiLmZsYWdzfD0xO2ZpKGEsYixjLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gcGkoYSxiLGMsZCxlKXtpZihGZihjKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO3RnKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKW51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpLE1nKGIsYyxkKSxPZyhiLGMsZCxlKSxkPSEwO2Vsc2UgaWYobnVsbD09PWEpe3ZhciBnPWIuc3RhdGVOb2RlLGg9Yi5tZW1vaXplZFByb3BzO2cucHJvcHM9aDt2YXIgaz1nLmNvbnRleHQsbD1jLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgbCYmbnVsbCE9PWw/bD12ZyhsKToobD1GZihjKT9EZjpNLmN1cnJlbnQsbD1FZihiLGwpKTt2YXIgbj1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxBPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBufHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtBfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXG5cImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PWR8fGshPT1sKSYmTmcoYixnLGQsbCk7d2c9ITE7dmFyIHA9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cDtDZyhiLGQsZyxlKTtrPWIubWVtb2l6ZWRTdGF0ZTtoIT09ZHx8cCE9PWt8fE4uY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuJiYoR2coYixjLG4sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXdnfHxMZyhiLGMsaCxkLHAsayxsKSk/KEF8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTt5ZyhhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmxnKGIudHlwZSxoKTtnLnByb3BzPWw7QT1iLnBlbmRpbmdQcm9wcztwPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPXZnKGspOihrPUZmKGMpP0RmOk0uY3VycmVudCxrPUVmKGIsaykpO3ZhciBDPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDfHxcblwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09QXx8cCE9PWspJiZOZyhiLGcsZCxrKTt3Zz0hMTtwPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXA7Q2coYixkLGcsZSk7dmFyIHg9Yi5tZW1vaXplZFN0YXRlO2ghPT1BfHxwIT09eHx8Ti5jdXJyZW50fHx3Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIEMmJihHZyhiLGMsQyxkKSx4PWIubWVtb2l6ZWRTdGF0ZSksKGw9d2d8fExnKGIsYyxsLGQscCx4LGspKT8obnx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGV8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiZnLmNvbXBvbmVudFdpbGxVcGRhdGUoZCxcbngsayksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoZCx4LGspKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUmJihiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSYmKGIuZmxhZ3N8PTI1NikpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksYi5tZW1vaXplZFByb3BzPWQsYi5tZW1vaXplZFN0YXRlPXgpLGcucHJvcHM9ZCxnLnN0YXRlPXgsZy5jb250ZXh0PWssZD1sKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxcbmg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksZD0hMSl9cmV0dXJuIHFpKGEsYixjLGQsZixlKX1cbmZ1bmN0aW9uIHFpKGEsYixjLGQsZSxmKXtvaShhLGIpO3ZhciBnPTAhPT0oYi5mbGFncyY2NCk7aWYoIWQmJiFnKXJldHVybiBlJiZLZihiLGMsITEpLGhpKGEsYixmKTtkPWIuc3RhdGVOb2RlO2VpLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9WWcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1ZZyhiLG51bGwsaCxmKSk6ZmkoYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmS2YoYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiByaShhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0P0hmKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJkhmKGEsYi5jb250ZXh0LCExKTtlaChhLGIuY29udGFpbmVySW5mbyl9XG52YXIgc2k9e2RlaHlkcmF0ZWQ6bnVsbCxyZXRyeUxhbmU6MH07XG5mdW5jdGlvbiB0aShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1QLmN1cnJlbnQsZj0hMSxnOyhnPTAhPT0oYi5mbGFncyY2NCkpfHwoZz1udWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZT8hMTowIT09KGUmMikpO2c/KGY9ITAsYi5mbGFncyY9LTY1KTpudWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZXx8dm9pZCAwPT09ZC5mYWxsYmFja3x8ITA9PT1kLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwoZXw9MSk7SShQLGUmMSk7aWYobnVsbD09PWEpe3ZvaWQgMCE9PWQuZmFsbGJhY2smJnBoKGIpO2E9ZC5jaGlsZHJlbjtlPWQuZmFsbGJhY2s7aWYoZilyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxiLm1lbW9pemVkU3RhdGU9c2ksYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQudW5zdGFibGVfZXhwZWN0ZWRMb2FkVGltZSlyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxcbmIubWVtb2l6ZWRTdGF0ZT1zaSxiLmxhbmVzPTMzNTU0NDMyLGE7Yz12aSh7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjphfSxiLm1vZGUsYyxudWxsKTtjLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWN9aWYobnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSl7aWYoZilyZXR1cm4gZD13aShhLGIsZC5jaGlsZHJlbixkLmZhbGxiYWNrLGMpLGY9Yi5jaGlsZCxlPWEuY2hpbGQubWVtb2l6ZWRTdGF0ZSxmLm1lbW9pemVkU3RhdGU9bnVsbD09PWU/e2Jhc2VMYW5lczpjfTp7YmFzZUxhbmVzOmUuYmFzZUxhbmVzfGN9LGYuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmMsYi5tZW1vaXplZFN0YXRlPXNpLGQ7Yz14aShhLGIsZC5jaGlsZHJlbixjKTtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gY31pZihmKXJldHVybiBkPXdpKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLGYubWVtb2l6ZWRTdGF0ZT1udWxsPT09ZT97YmFzZUxhbmVzOmN9Olxue2Jhc2VMYW5lczplLmJhc2VMYW5lc3xjfSxmLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzJn5jLGIubWVtb2l6ZWRTdGF0ZT1zaSxkO2M9eGkoYSxiLGQuY2hpbGRyZW4sYyk7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGN9ZnVuY3Rpb24gdWkoYSxiLGMsZCl7dmFyIGU9YS5tb2RlLGY9YS5jaGlsZDtiPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46Yn07MD09PShlJjIpJiZudWxsIT09Zj8oZi5jaGlsZExhbmVzPTAsZi5wZW5kaW5nUHJvcHM9Yik6Zj12aShiLGUsMCxudWxsKTtjPVhnKGMsZSxkLG51bGwpO2YucmV0dXJuPWE7Yy5yZXR1cm49YTtmLnNpYmxpbmc9YzthLmNoaWxkPWY7cmV0dXJuIGN9XG5mdW5jdGlvbiB4aShhLGIsYyxkKXt2YXIgZT1hLmNoaWxkO2E9ZS5zaWJsaW5nO2M9VGcoZSx7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpjfSk7MD09PShiLm1vZGUmMikmJihjLmxhbmVzPWQpO2MucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGw7bnVsbCE9PWEmJihhLm5leHRFZmZlY3Q9bnVsbCxhLmZsYWdzPTgsYi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9YSk7cmV0dXJuIGIuY2hpbGQ9Y31cbmZ1bmN0aW9uIHdpKGEsYixjLGQsZSl7dmFyIGY9Yi5tb2RlLGc9YS5jaGlsZDthPWcuc2libGluZzt2YXIgaD17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmN9OzA9PT0oZiYyKSYmYi5jaGlsZCE9PWc/KGM9Yi5jaGlsZCxjLmNoaWxkTGFuZXM9MCxjLnBlbmRpbmdQcm9wcz1oLGc9Yy5sYXN0RWZmZWN0LG51bGwhPT1nPyhiLmZpcnN0RWZmZWN0PWMuZmlyc3RFZmZlY3QsYi5sYXN0RWZmZWN0PWcsZy5uZXh0RWZmZWN0PW51bGwpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PW51bGwpOmM9VGcoZyxoKTtudWxsIT09YT9kPVRnKGEsZCk6KGQ9WGcoZCxmLGUsbnVsbCksZC5mbGFnc3w9Mik7ZC5yZXR1cm49YjtjLnJldHVybj1iO2Muc2libGluZz1kO2IuY2hpbGQ9YztyZXR1cm4gZH1mdW5jdGlvbiB5aShhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtzZyhhLnJldHVybixiKX1cbmZ1bmN0aW9uIHppKGEsYixjLGQsZSxmKXt2YXIgZz1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWc/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZSxsYXN0RWZmZWN0OmZ9OihnLmlzQmFja3dhcmRzPWIsZy5yZW5kZXJpbmc9bnVsbCxnLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGcubGFzdD1kLGcudGFpbD1jLGcudGFpbE1vZGU9ZSxnLmxhc3RFZmZlY3Q9Zil9XG5mdW5jdGlvbiBBaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLnJldmVhbE9yZGVyLGY9ZC50YWlsO2ZpKGEsYixkLmNoaWxkcmVuLGMpO2Q9UC5jdXJyZW50O2lmKDAhPT0oZCYyKSlkPWQmMXwyLGIuZmxhZ3N8PTY0O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyY2NCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZ5aShhLGMpO2Vsc2UgaWYoMTk9PT1hLnRhZyl5aShhLGMpO2Vsc2UgaWYobnVsbCE9PWEuY2hpbGQpe2EuY2hpbGQucmV0dXJuPWE7YT1hLmNoaWxkO2NvbnRpbnVlfWlmKGE9PT1iKWJyZWFrIGE7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxhLnJldHVybj09PWIpYnJlYWsgYTthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47YT1hLnNpYmxpbmd9ZCY9MX1JKFAsZCk7aWYoMD09PShiLm1vZGUmMikpYi5tZW1vaXplZFN0YXRlPVxubnVsbDtlbHNlIHN3aXRjaChlKXtjYXNlIFwiZm9yd2FyZHNcIjpjPWIuY2hpbGQ7Zm9yKGU9bnVsbDtudWxsIT09YzspYT1jLmFsdGVybmF0ZSxudWxsIT09YSYmbnVsbD09PWloKGEpJiYoZT1jKSxjPWMuc2libGluZztjPWU7bnVsbD09PWM/KGU9Yi5jaGlsZCxiLmNoaWxkPW51bGwpOihlPWMuc2libGluZyxjLnNpYmxpbmc9bnVsbCk7emkoYiwhMSxlLGMsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09aWgoYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfXppKGIsITAsYyxudWxsLGYsYi5sYXN0RWZmZWN0KTticmVhaztjYXNlIFwidG9nZXRoZXJcIjp6aShiLCExLG51bGwsbnVsbCx2b2lkIDAsYi5sYXN0RWZmZWN0KTticmVhaztkZWZhdWx0OmIubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gaGkoYSxiLGMpe251bGwhPT1hJiYoYi5kZXBlbmRlbmNpZXM9YS5kZXBlbmRlbmNpZXMpO0RnfD1iLmxhbmVzO2lmKDAhPT0oYyZiLmNoaWxkTGFuZXMpKXtpZihudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQpdGhyb3cgRXJyb3IoeSgxNTMpKTtpZihudWxsIT09Yi5jaGlsZCl7YT1iLmNoaWxkO2M9VGcoYSxhLnBlbmRpbmdQcm9wcyk7Yi5jaGlsZD1jO2ZvcihjLnJldHVybj1iO251bGwhPT1hLnNpYmxpbmc7KWE9YS5zaWJsaW5nLGM9Yy5zaWJsaW5nPVRnKGEsYS5wZW5kaW5nUHJvcHMpLGMucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGx9cmV0dXJuIGIuY2hpbGR9cmV0dXJuIG51bGx9dmFyIEJpLENpLERpLEVpO1xuQmk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O0NpPWZ1bmN0aW9uKCl7fTtcbkRpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtkaChhaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVlhKGEsZSk7ZD1ZYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZWIoYSxlKTtkPWViKGEsZCk7Zj1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6ZT1tKHt9LGUse3ZhbHVlOnZvaWQgMH0pO2Q9bSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtmPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmU9Z2IoYSxlKTtkPWdiKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfXZiKGMsZCk7dmFyIGc7Yz1udWxsO2ZvcihsIGluIGUpaWYoIWQuaGFzT3duUHJvcGVydHkobCkmJmUuaGFzT3duUHJvcGVydHkobCkmJm51bGwhPWVbbF0paWYoXCJzdHlsZVwiPT09XG5sKXt2YXIgaD1lW2xdO2ZvcihnIGluIGgpaC5oYXNPd25Qcm9wZXJ0eShnKSYmKGN8fChjPXt9KSxjW2ddPVwiXCIpfWVsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1sJiZcImNoaWxkcmVuXCIhPT1sJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJlwiYXV0b0ZvY3VzXCIhPT1sJiYoY2EuaGFzT3duUHJvcGVydHkobCk/Znx8KGY9W10pOihmPWZ8fFtdKS5wdXNoKGwsbnVsbCkpO2ZvcihsIGluIGQpe3ZhciBrPWRbbF07aD1udWxsIT1lP2VbbF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkobCkmJmshPT1oJiYobnVsbCE9a3x8bnVsbCE9aCkpaWYoXCJzdHlsZVwiPT09bClpZihoKXtmb3IoZyBpbiBoKSFoLmhhc093blByb3BlcnR5KGcpfHxrJiZrLmhhc093blByb3BlcnR5KGcpfHwoY3x8KGM9e30pLGNbZ109XCJcIik7Zm9yKGcgaW4gaylrLmhhc093blByb3BlcnR5KGcpJiZoW2ddIT09a1tnXSYmKGN8fFxuKGM9e30pLGNbZ109a1tnXSl9ZWxzZSBjfHwoZnx8KGY9W10pLGYucHVzaChsLGMpKSxjPWs7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWw/KGs9az9rLl9faHRtbDp2b2lkIDAsaD1oP2guX19odG1sOnZvaWQgMCxudWxsIT1rJiZoIT09ayYmKGY9Znx8W10pLnB1c2gobCxrKSk6XCJjaGlsZHJlblwiPT09bD9cInN0cmluZ1wiIT09dHlwZW9mIGsmJlwibnVtYmVyXCIhPT10eXBlb2Yga3x8KGY9Znx8W10pLnB1c2gobCxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmKGNhLmhhc093blByb3BlcnR5KGwpPyhudWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1sJiZHKFwic2Nyb2xsXCIsYSksZnx8aD09PWt8fChmPVtdKSk6XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09ayYmay4kJHR5cGVvZj09PUdhP2sudG9TdHJpbmcoKTooZj1mfHxbXSkucHVzaChsLGspKX1jJiYoZj1mfHxbXSkucHVzaChcInN0eWxlXCIsXG5jKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07RWk9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07ZnVuY3Rpb24gRmkoYSxiKXtpZighbGgpc3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIEdpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcztzd2l0Y2goYi50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBudWxsO2Nhc2UgMTpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2Q9Yi5zdGF0ZU5vZGU7ZC5wZW5kaW5nQ29udGV4dCYmKGQuY29udGV4dD1kLnBlbmRpbmdDb250ZXh0LGQucGVuZGluZ0NvbnRleHQ9bnVsbCk7aWYobnVsbD09PWF8fG51bGw9PT1hLmNoaWxkKXJoKGIpP2IuZmxhZ3N8PTQ6ZC5oeWRyYXRlfHwoYi5mbGFnc3w9MjU2KTtDaShiKTtyZXR1cm4gbnVsbDtjYXNlIDU6aGgoYik7dmFyIGU9ZGgoY2guY3VycmVudCk7Yz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKURpKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTEyOCk7ZWxzZXtpZighZCl7aWYobnVsbD09PVxuYi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtyZXR1cm4gbnVsbH1hPWRoKGFoLmN1cnJlbnQpO2lmKHJoKGIpKXtkPWIuc3RhdGVOb2RlO2M9Yi50eXBlO3ZhciBmPWIubWVtb2l6ZWRQcm9wcztkW3dmXT1iO2RbeGZdPWY7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsZCk7RyhcImNsb3NlXCIsZCk7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihhPTA7YTxYZS5sZW5ndGg7YSsrKUcoWGVbYV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkcoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGQpO0coXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpHKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WmEoZCxmKTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9XG57d2FzTXVsdGlwbGU6ISFmLm11bHRpcGxlfTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGQsZiksRyhcImludmFsaWRcIixkKX12YihjLGYpO2E9bnVsbDtmb3IodmFyIGcgaW4gZilmLmhhc093blByb3BlcnR5KGcpJiYoZT1mW2ddLFwiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBlP2QudGV4dENvbnRlbnQhPT1lJiYoYT1bXCJjaGlsZHJlblwiLGVdKTpcIm51bWJlclwiPT09dHlwZW9mIGUmJmQudGV4dENvbnRlbnQhPT1cIlwiK2UmJihhPVtcImNoaWxkcmVuXCIsXCJcIitlXSk6Y2EuaGFzT3duUHJvcGVydHkoZykmJm51bGwhPWUmJlwib25TY3JvbGxcIj09PWcmJkcoXCJzY3JvbGxcIixkKSk7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGQpO2NiKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoZCk7amIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJihkLm9uY2xpY2s9XG5qZil9ZD1hO2IudXBkYXRlUXVldWU9ZDtudWxsIT09ZCYmKGIuZmxhZ3N8PTQpfWVsc2V7Zz05PT09ZS5ub2RlVHlwZT9lOmUub3duZXJEb2N1bWVudDthPT09a2IuaHRtbCYmKGE9bGIoYykpO2E9PT1rYi5odG1sP1wic2NyaXB0XCI9PT1jPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVt3Zl09YjthW3hmXT1kO0JpKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTtnPXdiKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsYSk7RyhcImNsb3NlXCIsYSk7XG5lPWQ7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGEpO2U9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8WGUubGVuZ3RoO2UrKylHKFhlW2VdLGEpO2U9ZDticmVhaztjYXNlIFwic291cmNlXCI6RyhcImVycm9yXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGEpO0coXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RyhcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpaYShhLGQpO2U9WWEoYSxkKTtHKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWViKGEsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPW0oe30sZCx7dmFsdWU6dm9pZCAwfSk7RyhcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGQpO2U9XG5nYihhLGQpO0coXCJpbnZhbGlkXCIsYSk7YnJlYWs7ZGVmYXVsdDplPWR9dmIoYyxlKTt2YXIgaD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3RiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZvYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09Y3x8XCJcIiE9PWspJiZwYihhLGspOlwibnVtYmVyXCI9PT10eXBlb2YgayYmcGIoYSxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1mJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09ZiYmXCJhdXRvRm9jdXNcIiE9PWYmJihjYS5oYXNPd25Qcm9wZXJ0eShmKT9udWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1mJiZHKFwic2Nyb2xsXCIsYSk6bnVsbCE9ayYmcWEoYSxmLGssZykpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpWYShhKTtjYihhLGQsITEpO1xuYnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoYSk7amIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1NhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZmIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmZiKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfW1mKGMsZCkmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD0xMjgpfXJldHVybiBudWxsO2Nhc2UgNjppZihhJiZudWxsIT1iLnN0YXRlTm9kZSlFaShhLGIsYS5tZW1vaXplZFByb3BzLGQpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBkJiZudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtcbmM9ZGgoY2guY3VycmVudCk7ZGgoYWguY3VycmVudCk7cmgoYik/KGQ9Yi5zdGF0ZU5vZGUsYz1iLm1lbW9pemVkUHJvcHMsZFt3Zl09YixkLm5vZGVWYWx1ZSE9PWMmJihiLmZsYWdzfD00KSk6KGQ9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxkW3dmXT1iLGIuc3RhdGVOb2RlPWQpfXJldHVybiBudWxsO2Nhc2UgMTM6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBiLmxhbmVzPWMsYjtkPW51bGwhPT1kO2M9ITE7bnVsbD09PWE/dm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLmZhbGxiYWNrJiZyaChiKTpjPW51bGwhPT1hLm1lbW9pemVkU3RhdGU7aWYoZCYmIWMmJjAhPT0oYi5tb2RlJjIpKWlmKG51bGw9PT1hJiYhMCE9PWIubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFja3x8MCE9PShQLmN1cnJlbnQmMSkpMD09PVYmJihWPTMpO2Vsc2V7aWYoMD09PVZ8fDM9PT1WKVY9XG40O251bGw9PT1VfHwwPT09KERnJjEzNDIxNzcyNykmJjA9PT0oSGkmMTM0MjE3NzI3KXx8SWkoVSxXKX1pZihkfHxjKWIuZmxhZ3N8PTQ7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiBmaCgpLENpKGIpLG51bGw9PT1hJiZjZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHJnKGIpLG51bGw7Y2FzZSAxNzpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMTk6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtmPTAhPT0oYi5mbGFncyY2NCk7Zz1kLnJlbmRlcmluZztpZihudWxsPT09ZylpZihmKUZpKGQsITEpO2Vsc2V7aWYoMCE9PVZ8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmNjQpKWZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtnPWloKGEpO2lmKG51bGwhPT1nKXtiLmZsYWdzfD02NDtGaShkLCExKTtmPWcudXBkYXRlUXVldWU7bnVsbCE9PWYmJihiLnVwZGF0ZVF1ZXVlPWYsYi5mbGFnc3w9NCk7XG5udWxsPT09ZC5sYXN0RWZmZWN0JiYoYi5maXJzdEVmZmVjdD1udWxsKTtiLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0O2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTIsZi5uZXh0RWZmZWN0PW51bGwsZi5maXJzdEVmZmVjdD1udWxsLGYubGFzdEVmZmVjdD1udWxsLGc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPW51bGwsZi5tZW1vaXplZFByb3BzPW51bGwsZi5tZW1vaXplZFN0YXRlPW51bGwsZi51cGRhdGVRdWV1ZT1udWxsLGYuZGVwZW5kZW5jaWVzPW51bGwsZi5zdGF0ZU5vZGU9bnVsbCk6KGYuY2hpbGRMYW5lcz1nLmNoaWxkTGFuZXMsZi5sYW5lcz1nLmxhbmVzLGYuY2hpbGQ9Zy5jaGlsZCxmLm1lbW9pemVkUHJvcHM9Zy5tZW1vaXplZFByb3BzLGYubWVtb2l6ZWRTdGF0ZT1nLm1lbW9pemVkU3RhdGUsZi51cGRhdGVRdWV1ZT1nLnVwZGF0ZVF1ZXVlLGYudHlwZT1nLnR5cGUsYT1nLmRlcGVuZGVuY2llcyxcbmYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7SShQLFAuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9YS5zaWJsaW5nfW51bGwhPT1kLnRhaWwmJk8oKT5KaSYmKGIuZmxhZ3N8PTY0LGY9ITAsRmkoZCwhMSksYi5sYW5lcz0zMzU1NDQzMil9ZWxzZXtpZighZilpZihhPWloKGcpLG51bGwhPT1hKXtpZihiLmZsYWdzfD02NCxmPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxGaShkLCEwKSxudWxsPT09ZC50YWlsJiZcImhpZGRlblwiPT09ZC50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhbGgpcmV0dXJuIGI9Yi5sYXN0RWZmZWN0PWQubGFzdEVmZmVjdCxudWxsIT09YiYmKGIubmV4dEVmZmVjdD1udWxsKSxudWxsfWVsc2UgMipPKCktZC5yZW5kZXJpbmdTdGFydFRpbWU+SmkmJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9XG42NCxmPSEwLEZpKGQsITEpLGIubGFuZXM9MzM1NTQ0MzIpO2QuaXNCYWNrd2FyZHM/KGcuc2libGluZz1iLmNoaWxkLGIuY2hpbGQ9Zyk6KGM9ZC5sYXN0LG51bGwhPT1jP2Muc2libGluZz1nOmIuY2hpbGQ9ZyxkLmxhc3Q9Zyl9cmV0dXJuIG51bGwhPT1kLnRhaWw/KGM9ZC50YWlsLGQucmVuZGVyaW5nPWMsZC50YWlsPWMuc2libGluZyxkLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0LGQucmVuZGVyaW5nU3RhcnRUaW1lPU8oKSxjLnNpYmxpbmc9bnVsbCxiPVAuY3VycmVudCxJKFAsZj9iJjF8MjpiJjEpLGMpOm51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBLaSgpLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09KG51bGwhPT1iLm1lbW9pemVkU3RhdGUpJiZcInVuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nXCIhPT1kLm1vZGUmJihiLmZsYWdzfD00KSxudWxsfXRocm93IEVycm9yKHkoMTU2LGIudGFnKSk7fVxuZnVuY3Rpb24gTGkoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDE6RmYoYS50eXBlKSYmR2YoKTt2YXIgYj1hLmZsYWdzO3JldHVybiBiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2I9YS5mbGFncztpZigwIT09KGImNjQpKXRocm93IEVycm9yKHkoMjg1KSk7YS5mbGFncz1iJi00MDk3fDY0O3JldHVybiBhO2Nhc2UgNTpyZXR1cm4gaGgoYSksbnVsbDtjYXNlIDEzOnJldHVybiBIKFApLGI9YS5mbGFncyxiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEgoUCksbnVsbDtjYXNlIDQ6cmV0dXJuIGZoKCksbnVsbDtjYXNlIDEwOnJldHVybiByZyhhKSxudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gS2koKSxudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24gTWkoYSxiKXt0cnl7dmFyIGM9XCJcIixkPWI7ZG8gYys9UWEoZCksZD1kLnJldHVybjt3aGlsZShkKTt2YXIgZT1jfWNhdGNoKGYpe2U9XCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIitmLm1lc3NhZ2UrXCJcXG5cIitmLnN0YWNrfXJldHVybnt2YWx1ZTphLHNvdXJjZTpiLHN0YWNrOmV9fWZ1bmN0aW9uIE5pKGEsYil7dHJ5e2NvbnNvbGUuZXJyb3IoYi52YWx1ZSl9Y2F0Y2goYyl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGM7fSl9fXZhciBPaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha01hcD9XZWFrTWFwOk1hcDtmdW5jdGlvbiBQaShhLGIsYyl7Yz16ZygtMSxjKTtjLnRhZz0zO2MucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgZD1iLnZhbHVlO2MuY2FsbGJhY2s9ZnVuY3Rpb24oKXtRaXx8KFFpPSEwLFJpPWQpO05pKGEsYil9O3JldHVybiBjfVxuZnVuY3Rpb24gU2koYSxiLGMpe2M9emcoLTEsYyk7Yy50YWc9Mzt2YXIgZD1hLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZT1iLnZhbHVlO2MucGF5bG9hZD1mdW5jdGlvbigpe05pKGEsYik7cmV0dXJuIGQoZSl9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCIhPT10eXBlb2YgZCYmKG51bGw9PT1UaT9UaT1uZXcgU2V0KFt0aGlzXSk6VGkuYWRkKHRoaXMpLE5pKGEsYikpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfXZhciBVaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha1NldD9XZWFrU2V0OlNldDtcbmZ1bmN0aW9uIFZpKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXRyeXtiKG51bGwpfWNhdGNoKGMpe1dpKGEsYyl9ZWxzZSBiLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBYaShhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOnJldHVybjtjYXNlIDE6aWYoYi5mbGFncyYyNTYmJm51bGwhPT1hKXt2YXIgYz1hLm1lbW9pemVkUHJvcHMsZD1hLm1lbW9pemVkU3RhdGU7YT1iLnN0YXRlTm9kZTtiPWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoYi5lbGVtZW50VHlwZT09PWIudHlwZT9jOmxnKGIudHlwZSxjKSxkKTthLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPWJ9cmV0dXJuO2Nhc2UgMzpiLmZsYWdzJjI1NiYmcWYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7cmV0dXJuO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fVxuZnVuY3Rpb24gWWkoYSxiLGMpe3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOmI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve2lmKDM9PT0oYS50YWcmMykpe3ZhciBkPWEuY3JlYXRlO2EuZGVzdHJveT1kKCl9YT1hLm5leHR9d2hpbGUoYSE9PWIpfWI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve3ZhciBlPWE7ZD1lLm5leHQ7ZT1lLnRhZzswIT09KGUmNCkmJjAhPT0oZSYxKSYmKFppKGMsYSksJGkoYyxhKSk7YT1kfXdoaWxlKGEhPT1iKX1yZXR1cm47Y2FzZSAxOmE9Yy5zdGF0ZU5vZGU7Yy5mbGFncyY0JiYobnVsbD09PWI/YS5jb21wb25lbnREaWRNb3VudCgpOihkPWMuZWxlbWVudFR5cGU9PT1jLnR5cGU/Yi5tZW1vaXplZFByb3BzOmxnKGMudHlwZSxiLm1lbW9pemVkUHJvcHMpLGEuY29tcG9uZW50RGlkVXBkYXRlKGQsXG5iLm1lbW9pemVkU3RhdGUsYS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSkpKTtiPWMudXBkYXRlUXVldWU7bnVsbCE9PWImJkVnKGMsYixhKTtyZXR1cm47Y2FzZSAzOmI9Yy51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YT1udWxsO2lmKG51bGwhPT1jLmNoaWxkKXN3aXRjaChjLmNoaWxkLnRhZyl7Y2FzZSA1OmE9Yy5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmE9Yy5jaGlsZC5zdGF0ZU5vZGV9RWcoYyxiLGEpfXJldHVybjtjYXNlIDU6YT1jLnN0YXRlTm9kZTtudWxsPT09YiYmYy5mbGFncyY0JiZtZihjLnR5cGUsYy5tZW1vaXplZFByb3BzKSYmYS5mb2N1cygpO3JldHVybjtjYXNlIDY6cmV0dXJuO2Nhc2UgNDpyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsPT09Yy5tZW1vaXplZFN0YXRlJiYoYz1jLmFsdGVybmF0ZSxudWxsIT09YyYmKGM9Yy5tZW1vaXplZFN0YXRlLG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbCE9PWMmJkNjKGMpKSkpO1xucmV0dXJuO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIwOmNhc2UgMjE6Y2FzZSAyMzpjYXNlIDI0OnJldHVybn10aHJvdyBFcnJvcih5KDE2MykpO31cbmZ1bmN0aW9uIGFqKGEsYil7Zm9yKHZhciBjPWE7Oyl7aWYoNT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihiKWQ9ZC5zdHlsZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5zZXRQcm9wZXJ0eT9kLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwibm9uZVwiLFwiaW1wb3J0YW50XCIpOmQuZGlzcGxheT1cIm5vbmVcIjtlbHNle2Q9Yy5zdGF0ZU5vZGU7dmFyIGU9Yy5tZW1vaXplZFByb3BzLnN0eWxlO2U9dm9pZCAwIT09ZSYmbnVsbCE9PWUmJmUuaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5XCIpP2UuZGlzcGxheTpudWxsO2Quc3R5bGUuZGlzcGxheT1zYihcImRpc3BsYXlcIixlKX19ZWxzZSBpZig2PT09Yy50YWcpYy5zdGF0ZU5vZGUubm9kZVZhbHVlPWI/XCJcIjpjLm1lbW9pemVkUHJvcHM7ZWxzZSBpZigoMjMhPT1jLnRhZyYmMjQhPT1jLnRhZ3x8bnVsbD09PWMubWVtb2l6ZWRTdGF0ZXx8Yz09PWEpJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PVxuYSlicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YSlyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGJqKGEsYil7aWYoTWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBNZi5vbkNvbW1pdEZpYmVyVW5tb3VudCl0cnl7TWYub25Db21taXRGaWJlclVubW91bnQoTGYsYil9Y2F0Y2goZil7fXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMjI6YT1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1hJiYoYT1hLmxhc3RFZmZlY3QsbnVsbCE9PWEpKXt2YXIgYz1hPWEubmV4dDtkb3t2YXIgZD1jLGU9ZC5kZXN0cm95O2Q9ZC50YWc7aWYodm9pZCAwIT09ZSlpZigwIT09KGQmNCkpWmkoYixjKTtlbHNle2Q9Yjt0cnl7ZSgpfWNhdGNoKGYpe1dpKGQsZil9fWM9Yy5uZXh0fXdoaWxlKGMhPT1hKX1icmVhaztjYXNlIDE6VmkoYik7YT1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7YS5wcm9wcz1iLm1lbW9pemVkUHJvcHMsYS5zdGF0ZT1iLm1lbW9pemVkU3RhdGUsYS5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGYpe1dpKGIsXG5mKX1icmVhaztjYXNlIDU6VmkoYik7YnJlYWs7Y2FzZSA0OmNqKGEsYil9fWZ1bmN0aW9uIGRqKGEpe2EuYWx0ZXJuYXRlPW51bGw7YS5jaGlsZD1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5maXJzdEVmZmVjdD1udWxsO2EubGFzdEVmZmVjdD1udWxsO2EubWVtb2l6ZWRQcm9wcz1udWxsO2EubWVtb2l6ZWRTdGF0ZT1udWxsO2EucGVuZGluZ1Byb3BzPW51bGw7YS5yZXR1cm49bnVsbDthLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gZWooYSl7cmV0dXJuIDU9PT1hLnRhZ3x8Mz09PWEudGFnfHw0PT09YS50YWd9XG5mdW5jdGlvbiBmaihhKXthOntmb3IodmFyIGI9YS5yZXR1cm47bnVsbCE9PWI7KXtpZihlaihiKSlicmVhayBhO2I9Yi5yZXR1cm59dGhyb3cgRXJyb3IoeSgxNjApKTt9dmFyIGM9YjtiPWMuc3RhdGVOb2RlO3N3aXRjaChjLnRhZyl7Y2FzZSA1OnZhciBkPSExO2JyZWFrO2Nhc2UgMzpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2Nhc2UgNDpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgxNjEpKTt9Yy5mbGFncyYxNiYmKHBiKGIsXCJcIiksYy5mbGFncyY9LTE3KTthOmI6Zm9yKGM9YTs7KXtmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGVqKGMucmV0dXJuKSl7Yz1udWxsO2JyZWFrIGF9Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2ZvcihjPWMuc2libGluZzs1IT09Yy50YWcmJjYhPT1jLnRhZyYmMTghPT1jLnRhZzspe2lmKGMuZmxhZ3MmMiljb250aW51ZSBiO2lmKG51bGw9PT1cbmMuY2hpbGR8fDQ9PT1jLnRhZyljb250aW51ZSBiO2Vsc2UgYy5jaGlsZC5yZXR1cm49YyxjPWMuY2hpbGR9aWYoIShjLmZsYWdzJjIpKXtjPWMuc3RhdGVOb2RlO2JyZWFrIGF9fWQ/Z2ooYSxjLGIpOmhqKGEsYyxiKX1cbmZ1bmN0aW9uIGdqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiPzg9PT1jLm5vZGVUeXBlP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKTpjLmluc2VydEJlZm9yZShhLGIpOig4PT09Yy5ub2RlVHlwZT8oYj1jLnBhcmVudE5vZGUsYi5pbnNlcnRCZWZvcmUoYSxjKSk6KGI9YyxiLmFwcGVuZENoaWxkKGEpKSxjPWMuX3JlYWN0Um9vdENvbnRhaW5lcixudWxsIT09YyYmdm9pZCAwIT09Y3x8bnVsbCE9PWIub25jbGlja3x8KGIub25jbGljaz1qZikpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihnaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KWdqKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIGhqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiP2MuaW5zZXJ0QmVmb3JlKGEsYik6Yy5hcHBlbmRDaGlsZChhKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoaGooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOyloaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBjaihhLGIpe2Zvcih2YXIgYz1iLGQ9ITEsZSxmOzspe2lmKCFkKXtkPWMucmV0dXJuO2E6Zm9yKDs7KXtpZihudWxsPT09ZCl0aHJvdyBFcnJvcih5KDE2MCkpO2U9ZC5zdGF0ZU5vZGU7c3dpdGNoKGQudGFnKXtjYXNlIDU6Zj0hMTticmVhayBhO2Nhc2UgMzplPWUuY29udGFpbmVySW5mbztmPSEwO2JyZWFrIGE7Y2FzZSA0OmU9ZS5jb250YWluZXJJbmZvO2Y9ITA7YnJlYWsgYX1kPWQucmV0dXJufWQ9ITB9aWYoNT09PWMudGFnfHw2PT09Yy50YWcpe2E6Zm9yKHZhciBnPWEsaD1jLGs9aDs7KWlmKGJqKGcsayksbnVsbCE9PWsuY2hpbGQmJjQhPT1rLnRhZylrLmNoaWxkLnJldHVybj1rLGs9ay5jaGlsZDtlbHNle2lmKGs9PT1oKWJyZWFrIGE7Zm9yKDtudWxsPT09ay5zaWJsaW5nOyl7aWYobnVsbD09PWsucmV0dXJufHxrLnJldHVybj09PWgpYnJlYWsgYTtrPWsucmV0dXJufWsuc2libGluZy5yZXR1cm49ay5yZXR1cm47az1rLnNpYmxpbmd9Zj8oZz1lLGg9Yy5zdGF0ZU5vZGUsXG44PT09Zy5ub2RlVHlwZT9nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCk6Zy5yZW1vdmVDaGlsZChoKSk6ZS5yZW1vdmVDaGlsZChjLnN0YXRlTm9kZSl9ZWxzZSBpZig0PT09Yy50YWcpe2lmKG51bGwhPT1jLmNoaWxkKXtlPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Zj0hMDtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX19ZWxzZSBpZihiaihhLGMpLG51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybjs0PT09Yy50YWcmJihkPSExKX1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGlqKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjp2YXIgYz1iLnVwZGF0ZVF1ZXVlO2M9bnVsbCE9PWM/Yy5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWMpe3ZhciBkPWM9Yy5uZXh0O2RvIDM9PT0oZC50YWcmMykmJihhPWQuZGVzdHJveSxkLmRlc3Ryb3k9dm9pZCAwLHZvaWQgMCE9PWEmJmEoKSksZD1kLm5leHQ7d2hpbGUoZCE9PWMpfXJldHVybjtjYXNlIDE6cmV0dXJuO2Nhc2UgNTpjPWIuc3RhdGVOb2RlO2lmKG51bGwhPWMpe2Q9Yi5tZW1vaXplZFByb3BzO3ZhciBlPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpkO2E9Yi50eXBlO3ZhciBmPWIudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKG51bGwhPT1mKXtjW3hmXT1kO1wiaW5wdXRcIj09PWEmJlwicmFkaW9cIj09PWQudHlwZSYmbnVsbCE9ZC5uYW1lJiYkYShjLGQpO3diKGEsZSk7Yj13YihhLGQpO2ZvcihlPTA7ZTxmLmxlbmd0aDtlKz1cbjIpe3ZhciBnPWZbZV0saD1mW2UrMV07XCJzdHlsZVwiPT09Zz90YihjLGgpOlwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWc/b2IoYyxoKTpcImNoaWxkcmVuXCI9PT1nP3BiKGMsaCk6cWEoYyxnLGgsYil9c3dpdGNoKGEpe2Nhc2UgXCJpbnB1dFwiOmFiKGMsZCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYyxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YT1jLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUsYy5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhZC5tdWx0aXBsZSxmPWQudmFsdWUsbnVsbCE9Zj9mYihjLCEhZC5tdWx0aXBsZSxmLCExKTphIT09ISFkLm11bHRpcGxlJiYobnVsbCE9ZC5kZWZhdWx0VmFsdWU/ZmIoYywhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApOmZiKGMsISFkLm11bHRpcGxlLGQubXVsdGlwbGU/W106XCJcIiwhMSkpfX19cmV0dXJuO2Nhc2UgNjppZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjIpKTtiLnN0YXRlTm9kZS5ub2RlVmFsdWU9XG5iLm1lbW9pemVkUHJvcHM7cmV0dXJuO2Nhc2UgMzpjPWIuc3RhdGVOb2RlO2MuaHlkcmF0ZSYmKGMuaHlkcmF0ZT0hMSxDYyhjLmNvbnRhaW5lckluZm8pKTtyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsIT09Yi5tZW1vaXplZFN0YXRlJiYoamo9TygpLGFqKGIuY2hpbGQsITApKTtraihiKTtyZXR1cm47Y2FzZSAxOTpraihiKTtyZXR1cm47Y2FzZSAxNzpyZXR1cm47Y2FzZSAyMzpjYXNlIDI0OmFqKGIsbnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSk7cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fWZ1bmN0aW9uIGtqKGEpe3ZhciBiPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWIpe2EudXBkYXRlUXVldWU9bnVsbDt2YXIgYz1hLnN0YXRlTm9kZTtudWxsPT09YyYmKGM9YS5zdGF0ZU5vZGU9bmV3IFVpKTtiLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9bGouYmluZChudWxsLGEsYik7Yy5oYXMoYil8fChjLmFkZChiKSxiLnRoZW4oZCxkKSl9KX19XG5mdW5jdGlvbiBtaihhLGIpe3JldHVybiBudWxsIT09YSYmKGE9YS5tZW1vaXplZFN0YXRlLG51bGw9PT1hfHxudWxsIT09YS5kZWh5ZHJhdGVkKT8oYj1iLm1lbW9pemVkU3RhdGUsbnVsbCE9PWImJm51bGw9PT1iLmRlaHlkcmF0ZWQpOiExfXZhciBuaj1NYXRoLmNlaWwsb2o9cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixwaj1yYS5SZWFjdEN1cnJlbnRPd25lcixYPTAsVT1udWxsLFk9bnVsbCxXPTAscWo9MCxyaj1CZigwKSxWPTAsc2o9bnVsbCx0aj0wLERnPTAsSGk9MCx1aj0wLHZqPW51bGwsamo9MCxKaT1JbmZpbml0eTtmdW5jdGlvbiB3aigpe0ppPU8oKSs1MDB9dmFyIFo9bnVsbCxRaT0hMSxSaT1udWxsLFRpPW51bGwseGo9ITEseWo9bnVsbCx6aj05MCxBaj1bXSxCaj1bXSxDaj1udWxsLERqPTAsRWo9bnVsbCxGaj0tMSxHaj0wLEhqPTAsSWo9bnVsbCxKaj0hMTtmdW5jdGlvbiBIZygpe3JldHVybiAwIT09KFgmNDgpP08oKTotMSE9PUZqP0ZqOkZqPU8oKX1cbmZ1bmN0aW9uIElnKGEpe2E9YS5tb2RlO2lmKDA9PT0oYSYyKSlyZXR1cm4gMTtpZigwPT09KGEmNCkpcmV0dXJuIDk5PT09ZWcoKT8xOjI7MD09PUdqJiYoR2o9dGopO2lmKDAhPT1rZy50cmFuc2l0aW9uKXswIT09SGomJihIaj1udWxsIT09dmo/dmoucGVuZGluZ0xhbmVzOjApO2E9R2o7dmFyIGI9NDE4NjExMiZ+SGo7YiY9LWI7MD09PWImJihhPTQxODYxMTImfmEsYj1hJi1hLDA9PT1iJiYoYj04MTkyKSk7cmV0dXJuIGJ9YT1lZygpOzAhPT0oWCY0KSYmOTg9PT1hP2E9WGMoMTIsR2opOihhPVNjKGEpLGE9WGMoYSxHaikpO3JldHVybiBhfVxuZnVuY3Rpb24gSmcoYSxiLGMpe2lmKDUwPERqKXRocm93IERqPTAsRWo9bnVsbCxFcnJvcih5KDE4NSkpO2E9S2ooYSxiKTtpZihudWxsPT09YSlyZXR1cm4gbnVsbDskYyhhLGIsYyk7YT09PVUmJihIaXw9Yiw0PT09ViYmSWkoYSxXKSk7dmFyIGQ9ZWcoKTsxPT09Yj8wIT09KFgmOCkmJjA9PT0oWCY0OCk/TGooYSk6KE1qKGEsYyksMD09PVgmJih3aigpLGlnKCkpKTooMD09PShYJjQpfHw5OCE9PWQmJjk5IT09ZHx8KG51bGw9PT1Daj9Daj1uZXcgU2V0KFthXSk6Q2ouYWRkKGEpKSxNaihhLGMpKTt2aj1hfWZ1bmN0aW9uIEtqKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO2M9YTtmb3IoYT1hLnJldHVybjtudWxsIT09YTspYS5jaGlsZExhbmVzfD1iLGM9YS5hbHRlcm5hdGUsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpLGM9YSxhPWEucmV0dXJuO3JldHVybiAzPT09Yy50YWc/Yy5zdGF0ZU5vZGU6bnVsbH1cbmZ1bmN0aW9uIE1qKGEsYil7Zm9yKHZhciBjPWEuY2FsbGJhY2tOb2RlLGQ9YS5zdXNwZW5kZWRMYW5lcyxlPWEucGluZ2VkTGFuZXMsZj1hLmV4cGlyYXRpb25UaW1lcyxnPWEucGVuZGluZ0xhbmVzOzA8Zzspe3ZhciBoPTMxLVZjKGcpLGs9MTw8aCxsPWZbaF07aWYoLTE9PT1sKXtpZigwPT09KGsmZCl8fDAhPT0oayZlKSl7bD1iO1JjKGspO3ZhciBuPUY7ZltoXT0xMDw9bj9sKzI1MDo2PD1uP2wrNUUzOi0xfX1lbHNlIGw8PWImJihhLmV4cGlyZWRMYW5lc3w9ayk7ZyY9fmt9ZD1VYyhhLGE9PT1VP1c6MCk7Yj1GO2lmKDA9PT1kKW51bGwhPT1jJiYoYyE9PVpmJiZQZihjKSxhLmNhbGxiYWNrTm9kZT1udWxsLGEuY2FsbGJhY2tQcmlvcml0eT0wKTtlbHNle2lmKG51bGwhPT1jKXtpZihhLmNhbGxiYWNrUHJpb3JpdHk9PT1iKXJldHVybjtjIT09WmYmJlBmKGMpfTE1PT09Yj8oYz1Mai5iaW5kKG51bGwsYSksbnVsbD09PWFnPyhhZz1bY10sYmc9T2YoVWYsamcpKTphZy5wdXNoKGMpLFxuYz1aZik6MTQ9PT1iP2M9aGcoOTksTGouYmluZChudWxsLGEpKTooYz1UYyhiKSxjPWhnKGMsTmouYmluZChudWxsLGEpKSk7YS5jYWxsYmFja1ByaW9yaXR5PWI7YS5jYWxsYmFja05vZGU9Y319XG5mdW5jdGlvbiBOaihhKXtGaj0tMTtIaj1Haj0wO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYj1hLmNhbGxiYWNrTm9kZTtpZihPaigpJiZhLmNhbGxiYWNrTm9kZSE9PWIpcmV0dXJuIG51bGw7dmFyIGM9VWMoYSxhPT09VT9XOjApO2lmKDA9PT1jKXJldHVybiBudWxsO3ZhciBkPWM7dmFyIGU9WDtYfD0xNjt2YXIgZj1QaigpO2lmKFUhPT1hfHxXIT09ZCl3aigpLFFqKGEsZCk7ZG8gdHJ5e1JqKCk7YnJlYWt9Y2F0Y2goaCl7U2ooYSxoKX13aGlsZSgxKTtxZygpO29qLmN1cnJlbnQ9ZjtYPWU7bnVsbCE9PVk/ZD0wOihVPW51bGwsVz0wLGQ9Vik7aWYoMCE9PSh0aiZIaSkpUWooYSwwKTtlbHNlIGlmKDAhPT1kKXsyPT09ZCYmKFh8PTY0LGEuaHlkcmF0ZSYmKGEuaHlkcmF0ZT0hMSxxZihhLmNvbnRhaW5lckluZm8pKSxjPVdjKGEpLDAhPT1jJiYoZD1UaihhLGMpKSk7aWYoMT09PWQpdGhyb3cgYj1zaixRaihhLDApLElpKGEsYyksTWooYSxPKCkpLGI7YS5maW5pc2hlZFdvcms9XG5hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRMYW5lcz1jO3N3aXRjaChkKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHkoMzQ1KSk7Y2FzZSAyOlVqKGEpO2JyZWFrO2Nhc2UgMzpJaShhLGMpO2lmKChjJjYyOTE0NTYwKT09PWMmJihkPWpqKzUwMC1PKCksMTA8ZCkpe2lmKDAhPT1VYyhhLDApKWJyZWFrO2U9YS5zdXNwZW5kZWRMYW5lcztpZigoZSZjKSE9PWMpe0hnKCk7YS5waW5nZWRMYW5lc3w9YS5zdXNwZW5kZWRMYW5lcyZlO2JyZWFrfWEudGltZW91dEhhbmRsZT1vZihVai5iaW5kKG51bGwsYSksZCk7YnJlYWt9VWooYSk7YnJlYWs7Y2FzZSA0OklpKGEsYyk7aWYoKGMmNDE4NjExMik9PT1jKWJyZWFrO2Q9YS5ldmVudFRpbWVzO2ZvcihlPS0xOzA8Yzspe3ZhciBnPTMxLVZjKGMpO2Y9MTw8ZztnPWRbZ107Zz5lJiYoZT1nKTtjJj1+Zn1jPWU7Yz1PKCktYztjPSgxMjA+Yz8xMjA6NDgwPmM/NDgwOjEwODA+Yz8xMDgwOjE5MjA+Yz8xOTIwOjNFMz5jPzNFMzo0MzIwPlxuYz80MzIwOjE5NjAqbmooYy8xOTYwKSktYztpZigxMDxjKXthLnRpbWVvdXRIYW5kbGU9b2YoVWouYmluZChudWxsLGEpLGMpO2JyZWFrfVVqKGEpO2JyZWFrO2Nhc2UgNTpVaihhKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHkoMzI5KSk7fX1NaihhLE8oKSk7cmV0dXJuIGEuY2FsbGJhY2tOb2RlPT09Yj9Oai5iaW5kKG51bGwsYSk6bnVsbH1mdW5jdGlvbiBJaShhLGIpe2ImPX51ajtiJj1+SGk7YS5zdXNwZW5kZWRMYW5lc3w9YjthLnBpbmdlZExhbmVzJj1+Yjtmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGI7KXt2YXIgYz0zMS1WYyhiKSxkPTE8PGM7YVtjXT0tMTtiJj1+ZH19XG5mdW5jdGlvbiBMaihhKXtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzI3KSk7T2ooKTtpZihhPT09VSYmMCE9PShhLmV4cGlyZWRMYW5lcyZXKSl7dmFyIGI9Vzt2YXIgYz1UaihhLGIpOzAhPT0odGomSGkpJiYoYj1VYyhhLGIpLGM9VGooYSxiKSl9ZWxzZSBiPVVjKGEsMCksYz1UaihhLGIpOzAhPT1hLnRhZyYmMj09PWMmJihYfD02NCxhLmh5ZHJhdGUmJihhLmh5ZHJhdGU9ITEscWYoYS5jb250YWluZXJJbmZvKSksYj1XYyhhKSwwIT09YiYmKGM9VGooYSxiKSkpO2lmKDE9PT1jKXRocm93IGM9c2osUWooYSwwKSxJaShhLGIpLE1qKGEsTygpKSxjO2EuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWI7VWooYSk7TWooYSxPKCkpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gVmooKXtpZihudWxsIT09Q2ope3ZhciBhPUNqO0NqPW51bGw7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZXhwaXJlZExhbmVzfD0yNCZhLnBlbmRpbmdMYW5lcztNaihhLE8oKSl9KX1pZygpfWZ1bmN0aW9uIFdqKGEsYil7dmFyIGM9WDtYfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIFhqKGEsYil7dmFyIGM9WDtYJj0tMjtYfD04O3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIG5pKGEsYil7SShyaixxaik7cWp8PWI7dGp8PWJ9ZnVuY3Rpb24gS2koKXtxaj1yai5jdXJyZW50O0gocmopfVxuZnVuY3Rpb24gUWooYSxiKXthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO3ZhciBjPWEudGltZW91dEhhbmRsZTstMSE9PWMmJihhLnRpbWVvdXRIYW5kbGU9LTEscGYoYykpO2lmKG51bGwhPT1ZKWZvcihjPVkucmV0dXJuO251bGwhPT1jOyl7dmFyIGQ9Yztzd2l0Y2goZC50YWcpe2Nhc2UgMTpkPWQudHlwZS5jaGlsZENvbnRleHRUeXBlcztudWxsIT09ZCYmdm9pZCAwIT09ZCYmR2YoKTticmVhaztjYXNlIDM6ZmgoKTtIKE4pO0goTSk7dWgoKTticmVhaztjYXNlIDU6aGgoZCk7YnJlYWs7Y2FzZSA0OmZoKCk7YnJlYWs7Y2FzZSAxMzpIKFApO2JyZWFrO2Nhc2UgMTk6SChQKTticmVhaztjYXNlIDEwOnJnKGQpO2JyZWFrO2Nhc2UgMjM6Y2FzZSAyNDpLaSgpfWM9Yy5yZXR1cm59VT1hO1k9VGcoYS5jdXJyZW50LG51bGwpO1c9cWo9dGo9YjtWPTA7c2o9bnVsbDt1aj1IaT1EZz0wfVxuZnVuY3Rpb24gU2ooYSxiKXtkb3t2YXIgYz1ZO3RyeXtxZygpO3ZoLmN1cnJlbnQ9R2g7aWYoeWgpe2Zvcih2YXIgZD1SLm1lbW9pemVkU3RhdGU7bnVsbCE9PWQ7KXt2YXIgZT1kLnF1ZXVlO251bGwhPT1lJiYoZS5wZW5kaW5nPW51bGwpO2Q9ZC5uZXh0fXloPSExfXhoPTA7VD1TPVI9bnVsbDt6aD0hMTtwai5jdXJyZW50PW51bGw7aWYobnVsbD09PWN8fG51bGw9PT1jLnJldHVybil7Vj0xO3NqPWI7WT1udWxsO2JyZWFrfWE6e3ZhciBmPWEsZz1jLnJldHVybixoPWMsaz1iO2I9VztoLmZsYWdzfD0yMDQ4O2guZmlyc3RFZmZlY3Q9aC5sYXN0RWZmZWN0PW51bGw7aWYobnVsbCE9PWsmJlwib2JqZWN0XCI9PT10eXBlb2YgayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGsudGhlbil7dmFyIGw9aztpZigwPT09KGgubW9kZSYyKSl7dmFyIG49aC5hbHRlcm5hdGU7bj8oaC51cGRhdGVRdWV1ZT1uLnVwZGF0ZVF1ZXVlLGgubWVtb2l6ZWRTdGF0ZT1uLm1lbW9pemVkU3RhdGUsaC5sYW5lcz1uLmxhbmVzKTpcbihoLnVwZGF0ZVF1ZXVlPW51bGwsaC5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBBPTAhPT0oUC5jdXJyZW50JjEpLHA9Zztkb3t2YXIgQztpZihDPTEzPT09cC50YWcpe3ZhciB4PXAubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09eClDPW51bGwhPT14LmRlaHlkcmF0ZWQ/ITA6ITE7ZWxzZXt2YXIgdz1wLm1lbW9pemVkUHJvcHM7Qz12b2lkIDA9PT13LmZhbGxiYWNrPyExOiEwIT09dy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjaz8hMDpBPyExOiEwfX1pZihDKXt2YXIgej1wLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT16KXt2YXIgdT1uZXcgU2V0O3UuYWRkKGwpO3AudXBkYXRlUXVldWU9dX1lbHNlIHouYWRkKGwpO2lmKDA9PT0ocC5tb2RlJjIpKXtwLmZsYWdzfD02NDtoLmZsYWdzfD0xNjM4NDtoLmZsYWdzJj0tMjk4MTtpZigxPT09aC50YWcpaWYobnVsbD09PWguYWx0ZXJuYXRlKWgudGFnPTE3O2Vsc2V7dmFyIHQ9emcoLTEsMSk7dC50YWc9MjtBZyhoLHQpfWgubGFuZXN8PTE7YnJlYWsgYX1rPVxudm9pZCAwO2g9Yjt2YXIgcT1mLnBpbmdDYWNoZTtudWxsPT09cT8ocT1mLnBpbmdDYWNoZT1uZXcgT2ksaz1uZXcgU2V0LHEuc2V0KGwsaykpOihrPXEuZ2V0KGwpLHZvaWQgMD09PWsmJihrPW5ldyBTZXQscS5zZXQobCxrKSkpO2lmKCFrLmhhcyhoKSl7ay5hZGQoaCk7dmFyIHY9WWouYmluZChudWxsLGYsbCxoKTtsLnRoZW4odix2KX1wLmZsYWdzfD00MDk2O3AubGFuZXM9YjticmVhayBhfXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApO2s9RXJyb3IoKFJhKGgudHlwZSl8fFwiQSBSZWFjdCBjb21wb25lbnRcIikrXCIgc3VzcGVuZGVkIHdoaWxlIHJlbmRlcmluZywgYnV0IG5vIGZhbGxiYWNrIFVJIHdhcyBzcGVjaWZpZWQuXFxuXFxuQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byBwcm92aWRlIGEgbG9hZGluZyBpbmRpY2F0b3Igb3IgcGxhY2Vob2xkZXIgdG8gZGlzcGxheS5cIil9NSE9PVYmJihWPTIpO2s9TWkoayxoKTtwPVxuZztkb3tzd2l0Y2gocC50YWcpe2Nhc2UgMzpmPWs7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBKPVBpKHAsZixiKTtCZyhwLEopO2JyZWFrIGE7Y2FzZSAxOmY9azt2YXIgSz1wLnR5cGUsUT1wLnN0YXRlTm9kZTtpZigwPT09KHAuZmxhZ3MmNjQpJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxudWxsIT09USYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFEuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoUSkpKSl7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBMPVNpKHAsZixiKTtCZyhwLEwpO2JyZWFrIGF9fXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApfVpqKGMpfWNhdGNoKHZhKXtiPXZhO1k9PT1jJiZudWxsIT09YyYmKFk9Yz1jLnJldHVybik7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9XG5mdW5jdGlvbiBQaigpe3ZhciBhPW9qLmN1cnJlbnQ7b2ouY3VycmVudD1HaDtyZXR1cm4gbnVsbD09PWE/R2g6YX1mdW5jdGlvbiBUaihhLGIpe3ZhciBjPVg7WHw9MTY7dmFyIGQ9UGooKTtVPT09YSYmVz09PWJ8fFFqKGEsYik7ZG8gdHJ5e2FrKCk7YnJlYWt9Y2F0Y2goZSl7U2ooYSxlKX13aGlsZSgxKTtxZygpO1g9Yztvai5jdXJyZW50PWQ7aWYobnVsbCE9PVkpdGhyb3cgRXJyb3IoeSgyNjEpKTtVPW51bGw7Vz0wO3JldHVybiBWfWZ1bmN0aW9uIGFrKCl7Zm9yKDtudWxsIT09WTspYmsoWSl9ZnVuY3Rpb24gUmooKXtmb3IoO251bGwhPT1ZJiYhUWYoKTspYmsoWSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Y2soYS5hbHRlcm5hdGUsYSxxaik7YS5tZW1vaXplZFByb3BzPWEucGVuZGluZ1Byb3BzO251bGw9PT1iP1pqKGEpOlk9Yjtwai5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBaaihhKXt2YXIgYj1hO2Rve3ZhciBjPWIuYWx0ZXJuYXRlO2E9Yi5yZXR1cm47aWYoMD09PShiLmZsYWdzJjIwNDgpKXtjPUdpKGMsYixxaik7aWYobnVsbCE9PWMpe1k9YztyZXR1cm59Yz1iO2lmKDI0IT09Yy50YWcmJjIzIT09Yy50YWd8fG51bGw9PT1jLm1lbW9pemVkU3RhdGV8fDAhPT0ocWomMTA3Mzc0MTgyNCl8fDA9PT0oYy5tb2RlJjQpKXtmb3IodmFyIGQ9MCxlPWMuY2hpbGQ7bnVsbCE9PWU7KWR8PWUubGFuZXN8ZS5jaGlsZExhbmVzLGU9ZS5zaWJsaW5nO2MuY2hpbGRMYW5lcz1kfW51bGwhPT1hJiYwPT09KGEuZmxhZ3MmMjA0OCkmJihudWxsPT09YS5maXJzdEVmZmVjdCYmKGEuZmlyc3RFZmZlY3Q9Yi5maXJzdEVmZmVjdCksbnVsbCE9PWIubGFzdEVmZmVjdCYmKG51bGwhPT1hLmxhc3RFZmZlY3QmJihhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1iLmZpcnN0RWZmZWN0KSxhLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0KSwxPGIuZmxhZ3MmJihudWxsIT09XG5hLmxhc3RFZmZlY3Q/YS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YjphLmZpcnN0RWZmZWN0PWIsYS5sYXN0RWZmZWN0PWIpKX1lbHNle2M9TGkoYik7aWYobnVsbCE9PWMpe2MuZmxhZ3MmPTIwNDc7WT1jO3JldHVybn1udWxsIT09YSYmKGEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PW51bGwsYS5mbGFnc3w9MjA0OCl9Yj1iLnNpYmxpbmc7aWYobnVsbCE9PWIpe1k9YjtyZXR1cm59WT1iPWF9d2hpbGUobnVsbCE9PWIpOzA9PT1WJiYoVj01KX1mdW5jdGlvbiBVaihhKXt2YXIgYj1lZygpO2dnKDk5LGRrLmJpbmQobnVsbCxhLGIpKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGRrKGEsYil7ZG8gT2ooKTt3aGlsZShudWxsIT09eWopO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYz1hLmZpbmlzaGVkV29yaztpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IoeSgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO3ZhciBkPWMubGFuZXN8Yy5jaGlsZExhbmVzLGU9ZCxmPWEucGVuZGluZ0xhbmVzJn5lO2EucGVuZGluZ0xhbmVzPWU7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9ZTthLm11dGFibGVSZWFkTGFuZXMmPWU7YS5lbnRhbmdsZWRMYW5lcyY9ZTtlPWEuZW50YW5nbGVtZW50cztmb3IodmFyIGc9YS5ldmVudFRpbWVzLGg9YS5leHBpcmF0aW9uVGltZXM7MDxmOyl7dmFyIGs9MzEtVmMoZiksbD0xPDxrO2Vba109MDtnW2tdPS0xO2hba109LTE7ZiY9fmx9bnVsbCE9PVxuQ2omJjA9PT0oZCYyNCkmJkNqLmhhcyhhKSYmQ2ouZGVsZXRlKGEpO2E9PT1VJiYoWT1VPW51bGwsVz0wKTsxPGMuZmxhZ3M/bnVsbCE9PWMubGFzdEVmZmVjdD8oYy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxkPWMuZmlyc3RFZmZlY3QpOmQ9YzpkPWMuZmlyc3RFZmZlY3Q7aWYobnVsbCE9PWQpe2U9WDtYfD0zMjtwai5jdXJyZW50PW51bGw7a2Y9ZmQ7Zz1OZSgpO2lmKE9lKGcpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBnKWg9e3N0YXJ0Omcuc2VsZWN0aW9uU3RhcnQsZW5kOmcuc2VsZWN0aW9uRW5kfTtlbHNlIGE6aWYoaD0oaD1nLm93bmVyRG9jdW1lbnQpJiZoLmRlZmF1bHRWaWV3fHx3aW5kb3csKGw9aC5nZXRTZWxlY3Rpb24mJmguZ2V0U2VsZWN0aW9uKCkpJiYwIT09bC5yYW5nZUNvdW50KXtoPWwuYW5jaG9yTm9kZTtmPWwuYW5jaG9yT2Zmc2V0O2s9bC5mb2N1c05vZGU7bD1sLmZvY3VzT2Zmc2V0O3RyeXtoLm5vZGVUeXBlLGsubm9kZVR5cGV9Y2F0Y2godmEpe2g9bnVsbDtcbmJyZWFrIGF9dmFyIG49MCxBPS0xLHA9LTEsQz0wLHg9MCx3PWcsej1udWxsO2I6Zm9yKDs7KXtmb3IodmFyIHU7Oyl7dyE9PWh8fDAhPT1mJiYzIT09dy5ub2RlVHlwZXx8KEE9bitmKTt3IT09a3x8MCE9PWwmJjMhPT13Lm5vZGVUeXBlfHwocD1uK2wpOzM9PT13Lm5vZGVUeXBlJiYobis9dy5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHU9dy5maXJzdENoaWxkKSlicmVhazt6PXc7dz11fWZvcig7Oyl7aWYodz09PWcpYnJlYWsgYjt6PT09aCYmKytDPT09ZiYmKEE9bik7ej09PWsmJisreD09PWwmJihwPW4pO2lmKG51bGwhPT0odT13Lm5leHRTaWJsaW5nKSlicmVhazt3PXo7ej13LnBhcmVudE5vZGV9dz11fWg9LTE9PT1BfHwtMT09PXA/bnVsbDp7c3RhcnQ6QSxlbmQ6cH19ZWxzZSBoPW51bGw7aD1ofHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBoPW51bGw7bGY9e2ZvY3VzZWRFbGVtOmcsc2VsZWN0aW9uUmFuZ2U6aH07ZmQ9ITE7SWo9bnVsbDtKaj0hMTtaPWQ7ZG8gdHJ5e2VrKCl9Y2F0Y2godmEpe2lmKG51bGw9PT1cblopdGhyb3cgRXJyb3IoeSgzMzApKTtXaShaLHZhKTtaPVoubmV4dEVmZmVjdH13aGlsZShudWxsIT09Wik7SWo9bnVsbDtaPWQ7ZG8gdHJ5e2ZvcihnPWE7bnVsbCE9PVo7KXt2YXIgdD1aLmZsYWdzO3QmMTYmJnBiKFouc3RhdGVOb2RlLFwiXCIpO2lmKHQmMTI4KXt2YXIgcT1aLmFsdGVybmF0ZTtpZihudWxsIT09cSl7dmFyIHY9cS5yZWY7bnVsbCE9PXYmJihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdj92KG51bGwpOnYuY3VycmVudD1udWxsKX19c3dpdGNoKHQmMTAzOCl7Y2FzZSAyOmZqKFopO1ouZmxhZ3MmPS0zO2JyZWFrO2Nhc2UgNjpmaihaKTtaLmZsYWdzJj0tMztpaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDEwMjQ6Wi5mbGFncyY9LTEwMjU7YnJlYWs7Y2FzZSAxMDI4OlouZmxhZ3MmPS0xMDI1O2lqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgNDppaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDg6aD1aO2NqKGcsaCk7dmFyIEo9aC5hbHRlcm5hdGU7ZGooaCk7bnVsbCE9PVxuSiYmZGooSil9Wj1aLm5leHRFZmZlY3R9fWNhdGNoKHZhKXtpZihudWxsPT09Wil0aHJvdyBFcnJvcih5KDMzMCkpO1dpKFosdmEpO1o9Wi5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1aKTt2PWxmO3E9TmUoKTt0PXYuZm9jdXNlZEVsZW07Zz12LnNlbGVjdGlvblJhbmdlO2lmKHEhPT10JiZ0JiZ0Lm93bmVyRG9jdW1lbnQmJk1lKHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdCkpe251bGwhPT1nJiZPZSh0KSYmKHE9Zy5zdGFydCx2PWcuZW5kLHZvaWQgMD09PXYmJih2PXEpLFwic2VsZWN0aW9uU3RhcnRcImluIHQ/KHQuc2VsZWN0aW9uU3RhcnQ9cSx0LnNlbGVjdGlvbkVuZD1NYXRoLm1pbih2LHQudmFsdWUubGVuZ3RoKSk6KHY9KHE9dC5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnEuZGVmYXVsdFZpZXd8fHdpbmRvdyx2LmdldFNlbGVjdGlvbiYmKHY9di5nZXRTZWxlY3Rpb24oKSxoPXQudGV4dENvbnRlbnQubGVuZ3RoLEo9TWF0aC5taW4oZy5zdGFydCxoKSxnPXZvaWQgMD09PVxuZy5lbmQ/SjpNYXRoLm1pbihnLmVuZCxoKSwhdi5leHRlbmQmJko+ZyYmKGg9ZyxnPUosSj1oKSxoPUxlKHQsSiksZj1MZSh0LGcpLGgmJmYmJigxIT09di5yYW5nZUNvdW50fHx2LmFuY2hvck5vZGUhPT1oLm5vZGV8fHYuYW5jaG9yT2Zmc2V0IT09aC5vZmZzZXR8fHYuZm9jdXNOb2RlIT09Zi5ub2RlfHx2LmZvY3VzT2Zmc2V0IT09Zi5vZmZzZXQpJiYocT1xLmNyZWF0ZVJhbmdlKCkscS5zZXRTdGFydChoLm5vZGUsaC5vZmZzZXQpLHYucmVtb3ZlQWxsUmFuZ2VzKCksSj5nPyh2LmFkZFJhbmdlKHEpLHYuZXh0ZW5kKGYubm9kZSxmLm9mZnNldCkpOihxLnNldEVuZChmLm5vZGUsZi5vZmZzZXQpLHYuYWRkUmFuZ2UocSkpKSkpKTtxPVtdO2Zvcih2PXQ7dj12LnBhcmVudE5vZGU7KTE9PT12Lm5vZGVUeXBlJiZxLnB1c2goe2VsZW1lbnQ6dixsZWZ0OnYuc2Nyb2xsTGVmdCx0b3A6di5zY3JvbGxUb3B9KTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgdC5mb2N1cyYmdC5mb2N1cygpO2Zvcih0PVxuMDt0PHEubGVuZ3RoO3QrKyl2PXFbdF0sdi5lbGVtZW50LnNjcm9sbExlZnQ9di5sZWZ0LHYuZWxlbWVudC5zY3JvbGxUb3A9di50b3B9ZmQ9ISFrZjtsZj1rZj1udWxsO2EuY3VycmVudD1jO1o9ZDtkbyB0cnl7Zm9yKHQ9YTtudWxsIT09Wjspe3ZhciBLPVouZmxhZ3M7SyYzNiYmWWkodCxaLmFsdGVybmF0ZSxaKTtpZihLJjEyOCl7cT12b2lkIDA7dmFyIFE9Wi5yZWY7aWYobnVsbCE9PVEpe3ZhciBMPVouc3RhdGVOb2RlO3N3aXRjaChaLnRhZyl7Y2FzZSA1OnE9TDticmVhaztkZWZhdWx0OnE9TH1cImZ1bmN0aW9uXCI9PT10eXBlb2YgUT9RKHEpOlEuY3VycmVudD1xfX1aPVoubmV4dEVmZmVjdH19Y2F0Y2godmEpe2lmKG51bGw9PT1aKXRocm93IEVycm9yKHkoMzMwKSk7V2koWix2YSk7Wj1aLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVopO1o9bnVsbDskZigpO1g9ZX1lbHNlIGEuY3VycmVudD1jO2lmKHhqKXhqPSExLHlqPWEsemo9YjtlbHNlIGZvcihaPWQ7bnVsbCE9PVo7KWI9XG5aLm5leHRFZmZlY3QsWi5uZXh0RWZmZWN0PW51bGwsWi5mbGFncyY4JiYoSz1aLEsuc2libGluZz1udWxsLEsuc3RhdGVOb2RlPW51bGwpLFo9YjtkPWEucGVuZGluZ0xhbmVzOzA9PT1kJiYoVGk9bnVsbCk7MT09PWQ/YT09PUVqP0RqKys6KERqPTAsRWo9YSk6RGo9MDtjPWMuc3RhdGVOb2RlO2lmKE1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgTWYub25Db21taXRGaWJlclJvb3QpdHJ5e01mLm9uQ29tbWl0RmliZXJSb290KExmLGMsdm9pZCAwLDY0PT09KGMuY3VycmVudC5mbGFncyY2NCkpfWNhdGNoKHZhKXt9TWooYSxPKCkpO2lmKFFpKXRocm93IFFpPSExLGE9UmksUmk9bnVsbCxhO2lmKDAhPT0oWCY4KSlyZXR1cm4gbnVsbDtpZygpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gZWsoKXtmb3IoO251bGwhPT1aOyl7dmFyIGE9Wi5hbHRlcm5hdGU7Smp8fG51bGw9PT1Janx8KDAhPT0oWi5mbGFncyY4KT9kYyhaLElqKSYmKEpqPSEwKToxMz09PVoudGFnJiZtaihhLFopJiZkYyhaLElqKSYmKEpqPSEwKSk7dmFyIGI9Wi5mbGFnczswIT09KGImMjU2KSYmWGkoYSxaKTswPT09KGImNTEyKXx8eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSk7Wj1aLm5leHRFZmZlY3R9fWZ1bmN0aW9uIE9qKCl7aWYoOTAhPT16ail7dmFyIGE9OTc8emo/OTc6emo7emo9OTA7cmV0dXJuIGdnKGEsZmspfXJldHVybiExfWZ1bmN0aW9uICRpKGEsYil7QWoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfWZ1bmN0aW9uIFppKGEsYil7QmoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfVxuZnVuY3Rpb24gZmsoKXtpZihudWxsPT09eWopcmV0dXJuITE7dmFyIGE9eWo7eWo9bnVsbDtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzMxKSk7dmFyIGI9WDtYfD0zMjt2YXIgYz1CajtCaj1bXTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrPTIpe3ZhciBlPWNbZF0sZj1jW2QrMV0sZz1lLmRlc3Ryb3k7ZS5kZXN0cm95PXZvaWQgMDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyl0cnl7ZygpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Yz1BajtBaj1bXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7ZT1jW2RdO2Y9Y1tkKzFdO3RyeXt2YXIgaD1lLmNyZWF0ZTtlLmRlc3Ryb3k9aCgpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Zm9yKGg9YS5jdXJyZW50LmZpcnN0RWZmZWN0O251bGwhPT1oOylhPWgubmV4dEVmZmVjdCxoLm5leHRFZmZlY3Q9bnVsbCxoLmZsYWdzJjgmJihoLnNpYmxpbmc9XG5udWxsLGguc3RhdGVOb2RlPW51bGwpLGg9YTtYPWI7aWcoKTtyZXR1cm4hMH1mdW5jdGlvbiBnayhhLGIsYyl7Yj1NaShjLGIpO2I9UGkoYSxiLDEpO0FnKGEsYik7Yj1IZygpO2E9S2ooYSwxKTtudWxsIT09YSYmKCRjKGEsMSxiKSxNaihhLGIpKX1cbmZ1bmN0aW9uIFdpKGEsYil7aWYoMz09PWEudGFnKWdrKGEsYSxiKTtlbHNlIGZvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKDM9PT1jLnRhZyl7Z2soYyxhLGIpO2JyZWFrfWVsc2UgaWYoMT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoZCkpKXthPU1pKGIsYSk7dmFyIGU9U2koYyxhLDEpO0FnKGMsZSk7ZT1IZygpO2M9S2ooYywxKTtpZihudWxsIT09YykkYyhjLDEsZSksTWooYyxlKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PVRpfHwhVGkuaGFzKGQpKSl0cnl7ZC5jb21wb25lbnREaWRDYXRjaChiLGEpfWNhdGNoKGYpe31icmVha319Yz1jLnJldHVybn19XG5mdW5jdGlvbiBZaihhLGIsYyl7dmFyIGQ9YS5waW5nQ2FjaGU7bnVsbCE9PWQmJmQuZGVsZXRlKGIpO2I9SGcoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmM7VT09PWEmJihXJmMpPT09YyYmKDQ9PT1WfHwzPT09ViYmKFcmNjI5MTQ1NjApPT09VyYmNTAwPk8oKS1qaj9RaihhLDApOnVqfD1jKTtNaihhLGIpfWZ1bmN0aW9uIGxqKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbCE9PWMmJmMuZGVsZXRlKGIpO2I9MDswPT09YiYmKGI9YS5tb2RlLDA9PT0oYiYyKT9iPTE6MD09PShiJjQpP2I9OTk9PT1lZygpPzE6MjooMD09PUdqJiYoR2o9dGopLGI9WWMoNjI5MTQ1NjAmfkdqKSwwPT09YiYmKGI9NDE5NDMwNCkpKTtjPUhnKCk7YT1LaihhLGIpO251bGwhPT1hJiYoJGMoYSxiLGMpLE1qKGEsYykpfXZhciBjaztcbmNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmxhbmVzO2lmKG51bGwhPT1hKWlmKGEubWVtb2l6ZWRQcm9wcyE9PWIucGVuZGluZ1Byb3BzfHxOLmN1cnJlbnQpdWc9ITA7ZWxzZSBpZigwIT09KGMmZCkpdWc9MCE9PShhLmZsYWdzJjE2Mzg0KT8hMDohMTtlbHNle3VnPSExO3N3aXRjaChiLnRhZyl7Y2FzZSAzOnJpKGIpO3NoKCk7YnJlYWs7Y2FzZSA1OmdoKGIpO2JyZWFrO2Nhc2UgMTpGZihiLnR5cGUpJiZKZihiKTticmVhaztjYXNlIDQ6ZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOmQ9Yi5tZW1vaXplZFByb3BzLnZhbHVlO3ZhciBlPWIudHlwZS5fY29udGV4dDtJKG1nLGUuX2N1cnJlbnRWYWx1ZSk7ZS5fY3VycmVudFZhbHVlPWQ7YnJlYWs7Y2FzZSAxMzppZihudWxsIT09Yi5tZW1vaXplZFN0YXRlKXtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gdGkoYSxiLGMpO0koUCxQLmN1cnJlbnQmMSk7Yj1oaShhLGIsYyk7cmV0dXJuIG51bGwhPT1cbmI/Yi5zaWJsaW5nOm51bGx9SShQLFAuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmQ9MCE9PShjJmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjY0KSl7aWYoZClyZXR1cm4gQWkoYSxiLGMpO2IuZmxhZ3N8PTY0fWU9Yi5tZW1vaXplZFN0YXRlO251bGwhPT1lJiYoZS5yZW5kZXJpbmc9bnVsbCxlLnRhaWw9bnVsbCxlLmxhc3RFZmZlY3Q9bnVsbCk7SShQLFAuY3VycmVudCk7aWYoZClicmVhaztlbHNlIHJldHVybiBudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gYi5sYW5lcz0wLG1pKGEsYixjKX1yZXR1cm4gaGkoYSxiLGMpfWVsc2UgdWc9ITE7Yi5sYW5lcz0wO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7ZT1FZihiLE0uY3VycmVudCk7dGcoYixjKTtlPUNoKG51bGwsYixkLGEsZSxjKTtiLmZsYWdzfD0xO2lmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mKXtiLnRhZz0xO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtpZihGZihkKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO2IubWVtb2l6ZWRTdGF0ZT1udWxsIT09ZS5zdGF0ZSYmdm9pZCAwIT09ZS5zdGF0ZT9lLnN0YXRlOm51bGw7eGcoYik7dmFyIGc9ZC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XCJmdW5jdGlvblwiPT09dHlwZW9mIGcmJkdnKGIsZCxnLGEpO2UudXBkYXRlcj1LZztiLnN0YXRlTm9kZT1lO2UuX3JlYWN0SW50ZXJuYWxzPWI7T2coYixkLGEsYyk7Yj1xaShudWxsLGIsZCwhMCxmLGMpfWVsc2UgYi50YWc9MCxmaShudWxsLGIsZSxjKSxiPWIuY2hpbGQ7cmV0dXJuIGI7Y2FzZSAxNjplPWIuZWxlbWVudFR5cGU7YTp7bnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9Mik7XG5hPWIucGVuZGluZ1Byb3BzO2Y9ZS5faW5pdDtlPWYoZS5fcGF5bG9hZCk7Yi50eXBlPWU7Zj1iLnRhZz1oayhlKTthPWxnKGUsYSk7c3dpdGNoKGYpe2Nhc2UgMDpiPWxpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1waShudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPWdpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9aWkobnVsbCxiLGUsbGcoZS50eXBlLGEpLGQsYyk7YnJlYWsgYX10aHJvdyBFcnJvcih5KDMwNixlLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGxpKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLHBpKGEsYixkLGUsYyk7Y2FzZSAzOnJpKGIpO2Q9Yi51cGRhdGVRdWV1ZTtpZihudWxsPT09YXx8bnVsbD09PWQpdGhyb3cgRXJyb3IoeSgyODIpKTtcbmQ9Yi5wZW5kaW5nUHJvcHM7ZT1iLm1lbW9pemVkU3RhdGU7ZT1udWxsIT09ZT9lLmVsZW1lbnQ6bnVsbDt5ZyhhLGIpO0NnKGIsZCxudWxsLGMpO2Q9Yi5tZW1vaXplZFN0YXRlLmVsZW1lbnQ7aWYoZD09PWUpc2goKSxiPWhpKGEsYixjKTtlbHNle2U9Yi5zdGF0ZU5vZGU7aWYoZj1lLmh5ZHJhdGUpa2g9cmYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxqaD1iLGY9bGg9ITA7aWYoZil7YT1lLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7aWYobnVsbCE9YSlmb3IoZT0wO2U8YS5sZW5ndGg7ZSs9MilmPWFbZV0sZi5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1hW2UrMV0sdGgucHVzaChmKTtjPVpnKGIsbnVsbCxkLGMpO2ZvcihiLmNoaWxkPWM7YzspYy5mbGFncz1jLmZsYWdzJi0zfDEwMjQsYz1jLnNpYmxpbmd9ZWxzZSBmaShhLGIsZCxjKSxzaCgpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIGdoKGIpLG51bGw9PT1hJiZcbnBoKGIpLGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZj1udWxsIT09YT9hLm1lbW9pemVkUHJvcHM6bnVsbCxnPWUuY2hpbGRyZW4sbmYoZCxlKT9nPW51bGw6bnVsbCE9PWYmJm5mKGQsZikmJihiLmZsYWdzfD0xNiksb2koYSxiKSxmaShhLGIsZyxjKSxiLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWEmJnBoKGIpLG51bGw7Y2FzZSAxMzpyZXR1cm4gdGkoYSxiLGMpO2Nhc2UgNDpyZXR1cm4gZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxkPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hP2IuY2hpbGQ9WWcoYixudWxsLGQsYyk6ZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGdpKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBmaShhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIGZpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbmMpLGIuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZmkoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMDphOntkPWIudHlwZS5fY29udGV4dDtlPWIucGVuZGluZ1Byb3BzO2c9Yi5tZW1vaXplZFByb3BzO2Y9ZS52YWx1ZTt2YXIgaD1iLnR5cGUuX2NvbnRleHQ7SShtZyxoLl9jdXJyZW50VmFsdWUpO2guX2N1cnJlbnRWYWx1ZT1mO2lmKG51bGwhPT1nKWlmKGg9Zy52YWx1ZSxmPUhlKGgsZik/MDooXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzP2QuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzKGgsZik6MTA3Mzc0MTgyMyl8MCwwPT09Zil7aWYoZy5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFOLmN1cnJlbnQpe2I9aGkoYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGg9Yi5jaGlsZCxudWxsIT09aCYmKGgucmV0dXJuPWIpO251bGwhPT1oOyl7dmFyIGs9aC5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PWspe2c9aC5jaGlsZDtmb3IodmFyIGw9XG5rLmZpcnN0Q29udGV4dDtudWxsIT09bDspe2lmKGwuY29udGV4dD09PWQmJjAhPT0obC5vYnNlcnZlZEJpdHMmZikpezE9PT1oLnRhZyYmKGw9emcoLTEsYyYtYyksbC50YWc9MixBZyhoLGwpKTtoLmxhbmVzfD1jO2w9aC5hbHRlcm5hdGU7bnVsbCE9PWwmJihsLmxhbmVzfD1jKTtzZyhoLnJldHVybixjKTtrLmxhbmVzfD1jO2JyZWFrfWw9bC5uZXh0fX1lbHNlIGc9MTA9PT1oLnRhZz9oLnR5cGU9PT1iLnR5cGU/bnVsbDpoLmNoaWxkOmguY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49aDtlbHNlIGZvcihnPWg7bnVsbCE9PWc7KXtpZihnPT09Yil7Zz1udWxsO2JyZWFrfWg9Zy5zaWJsaW5nO2lmKG51bGwhPT1oKXtoLnJldHVybj1nLnJldHVybjtnPWg7YnJlYWt9Zz1nLnJldHVybn1oPWd9ZmkoYSxiLGUuY2hpbGRyZW4sYyk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgOTpyZXR1cm4gZT1iLnR5cGUsZj1iLnBlbmRpbmdQcm9wcyxkPWYuY2hpbGRyZW4sdGcoYixjKSxlPXZnKGUsXG5mLnVuc3RhYmxlX29ic2VydmVkQml0cyksZD1kKGUpLGIuZmxhZ3N8PTEsZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDE0OnJldHVybiBlPWIudHlwZSxmPWxnKGUsYi5wZW5kaW5nUHJvcHMpLGY9bGcoZS50eXBlLGYpLGlpKGEsYixlLGYsZCxjKTtjYXNlIDE1OnJldHVybiBraShhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGQsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6bGcoZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKSxiLnRhZz0xLEZmKGQpPyhhPSEwLEpmKGIpKTphPSExLHRnKGIsYyksTWcoYixkLGUpLE9nKGIsZCxlLGMpLHFpKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4gQWkoYSxiLGMpO2Nhc2UgMjM6cmV0dXJuIG1pKGEsYixjKTtjYXNlIDI0OnJldHVybiBtaShhLGIsYyl9dGhyb3cgRXJyb3IoeSgxNTYsYi50YWcpKTtcbn07ZnVuY3Rpb24gaWsoYSxiLGMsZCl7dGhpcy50YWc9YTt0aGlzLmtleT1jO3RoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGw7dGhpcy5pbmRleD0wO3RoaXMucmVmPW51bGw7dGhpcy5wZW5kaW5nUHJvcHM9Yjt0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbDt0aGlzLm1vZGU9ZDt0aGlzLmZsYWdzPTA7dGhpcy5sYXN0RWZmZWN0PXRoaXMuZmlyc3RFZmZlY3Q9dGhpcy5uZXh0RWZmZWN0PW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIG5oKGEsYixjLGQpe3JldHVybiBuZXcgaWsoYSxiLGMsZCl9ZnVuY3Rpb24gamkoYSl7YT1hLnByb3RvdHlwZTtyZXR1cm4hKCFhfHwhYS5pc1JlYWN0Q29tcG9uZW50KX1cbmZ1bmN0aW9uIGhrKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBqaShhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09QWEpcmV0dXJuIDExO2lmKGE9PT1EYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBUZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPW5oKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMubmV4dEVmZmVjdD1udWxsLGMuZmlyc3RFZmZlY3Q9bnVsbCxjLmxhc3RFZmZlY3Q9bnVsbCk7Yy5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcztjLmxhbmVzPWEubGFuZXM7Yy5jaGlsZD1hLmNoaWxkO2MubWVtb2l6ZWRQcm9wcz1hLm1lbW9pemVkUHJvcHM7Yy5tZW1vaXplZFN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtjLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWU7Yj1hLmRlcGVuZGVuY2llcztjLmRlcGVuZGVuY2llcz1udWxsPT09Yj9udWxsOntsYW5lczpiLmxhbmVzLGZpcnN0Q29udGV4dDpiLmZpcnN0Q29udGV4dH07XG5jLnNpYmxpbmc9YS5zaWJsaW5nO2MuaW5kZXg9YS5pbmRleDtjLnJlZj1hLnJlZjtyZXR1cm4gY31cbmZ1bmN0aW9uIFZnKGEsYixjLGQsZSxmKXt2YXIgZz0yO2Q9YTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlqaShhKSYmKGc9MSk7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpZz01O2Vsc2UgYTpzd2l0Y2goYSl7Y2FzZSB1YTpyZXR1cm4gWGcoYy5jaGlsZHJlbixlLGYsYik7Y2FzZSBIYTpnPTg7ZXw9MTY7YnJlYWs7Y2FzZSB3YTpnPTg7ZXw9MTticmVhaztjYXNlIHhhOnJldHVybiBhPW5oKDEyLGMsYixlfDgpLGEuZWxlbWVudFR5cGU9eGEsYS50eXBlPXhhLGEubGFuZXM9ZixhO2Nhc2UgQmE6cmV0dXJuIGE9bmgoMTMsYyxiLGUpLGEudHlwZT1CYSxhLmVsZW1lbnRUeXBlPUJhLGEubGFuZXM9ZixhO2Nhc2UgQ2E6cmV0dXJuIGE9bmgoMTksYyxiLGUpLGEuZWxlbWVudFR5cGU9Q2EsYS5sYW5lcz1mLGE7Y2FzZSBJYTpyZXR1cm4gdmkoYyxlLGYsYik7Y2FzZSBKYTpyZXR1cm4gYT1uaCgyNCxjLGIsZSksYS5lbGVtZW50VHlwZT1KYSxhLmxhbmVzPWYsYTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBhJiZudWxsIT09YSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSB5YTpnPTEwO2JyZWFrIGE7Y2FzZSB6YTpnPTk7YnJlYWsgYTtjYXNlIEFhOmc9MTE7YnJlYWsgYTtjYXNlIERhOmc9MTQ7YnJlYWsgYTtjYXNlIEVhOmc9MTY7ZD1udWxsO2JyZWFrIGE7Y2FzZSBGYTpnPTIyO2JyZWFrIGF9dGhyb3cgRXJyb3IoeSgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1uaChnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIFhnKGEsYixjLGQpe2E9bmgoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHZpKGEsYixjLGQpe2E9bmgoMjMsYSxkLGIpO2EuZWxlbWVudFR5cGU9SWE7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIFVnKGEsYixjKXthPW5oKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIFdnKGEsYixjKXtiPW5oKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gamsoYSxiLGMpe3RoaXMudGFnPWI7dGhpcy5jb250YWluZXJJbmZvPWE7dGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5oeWRyYXRlPWM7dGhpcy5jYWxsYmFja05vZGU9bnVsbDt0aGlzLmNhbGxiYWNrUHJpb3JpdHk9MDt0aGlzLmV2ZW50VGltZXM9WmMoMCk7dGhpcy5leHBpcmF0aW9uVGltZXM9WmMoLTEpO3RoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5maW5pc2hlZExhbmVzPXRoaXMubXV0YWJsZVJlYWRMYW5lcz10aGlzLmV4cGlyZWRMYW5lcz10aGlzLnBpbmdlZExhbmVzPXRoaXMuc3VzcGVuZGVkTGFuZXM9dGhpcy5wZW5kaW5nTGFuZXM9MDt0aGlzLmVudGFuZ2xlbWVudHM9WmMoMCk7dGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9XG5mdW5jdGlvbiBrayhhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnRhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gbGsoYSxiLGMsZCl7dmFyIGU9Yi5jdXJyZW50LGY9SGcoKSxnPUlnKGUpO2E6aWYoYyl7Yz1jLl9yZWFjdEludGVybmFscztiOntpZihaYihjKSE9PWN8fDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDE3MCkpO3ZhciBoPWM7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aD1oLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGI7Y2FzZSAxOmlmKEZmKGgudHlwZSkpe2g9aC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYn19aD1oLnJldHVybn13aGlsZShudWxsIT09aCk7dGhyb3cgRXJyb3IoeSgxNzEpKTt9aWYoMT09PWMudGFnKXt2YXIgaz1jLnR5cGU7aWYoRmYoaykpe2M9SWYoYyxrLGgpO2JyZWFrIGF9fWM9aH1lbHNlIGM9Q2Y7bnVsbD09PWIuY29udGV4dD9iLmNvbnRleHQ9YzpiLnBlbmRpbmdDb250ZXh0PWM7Yj16ZyhmLGcpO2IucGF5bG9hZD17ZWxlbWVudDphfTtkPXZvaWQgMD09PWQ/bnVsbDpkO251bGwhPT1cbmQmJihiLmNhbGxiYWNrPWQpO0FnKGUsYik7SmcoZSxnLGYpO3JldHVybiBnfWZ1bmN0aW9uIG1rKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gbmsoYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIG9rKGEsYil7bmsoYSxiKTsoYT1hLmFsdGVybmF0ZSkmJm5rKGEsYil9ZnVuY3Rpb24gcGsoKXtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIHFrKGEsYixjKXt2YXIgZD1udWxsIT1jJiZudWxsIT1jLmh5ZHJhdGlvbk9wdGlvbnMmJmMuaHlkcmF0aW9uT3B0aW9ucy5tdXRhYmxlU291cmNlc3x8bnVsbDtjPW5ldyBqayhhLGIsbnVsbCE9YyYmITA9PT1jLmh5ZHJhdGUpO2I9bmgoMyxudWxsLG51bGwsMj09PWI/NzoxPT09Yj8zOjApO2MuY3VycmVudD1iO2Iuc3RhdGVOb2RlPWM7eGcoYik7YVtmZl09Yy5jdXJyZW50O2NmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspe2I9ZFthXTt2YXIgZT1iLl9nZXRWZXJzaW9uO2U9ZShiLl9zb3VyY2UpO251bGw9PWMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT9jLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W2IsZV06Yy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2goYixlKX10aGlzLl9pbnRlcm5hbFJvb3Q9Y31cbnFrLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7bGsoYSx0aGlzLl9pbnRlcm5hbFJvb3QsbnVsbCxudWxsKX07cWsucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9pbnRlcm5hbFJvb3QsYj1hLmNvbnRhaW5lckluZm87bGsobnVsbCxhLG51bGwsZnVuY3Rpb24oKXtiW2ZmXT1udWxsfSl9O2Z1bmN0aW9uIHJrKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1cbmZ1bmN0aW9uIHNrKGEsYil7Ynx8KGI9YT85PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLmZpcnN0Q2hpbGQ6bnVsbCxiPSEoIWJ8fDEhPT1iLm5vZGVUeXBlfHwhYi5oYXNBdHRyaWJ1dGUoXCJkYXRhLXJlYWN0cm9vdFwiKSkpO2lmKCFiKWZvcih2YXIgYztjPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGMpO3JldHVybiBuZXcgcWsoYSwwLGI/e2h5ZHJhdGU6ITB9OnZvaWQgMCl9XG5mdW5jdGlvbiB0ayhhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPW1rKGcpO2guY2FsbChhKX19bGsoYixnLGEsZSl9ZWxzZXtmPWMuX3JlYWN0Um9vdENvbnRhaW5lcj1zayhjLGQpO2c9Zi5faW50ZXJuYWxSb290O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaz1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1tayhnKTtrLmNhbGwoYSl9fVhqKGZ1bmN0aW9uKCl7bGsoYixnLGEsZSl9KX1yZXR1cm4gbWsoZyl9ZWM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKTtKZyhhLDQsYik7b2soYSw0KX19O2ZjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPUhnKCk7SmcoYSw2NzEwODg2NCxiKTtvayhhLDY3MTA4ODY0KX19O1xuZ2M9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKSxjPUlnKGEpO0pnKGEsYyxiKTtvayhhLGMpfX07aGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYigpfTtcbnliPWZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYil7Y2FzZSBcImlucHV0XCI6YWIoYSxjKTtiPWMubmFtZTtpZihcInJhZGlvXCI9PT1jLnR5cGUmJm51bGwhPWIpe2ZvcihjPWE7Yy5wYXJlbnROb2RlOyljPWMucGFyZW50Tm9kZTtjPWMucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9XCIrSlNPTi5zdHJpbmdpZnkoXCJcIitiKSsnXVt0eXBlPVwicmFkaW9cIl0nKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdO2lmKGQhPT1hJiZkLmZvcm09PT1hLmZvcm0pe3ZhciBlPURiKGQpO2lmKCFlKXRocm93IEVycm9yKHkoOTApKTtXYShkKTthYihkLGUpfX19YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYSxjKTticmVhaztjYXNlIFwic2VsZWN0XCI6Yj1jLnZhbHVlLG51bGwhPWImJmZiKGEsISFjLm11bHRpcGxlLGIsITEpfX07R2I9V2o7XG5IYj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPVg7WHw9NDt0cnl7cmV0dXJuIGdnKDk4LGEuYmluZChudWxsLGIsYyxkLGUpKX1maW5hbGx5e1g9ZiwwPT09WCYmKHdqKCksaWcoKSl9fTtJYj1mdW5jdGlvbigpezA9PT0oWCY0OSkmJihWaigpLE9qKCkpfTtKYj1mdW5jdGlvbihhLGIpe3ZhciBjPVg7WHw9Mjt0cnl7cmV0dXJuIGEoYil9ZmluYWxseXtYPWMsMD09PVgmJih3aigpLGlnKCkpfX07ZnVuY3Rpb24gdWsoYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4ga2soYSxiLG51bGwsYyl9dmFyIHZrPXtFdmVudHM6W0NiLHVlLERiLEViLEZiLE9qLHtjdXJyZW50OiExfV19LHdrPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp3YyxidW5kbGVUeXBlOjAsdmVyc2lvbjpcIjE3LjAuMlwiLHJlbmRlcmVyUGFja2FnZU5hbWU6XCJyZWFjdC1kb21cIn07XG52YXIgeGs9e2J1bmRsZVR5cGU6d2suYnVuZGxlVHlwZSx2ZXJzaW9uOndrLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTp3ay5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOndrLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oYSl7YT1jYyhhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6d2suZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fFxucGssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbH07aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciB5az1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXlrLmlzRGlzYWJsZWQmJnlrLnN1cHBvcnRzRmliZXIpdHJ5e0xmPXlrLmluamVjdCh4ayksTWY9eWt9Y2F0Y2goYSl7fX1leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXZrO2V4cG9ydHMuY3JlYXRlUG9ydGFsPXVrO1xuZXhwb3J0cy5maW5kRE9NTm9kZT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKDE9PT1hLm5vZGVUeXBlKXJldHVybiBhO3ZhciBiPWEuX3JlYWN0SW50ZXJuYWxzO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcih5KDE4OCkpO3Rocm93IEVycm9yKHkoMjY4LE9iamVjdC5rZXlzKGEpKSk7fWE9Y2MoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhLGIpe3ZhciBjPVg7aWYoMCE9PShjJjQ4KSlyZXR1cm4gYShiKTtYfD0xO3RyeXtpZihhKXJldHVybiBnZyg5OSxhLmJpbmQobnVsbCxiKSl9ZmluYWxseXtYPWMsaWcoKX19O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIXJrKGIpKXRocm93IEVycm9yKHkoMjAwKSk7cmV0dXJuIHRrKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMucmVuZGVyPWZ1bmN0aW9uKGEsYixjKXtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4gdGsobnVsbCxhLGIsITEsYyl9O2V4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihhKXtpZighcmsoYSkpdGhyb3cgRXJyb3IoeSg0MCkpO3JldHVybiBhLl9yZWFjdFJvb3RDb250YWluZXI/KFhqKGZ1bmN0aW9uKCl7dGsobnVsbCxudWxsLGEsITEsZnVuY3Rpb24oKXthLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbDthW2ZmXT1udWxsfSl9KSwhMCk6ITF9O2V4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9V2o7ZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdWsoYSxiLDI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsKX07XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFyayhjKSl0aHJvdyBFcnJvcih5KDIwMCkpO2lmKG51bGw9PWF8fHZvaWQgMD09PWEuX3JlYWN0SW50ZXJuYWxzKXRocm93IEVycm9yKHkoMzgpKTtyZXR1cm4gdGsoYSxiLGMsITEsZCl9O2V4cG9ydHMudmVyc2lvbj1cIjE3LjAuMlwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IHtBY3Rpb24sIFJlZHVjZXIsIFN0YXRlfSBmcm9tICcuL2NyZWF0ZVN0b3JlJztcblxuaW50ZXJmYWNlIFJlZHVjZXJzTWFwT2JqZWN0PFMgZXh0ZW5kcyBTdGF0ZSA9IGFueSwgQSBleHRlbmRzIEFjdGlvbiA9IGFueT4ge1xuICBba2V5OiBzdHJpbmddOiBSZWR1Y2VyPFMsIEE+O1xufVxuXG50eXBlIFN0YXRlRnJvbVJlZHVjZXJzTWFwT2JqZWN0PE0+ID0gTSBleHRlbmRzIFJlZHVjZXJzTWFwT2JqZWN0XG4gID8ge1tQIGluIGtleW9mIE1dOiBNW1BdIGV4dGVuZHMgUmVkdWNlcjxpbmZlciBTLCBhbnk+ID8gUyA6IG5ldmVyfVxuICA6IG5ldmVyO1xuXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnM8UyBleHRlbmRzIFN0YXRlLCBBIGV4dGVuZHMgQWN0aW9uPihyZWR1Y2VyczogUmVkdWNlcnNNYXBPYmplY3QpOiBSZWR1Y2VyPFMsIEE+IHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGZpbmFsUmVkdWNlcnNPYmo6IFJlZHVjZXJzTWFwT2JqZWN0ID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgcmVkdWNlcktleXMpIHtcbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNPYmpba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICgoc3RhdGU6IFN0YXRlRnJvbVJlZHVjZXJzTWFwT2JqZWN0PHR5cGVvZiByZWR1Y2Vycz4gPSB7fSwgYWN0aW9uOiBBKSA9PiB7XG4gICAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0U3RhdGU6IFN0YXRlRnJvbVJlZHVjZXJzTWFwT2JqZWN0PHR5cGVvZiByZWR1Y2Vycz4gPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZHVjZXJLZXlzKSB7XG4gICAgICBjb25zdCBwcmV2U3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gZmluYWxSZWR1Y2Vyc09ialtrZXldKHByZXZTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2U3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfSkgYXMgYW55IGFzIFJlZHVjZXI8UywgQT47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2VycztcbiIsImV4cG9ydCB0eXBlIFN0YXRlID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgYW55Pj47XG5leHBvcnQgdHlwZSBBY3Rpb24gPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgcGF5bG9hZDogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgUmVkdWNlcjxTIGV4dGVuZHMgU3RhdGUsIEEgZXh0ZW5kcyBBY3Rpb24+ID0gKHM6IFMsIGE6IEEpID0+IFM7XG50eXBlIExpc3RlbmVyPFMgZXh0ZW5kcyBTdGF0ZT4gPSAobnM6IFMsIHBzPzogUykgPT4gdm9pZDtcbnR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlPFMgZXh0ZW5kcyBTdGF0ZSwgQSBleHRlbmRzIEFjdGlvbj4ge1xuICBkaXNwYXRjaDogKGE6IEEpID0+IHZvaWQ7XG4gIGdldFN0YXRlOiAoKSA9PiBTO1xuICBzdWJzY3JpYmU6IChsaXN0ZW5lcjogTGlzdGVuZXI8Uz4pID0+IFVuc3Vic2NyaWJlO1xufVxuXG4vKipcbiAqIOeugOWNleWunueOsOeahCBSZWR1eFxuICogQHBhcmFtIHByZWxvYWRlZFN0YXRlIOWIneWniyBzdGF0ZVxuICogQHBhcmFtIHJlZHVjZXIgcmVkdWNlciBwdXJlIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBzdG9yZVxuICovXG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxTIGV4dGVuZHMgU3RhdGUsIEEgZXh0ZW5kcyBBY3Rpb24+KFxuICBwcmVsb2FkZWRTdGF0ZTogUyxcbiAgcmVkdWNlcjogUmVkdWNlcjxTLCBBPixcbik6IFN0b3JlPFJlYWRvbmx5PFM+LCBBPiB7XG4gIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXI8Uz5bXSA9IFtdO1xuICBsZXQgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG5cbiAgY29uc3QgZGlzcGF0Y2ggPSAoYWN0aW9uOiBBKSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gcmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgY29uc3QgcHJldlN0YXRlID0gY3VycmVudFN0YXRlO1xuICAgIGN1cnJlbnRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgIGZvciAoY29uc3QgY2Igb2YgbGlzdGVuZXJzKSB7XG4gICAgICBjYihjdXJyZW50U3RhdGUsIHByZXZTdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHN1YnNjcmliZSA9IChsaXN0ZW5lcjogTGlzdGVuZXI8Uz4pID0+IHtcbiAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBnZXRTdGF0ZSA9ICgpID0+IHtcbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGlzcGF0Y2gsXG4gICAgZ2V0U3RhdGUsXG4gICAgc3Vic2NyaWJlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdG9yZTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgQXBwU2V0dGluZyB7XG4gIHNob3VsZFNwbGl0TWVtb1dvcmQ6IGJvb2xlYW47XG4gIHNob3VsZEhpZGVJbWFnZVVybDogYm9vbGVhbjtcbiAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IGJvb2xlYW47XG4gIHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlIGV4dGVuZHMgQXBwU2V0dGluZyB7XG4gIG1hcmtNZW1vSWQ6IHN0cmluZztcbiAgZWRpdE1lbW9JZDogc3RyaW5nO1xuICBpc01vYmlsZVZpZXc6IGJvb2xlYW47XG4gIHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFNldE1hcmtNZW1vSWRBY3Rpb24ge1xuICB0eXBlOiAnU0VUX01BUktfTUVNT19JRCc7XG4gIHBheWxvYWQ6IHtcbiAgICBtYXJrTWVtb0lkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRFZGl0TWVtb0lkQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9FRElUX01FTU9fSUQnO1xuICBwYXlsb2FkOiB7XG4gICAgZWRpdE1lbW9JZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0TW9iaWxlVmlld0FjdGlvbiB7XG4gIHR5cGU6ICdTRVRfTU9CSUxFX1ZJRVcnO1xuICBwYXlsb2FkOiB7XG4gICAgaXNNb2JpbGVWaWV3OiBib29sZWFuO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0U2hvd1NpZGViYXJBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1NIT1dfU0lERUJBUl9JTl9NT0JJTEVfVklFVyc7XG4gIHBheWxvYWQ6IHtcbiAgICBzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXc6IGJvb2xlYW47XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRBcHBTZXR0aW5nQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9BUFBfU0VUVElORyc7XG4gIHBheWxvYWQ6IFBhcnRpYWw8QXBwU2V0dGluZz47XG59XG5cbmV4cG9ydCB0eXBlIEFjdGlvbnMgPVxuICB8IFNldE1vYmlsZVZpZXdBY3Rpb25cbiAgfCBTZXRTaG93U2lkZWJhckFjdGlvblxuICB8IFNldEVkaXRNZW1vSWRBY3Rpb25cbiAgfCBTZXRNYXJrTWVtb0lkQWN0aW9uXG4gIHwgU2V0QXBwU2V0dGluZ0FjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ1NFVF9NQVJLX01FTU9fSUQnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQubWFya01lbW9JZCA9PT0gc3RhdGUubWFya01lbW9JZCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtYXJrTWVtb0lkOiBhY3Rpb24ucGF5bG9hZC5tYXJrTWVtb0lkLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0VESVRfTUVNT19JRCc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5lZGl0TWVtb0lkID09PSBzdGF0ZS5lZGl0TWVtb0lkKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGVkaXRNZW1vSWQ6IGFjdGlvbi5wYXlsb2FkLmVkaXRNZW1vSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfTU9CSUxFX1ZJRVcnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuaXNNb2JpbGVWaWV3ID09PSBzdGF0ZS5pc01vYmlsZVZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXNNb2JpbGVWaWV3OiBhY3Rpb24ucGF5bG9hZC5pc01vYmlsZVZpZXcsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfU0hPV19TSURFQkFSX0lOX01PQklMRV9WSUVXJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnNob3dTaWRlcmJhckluTW9iaWxlVmlldyA9PT0gc3RhdGUuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogYWN0aW9uLnBheWxvYWQuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0FQUF9TRVRUSU5HJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0YXRlOiBTdGF0ZSA9IHtcbiAgbWFya01lbW9JZDogJycsXG4gIGVkaXRNZW1vSWQ6ICcnLFxuICBzaG91bGRTcGxpdE1lbW9Xb3JkOiB0cnVlLFxuICBzaG91bGRIaWRlSW1hZ2VVcmw6IHRydWUsXG4gIHNob3VsZFVzZU1hcmtkb3duUGFyc2VyOiB0cnVlLFxuICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogZmFsc2UsXG4gIGlzTW9iaWxlVmlldzogZmFsc2UsXG4gIHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogZmFsc2UsXG59O1xuIiwiZXhwb3J0IHR5cGUgU3RhdGUgPSBBcHBMb2NhdGlvbjtcblxuaW50ZXJmYWNlIFNldExvY2F0aW9uIHtcbiAgdHlwZTogJ1NFVF9MT0NBVElPTic7XG4gIHBheWxvYWQ6IFN0YXRlO1xufVxuXG5pbnRlcmZhY2UgU2V0UGF0aG5hbWVBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1BBVEhOQU1FJztcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRRdWVyeSB7XG4gIHR5cGU6ICdTRVRfUVVFUlknO1xuICBwYXlsb2FkOiBRdWVyeTtcbn1cblxuaW50ZXJmYWNlIFNldFF1ZXJ5RmlsdGVyQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9RVUVSWV9GSUxURVInO1xuICBwYXlsb2FkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZXRUYWdRdWVyeUFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfVEFHX1FVRVJZJztcbiAgcGF5bG9hZDoge1xuICAgIHRhZzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0RnJvbUFuZFRvUXVlcnlBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0RVUkFUSU9OX1FVRVJZJztcbiAgcGF5bG9hZDoge1xuICAgIGR1cmF0aW9uOiBEdXJhdGlvbiB8IG51bGw7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRUeXBlQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9UWVBFJztcbiAgcGF5bG9hZDoge1xuICAgIHR5cGU6IE1lbW9TcGVjVHlwZSB8ICcnO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0VGV4dEFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfVEVYVCc7XG4gIHBheWxvYWQ6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRIYXNoQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9IQVNIJztcbiAgcGF5bG9hZDoge1xuICAgIGhhc2g6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9XG4gIHwgU2V0TG9jYXRpb25cbiAgfCBTZXRQYXRobmFtZUFjdGlvblxuICB8IFNldFF1ZXJ5XG4gIHwgU2V0VGFnUXVlcnlBY3Rpb25cbiAgfCBTZXRGcm9tQW5kVG9RdWVyeUFjdGlvblxuICB8IFNldFR5cGVBY3Rpb25cbiAgfCBTZXRUZXh0QWN0aW9uXG4gIHwgU2V0UXVlcnlGaWx0ZXJBY3Rpb25cbiAgfCBTZXRIYXNoQWN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUsIGFjdGlvbjogQWN0aW9ucykge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX0xPQ0FUSU9OJzoge1xuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH1cbiAgICBjYXNlICdTRVRfUEFUSE5BTUUnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQucGF0aG5hbWUgPT09IHN0YXRlLnBhdGhuYW1lKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHBhdGhuYW1lOiBhY3Rpb24ucGF5bG9hZC5wYXRobmFtZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9IQVNIJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLmhhc2ggPT09IHN0YXRlLmhhc2gpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaGFzaDogYWN0aW9uLnBheWxvYWQuaGFzaCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9RVUVSWSc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1RBR19RVUVSWSc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC50YWcgPT09IHN0YXRlLnF1ZXJ5LnRhZykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIHRhZzogYWN0aW9uLnBheWxvYWQudGFnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0RVUkFUSU9OX1FVRVJZJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLmR1cmF0aW9uID09PSBzdGF0ZS5xdWVyeS5kdXJhdGlvbikge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5kdXJhdGlvbixcbiAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLmR1cmF0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfVFlQRSc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC50eXBlID09PSBzdGF0ZS5xdWVyeS50eXBlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgdHlwZTogYWN0aW9uLnBheWxvYWQudHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9URVhUJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnRleHQgPT09IHN0YXRlLnF1ZXJ5LnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICB0ZXh0OiBhY3Rpb24ucGF5bG9hZC50ZXh0LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1FVRVJZX0ZJTFRFUic6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZCA9PT0gc3RhdGUucXVlcnkuZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgZmlsdGVyOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIHBhdGhuYW1lOiAnLycsXG4gIGhhc2g6ICcnLFxuICBxdWVyeToge1xuICAgIHRhZzogJycsXG4gICAgZHVyYXRpb246IG51bGwsXG4gICAgdHlwZTogJycsXG4gICAgdGV4dDogJycsXG4gICAgZmlsdGVyOiAnJyxcbiAgfSxcbn07XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5uYW1lc3BhY2UgdXRpbHMge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0Tm93VGltZVN0YW1wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBhcnNlSW50KG1vbWVudCgpLmZvcm1hdCgneCcpKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRPU1ZlcnNpb24oKTogJ1dpbmRvd3MnIHwgJ01hY09TJyB8ICdMaW51eCcgfCAnVW5rbm93bicge1xuICAgIGNvbnN0IGFwcFZlcnNpb24gPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIGxldCBkZXRlY3RlZE9TOiAnV2luZG93cycgfCAnTWFjT1MnIHwgJ0xpbnV4JyB8ICdVbmtub3duJyA9ICdVbmtub3duJztcblxuICAgIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoJ1dpbicpICE9IC0xKSB7XG4gICAgICBkZXRlY3RlZE9TID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAoYXBwVmVyc2lvbi5pbmRleE9mKCdNYWMnKSAhPSAtMSkge1xuICAgICAgZGV0ZWN0ZWRPUyA9ICdNYWNPUyc7XG4gICAgfSBlbHNlIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoJ0xpbnV4JykgIT0gLTEpIHtcbiAgICAgIGRldGVjdGVkT1MgPSAnTGludXgnO1xuICAgIH1cblxuICAgIHJldHVybiBkZXRlY3RlZE9TO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVTdGFtcEJ5RGF0ZSh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0ID0gdC5yZXBsYWNlQWxsKCctJywgJy8nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHQpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RhbXBCeURhdGUodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGdldFRpbWVTdGFtcEJ5RGF0ZSh0KSk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVTdHJpbmcodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGdldFRpbWVTdGFtcEJ5RGF0ZSh0KSk7XG5cbiAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gZC5nZXRNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXRlID0gZC5nZXREYXRlKCk7XG5cbiAgICByZXR1cm4gYCR7eWVhcn0vJHttb250aH0vJHtkYXRlfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0VGltZVN0cmluZyh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZ2V0VGltZVN0YW1wQnlEYXRlKHQpKTtcblxuICAgIGNvbnN0IGhvdXJzID0gZC5nZXRIb3VycygpO1xuICAgIGNvbnN0IG1pbnMgPSBkLmdldE1pbnV0ZXMoKTtcblxuICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XG4gICAgY29uc3QgbWluc1N0ciA9IG1pbnMgPCAxMCA/ICcwJyArIG1pbnMgOiBtaW5zO1xuXG4gICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnNTdHJ9YDtcbiAgfVxuXG4gIC8vIEZvciBleGFtcGxlOiAyMDIxLTQtOCAxNzo1MjoxN1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0RGF0ZVRpbWVTdHJpbmcodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGdldFRpbWVTdGFtcEJ5RGF0ZSh0KSk7XG5cbiAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gZC5nZXRNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXRlID0gZC5nZXREYXRlKCk7XG4gICAgY29uc3QgaG91cnMgPSBkLmdldEhvdXJzKCk7XG4gICAgY29uc3QgbWlucyA9IGQuZ2V0TWludXRlcygpO1xuICAgIC8vIGNvbnN0IHNlY3MgPSBkLmdldFNlY29uZHMoKTtcblxuICAgIGNvbnN0IG1vbnRoU3RyID0gbW9udGggPCAxMCA/ICcwJyArIG1vbnRoIDogbW9udGg7XG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUgPCAxMCA/ICcwJyArIGRhdGUgOiBkYXRlO1xuICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XG4gICAgY29uc3QgbWluc1N0ciA9IG1pbnMgPCAxMCA/ICcwJyArIG1pbnMgOiBtaW5zO1xuICAgIC8vIGNvbnN0IHNlY3NTdHIgPSBzZWNzIDwgMTAgPyBcIjBcIiArIHNlY3MgOiBzZWNzO1xuICAgIGNvbnN0IHNlY3NTdHIgPSAnMDAnO1xuXG4gICAgcmV0dXJuIGAke3llYXJ9LyR7bW9udGhTdHJ9LyR7ZGF0ZVN0cn0gJHtob3Vyc1N0cn06JHttaW5zU3RyfToke3NlY3NTdHJ9YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWR1cGU8VD4oZGF0YTogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWR1cGVPYmplY3RXaXRoSWQ8VCBleHRlbmRzIHtpZDogc3RyaW5nfT4oZGF0YTogVFtdKTogVFtdIHtcbiAgICBjb25zdCBpZFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGEpIHtcbiAgICAgIGlmICghaWRTZXQuaGFzKGQuaWQpKSB7XG4gICAgICAgIGlkU2V0LmFkZChkLmlkKTtcbiAgICAgICAgcmVzdWx0LnB1c2goZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmbjogRnVuY3Rpb25UeXBlLCBkZWxheTogbnVtYmVyKSB7XG4gICAgbGV0IHRpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZm4sIGRlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlKGZuOiBGdW5jdGlvblR5cGUsIGRlbGF5OiBudW1iZXIpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmbigpO1xuICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3RUb1BhcmFtc1N0cmluZyhvYmplY3Q6IEtWT2JqZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCB2YWwgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcGFyYW1zLnB1c2goLi4udHJhbnNmb3JtT2JqZWN0VG9QYXJhbXNTdHJpbmcodmFsKS5zcGxpdCgnJicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbXMucHVzaChgJHtrZXl9PSR7dmFsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcmJyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUGFyYW1zU3RyaW5nVG9PYmplY3QocGFyYW1zU3RyaW5nOiBzdHJpbmcpOiBLVk9iamVjdCB7XG4gICAgY29uc3Qgb2JqZWN0OiBLVk9iamVjdCA9IHt9O1xuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc1N0cmluZy5zcGxpdCgnJicpO1xuXG4gICAgZm9yIChjb25zdCBwIG9mIHBhcmFtcykge1xuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IHAuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChrZXkgJiYgdmFsKSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0TnVsbEtleXMob2JqZWN0OiBLVk9iamVjdCk6IEtWT2JqZWN0IHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsT2JqZWN0OiBLVk9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoKTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHRlbXAgPSBmaWx0ZXJPYmplY3ROdWxsS2V5cyhKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbCkpKTtcbiAgICAgICAgaWYgKHRlbXAgJiYgT2JqZWN0LmtleXModGVtcCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbmFsT2JqZWN0W2tleV0gPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgZmluYWxPYmplY3Rba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaW5hbE9iamVjdDtcbiAgfVxuXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZykge1xuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQsIG1ldGhvZHMgbm90IHN1cHBvcnRzLicpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZVNpemUoc3JjOiBzdHJpbmcpOiBQcm9taXNlPHt3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcn0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGltZ0VsID0gbmV3IEltYWdlKCk7XG5cbiAgICAgIGltZ0VsLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1nRWw7XG5cbiAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe3dpZHRoOiAwLCBoZWlnaHQ6IDB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaW1nRWwub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh7d2lkdGg6IDAsIGhlaWdodDogMH0pO1xuICAgICAgfTtcblxuICAgICAgaW1nRWwuY2xhc3NOYW1lID0gJ2hpZGRlbic7XG4gICAgICBpbWdFbC5zcmMgPSBzcmM7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZ0VsKTtcbiAgICAgIGltZ0VsLnJlbW92ZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlIHtcbiAgbWVtb3M6IE1vZGVsLk1lbW9bXTtcbiAgdGFnczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZXRNZW1vc0FjdGlvbiB7XG4gIHR5cGU6ICdTRVRfTUVNT1MnO1xuICBwYXlsb2FkOiB7XG4gICAgbWVtb3M6IE1vZGVsLk1lbW9bXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldFRhZ3NBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1RBR1MnO1xuICBwYXlsb2FkOiB7XG4gICAgdGFnczogc3RyaW5nW107XG4gIH07XG59XG5cbmludGVyZmFjZSBJbnNlcnRNZW1vQWN0aW9uIHtcbiAgdHlwZTogJ0lOU0VSVF9NRU1PJztcbiAgcGF5bG9hZDoge1xuICAgIG1lbW86IE1vZGVsLk1lbW87XG4gIH07XG59XG5cbmludGVyZmFjZSBEZWxldGVNZW1vQnlJZEFjdGlvbiB7XG4gIHR5cGU6ICdERUxFVEVfTUVNT19CWV9JRCc7XG4gIHBheWxvYWQ6IHtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRWRpdE1lbW9CeUlkQWN0aW9uIHtcbiAgdHlwZTogJ0VESVRfTUVNTyc7XG4gIHBheWxvYWQ6IE1vZGVsLk1lbW87XG59XG5cbmV4cG9ydCB0eXBlIEFjdGlvbnMgPSBTZXRNZW1vc0FjdGlvbiB8IFNldFRhZ3NBY3Rpb24gfCBJbnNlcnRNZW1vQWN0aW9uIHwgRGVsZXRlTWVtb0J5SWRBY3Rpb24gfCBFZGl0TWVtb0J5SWRBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKTogU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX01FTU9TJzoge1xuICAgICAgY29uc3QgbWVtb3MgPSB1dGlscy5kZWR1cGVPYmplY3RXaXRoSWQoXG4gICAgICAgIGFjdGlvbi5wYXlsb2FkLm1lbW9zLnNvcnQoXG4gICAgICAgICAgKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgLy8gY29uc3QgbWVtb3MgPSBhY3Rpb24ucGF5bG9hZC5tZW1vcy5zb3J0KChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtZW1vczogWy4uLm1lbW9zXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9UQUdTJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHRhZ3M6IGFjdGlvbi5wYXlsb2FkLnRhZ3MsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdJTlNFUlRfTUVNTyc6IHtcbiAgICAgIGNvbnN0IG1lbW9zID0gdXRpbHMuZGVkdXBlT2JqZWN0V2l0aElkKFxuICAgICAgICBbYWN0aW9uLnBheWxvYWQubWVtbywgLi4uc3RhdGUubWVtb3NdLnNvcnQoXG4gICAgICAgICAgKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG1lbW9zLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnREVMRVRFX01FTU9fQllfSUQnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbWVtb3M6IFsuLi5zdGF0ZS5tZW1vc10uZmlsdGVyKChtZW1vKSA9PiBtZW1vLmlkICE9PSBhY3Rpb24ucGF5bG9hZC5pZCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdFRElUX01FTU8nOiB7XG4gICAgICBjb25zdCBtZW1vcyA9IHN0YXRlLm1lbW9zLm1hcCgobSkgPT4ge1xuICAgICAgICBpZiAobS5pZCA9PT0gYWN0aW9uLnBheWxvYWQuaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubSxcbiAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbWVtb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGU6IFN0YXRlID0ge1xuICBtZW1vczogW10sXG4gIHRhZ3M6IFtdLFxufTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgU3RhdGUge1xuICB1c2VyOiBNb2RlbC5Vc2VyIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFNpZ25JbkFjdGlvbiB7XG4gIHR5cGU6ICdTSUdOX0lOJztcbiAgcGF5bG9hZDogU3RhdGU7XG59XG5cbmludGVyZmFjZSBTaWduT3V0QWN0aW9uIHtcbiAgdHlwZTogJ1NJR05fT1VUJztcbiAgcGF5bG9hZDogbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNpZ25JbkFjdGlvbiB8IFNpZ25PdXRBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKTogU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0lHTl9JTic6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXI6IGFjdGlvbi5wYXlsb2FkLnVzZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTSUdOX09VVCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXI6IG51bGwsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGU6IFN0YXRlID0ge3VzZXI6IG51bGx9O1xuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlIHtcbiAgcXVlcmllczogTW9kZWwuUXVlcnlbXTtcbn1cblxuaW50ZXJmYWNlIFNldFF1ZXJpZXMge1xuICB0eXBlOiAnU0VUX1FVRVJJRVMnO1xuICBwYXlsb2FkOiB7XG4gICAgcXVlcmllczogTW9kZWwuUXVlcnlbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEluc2VydFF1ZXJ5QWN0aW9uIHtcbiAgdHlwZTogJ0lOU0VSVF9RVUVSWSc7XG4gIHBheWxvYWQ6IHtcbiAgICBxdWVyeTogTW9kZWwuUXVlcnk7XG4gIH07XG59XG5cbmludGVyZmFjZSBEZWxldGVRdWVyeUJ5SWRBY3Rpb24ge1xuICB0eXBlOiAnREVMRVRFX1FVRVJZX0JZX0lEJztcbiAgcGF5bG9hZDoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBVcGRhdGVRdWVyeUFjdGlvbiB7XG4gIHR5cGU6ICdVUERBVEVfUVVFUlknO1xuICBwYXlsb2FkOiBNb2RlbC5RdWVyeTtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNldFF1ZXJpZXMgfCBJbnNlcnRRdWVyeUFjdGlvbiB8IERlbGV0ZVF1ZXJ5QnlJZEFjdGlvbiB8IFVwZGF0ZVF1ZXJ5QWN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUsIGFjdGlvbjogQWN0aW9ucyk6IFN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ1NFVF9RVUVSSUVTJzoge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHV0aWxzLmRlZHVwZU9iamVjdFdpdGhJZChcbiAgICAgICAgYWN0aW9uLnBheWxvYWQucXVlcmllc1xuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIucGlubmVkQXQgPz8gMCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5waW5uZWRBdCA/PyAwKSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcmllcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0lOU0VSVF9RVUVSWSc6IHtcbiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB1dGlscy5kZWR1cGVPYmplY3RXaXRoSWQoXG4gICAgICAgIFthY3Rpb24ucGF5bG9hZC5xdWVyeSwgLi4uc3RhdGUucXVlcmllc10uc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcmllcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0RFTEVURV9RVUVSWV9CWV9JRCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzOiBbLi4uc3RhdGUucXVlcmllc10uZmlsdGVyKChxdWVyeSkgPT4gcXVlcnkuaWQgIT09IGFjdGlvbi5wYXlsb2FkLmlkKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1VQREFURV9RVUVSWSc6IHtcbiAgICAgIGNvbnN0IHF1ZXJpZXMgPSBzdGF0ZS5xdWVyaWVzLm1hcCgobSkgPT4ge1xuICAgICAgICBpZiAobS5pZCA9PT0gYWN0aW9uLnBheWxvYWQuaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubSxcbiAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcmllcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIHF1ZXJpZXM6IFtdLFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIG9ic2lkaWFuID0gcmVxdWlyZSgnb2JzaWRpYW4nKTtcblxuY29uc3QgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuY29uc3QgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQgPSBcImdnZ2ctW1ddd3dcIjtcbmNvbnN0IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1NTVwiO1xuY29uc3QgREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQgPSBcIllZWVktW1FdUVwiO1xuY29uc3QgREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQgPSBcIllZWVlcIjtcblxuZnVuY3Rpb24gc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKHBlcmlvZGljaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gd2luZG93LmFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LltwZXJpb2RpY2l0eV0/LmVuYWJsZWQ7XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgZGFpbHktbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldERhaWx5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHsgaW50ZXJuYWxQbHVnaW5zLCBwbHVnaW5zIH0gPSB3aW5kb3cuYXBwO1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwiZGFpbHlcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybWF0LCBmb2xkZXIsIHRlbXBsYXRlIH0gPSBwbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8uZGFpbHkgfHwge307XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0IHx8IERFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBmb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZm9sZGVyLCBmb3JtYXQsIHRlbXBsYXRlIH0gPSBpbnRlcm5hbFBsdWdpbnMuZ2V0UGx1Z2luQnlJZChcImRhaWx5LW5vdGVzXCIpPy5pbnN0YW5jZT8ub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0IHx8IERFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBkYWlseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGB3ZWVrbHktbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGVTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgICAgICBjb25zdCBjYWxlbmRhclNldHRpbmdzID0gcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJjYWxlbmRhclwiKT8ub3B0aW9ucztcbiAgICAgICAgY29uc3QgcGVyaW9kaWNOb3Rlc1NldHRpbmdzID0gcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/LndlZWtseTtcbiAgICAgICAgaWYgKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIndlZWtseVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBjYWxlbmRhclNldHRpbmdzIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9ybWF0IHx8IERFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy53ZWVrbHlOb3RlVGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSB3ZWVrbHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIm1vbnRobHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5tb250aGx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLmZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBtb250aGx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHBlcmlvZGljLW5vdGVzYCBwbHVnaW5cbiAqIHRvIGtlZXAgYmVoYXZpb3Igb2YgY3JlYXRpbmcgYSBuZXcgbm90ZSBpbi1zeW5jLlxuICovXG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcInF1YXJ0ZXJseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/LnF1YXJ0ZXJseSkgfHxcbiAgICAgICAgICAgIHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBzZXR0aW5ncy5mb3JtYXQgfHwgREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLmZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBxdWFydGVybHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFllYXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwieWVhcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ueWVhcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHllYXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cblxuLy8gQ3JlZGl0OiBAY3JlYXRpb25peC9wYXRoLmpzXG5mdW5jdGlvbiBqb2luKC4uLnBhcnRTZWdtZW50cykge1xuICAgIC8vIFNwbGl0IHRoZSBpbnB1dHMgaW50byBhIGxpc3Qgb2YgcGF0aCBjb21tYW5kcy5cbiAgICBsZXQgcGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRTZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5jb25jYXQocGFydFNlZ21lbnRzW2ldLnNwbGl0KFwiL1wiKSk7XG4gICAgfVxuICAgIC8vIEludGVycHJldCB0aGUgcGF0aCBjb21tYW5kcyB0byBnZXQgdGhlIG5ldyByZXNvbHZlZCBwYXRoLlxuICAgIGNvbnN0IG5ld1BhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICAvLyBBbHNvIHJlbW92ZSBcIi5cIiBzZWdtZW50c1xuICAgICAgICBpZiAoIXBhcnQgfHwgcGFydCA9PT0gXCIuXCIpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgLy8gUHVzaCBuZXcgcGF0aCBzZWdtZW50cy5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbmV3UGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG4gICAgLy8gUHJlc2VydmUgdGhlIGluaXRpYWwgc2xhc2ggaWYgdGhlcmUgd2FzIG9uZS5cbiAgICBpZiAocGFydHNbMF0gPT09IFwiXCIpXG4gICAgICAgIG5ld1BhcnRzLnVuc2hpZnQoXCJcIik7XG4gICAgLy8gVHVybiBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIHBhdGguXG4gICAgcmV0dXJuIG5ld1BhcnRzLmpvaW4oXCIvXCIpO1xufVxuZnVuY3Rpb24gYmFzZW5hbWUoZnVsbFBhdGgpIHtcbiAgICBsZXQgYmFzZSA9IGZ1bGxQYXRoLnN1YnN0cmluZyhmdWxsUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICBpZiAoYmFzZS5sYXN0SW5kZXhPZihcIi5cIikgIT0gLTEpXG4gICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSk7XG4gICAgcmV0dXJuIGJhc2U7XG59XG5hc3luYyBmdW5jdGlvbiBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCkge1xuICAgIGNvbnN0IGRpcnMgPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnNwbGl0KFwiL1wiKTtcbiAgICBkaXJzLnBvcCgpOyAvLyByZW1vdmUgYmFzZW5hbWVcbiAgICBpZiAoZGlycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGlyID0gam9pbiguLi5kaXJzKTtcbiAgICAgICAgaWYgKCF3aW5kb3cuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChkaXIpKSB7XG4gICAgICAgICAgICBhd2FpdCB3aW5kb3cuYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihkaXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Tm90ZVBhdGgoZGlyZWN0b3J5LCBmaWxlbmFtZSkge1xuICAgIGlmICghZmlsZW5hbWUuZW5kc1dpdGgoXCIubWRcIikpIHtcbiAgICAgICAgZmlsZW5hbWUgKz0gXCIubWRcIjtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoam9pbihkaXJlY3RvcnksIGZpbGVuYW1lKSk7XG4gICAgYXdhaXQgZW5zdXJlRm9sZGVyRXhpc3RzKHBhdGgpO1xuICAgIHJldHVybiBwYXRoO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKSB7XG4gICAgY29uc3QgeyBtZXRhZGF0YUNhY2hlLCB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBvYnNpZGlhbi5ub3JtYWxpemVQYXRoKHRlbXBsYXRlKTtcbiAgICBpZiAodGVtcGxhdGVQYXRoID09PSBcIi9cIikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtcIlwiLCBudWxsXSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QodGVtcGxhdGVQYXRoLCBcIlwiKTtcbiAgICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCB2YXVsdC5jYWNoZWRSZWFkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IElGb2xkSW5mbyA9IHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIubG9hZCh0ZW1wbGF0ZUZpbGUpO1xuICAgICAgICByZXR1cm4gW2NvbnRlbnRzLCBJRm9sZEluZm9dO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByZWFkIHRoZSBkYWlseSBub3RlIHRlbXBsYXRlICcke3RlbXBsYXRlUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIkZhaWxlZCB0byByZWFkIHRoZSBkYWlseSBub3RlIHRlbXBsYXRlXCIpO1xuICAgICAgICByZXR1cm4gW1wiXCIsIG51bGxdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBkYXRlVUlEIGlzIGEgd2F5IG9mIHdlZWtseSBpZGVudGlmeWluZyBkYWlseS93ZWVrbHkvbW9udGhseSBub3Rlcy5cbiAqIFRoZXkgYXJlIHByZWZpeGVkIHdpdGggdGhlIGdyYW51bGFyaXR5IHRvIGF2b2lkIGFtYmlndWl0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0ZVVJRChkYXRlLCBncmFudWxhcml0eSA9IFwiZGF5XCIpIHtcbiAgICBjb25zdCB0cyA9IGRhdGUuY2xvbmUoKS5zdGFydE9mKGdyYW51bGFyaXR5KS5mb3JtYXQoKTtcbiAgICByZXR1cm4gYCR7Z3JhbnVsYXJpdHl9LSR7dHN9YDtcbn1cbmZ1bmN0aW9uIHJlbW92ZUVzY2FwZWRDaGFyYWN0ZXJzKGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvXFxbW15cXF1dKlxcXS9nLCBcIlwiKTsgLy8gcmVtb3ZlIGV2ZXJ5dGhpbmcgd2l0aGluIGJyYWNrZXRzXG59XG4vKipcbiAqIFhYWDogV2hlbiBwYXJzaW5nIGRhdGVzIHRoYXQgY29udGFpbiBib3RoIHdlZWsgbnVtYmVycyBhbmQgbW9udGhzLFxuICogTW9tZW50IGNob3NlcyB0byBpZ25vcmUgdGhlIHdlZWsgbnVtYmVycy4gRm9yIHRoZSB3ZWVrIGRhdGVVSUQsIHdlXG4gKiB3YW50IHRoZSBvcHBvc2l0ZSBiZWhhdmlvci4gU3RyaXAgdGhlIE1NTSBmcm9tIHRoZSBmb3JtYXQgdG8gcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybWF0QW1iaWd1b3VzKGZvcm1hdCwgZ3JhbnVsYXJpdHkpIHtcbiAgICBpZiAoZ3JhbnVsYXJpdHkgPT09IFwid2Vla1wiKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuRm9ybWF0ID0gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KTtcbiAgICAgICAgcmV0dXJuICgvd3sxLDJ9L2kudGVzdChjbGVhbkZvcm1hdCkgJiZcbiAgICAgICAgICAgICgvTXsxLDR9Ly50ZXN0KGNsZWFuRm9ybWF0KSB8fCAvRHsxLDR9Ly50ZXN0KGNsZWFuRm9ybWF0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGUoZmlsZSwgZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4gZ2V0RGF0ZUZyb21GaWxlbmFtZShmaWxlLmJhc2VuYW1lLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbVBhdGgocGF0aCwgZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4gZ2V0RGF0ZUZyb21GaWxlbmFtZShiYXNlbmFtZShwYXRoKSwgZ3JhbnVsYXJpdHkpO1xufVxuZnVuY3Rpb24gZ2V0RGF0ZUZyb21GaWxlbmFtZShmaWxlbmFtZSwgZ3JhbnVsYXJpdHkpIHtcbiAgICBjb25zdCBnZXRTZXR0aW5ncyA9IHtcbiAgICAgICAgZGF5OiBnZXREYWlseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgd2VlazogZ2V0V2Vla2x5Tm90ZVNldHRpbmdzLFxuICAgICAgICBtb250aDogZ2V0TW9udGhseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgcXVhcnRlcjogZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB5ZWFyOiBnZXRZZWFybHlOb3RlU2V0dGluZ3MsXG4gICAgfTtcbiAgICBjb25zdCBmb3JtYXQgPSBnZXRTZXR0aW5nc1tncmFudWxhcml0eV0oKS5mb3JtYXQuc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgIGNvbnN0IG5vdGVEYXRlID0gd2luZG93Lm1vbWVudChmaWxlbmFtZSwgZm9ybWF0LCB0cnVlKTtcbiAgICBpZiAoIW5vdGVEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGlzRm9ybWF0QW1iaWd1b3VzKGZvcm1hdCwgZ3JhbnVsYXJpdHkpKSB7XG4gICAgICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuRm9ybWF0ID0gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KTtcbiAgICAgICAgICAgIGlmICgvd3sxLDJ9L2kudGVzdChjbGVhbkZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudChmaWxlbmFtZSwgXG4gICAgICAgICAgICAgICAgLy8gSWYgZm9ybWF0IGNvbnRhaW5zIHdlZWssIHJlbW92ZSBkYXkgJiBtb250aCBmb3JtYXR0aW5nXG4gICAgICAgICAgICAgICAgZm9ybWF0LnJlcGxhY2UoL017MSw0fS9nLCBcIlwiKS5yZXBsYWNlKC9EezEsNH0vZywgXCJcIiksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm90ZURhdGU7XG59XG5cbmNsYXNzIERhaWx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURhaWx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgYXBwID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSBhcHA7XG4gICAgY29uc3QgbW9tZW50ID0gd2luZG93Lm1vbWVudDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCBtb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gbW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp5ZXN0ZXJkYXlcXHMqfX0vZ2ksIGRhdGUuY2xvbmUoKS5zdWJ0cmFjdCgxLCBcImRheVwiKS5mb3JtYXQoZm9ybWF0KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0b21vcnJvd1xccyp9fS9naSwgZGF0ZS5jbG9uZSgpLmFkZCgxLCBcImRcIikuZm9ybWF0KGZvcm1hdCkpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpIHtcbiAgICByZXR1cm4gZGFpbHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwiZGF5XCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsRGFpbHlOb3RlcygpIHtcbiAgICAvKipcbiAgICAgKiBGaW5kIGFsbCBkYWlseSBub3RlcyBpbiB0aGUgZGFpbHkgbm90ZSBmb2xkZXJcbiAgICAgKi9cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IGRhaWx5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob2JzaWRpYW4ubm9ybWFsaXplUGF0aChmb2xkZXIpKTtcbiAgICBpZiAoIWRhaWx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IERhaWx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBkYWlseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSB7fTtcbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZGFpbHlOb3Rlc0ZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcImRheVwiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGFpbHlOb3Rlc1tkYXRlU3RyaW5nXSA9IG5vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGFpbHlOb3Rlcztcbn1cblxuY2xhc3MgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5mdW5jdGlvbiBnZXREYXlzT2ZXZWVrKCkge1xuICAgIGNvbnN0IHsgbW9tZW50IH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgd2Vla1N0YXJ0ID0gbW9tZW50LmxvY2FsZURhdGEoKS5fd2Vlay5kb3c7XG4gICAgY29uc3QgZGF5c09mV2VlayA9IFtcbiAgICAgICAgXCJzdW5kYXlcIixcbiAgICAgICAgXCJtb25kYXlcIixcbiAgICAgICAgXCJ0dWVzZGF5XCIsXG4gICAgICAgIFwid2VkbmVzZGF5XCIsXG4gICAgICAgIFwidGh1cnNkYXlcIixcbiAgICAgICAgXCJmcmlkYXlcIixcbiAgICAgICAgXCJzYXR1cmRheVwiLFxuICAgIF07XG4gICAgd2hpbGUgKHdlZWtTdGFydCkge1xuICAgICAgICBkYXlzT2ZXZWVrLnB1c2goZGF5c09mV2Vlay5zaGlmdCgpKTtcbiAgICAgICAgd2Vla1N0YXJ0LS07XG4gICAgfVxuICAgIHJldHVybiBkYXlzT2ZXZWVrO1xufVxuZnVuY3Rpb24gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrTmFtZSkge1xuICAgIHJldHVybiBnZXREYXlzT2ZXZWVrKCkuaW5kZXhPZihkYXlPZldlZWtOYW1lLnRvTG93ZXJDYXNlKCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV2Vla2x5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpXFxzKjooLio/KX19L2dpLCAoXywgZGF5T2ZXZWVrLCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IGdldERheU9mV2Vla051bWVyaWNhbFZhbHVlKGRheU9mV2Vlayk7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS53ZWVrZGF5KGRheSkuZm9ybWF0KG1vbWVudEZvcm1hdC50cmltKCkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRXZWVrbHlOb3RlKGRhdGUsIHdlZWtseU5vdGVzKSB7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJ3ZWVrXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsV2Vla2x5Tm90ZXMoKSB7XG4gICAgY29uc3Qgd2Vla2x5Tm90ZXMgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCB3ZWVrbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghd2Vla2x5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdlZWtseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgd2Vla2x5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHdlZWtseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwid2Vla1wiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIHdlZWtseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3ZWVrbHlOb3Rlcztcbn1cblxuY2xhc3MgTW9udGhseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVNb250aGx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldE1vbnRobHlOb3RlKGRhdGUsIG1vbnRobHlOb3Rlcykge1xuICAgIHJldHVybiBtb250aGx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIm1vbnRoXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsTW9udGhseU5vdGVzKCkge1xuICAgIGNvbnN0IG1vbnRobHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIG1vbnRobHlOb3RlcztcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IG1vbnRobHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghbW9udGhseU5vdGVzRm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBtb250aGx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKG1vbnRobHlOb3Rlc0ZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIG1vbnRobHlOb3Rlc1tkYXRlU3RyaW5nXSA9IG5vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbW9udGhseU5vdGVzO1xufVxuXG5jbGFzcyBRdWFydGVybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUXVhcnRlcmx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UXVhcnRlcmx5Tm90ZShkYXRlLCBxdWFydGVybHkpIHtcbiAgICByZXR1cm4gcXVhcnRlcmx5W2dldERhdGVVSUQoZGF0ZSwgXCJxdWFydGVyXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsUXVhcnRlcmx5Tm90ZXMoKSB7XG4gICAgY29uc3QgcXVhcnRlcmx5ID0ge307XG4gICAgaWYgKCFhcHBIYXNRdWFydGVybHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiBxdWFydGVybHk7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHF1YXJ0ZXJseUZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghcXVhcnRlcmx5Rm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWFydGVybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIHF1YXJ0ZXJseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihxdWFydGVybHlGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJxdWFydGVyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICAgICAgcXVhcnRlcmx5W2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBxdWFydGVybHk7XG59XG5cbmNsYXNzIFllYXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVZZWFybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRZZWFybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRZZWFybHlOb3RlKGRhdGUsIHllYXJseU5vdGVzKSB7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJ5ZWFyXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsWWVhcmx5Tm90ZXMoKSB7XG4gICAgY29uc3QgeWVhcmx5Tm90ZXMgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHllYXJseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRZZWFybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCB5ZWFybHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICgheWVhcmx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFllYXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgeWVhcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHllYXJseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwieWVhclwiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHllYXJseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB5ZWFybHlOb3Rlcztcbn1cblxuZnVuY3Rpb24gYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgZGFpbHlOb3Rlc1BsdWdpbiA9IGFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2luc1tcImRhaWx5LW5vdGVzXCJdO1xuICAgIGlmIChkYWlseU5vdGVzUGx1Z2luICYmIGRhaWx5Tm90ZXNQbHVnaW4uZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uZGFpbHk/LmVuYWJsZWQ7XG59XG4vKipcbiAqIFhYWDogXCJXZWVrbHkgTm90ZXNcIiBsaXZlIGluIGVpdGhlciB0aGUgQ2FsZW5kYXIgcGx1Z2luIG9yIHRoZSBwZXJpb2RpYy1ub3RlcyBwbHVnaW4uXG4gKiBDaGVjayBib3RoIHVudGlsIHRoZSB3ZWVrbHkgbm90ZXMgZmVhdHVyZSBpcyByZW1vdmVkIGZyb20gdGhlIENhbGVuZGFyIHBsdWdpbi5cbiAqL1xuZnVuY3Rpb24gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJjYWxlbmRhclwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ud2Vla2x5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ubW9udGhseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ucXVhcnRlcmx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy55ZWFybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBnZXRQZXJpb2RpY05vdGVTZXR0aW5ncyhncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9W2dyYW51bGFyaXR5XTtcbiAgICByZXR1cm4gZ2V0U2V0dGluZ3MoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBlcmlvZGljTm90ZShncmFudWxhcml0eSwgZGF0ZSkge1xuICAgIGNvbnN0IGNyZWF0ZUZuID0ge1xuICAgICAgICBkYXk6IGNyZWF0ZURhaWx5Tm90ZSxcbiAgICAgICAgbW9udGg6IGNyZWF0ZU1vbnRobHlOb3RlLFxuICAgICAgICB3ZWVrOiBjcmVhdGVXZWVrbHlOb3RlLFxuICAgIH07XG4gICAgcmV0dXJuIGNyZWF0ZUZuW2dyYW51bGFyaXR5XShkYXRlKTtcbn1cblxuZXhwb3J0cy5ERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVDtcbmV4cG9ydHMuREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5hcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZDtcbmV4cG9ydHMuYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNRdWFydGVybHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5jcmVhdGVEYWlseU5vdGUgPSBjcmVhdGVEYWlseU5vdGU7XG5leHBvcnRzLmNyZWF0ZU1vbnRobHlOb3RlID0gY3JlYXRlTW9udGhseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVBlcmlvZGljTm90ZSA9IGNyZWF0ZVBlcmlvZGljTm90ZTtcbmV4cG9ydHMuY3JlYXRlUXVhcnRlcmx5Tm90ZSA9IGNyZWF0ZVF1YXJ0ZXJseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVdlZWtseU5vdGUgPSBjcmVhdGVXZWVrbHlOb3RlO1xuZXhwb3J0cy5jcmVhdGVZZWFybHlOb3RlID0gY3JlYXRlWWVhcmx5Tm90ZTtcbmV4cG9ydHMuZ2V0QWxsRGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXM7XG5leHBvcnRzLmdldEFsbE1vbnRobHlOb3RlcyA9IGdldEFsbE1vbnRobHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsUXVhcnRlcmx5Tm90ZXMgPSBnZXRBbGxRdWFydGVybHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsV2Vla2x5Tm90ZXMgPSBnZXRBbGxXZWVrbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsWWVhcmx5Tm90ZXMgPSBnZXRBbGxZZWFybHlOb3RlcztcbmV4cG9ydHMuZ2V0RGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlO1xuZXhwb3J0cy5nZXREYWlseU5vdGVTZXR0aW5ncyA9IGdldERhaWx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXREYXRlRnJvbUZpbGUgPSBnZXREYXRlRnJvbUZpbGU7XG5leHBvcnRzLmdldERhdGVGcm9tUGF0aCA9IGdldERhdGVGcm9tUGF0aDtcbmV4cG9ydHMuZ2V0RGF0ZVVJRCA9IGdldERhdGVVSUQ7XG5leHBvcnRzLmdldE1vbnRobHlOb3RlID0gZ2V0TW9udGhseU5vdGU7XG5leHBvcnRzLmdldE1vbnRobHlOb3RlU2V0dGluZ3MgPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRQZXJpb2RpY05vdGVTZXR0aW5ncyA9IGdldFBlcmlvZGljTm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlID0gZ2V0UXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRUZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm87XG5leHBvcnRzLmdldFdlZWtseU5vdGUgPSBnZXRXZWVrbHlOb3RlO1xuZXhwb3J0cy5nZXRXZWVrbHlOb3RlU2V0dGluZ3MgPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFllYXJseU5vdGUgPSBnZXRZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRZZWFybHlOb3RlU2V0dGluZ3MgPSBnZXRZZWFybHlOb3RlU2V0dGluZ3M7XG4iLCJpbXBvcnQge0FwcCwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3Rlc30gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZSB7XG4gIGRhaWx5Tm90ZXM6IFJlY29yZDxzdHJpbmcsIFRGaWxlPjtcbiAgYXBwOiBBcHA7XG59XG5cbmludGVyZmFjZSBTZXREYWlseU5vdGVzQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9EQUlMWU5PVEVTJztcbiAgcGF5bG9hZDoge1xuICAgIGRhaWx5Tm90ZXM6IFJlY29yZDxzdHJpbmcsIFRGaWxlPjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldE9ic2lkaWFuQXBwQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9BUFAnO1xuICBwYXlsb2FkOiB7XG4gICAgYXBwOiBBcHA7XG4gIH07XG59XG5cbi8vIGludGVyZmFjZSBJbnNlcnREYWlseU5vdGVBY3Rpb24ge1xuLy8gICB0eXBlOiBcIklOU0VSVF9EQUlMWU5PVEVcIjtcbi8vICAgcGF5bG9hZDoge1xuLy8gICAgIGRhaWx5Tm90ZTogVEZpbGU7XG4vLyAgIH07XG4vLyB9XG5cbmV4cG9ydCB0eXBlIEFjdGlvbnMgPSBTZXREYWlseU5vdGVzQWN0aW9uIHwgU2V0T2JzaWRpYW5BcHBBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKTogU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX0RBSUxZTk9URVMnOiB7XG4gICAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZGFpbHlOb3RlczogZGFpbHlOb3RlcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9BUFAnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgYXBwOiBhY3Rpb24ucGF5bG9hZC5hcHAsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGU6IFN0YXRlID0ge1xuICBkYWlseU5vdGVzOiBudWxsLFxuICBhcHA6IG51bGwsXG59O1xuIiwiaW1wb3J0IGNvbWJpbmVSZWR1Y2VycyBmcm9tICcuLi9sYWJzL2NvbWJpbmVSZWR1Y2Vycyc7XG5pbXBvcnQgY3JlYXRlU3RvcmUgZnJvbSAnLi4vbGFicy9jcmVhdGVTdG9yZSc7XG5pbXBvcnQgKiBhcyBnbG9iYWxTdG9yZSBmcm9tICcuL2dsb2JhbFN0YXRlU3RvcmUnO1xuaW1wb3J0ICogYXMgbG9jYXRpb25TdG9yZSBmcm9tICcuL2xvY2F0aW9uU3RvcmUnO1xuaW1wb3J0ICogYXMgbWVtb1N0b3JlIGZyb20gJy4vbWVtb1N0b3JlJztcbmltcG9ydCAqIGFzIHVzZXJTdG9yZSBmcm9tICcuL3VzZXJTdG9yZSc7XG5pbXBvcnQgKiBhcyBxdWVyeVN0b3JlIGZyb20gJy4vcXVlcnlTdG9yZSc7XG5pbXBvcnQgKiBhcyBkYWlseU5vdGVzU3RvcmUgZnJvbSAnLi9kYWlseU5vdGVzU3RvcmUnO1xuXG5pbnRlcmZhY2UgQXBwU3RhdGUge1xuICBnbG9iYWxTdGF0ZTogZ2xvYmFsU3RvcmUuU3RhdGU7XG4gIGxvY2F0aW9uU3RhdGU6IGxvY2F0aW9uU3RvcmUuU3RhdGU7XG4gIG1lbW9TdGF0ZTogbWVtb1N0b3JlLlN0YXRlO1xuICB1c2VyU3RhdGU6IHVzZXJTdG9yZS5TdGF0ZTtcbiAgcXVlcnlTdGF0ZTogcXVlcnlTdG9yZS5TdGF0ZTtcbiAgZGFpbHlOb3Rlc1N0YXRlOiBkYWlseU5vdGVzU3RvcmUuU3RhdGU7XG59XG5cbnR5cGUgQXBwU3RhdGVBY3Rpb25zID1cbiAgfCBnbG9iYWxTdG9yZS5BY3Rpb25zXG4gIHwgbG9jYXRpb25TdG9yZS5BY3Rpb25zXG4gIHwgbWVtb1N0b3JlLkFjdGlvbnNcbiAgfCB1c2VyU3RvcmUuQWN0aW9uc1xuICB8IHF1ZXJ5U3RvcmUuQWN0aW9uc1xuICB8IGRhaWx5Tm90ZXNTdG9yZS5BY3Rpb25zO1xuXG5jb25zdCBhcHBTdG9yZSA9IGNyZWF0ZVN0b3JlPEFwcFN0YXRlLCBBcHBTdGF0ZUFjdGlvbnM+KFxuICB7XG4gICAgZ2xvYmFsU3RhdGU6IGdsb2JhbFN0b3JlLmRlZmF1bHRTdGF0ZSxcbiAgICBsb2NhdGlvblN0YXRlOiBsb2NhdGlvblN0b3JlLmRlZmF1bHRTdGF0ZSxcbiAgICBtZW1vU3RhdGU6IG1lbW9TdG9yZS5kZWZhdWx0U3RhdGUsXG4gICAgdXNlclN0YXRlOiB1c2VyU3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIHF1ZXJ5U3RhdGU6IHF1ZXJ5U3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIGRhaWx5Tm90ZXNTdGF0ZTogZGFpbHlOb3Rlc1N0b3JlLmRlZmF1bHRTdGF0ZSxcbiAgfSxcbiAgY29tYmluZVJlZHVjZXJzPEFwcFN0YXRlLCBBcHBTdGF0ZUFjdGlvbnM+KHtcbiAgICBnbG9iYWxTdGF0ZTogZ2xvYmFsU3RvcmUucmVkdWNlcixcbiAgICBsb2NhdGlvblN0YXRlOiBsb2NhdGlvblN0b3JlLnJlZHVjZXIsXG4gICAgbWVtb1N0YXRlOiBtZW1vU3RvcmUucmVkdWNlcixcbiAgICB1c2VyU3RhdGU6IHVzZXJTdG9yZS5yZWR1Y2VyLFxuICAgIHF1ZXJ5U3RhdGU6IHF1ZXJ5U3RvcmUucmVkdWNlcixcbiAgICBkYWlseU5vdGVzU3RhdGU6IGRhaWx5Tm90ZXNTdG9yZS5yZWR1Y2VyLFxuICB9KSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcFN0b3JlO1xuIiwiaW1wb3J0IHtjcmVhdGVDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi9hcHBTdG9yZSc7XG5cbmNvbnN0IGFwcENvbnRleHQgPSBjcmVhdGVDb250ZXh0KGFwcFN0b3JlLmdldFN0YXRlKCkpO1xuXG5leHBvcnQgZGVmYXVsdCBhcHBDb250ZXh0O1xuIiwiLy8gaW1wb3J0IHsgbW9tZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuLy8gaW1wb3J0IHVzZXJTZXJ2aWNlIGZyb20gXCIuL3VzZXJTZXJ2aWNlXCI7XG4vLyBpbXBvcnQgYXBpIGZyb20gXCIuLi9oZWxwZXJzL2FwaVwiO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge2dldEFsbERhaWx5Tm90ZXMsIGdldERhaWx5Tm90ZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcbmltcG9ydCB7QXBwLCBURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtNb21lbnR9IGZyb20gJ19vYnNpZGlhbkAwLjEzLjExQG9ic2lkaWFuL25vZGVfbW9kdWxlcy9tb21lbnQnO1xuLy8gaW1wb3J0IHsgTW9tZW50fSAgZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmNsYXNzIERhaWx5Tm90ZXNTZXJ2aWNlIHtcbiAgcHVibGljIGdldFN0YXRlKCkge1xuICAgIHJldHVybiBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcHAoYXBwOiBBcHApIHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0FQUCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGFwcCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRNeUFsbERhaWx5Tm90ZXMoKSB7XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXMoKTtcblxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfREFJTFlOT1RFUycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGRhaWx5Tm90ZXMsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xuICB9XG5cbiAgLy8gcHVibGljIHB1c2hEYWlseU5vdGUoZGFpbHlOb3RlOiBURmlsZSkge1xuICAvLyAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgLy8gICAgIHR5cGU6IFwiSU5TRVJUX0RBSUxZTk9URVwiLFxuICAvLyAgICAgcGF5bG9hZDoge1xuICAvLyAgICAgICBtZW1vOiB7XG4gIC8vICAgICAgICAgLi4ubWVtbyxcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgIH0sXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGFpbHlOb3RlQnlNZW1vKGRhdGU6IE1vbWVudCk6IFByb21pc2U8VEZpbGU+IHtcbiAgICBjb25zdCB7ZGFpbHlOb3Rlc30gPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpO1xuICAgIHJldHVybiBkYWlseU5vdGU7XG4gIH1cbn1cblxuY29uc3QgZGFpbHlOb3Rlc1NlcnZpY2UgPSBuZXcgRGFpbHlOb3Rlc1NlcnZpY2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgZGFpbHlOb3Rlc1NlcnZpY2U7XG4iLCJpbXBvcnQge0lucHV0QWN0aW9ufSBmcm9tICd0aW55LXVuZG8nO1xuXG4vKipcbiAqIERlZmluZSBzdG9yYWdlIGRhdGEgdHlwZVxuICovXG5pbnRlcmZhY2UgU3RvcmFnZURhdGEge1xuICAvLyDnvJbovpHlmajovpPlhaXnvJPlrZjlhoXlrrlcbiAgZWRpdG9yQ29udGVudENhY2hlOiBzdHJpbmc7XG4gIC8vIOWIhuivjeW8gOWFs1xuICBzaG91bGRTcGxpdE1lbW9Xb3JkOiBib29sZWFuO1xuICAvLyDmmK/lkKbpmpDol4/lm77niYfpk77mjqXlnLDlnYBcbiAgc2hvdWxkSGlkZUltYWdlVXJsOiBib29sZWFuO1xuICAvLyBtYXJrZG93biDop6PmnpDlvIDlhbNcbiAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IGJvb2xlYW47XG5cbiAgLy8gRWRpdG9yIHNldHRpbmdcbiAgdXNlVGlueVVuZG9IaXN0b3J5Q2FjaGU6IGJvb2xlYW47XG5cbiAgLy8gdGlueSB1bmRvIGFjdGlvbnMgY2FjaGVcbiAgdGlueVVuZG9BY3Rpb25zQ2FjaGU6IElucHV0QWN0aW9uW107XG4gIC8vIHRpbnkgdW5kbyBpbmRleCBjYWNoZVxuICB0aW55VW5kb0luZGV4Q2FjaGU6IG51bWJlcjtcbn1cblxudHlwZSBTdG9yYWdlS2V5ID0ga2V5b2YgU3RvcmFnZURhdGE7XG5cbi8qKlxuICogc3RvcmFnZSBoZWxwZXJcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBzdG9yYWdlIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldChrZXlzOiBTdG9yYWdlS2V5W10pOiBQYXJ0aWFsPFN0b3JhZ2VEYXRhPiB7XG4gICAgY29uc3QgZGF0YTogUGFydGlhbDxTdG9yYWdlRGF0YT4gPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmeVZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYgKHN0cmluZ2lmeVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gSlNPTi5wYXJzZShzdHJpbmdpZnlWYWx1ZSk7XG4gICAgICAgICAgZGF0YVtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0dldCBzdG9yYWdlIGZhaWxlZCBpbiAnLCBrZXksIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBzZXQoZGF0YTogUGFydGlhbDxTdG9yYWdlRGF0YT4pIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdHJpbmdpZnlWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KGRhdGFba2V5IGFzIFN0b3JhZ2VLZXldKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBzdHJpbmdpZnlWYWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NhdmUgc3RvcmFnZSBmYWlsZWQgaW4gJywga2V5LCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZShrZXlzOiBTdG9yYWdlS2V5W10pIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdSZW1vdmUgc3RvcmFnZSBmYWlsZWQgaW4gJywga2V5LCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVtaXRTdG9yYWdlQ2hhbmdlZEV2ZW50KCkge1xuICAgIGNvbnN0IGlmcmFtZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZUVsKTtcblxuICAgIGlmcmFtZUVsLmNvbnRlbnRXaW5kb3c/LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0JywgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcbiAgICBpZnJhbWVFbC5yZW1vdmUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtzdG9yYWdlfSBmcm9tICcuLi9oZWxwZXJzL3N0b3JhZ2UnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge0FwcFNldHRpbmd9IGZyb20gJy4uL3N0b3Jlcy9nbG9iYWxTdGF0ZVN0b3JlJztcblxuY2xhc3MgR2xvYmFsU3RhdGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgY2FjaGVkU2V0dGluZyA9IHN0b3JhZ2UuZ2V0KFtcbiAgICAgICdzaG91bGRTcGxpdE1lbW9Xb3JkJyxcbiAgICAgICdzaG91bGRIaWRlSW1hZ2VVcmwnLFxuICAgICAgJ3Nob3VsZFVzZU1hcmtkb3duUGFyc2VyJyxcbiAgICAgICd1c2VUaW55VW5kb0hpc3RvcnlDYWNoZScsXG4gICAgXSk7XG4gICAgY29uc3QgZGVmYXVsdEFwcFNldHRpbmcgPSB7XG4gICAgICBzaG91bGRTcGxpdE1lbW9Xb3JkOiBjYWNoZWRTZXR0aW5nLnNob3VsZFNwbGl0TWVtb1dvcmQgPz8gdHJ1ZSxcbiAgICAgIHNob3VsZEhpZGVJbWFnZVVybDogY2FjaGVkU2V0dGluZy5zaG91bGRIaWRlSW1hZ2VVcmwgPz8gdHJ1ZSxcbiAgICAgIHNob3VsZFVzZU1hcmtkb3duUGFyc2VyOiBjYWNoZWRTZXR0aW5nLnNob3VsZFVzZU1hcmtkb3duUGFyc2VyID8/IHRydWUsXG4gICAgICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogY2FjaGVkU2V0dGluZy51c2VUaW55VW5kb0hpc3RvcnlDYWNoZSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBcHBTZXR0aW5nKGRlZmF1bHRBcHBTZXR0aW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGF0ZSA9ICgpID0+IHtcbiAgICByZXR1cm4gYXBwU3RvcmUuZ2V0U3RhdGUoKS5nbG9iYWxTdGF0ZTtcbiAgfTtcblxuICBwdWJsaWMgc2V0RWRpdE1lbW9JZCA9IChlZGl0TWVtb0lkOiBzdHJpbmcpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0VESVRfTUVNT19JRCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGVkaXRNZW1vSWQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRNYXJrTWVtb0lkID0gKG1hcmtNZW1vSWQ6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfTUFSS19NRU1PX0lEJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgbWFya01lbW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIHNldElzTW9iaWxlVmlldyA9IChpc01vYmlsZVZpZXc6IGJvb2xlYW4pID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX01PQklMRV9WSUVXJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgaXNNb2JpbGVWaWV3LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3ID0gKHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogYm9vbGVhbikgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfU0hPV19TSURFQkFSX0lOX01PQklMRV9WSUVXJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgc2V0QXBwU2V0dGluZyA9IChhcHBTZXR0aW5nOiBQYXJ0aWFsPEFwcFNldHRpbmc+KSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9BUFBfU0VUVElORycsXG4gICAgICBwYXlsb2FkOiBhcHBTZXR0aW5nLFxuICAgIH0pO1xuICAgIHN0b3JhZ2Uuc2V0KGFwcFNldHRpbmcpO1xuICB9O1xufVxuXG5jb25zdCBnbG9iYWxTdGF0ZVNlcnZpY2UgPSBuZXcgR2xvYmFsU3RhdGVTZXJ2aWNlKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGdsb2JhbFN0YXRlU2VydmljZTtcbiIsIi8vIGltcG9ydCB1dGlscyBmcm9tIFwiLi4vaGVscGVycy91dGlsc1wiO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5cbi8vIGNvbnN0IHVwZGF0ZUxvY2F0aW9uVXJsID0gKG1ldGhvZDogXCJyZXBsYWNlXCIgfCBcInB1c2hcIiA9IFwicmVwbGFjZVwiKSA9PiB7XG4vLyAgIGNvbnN0IHsgcXVlcnksIHBhdGhuYW1lLCBoYXNoIH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmxvY2F0aW9uU3RhdGU7XG4vLyAgIGxldCBxdWVyeVN0cmluZyA9IHV0aWxzLnRyYW5zZm9ybU9iamVjdFRvUGFyYW1zU3RyaW5nKHF1ZXJ5KTtcbi8vICAgaWYgKHF1ZXJ5U3RyaW5nKSB7XG4vLyAgICAgcXVlcnlTdHJpbmcgPSBcIj9cIiArIHF1ZXJ5U3RyaW5nO1xuLy8gICB9IGVsc2Uge1xuLy8gICAgIHF1ZXJ5U3RyaW5nID0gXCJcIjtcbi8vICAgfVxuXG4vLyAgIGlmIChtZXRob2QgPT09IFwicmVwbGFjZVwiKSB7XG4vLyAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIFwiXCIsIHBhdGhuYW1lICsgaGFzaCArIHF1ZXJ5U3RyaW5nKTtcbi8vICAgfSBlbHNlIHtcbi8vICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgXCJcIiwgcGF0aG5hbWUgKyBoYXNoICsgcXVlcnlTdHJpbmcpO1xuLy8gICB9XG4vLyB9O1xuXG5jbGFzcyBMb2NhdGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXRlV2l0aExvY2F0aW9uKCk7XG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlV2l0aExvY2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTdGF0ZVdpdGhMb2NhdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7cGF0aG5hbWUsIHNlYXJjaCwgaGFzaH0gPSB3aW5kb3cubG9jYXRpb247XG4gICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBMb2NhdGlvbiA9IHtcbiAgICAgIHBhdGhuYW1lOiAnLycsXG4gICAgICBoYXNoOiAnJyxcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIHRhZzogJycsXG4gICAgICAgIGR1cmF0aW9uOiBudWxsLFxuICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIGZpbHRlcjogJycsXG4gICAgICB9LFxuICAgIH07XG4gICAgc3RhdGUucXVlcnkudGFnID0gdXJsUGFyYW1zLmdldCgndGFnJykgPz8gJyc7XG4gICAgc3RhdGUucXVlcnkudHlwZSA9ICh1cmxQYXJhbXMuZ2V0KCd0eXBlJykgPz8gJycpIGFzIE1lbW9TcGVjVHlwZTtcbiAgICBzdGF0ZS5xdWVyeS50ZXh0ID0gdXJsUGFyYW1zLmdldCgndGV4dCcpID8/ICcnO1xuICAgIHN0YXRlLnF1ZXJ5LmZpbHRlciA9IHVybFBhcmFtcy5nZXQoJ2ZpbHRlcicpID8/ICcnO1xuICAgIGNvbnN0IGZyb20gPSBwYXJzZUludCh1cmxQYXJhbXMuZ2V0KCdmcm9tJykgPz8gJzAnKTtcbiAgICBjb25zdCB0byA9IHBhcnNlSW50KHVybFBhcmFtcy5nZXQoJ3RvJykgPz8gJzAnKTtcbiAgICBpZiAodG8gPiBmcm9tICYmIHRvICE9PSAwKSB7XG4gICAgICBzdGF0ZS5xdWVyeS5kdXJhdGlvbiA9IHtcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICB9O1xuICAgIH1cbiAgICBzdGF0ZS5oYXNoID0gaGFzaDtcbiAgICBzdGF0ZS5wYXRobmFtZSA9IHRoaXMuZ2V0VmFsaWRQYXRobmFtZShwYXRobmFtZSk7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9MT0NBVElPTicsXG4gICAgICBwYXlsb2FkOiBzdGF0ZSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U3RhdGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkubG9jYXRpb25TdGF0ZTtcbiAgfTtcblxuICBwdWJsaWMgY2xlYXJRdWVyeSA9ICgpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgdGFnOiAnJyxcbiAgICAgICAgZHVyYXRpb246IG51bGwsXG4gICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRRdWVyeSA9IChxdWVyeTogUXVlcnkpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHF1ZXJ5LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0SGFzaCA9IChoYXNoOiBzdHJpbmcpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0hBU0gnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBoYXNoLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1BBVEhOQU1FJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgcHVzaEhpc3RvcnkgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUEFUSE5BTUUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybChcInB1c2hcIik7XG4gIH07XG5cbiAgcHVibGljIHJlcGxhY2VIaXN0b3J5ID0gKHBhdGhuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1BBVEhOQU1FJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoXCJyZXBsYWNlXCIpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRNZW1vVHlwZVF1ZXJ5ID0gKHR5cGU6IE1lbW9TcGVjVHlwZSB8ICcnID0gJycpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1RZUEUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICB0eXBlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldE1lbW9GaWx0ZXIgPSAoZmlsdGVySWQ6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUllfRklMVEVSJyxcbiAgICAgIHBheWxvYWQ6IGZpbHRlcklkLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0VGV4dFF1ZXJ5ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVEVYVCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0VGFnUXVlcnkgPSAodGFnOiBzdHJpbmcpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX1RBR19RVUVSWScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHRhZyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRGcm9tQW5kVG9RdWVyeSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0RVUkFUSU9OX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZHVyYXRpb246IHtmcm9tLCB0b30sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0VmFsaWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nKTogQXBwUm91dGVyID0+IHtcbiAgICBpZiAoWycvJywgJy9yZWN5Y2xlJywgJy9zZXR0aW5nJ10uaW5jbHVkZXMocGF0aG5hbWUpKSB7XG4gICAgICByZXR1cm4gcGF0aG5hbWUgYXMgQXBwUm91dGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJy8nO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgbG9jYXRpb25TZXJ2aWNlID0gbmV3IExvY2F0aW9uU2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2NhdGlvblNlcnZpY2U7XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXREYWlseU5vdGUsIGdldERhaWx5Tm90ZVNldHRpbmdzfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuLy8gaW1wb3J0IGFwcFN0b3JlIGZyb20gXCIuLi9zdG9yZXMvYXBwU3RvcmVcIjtcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XG5pbXBvcnQge1RGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoYW5nZU1lbW8oXG4gIG1lbW9pZDogc3RyaW5nLFxuICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBtZW1vVHlwZTogc3RyaW5nLFxuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XG4gIGNvbnN0IHtkYWlseU5vdGVzfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IHRpbWVTdHJpbmcgPSBtZW1vaWQuc2xpY2UoMCwgMTEpICsgJzAwJztcbiAgY29uc3QgaWRTdHJpbmcgPSBwYXJzZUludChtZW1vaWQuc2xpY2UoMTQpKTtcbiAgY29uc3QgY2hhbmdlRGF0ZSA9IG1vbWVudCh0aW1lU3RyaW5nLCAnWVlZWU1NRERISG1tU1MnKTtcbiAgY29uc3QgZGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlKGNoYW5nZURhdGUsIGRhaWx5Tm90ZXMpO1xuICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHZhdWx0LnJlYWQoZGFpbHlOb3RlKTtcbiAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudCk7XG4gIGNvbnN0IHJlbW92ZUVudGVyID0gY29udGVudC5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lID0gZmlsZUxpbmVzW2lkU3RyaW5nXTtcbiAgY29uc3QgbmV3TGluZSA9IGZpbGVMaW5lc1tpZFN0cmluZ10ucmVwbGFjZShvcmlnaW5hbENvbnRlbnQsIHJlbW92ZUVudGVyKTtcbiAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBmaWxlQ29udGVudC5yZXBsYWNlKG9yaWdpbmFsTGluZSwgbmV3TGluZSk7XG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShkYWlseU5vdGUsIG5ld0ZpbGVDb250ZW50KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWVtb2lkLFxuICAgIGNvbnRlbnQ6IHJlbW92ZUVudGVyLFxuICAgIGRlbGV0ZWRBdDogJycsXG4gICAgY3JlYXRlZEF0OiBjaGFuZ2VEYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgIHVwZGF0ZWRBdDogY2hhbmdlRGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06U1MnKSxcbiAgICBtZW1vVHlwZTogbWVtb1R5cGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlKG1lbW9pZDogc3RyaW5nKTogVEZpbGUge1xuICBjb25zdCB7ZGFpbHlOb3Rlc30gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpO1xuICBjb25zdCB0aW1lU3RyaW5nID0gbWVtb2lkLnNsaWNlKDAsIDEzKTtcbiAgY29uc3QgY2hhbmdlRGF0ZSA9IG1vbWVudCh0aW1lU3RyaW5nLCAnWVlZWU1NRERISG1tU1MnKTtcbiAgY29uc3QgZGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlKGNoYW5nZURhdGUsIGRhaWx5Tm90ZXMpO1xuICByZXR1cm4gZGFpbHlOb3RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGFpbHlOb3RlUGF0aCgpOiBzdHJpbmcge1xuICBjb25zdCBkYWlseU5vdGVzU2V0dGluZyA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gIGNvbnN0IGRhaWx5Tm90ZVBhdGggPSBkYWlseU5vdGVzU2V0dGluZy5mb2xkZXI7XG4gIHJldHVybiBkYWlseU5vdGVQYXRoO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGNvbnN0IGZpbmRRdWVyeSA9IGFzeW5jICgpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgcXVlcnlMaXN0ID0gW107XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcbiAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChxdWVyeUZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBpZiAoZmlsZUxpbmVzICYmIGZpbGVMaW5lcy5sZW5ndGggIT0gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGZpbGVMaW5lc1tpXSA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBjcmVhdGVkRGF0ZVN0cmluZyA9IGdldENyZWF0ZWREYXRlRnJvbUxpbmUoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgY29uc3QgY3JlYXRlZERhdGUgPSBtb21lbnQoY3JlYXRlZERhdGVTdHJpbmcsICdZWVlZTU1EREhIbW1zcycpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IGNyZWF0ZWREYXRlO1xuICAgICAgICBjb25zdCBpZCA9IGNyZWF0ZWREYXRlU3RyaW5nICsgZ2V0SURGcm9tTGluZShmaWxlTGluZXNbaV0pO1xuICAgICAgICBjb25zdCBxdWVyeXN0cmluZyA9IGdldFN0cmluZ0Zyb21MaW5lKGZpbGVMaW5lc1tpXSk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gZ2V0VGl0bGVGcm9tTGluZShmaWxlTGluZXNbaV0pO1xuICAgICAgICBsZXQgcGlubmVkRGF0ZTtcblxuICAgICAgICBpZiAoL14oLispcGlubmVkQXQoLispJC8udGVzdChmaWxlTGluZXNbaV0pKSB7XG4gICAgICAgICAgcGlubmVkRGF0ZSA9IG1vbWVudChnZXRQaW5uZWREYXRlRnJvbUxpbmUoZmlsZUxpbmVzW2ldKSwgJ1lZWVlNTURESEhtbXNzJyk7XG4gICAgICAgICAgcXVlcnlMaXN0LnB1c2goe1xuICAgICAgICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkRGF0ZSxcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHBpbm5lZEF0OiBwaW5uZWREYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5c3RyaW5nLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL14oLispXFxbXFxdKC4rKT8kLy50ZXN0KGZpbGVMaW5lc1tpXSkpIHtcbiAgICAgICAgICBxdWVyeUxpc3QucHVzaCh7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6ICcnLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlcnlMaXN0LnB1c2goe1xuICAgICAgICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkRGF0ZSxcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHBpbm5lZEF0OiAnJyxcbiAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBxdWVyeXN0cmluZyxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICB1c2VySWQ6ICcnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5TGlzdDtcbn07XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRDcmVhdGVkRGF0ZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4gL14oXFxkezE0fSkvLmV4ZWMobGluZSk/LlsxXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRJREZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4gL14oXFxkezE0fSkoXFxkezEsfSlcXHMvLmV4ZWMobGluZSk/LlsyXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRTdHJpbmdGcm9tTGluZSA9IChsaW5lOiBzdHJpbmcpID0+IC9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispP1xcXSkvLmV4ZWMobGluZSk/Lls0XTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRUaXRsZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4gL14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKylcXF0pLy5leGVjKGxpbmUpPy5bM107XG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZ2V0UGlubmVkRGF0ZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4vXihcXGR7MTR9KShcXGR7MSx9KVxccyguKylcXHMoXFxbKC4rKVxcXSlcXHMocGlubmVkQXRcXDogKFxcZHsxNH0pKS8uZXhlYyhsaW5lKT8uWzddO1xuIiwiaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5pbXBvcnQge1RGaWxlLCBub3JtYWxpemVQYXRoLCBOb3RpY2V9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU9ic2lkaWFuUXVlcnkgPSBhc3luYyAodGl0bGU6IHN0cmluZywgcXVlcnlzdHJpbmc6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICBpZiAocXVlcnlGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoKTtcbiAgICBjb25zdCBjcmVhdGVkRGF0ZSA9IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgY29uc3QgdXBkYXRlZERhdGUgPSBjcmVhdGVkRGF0ZTtcbiAgICAvLyBjb25zdCBsaW5lTnVtID0gZmlsZUxpbmVzLmxlbmd0aCArIDE7XG4gICAgLy8gbGV0IGxpbmVOdW07XG4gICAgbGV0IGxpbmVOdW07XG4gICAgaWYgKGZpbGVMaW5lcy5sZW5ndGggPT09IDEgJiYgZmlsZUxpbmVzWzBdID09PSAnJykge1xuICAgICAgbGluZU51bSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVOdW0gPSBmaWxlTGluZXMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG5cbiAgICBhd2FpdCBjcmVhdGVRdWVyeUluRmlsZShxdWVyeUZpbGUsIGZpbGVDb250ZW50cywgaWQsIHRpdGxlLCBxdWVyeXN0cmluZyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHBpbm5lZEF0OiAnJyxcbiAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5c3RyaW5nLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIHVwZGF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgIHVzZXJJZDogJycsXG4gICAgICB9LFxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcXVlcnlGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlUXVlcnlGaWxlKHF1ZXJ5RmlsZVBhdGgpO1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZmlsZSk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGNyZWF0ZWREYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IGNyZWF0ZWREYXRlO1xuICAgIGNvbnN0IGlkID0gZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJykgKyAxO1xuXG4gICAgYXdhaXQgY3JlYXRlUXVlcnlJbkZpbGUoZmlsZSwgZmlsZUNvbnRlbnRzLCBpZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUsXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlzdHJpbmcsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVF1ZXJ5SW5GaWxlID0gYXN5bmMgKFxuICBmaWxlOiBURmlsZSxcbiAgZmlsZUNvbnRlbnQ6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyxcbiAgdGl0bGU6IHN0cmluZyxcbiAgcXVlcnlTdHJpbmc6IHN0cmluZyxcbik6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGxldCBuZXdDb250ZW50O1xuICBpZiAoZmlsZUNvbnRlbnQgPT09ICcnKSB7XG4gICAgbmV3Q29udGVudCA9IGlkICsgJyAnICsgdGl0bGUgKyAnICcgKyBxdWVyeVN0cmluZztcbiAgfSBlbHNlIHtcbiAgICBuZXdDb250ZW50ID0gZmlsZUNvbnRlbnQgKyAnXFxuJyArIGlkICsgJyAnICsgdGl0bGUgKyAnICcgKyBxdWVyeVN0cmluZztcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVRdWVyeUZpbGUgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4gPT4ge1xuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtwYXRofSdgLCBlcnIpO1xuICAgIG5ldyBOb3RpY2UoJ1VuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuJyk7XG4gIH1cbn07XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbiIsImltcG9ydCB7bm9ybWFsaXplUGF0aCwgVEZvbGRlciwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlU2V0dGluZ3MsIGdldERhdGVGcm9tRmlsZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtQcm9jZXNzRW50cmllc0JlbG93fSBmcm9tICcuLi9tZW1vcyc7XG5cbmV4cG9ydCBjbGFzcyBEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlbWFpbmluZ1Rhc2tzKG5vdGU6IFRGaWxlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFub3RlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQobm90ZSk7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0IG1hdGNoTGVuZ3RoID0gKGZpbGVDb250ZW50cy5tYXRjaCgvKC18XFwqKSAoXFxbIFxcXVxccyk/KChcXDx0aW1lXFw+KT9cXGR7MSwyfVxcOlxcZHsyfSk/L2cpIHx8IFtdKS5sZW5ndGg7XG4gIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChQcm9jZXNzRW50cmllc0JlbG93LnJlcGxhY2UoLyhbLj8qK14kW1xcXVxcXFwoKXt9fC1dKS9nLCAnXFxcXCQxJyksICdnJyk7XG4gIGNvbnN0IHByb2Nlc3NFbnRyaWVzSGVhZGVyID0gKGZpbGVDb250ZW50cy5tYXRjaChyZSkgfHwgW10pLmxlbmd0aDtcbiAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgaWYgKHByb2Nlc3NFbnRyaWVzSGVhZGVyKSB7XG4gICAgcmV0dXJuIG1hdGNoTGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGFza3NGcm9tRGFpbHlOb3RlKGRhaWx5Tm90ZTogVEZpbGUgfCBudWxsLCBkYWlseUV2ZW50czogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XG4gIGlmICghZGFpbHlOb3RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IFRhc2tzID0gYXdhaXQgZ2V0UmVtYWluaW5nVGFza3MoZGFpbHlOb3RlKTtcblxuICBpZiAoVGFza3MpIHtcbiAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gZ2V0RGF0ZUZyb21GaWxlKGRhaWx5Tm90ZSwgJ2RheScpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBnZXREYXRlRnJvbUZpbGUoZGFpbHlOb3RlLCAnZGF5Jyk7XG4gICAgbGV0IHByb2Nlc3NIZWFkZXJGb3VuZCA9IGZhbHNlO1xuICAgIGxldCBtZW1vVHlwZTogc3RyaW5nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChwcm9jZXNzSGVhZGVyRm91bmQgPT0gZmFsc2UgJiYgbGluZUNvbnRhaW5zUGFyc2VCZWxvd1Rva2VuKGxpbmUpKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXJGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzc0hlYWRlckZvdW5kID09IHRydWUgJiYgIWxpbmVDb250YWluc1BhcnNlQmVsb3dUb2tlbihsaW5lKSAmJiAvXiN7MSx9IC9nLnRlc3QobGluZSkpIHtcbiAgICAgICAgcHJvY2Vzc0hlYWRlckZvdW5kID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lQ29udGFpbnNUaW1lKGxpbmUpICYmIHByb2Nlc3NIZWFkZXJGb3VuZCkge1xuICAgICAgICBzdGFydERhdGUuaG91cnMocGFyc2VJbnQoZXh0cmFjdEhvdXJGcm9tQnVsbGV0TGluZShsaW5lKSkpO1xuICAgICAgICBzdGFydERhdGUubWludXRlcyhwYXJzZUludChleHRyYWN0TWluRnJvbUJ1bGxldExpbmUobGluZSkpKTtcbiAgICAgICAgZW5kRGF0ZS5ob3VycyhwYXJzZUludChleHRyYWN0SG91ckZyb21CdWxsZXRMaW5lKGxpbmUpKSk7XG4gICAgICAgIGlmIChwYXJzZUludChleHRyYWN0SG91ckZyb21CdWxsZXRMaW5lKGxpbmUpKSA+IDIyKSB7XG4gICAgICAgICAgZW5kRGF0ZS5taW51dGVzKHBhcnNlSW50KGV4dHJhY3RNaW5Gcm9tQnVsbGV0TGluZShsaW5lKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZERhdGUubWludXRlcyhwYXJzZUludChleHRyYWN0TWluRnJvbUJ1bGxldExpbmUobGluZSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoL15cXHMqWy0qXVxccyhcXFsoLnsxfSlcXF0pXFxzL2cudGVzdChsaW5lKSkge1xuICAgICAgICAgIGNvbnN0IG1lbW9UYXNrVHlwZSA9IGV4dHJhY3RNZW1vVGFza1R5cGVGcm9tTGluZShsaW5lKTtcbiAgICAgICAgICBpZiAobWVtb1Rhc2tUeXBlID09PSAnICcpIHtcbiAgICAgICAgICAgIG1lbW9UeXBlID0gJ1RBU0stVE9ETyc7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZW1vVGFza1R5cGUgPT09ICd4JyB8fCBtZW1vVGFza1R5cGUgPT09ICdYJykge1xuICAgICAgICAgICAgbWVtb1R5cGUgPSAnVEFTSy1ET05FJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVtb1R5cGUgPSAnVEFTSy0nICsgbWVtb1Rhc2tUeXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW1vVHlwZSA9ICdKT1VSTkFMJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXdUZXh0ID0gZXh0cmFjdFRleHRGcm9tVG9kb0xpbmUobGluZSk7XG4gICAgICAgIGRhaWx5RXZlbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBzdGFydERhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1TUycpICsgaSxcbiAgICAgICAgICBjb250ZW50OiByYXdUZXh0LFxuICAgICAgICAgIHVzZXJfaWQ6IDEsXG4gICAgICAgICAgY3JlYXRlZEF0OiBzdGFydERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgdXBkYXRlZEF0OiBlbmREYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgICAgICAgIG1lbW9UeXBlOiBtZW1vVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWVtb3MoKTogUHJvbWlzZTxhbnlbXT4ge1xuICBjb25zdCBldmVudHM6IGFueVtdIHwgUHJvbWlzZUxpa2U8YW55W10+ID0gW107XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IHtmb2xkZXJ9ID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcblxuICBjb25zdCBkYWlseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG5vcm1hbGl6ZVBhdGgoZm9sZGVyKSkgYXMgVEZvbGRlcjtcblxuICBpZiAoIWRhaWx5Tm90ZXNGb2xkZXIpIHtcbiAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcignRmFpbGVkIHRvIGZpbmQgZGFpbHkgbm90ZXMgZm9sZGVyJyk7XG4gIH1cblxuICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xuXG4gIGZvciAoY29uc3Qgc3RyaW5nIGluIGRhaWx5Tm90ZXMpIHtcbiAgICBpZiAoZGFpbHlOb3Rlc1tzdHJpbmddIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgIGF3YWl0IGdldFRhc2tzRnJvbURhaWx5Tm90ZShkYWlseU5vdGVzW3N0cmluZ10sIGV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50cztcbn1cblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy8gY29uc3QgbGluZUlzVmFsaWRUb2RvID0gKGxpbmU6IHN0cmluZykgPT4ge1xuLy8gLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vICAgcmV0dXJuIC9eXFxzKltcXC1cXCpdXFxzXFxbKFxcc3x4fFh8XFxcXHxcXC18XFw+fER8XFw/fFxcL3xcXCt8UnxcXCF8aXxCfFB8QylcXF1cXHM/XFxzKlxcUy8udGVzdChsaW5lKVxuLy8gfVxuY29uc3QgbGluZUNvbnRhaW5zVGltZSA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccyk/KFxcPHRpbWVcXD4pP1xcZHsxLDJ9XFw6XFxkezJ9KC4qKSQvLnRlc3QobGluZSk7XG4gIC8vIFRoZSBiZWxvdyBsaW5lIGV4Y2x1ZGVzIGVudHJpZXMgd2l0aCBhICc6JyBhZnRlciB0aGUgdGltZSBhcyBJIHdhcyBoYXZpbmcgaXNzdWVzIHdpdGggbXkgY2FsZW5kYXJcbiAgLy8gYmVpbmcgcHVsbGVkIGluLiBPbmNlIG1hZGUgY29uZmlndXJhYmxlIHdpbGwgYmUgc2ltcGxlciB0byBtYW5hZ2UuXG4gIC8vIHJldHVybiAvXlxccypbXFwtXFwqXVxccyhcXFsoXFxzfHh8WHxcXFxcfFxcLXxcXD58RHxcXD98XFwvfFxcK3xSfFxcIXxpfEJ8UHxDKVxcXVxccyk/KFxcPHRpbWVcXD4pP1xcZHsxLDJ9XFw6XFxkezJ9W146XSguKikkLy50ZXN0KGxpbmUpO1xufTtcblxuY29uc3QgbGluZUNvbnRhaW5zUGFyc2VCZWxvd1Rva2VuID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBpZiAoUHJvY2Vzc0VudHJpZXNCZWxvdyA9PT0gJycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZSA9IG5ldyBSZWdFeHAoUHJvY2Vzc0VudHJpZXNCZWxvdy5yZXBsYWNlKC8oWy4/KiteJFtcXF1cXFxcKCl7fXwtXSkvZywgJ1xcXFwkMScpLCAnJyk7XG4gIHJldHVybiByZS50ZXN0KGxpbmUpO1xufTtcblxuY29uc3QgZXh0cmFjdFRleHRGcm9tVG9kb0xpbmUgPSAobGluZTogc3RyaW5nKSA9PlxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAvXlxccypbXFwtXFwqXVxccyhcXFsoLnsxfSlcXF1cXHM/KT8oXFw8dGltZVxcPik/KChcXGR7MSwyfSlcXDooXFxkezJ9KSk/KFxcPFxcL3RpbWVcXD4pP1xccz8oLiopJC8uZXhlYyhsaW5lKT8uWzhdO1xuXG5jb25zdCBleHRyYWN0SG91ckZyb21CdWxsZXRMaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgL15cXHMqW1xcLVxcKl1cXHMoXFxbKC57MX0pXFxdXFxzPyk/KFxcPHRpbWVcXD4pPyhcXGR7MSwyfSlcXDooXFxkezJ9KSguKikkLy5leGVjKGxpbmUpPy5bNF07XG5cbmNvbnN0IGV4dHJhY3RNaW5Gcm9tQnVsbGV0TGluZSA9IChsaW5lOiBzdHJpbmcpID0+XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccz8pPyhcXDx0aW1lXFw+KT8oXFxkezEsMn0pXFw6KFxcZHsyfSkoLiopJC8uZXhlYyhsaW5lKT8uWzVdO1xuXG5jb25zdCBleHRyYWN0TWVtb1Rhc2tUeXBlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PlxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAvXlxccypbXFwtXFwqXVxccyhcXFsoLnsxfSlcXF0pXFxzKC4qKSQvLmV4ZWMobGluZSk/LlsyXTtcbi8vIFRoZSBiZWxvdyBsaW5lIGV4Y2x1ZGVzIGVudHJpZXMgd2l0aCBhICc6JyBhZnRlciB0aGUgdGltZSBhcyBJIHdhcyBoYXZpbmcgaXNzdWVzIHdpdGggbXkgY2FsZW5kYXJcbi8vIGJlaW5nIHB1bGxlZCBpbi4gT25jZSBtYWRlIGNvbmZpZ3VyYWJsZSB3aWxsIGJlIHNpbXBsZXIgdG8gbWFuYWdlLlxuLy8gcmV0dXJuIC9eXFxzKltcXC1cXCpdXFxzKFxcWyhcXHN8eHxYfFxcXFx8XFwtfFxcPnxEfFxcP3xcXC98XFwrfFJ8XFwhfGl8QnxQfEMpXFxdXFxzKT8oXFw8dGltZVxcPik/XFxkezEsMn1cXDpcXGR7Mn1bXjpdKC4qKSQvLnRlc3QobGluZSk7XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9ic2lkaWFuUXVlcnkgPSBhc3luYyAocXVlcnlJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBxdWVyeVN0cmluZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL3F1ZXJ5Lm1kJztcblxuICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG5cbiAgICBsZXQgbGluZUlEO1xuXG4gICAgaWYgKC9eXFxkezEsM30kLy50ZXN0KHF1ZXJ5SWQpKSB7XG4gICAgICBsaW5lSUQgPSBxdWVyeUlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSUQgPSBnZXRJREZyb21MaW5lKHF1ZXJ5SWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVOdW0gPSBwYXJzZUludChsaW5lSUQpIC0gMTtcblxuICAgIGlmIChmaWxlTGluZXMgJiYgZmlsZUxpbmVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gZmlsZUxpbmVzW2xpbmVOdW1dO1xuXG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0ZVN0cmluZyA9IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpO1xuICAgICAgY29uc3QgdXBkYXRlZERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgY29uc3QgbmV3TGluZU51bSA9IGxpbmVOdW0gKyAxO1xuICAgICAgY29uc3QgaWQgPSB1cGRhdGVkRGF0ZVN0cmluZyArIG5ld0xpbmVOdW07XG4gICAgICBpZiAoL14oLispcGlubmVkQXQoLispJC8udGVzdChvbGRDb250ZW50KSkge1xuICAgICAgICBjb25zdCBwaW5uZWRTdHJpbmcgPSBnZXRQaW5uZWRTdHJpbmdGcm9tTGluZShvbGRDb250ZW50KTtcbiAgICAgICAgY29uc3QgcGlubmVkRGF0ZVN0cmluZyA9IGdldFBpbm5lZERhdGVGcm9tTGluZShvbGRDb250ZW50KTtcbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGlkICsgJyAnICsgdGl0bGUgKyAnICcgKyBxdWVyeVN0cmluZyArICcgJyArIHBpbm5lZFN0cmluZztcbiAgICAgICAgY29uc3QgcGlubmVkQXREYXRlID0gbW9tZW50KHBpbm5lZERhdGVTdHJpbmcsICdZWVlZTU1EREhIbW1zcycpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShvbGRDb250ZW50LCBuZXdDb250ZW50KTtcblxuICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkocXVlcnlGaWxlLCBuZXdGaWxlQ29udGVudHMpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3JlYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHBpbm5lZEF0OiBwaW5uZWRBdERhdGUsXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlTdHJpbmcsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGlkICsgJyAnICsgdGl0bGUgKyAnICcgKyBxdWVyeVN0cmluZztcblxuICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShvbGRDb250ZW50LCBuZXdDb250ZW50KTtcblxuICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkocXVlcnlGaWxlLCBuZXdGaWxlQ29udGVudHMpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3JlYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHBpbm5lZEF0OiAnJyxcbiAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBxdWVyeVN0cmluZyxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICB1c2VySWQ6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZ2V0SURGcm9tTGluZSA9IChsaW5lOiBzdHJpbmcpID0+IC9eKFxcZHsxNH0pKFxcZHsxLH0pLy5leGVjKGxpbmUpPy5bMl07XG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZ2V0UGlubmVkU3RyaW5nRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9Pi9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispXFxdKVxccyhwaW5uZWRBdFxcOiAoXFxkezE0fSlcXGQrKS8uZXhlYyhsaW5lKT8uWzZdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFBpbm5lZERhdGVGcm9tTGluZSA9IChsaW5lOiBzdHJpbmcpID0+L14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKylcXF0pXFxzKHBpbm5lZEF0XFw6IChcXGR7MTR9KVxcZCspLy5leGVjKGxpbmUpPy5bN107XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtjcmVhdGVEYWlseU5vdGUsIGdldEFsbERhaWx5Tm90ZXMsIGdldERhaWx5Tm90ZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtJbnNlcnRBZnRlcn0gZnJvbSAnLi4vbWVtb3MnO1xuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG5pbnRlcmZhY2UgTUNvbnRlbnQge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHBvc051bT86IG51bWJlcjtcbn1cblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzExNTE1MC9ob3ctdG8tZXNjYXBlLXJlZ3VsYXItZXhwcmVzc2lvbi1zcGVjaWFsLWNoYXJhY3RlcnMtdXNpbmctamF2YXNjcmlwdFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBhbnkpIHtcbiAgcmV0dXJuIGF3YWl0IHRleHQucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbn1cblxuLy9jcmVkaXQgdG8gY2hob3VtYW5uLCBvcmlnaW5hbCBjb2RlIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGhvdW1hbm4vcXVpY2thZGQvYmxvYi83NTM2YTEyMDcwMWE2MjZlZjAxMGRiNTY3Y2VhN2NmMzAxOGU2YzgyL3NyYy91dGlsaXR5LnRzI0wxMzBcbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lc0luU3RyaW5nKGlucHV0OiBzdHJpbmcpIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCB0ZW1wU3RyaW5nID0gaW5wdXQ7XG5cbiAgd2hpbGUgKHRlbXBTdHJpbmcuY29udGFpbnMoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gdGVtcFN0cmluZy5pbmRleE9mKCdcXG4nKTtcbiAgICBsaW5lcy5wdXNoKHRlbXBTdHJpbmcuc2xpY2UoMCwgbGluZUVuZEluZGV4KSk7XG4gICAgdGVtcFN0cmluZyA9IHRlbXBTdHJpbmcuc2xpY2UobGluZUVuZEluZGV4ICsgMSk7XG4gIH1cblxuICBsaW5lcy5wdXNoKHRlbXBTdHJpbmcpO1xuXG4gIHJldHVybiBsaW5lcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JJbnNlcnQoTWVtb0NvbnRlbnQ6IHN0cmluZywgaXNMaXN0OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XG4gIC8vIGNvbnN0IHBsdWdpbiA9IHdpbmRvdy5wbHVnaW47XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IHJlbW92ZUVudGVyID0gTWVtb0NvbnRlbnQucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG4gIGNvbnN0IGRhdGUgPSBtb21lbnQoKTtcbiAgY29uc3QgdGltZUhvdXIgPSBkYXRlLmZvcm1hdCgnSEgnKTtcbiAgY29uc3QgdGltZU1pbnV0ZSA9IGRhdGUuZm9ybWF0KCdtbScpO1xuICBsZXQgbmV3RXZlbnQ7XG4gIGxldCBsaW5lTnVtO1xuXG4gIGlmIChpc0xpc3QpIHtcbiAgICBuZXdFdmVudCA9IGAtIFsgXSBgICsgU3RyaW5nKHRpbWVIb3VyKSArIGA6YCArIFN0cmluZyh0aW1lTWludXRlKSArIGAgYCArIHJlbW92ZUVudGVyO1xuICB9IGVsc2Uge1xuICAgIG5ld0V2ZW50ID0gYC0gYCArIFN0cmluZyh0aW1lSG91cikgKyBgOmAgKyBTdHJpbmcodGltZU1pbnV0ZSkgKyBgIGAgKyByZW1vdmVFbnRlcjtcbiAgfVxuXG4gIGNvbnN0IGRhaWx5Tm90ZXMgPSBhd2FpdCBnZXRBbGxEYWlseU5vdGVzKCk7XG4gIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKTtcbiAgaWYgKCFleGlzdGluZ0ZpbGUpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlRGFpbHlOb3RlKGRhdGUpO1xuICAgIGF3YWl0IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldE15QWxsRGFpbHlOb3RlcygpO1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZmlsZSk7XG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBhd2FpdCBpbnNlcnRBZnRlckhhbmRsZXIoSW5zZXJ0QWZ0ZXIsIG5ld0V2ZW50LCBmaWxlQ29udGVudHMpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcbiAgICBpZiAobmV3RmlsZUNvbnRlbnQucG9zTnVtID09PSAtMSkge1xuICAgICAgY29uc3QgYWxsTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKG5ld0ZpbGVDb250ZW50LmNvbnRlbnQpO1xuICAgICAgbGluZU51bSA9IGFsbExpbmVzLmxlbmd0aCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVOdW0gPSBuZXdGaWxlQ29udGVudC5wb3NOdW0gKyAxO1xuICAgIH1cbiAgICBpZiAoaXNMaXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbScpICsgJzAwJyArIGxpbmVOdW0sXG4gICAgICAgIGNvbnRlbnQ6IE1lbW9Db250ZW50LFxuICAgICAgICBkZWxldGVkQXQ6ICcnLFxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICAgIHVwZGF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcbiAgICAgICAgbWVtb1R5cGU6ICdUQVNLLVRPRE8nLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW0nKSArICcwMCcgKyBsaW5lTnVtLFxuICAgICAgICBjb250ZW50OiBNZW1vQ29udGVudCxcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICAgIG1lbW9UeXBlOiAnSk9VUk5BTCcsXG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGV4aXN0aW5nRmlsZSk7XG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBhd2FpdCBpbnNlcnRBZnRlckhhbmRsZXIoSW5zZXJ0QWZ0ZXIsIG5ld0V2ZW50LCBmaWxlQ29udGVudHMpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShleGlzdGluZ0ZpbGUsIG5ld0ZpbGVDb250ZW50LmNvbnRlbnQpO1xuICAgIGlmIChuZXdGaWxlQ29udGVudC5wb3NOdW0gPT09IC0xKSB7XG4gICAgICBjb25zdCBhbGxMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUobmV3RmlsZUNvbnRlbnQuY29udGVudCk7XG4gICAgICBsaW5lTnVtID0gYWxsTGluZXMubGVuZ3RoICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZU51bSA9IG5ld0ZpbGVDb250ZW50LnBvc051bSArIDE7XG4gICAgfVxuICAgIGlmIChpc0xpc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tJykgKyAnMDAnICsgbGluZU51bSxcbiAgICAgICAgY29udGVudDogTWVtb0NvbnRlbnQsXG4gICAgICAgIGRlbGV0ZWRBdDogJycsXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcbiAgICAgICAgdXBkYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxuICAgICAgICBtZW1vVHlwZTogJ1RPRE8tQmxhbmsnLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW0nKSArICcwMCcgKyBsaW5lTnVtLFxuICAgICAgICBjb250ZW50OiBNZW1vQ29udGVudCxcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICAgIG1lbW9UeXBlOiAnSk9VUk5BTCcsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vL2NyZWRpdCB0byBjaGhvdW1hbm4sIG9yaWdpbmFsIGNvZGUgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2NoaG91bWFubi9xdWlja2FkZFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydEFmdGVySGFuZGxlcih0YXJnZXRTdHJpbmc6IHN0cmluZywgZm9ybWF0dGVkOiBzdHJpbmcsIGZpbGVDb250ZW50OiBzdHJpbmcpIHtcbiAgLy8gY29uc3QgdGFyZ2V0U3RyaW5nOiBzdHJpbmcgPSBwbHVnaW4uc2V0dGluZ3MuSW5zZXJ0QWZ0ZXI7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0IHRhcmdldFJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxzKiR7YXdhaXQgZXNjYXBlUmVnRXhwKHRhcmdldFN0cmluZyl9XFxzKmApO1xuICBjb25zdCBmaWxlQ29udGVudExpbmVzOiBzdHJpbmdbXSA9IGdldExpbmVzSW5TdHJpbmcoZmlsZUNvbnRlbnQpO1xuXG4gIGNvbnN0IHRhcmdldFBvc2l0aW9uID0gZmlsZUNvbnRlbnRMaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IHRhcmdldFJlZ2V4LnRlc3QobGluZSkpO1xuICBjb25zdCB0YXJnZXROb3RGb3VuZCA9IHRhcmdldFBvc2l0aW9uID09PSAtMTtcbiAgaWYgKHRhcmdldE5vdEZvdW5kKSB7XG4gICAgLy8gaWYgKHRoaXMuY2hvaWNlLmluc2VydEFmdGVyPy5jcmVhdGVJZk5vdEZvdW5kKSB7XG4gICAgLy8gICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbnNlcnRBZnRlcklmTm90Rm91bmQoZm9ybWF0dGVkKTtcbiAgICAvLyB9XG5cbiAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIGZpbmQgaW5zZXJ0IGFmdGVyIGxpbmUgaW4gZmlsZS4nKTtcbiAgfVxuXG4gIGNvbnN0IG5leHRIZWFkZXJQb3NpdGlvbkFmdGVyVGFyZ2V0UG9zaXRpb24gPSBmaWxlQ29udGVudExpbmVzXG4gICAgLnNsaWNlKHRhcmdldFBvc2l0aW9uICsgMSlcbiAgICAuZmluZEluZGV4KChsaW5lKSA9PiAvXiMrIHwtLS0vLnRlc3QobGluZSkpO1xuICBjb25zdCBmb3VuZE5leHRIZWFkZXIgPSBuZXh0SGVhZGVyUG9zaXRpb25BZnRlclRhcmdldFBvc2l0aW9uICE9PSAtMTtcblxuICBpZiAoZm91bmROZXh0SGVhZGVyKSB7XG4gICAgbGV0IGVuZE9mU2VjdGlvbkluZGV4OiBudW1iZXI7XG5cbiAgICBmb3IgKGxldCBpID0gbmV4dEhlYWRlclBvc2l0aW9uQWZ0ZXJUYXJnZXRQb3NpdGlvbiArIHRhcmdldFBvc2l0aW9uOyBpID4gdGFyZ2V0UG9zaXRpb247IGktLSkge1xuICAgICAgY29uc3QgbGluZUlzTmV3bGluZTogYm9vbGVhbiA9IC9eW1xcc1xcbiBdKiQvLnRlc3QoZmlsZUNvbnRlbnRMaW5lc1tpXSk7XG4gICAgICBpZiAoIWxpbmVJc05ld2xpbmUpIHtcbiAgICAgICAgZW5kT2ZTZWN0aW9uSW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWVuZE9mU2VjdGlvbkluZGV4KSBlbmRPZlNlY3Rpb25JbmRleCA9IHRhcmdldFBvc2l0aW9uO1xuXG4gICAgcmV0dXJuIGF3YWl0IGluc2VydFRleHRBZnRlclBvc2l0aW9uSW5Cb2R5KGZvcm1hdHRlZCwgZmlsZUNvbnRlbnQsIGVuZE9mU2VjdGlvbkluZGV4LCBmb3VuZE5leHRIZWFkZXIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCBpbnNlcnRUZXh0QWZ0ZXJQb3NpdGlvbkluQm9keShmb3JtYXR0ZWQsIGZpbGVDb250ZW50LCBmaWxlQ29udGVudExpbmVzLmxlbmd0aCAtIDEsIGZvdW5kTmV4dEhlYWRlcik7XG4gIH1cbiAgLy8gcmV0dXJuIGluc2VydFRleHRBZnRlclBvc2l0aW9uSW5Cb2R5KGZvcm1hdHRlZCwgZmlsZUNvbnRlbnQsIHRhcmdldFBvc2l0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydFRleHRBZnRlclBvc2l0aW9uSW5Cb2R5KFxuICB0ZXh0OiBzdHJpbmcsXG4gIGJvZHk6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGZvdW5kPzogYm9vbGVhbixcbik6IFByb21pc2U8TUNvbnRlbnQ+IHtcbiAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogYCR7Ym9keX1cXG4ke3RleHR9YCxcbiAgICAgIHBvc051bTogLTEsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNwbGl0Q29udGVudCA9IGJvZHkuc3BsaXQoJ1xcbicpO1xuXG4gIGlmIChmb3VuZCkge1xuICAgIGNvbnN0IHByZSA9IHNwbGl0Q29udGVudC5zbGljZSgwLCBwb3MgKyAxKS5qb2luKCdcXG4nKTtcbiAgICBjb25zdCBwb3N0ID0gc3BsaXRDb250ZW50LnNsaWNlKHBvcyArIDEpLmpvaW4oJ1xcbicpO1xuICAgIC8vIHJldHVybiBgJHtwcmV9XFxuJHt0ZXh0fVxcbiR7cG9zdH1gO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBgJHtwcmV9XFxuJHt0ZXh0fVxcbiR7cG9zdH1gLFxuICAgICAgcG9zTnVtOiBwb3MsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcmUgPSBzcGxpdENvbnRlbnQuc2xpY2UoMCwgcG9zICsgMSkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcG9zdCA9IHNwbGl0Q29udGVudC5zbGljZShwb3MgKyAxKS5qb2luKCdcXG4nKTtcbiAgICBpZiAoL1tcXHNcXFNdKj8vZy50ZXN0KHBvc3QpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBgJHtwcmV9XFxuJHt0ZXh0fWAsXG4gICAgICAgIHBvc051bTogcG9zLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogYCR7cHJlfSR7dGV4dH1cXG4ke3Bvc3R9YCxcbiAgICAgICAgcG9zTnVtOiBwb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyByZXR1cm4gYCR7cHJlfSR7dGV4dH1cXG4ke3Bvc3R9YDtcbiAgfVxufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtjcmVhdGVEYWlseU5vdGUsIGdldEFsbERhaWx5Tm90ZXMsIGdldERhaWx5Tm90ZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcbmltcG9ydCB7aW5zZXJ0QWZ0ZXJIYW5kbGVyfSBmcm9tICcuL29iQ3JlYXRlTWVtbyc7XG5pbXBvcnQge0luc2VydEFmdGVyfSBmcm9tICcuLi9tZW1vcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN0b3JlRGVsZXRlZE1lbW8oZGVsZXRlZE1lbW9pZDogc3RyaW5nKTogUHJvbWlzZTxhbnlbXT4ge1xuICBjb25zdCB7dmF1bHQsIG1ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBpZiAoL1xcZHsxNCx9Ly50ZXN0KGRlbGV0ZWRNZW1vaWQpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL2RlbGV0ZS5tZCc7XG4gICAgY29uc3QgZGVsZXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgICBpZiAoZGVsZXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkZWxldGVGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQoZGVsZXRlZE1lbW9pZC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3RGVsZXRlZmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzLnJlcGxhY2UobGluZSwgJycpO1xuICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZGVsZXRlRmlsZSwgbmV3RGVsZXRlZmlsZUNvbnRlbnRzKTtcbiAgICAgICAgaWYgKC9eLSAoLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQobGluZSk7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChpZCwgJ1lZWVlNTURESEhtbXNzJyk7XG4gICAgICAgICAgY29uc3QgdGltZUhvdXIgPSBkYXRlLmZvcm1hdCgnSEgnKTtcbiAgICAgICAgICBjb25zdCB0aW1lTWludXRlID0gZGF0ZS5mb3JtYXQoJ21tJyk7XG5cbiAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IGAtIGAgKyBTdHJpbmcodGltZUhvdXIpICsgYDpgICsgU3RyaW5nKHRpbWVNaW51dGUpICsgYCBgICsgZXh0cmFjdENvbnRlbnRmcm9tVGV4dChsaW5lKTtcbiAgICAgICAgICBjb25zdCBkYWlseU5vdGVzID0gYXdhaXQgZ2V0QWxsRGFpbHlOb3RlcygpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKTtcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nRmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGNyZWF0ZURhaWx5Tm90ZShkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGF3YWl0IGluc2VydEFmdGVySGFuZGxlcihJbnNlcnRBZnRlciwgbmV3RXZlbnQsIGZpbGVDb250ZW50cyk7XG4gICAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZmlsZSwgbmV3RmlsZUNvbnRlbnQuY29udGVudCk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEF0OiAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZXhpc3RpbmdGaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gYXdhaXQgaW5zZXJ0QWZ0ZXJIYW5kbGVyKEluc2VydEFmdGVyLCBuZXdFdmVudCwgZmlsZUNvbnRlbnRzKTtcbiAgICAgICAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShleGlzdGluZ0ZpbGUsIG5ld0ZpbGVDb250ZW50LmNvbnRlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRBdDogJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaWxlTGluZXMgPSBudWxsO1xuICAgICAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRm9yZXZlcihkZWxldGVkTWVtb2lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge3ZhdWx0LCBtZXRhZGF0YUNhY2hlfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChkZWxldGVkTWVtb2lkKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9kZWxldGUubWQnO1xuICAgIGNvbnN0IGRlbGV0ZUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKGRlbGV0ZUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgICBsZXQgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgICAgaWYgKGZpbGVMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGluZU51bSA9IHBhcnNlSW50KGRlbGV0ZWRNZW1vaWQuc2xpY2UoMTQpKTtcbiAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtIC0gMV07XG4gICAgICAgIGlmICgvXi0gKC4rKSQvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAvLyBjb25zdCBpZCA9IGV4dHJhY3RJRGZyb21UZXh0KGZpbGVMaW5lc1tpXSk7XG4gICAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBmaWxlQ29udGVudHMucmVwbGFjZShsaW5lLCAnJyk7XG4gICAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KGRlbGV0ZUZpbGUsIG5ld0ZpbGVDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmlsZUxpbmVzID0gbnVsbDtcbiAgICAgIGZpbGVDb250ZW50cyA9IG51bGw7XG4gICAgfVxuICB9XG4gIC8vIHJldHVybiBkZWxldGVkTWVtb3M7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZWxldGVkTWVtb3MoKTogUHJvbWlzZTxhbnlbXT4ge1xuICBjb25zdCB7dmF1bHQsIG1ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvZGVsZXRlLm1kJztcbiAgY29uc3QgZGVsZXRlZE1lbW9zOiBhbnlbXSB8IFByb21pc2VMaWtlPGFueVtdPiA9IFtdO1xuICBjb25zdCBkZWxldGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcbiAgaWYgKGRlbGV0ZUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGxldCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGRlbGV0ZUZpbGUpO1xuICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgaWYgKGZpbGVMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBkZWxldGVkTWVtb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBmaWxlTGluZXNbaV07XG4gICAgICAgIGlmICghLy0gLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBleHRyYWN0SURmcm9tVGV4dChsaW5lKTtcbiAgICAgICAgICBjb25zdCB0aW1lU3RyaW5nID0gaWQuc2xpY2UoMCwgMTMpO1xuICAgICAgICAgIC8vIGNvbnN0IGlkU3RyaW5nID0gcGFyc2VJbnQoaWQuc2xpY2UoMTQpKTtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkRGF0ZSA9IG1vbWVudCh0aW1lU3RyaW5nLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBjb25zdCBkZWxldGVkRGF0ZUlEID0gZXh0cmFjdERlbGV0ZURhdGVmcm9tVGV4dChmaWxlTGluZXNbaV0pO1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWREYXRlID0gbW9tZW50KGRlbGV0ZWREYXRlSUQuc2xpY2UoMCwgMTMpLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZXh0cmFjdENvbnRlbnRmcm9tVGV4dChmaWxlTGluZXNbaV0pO1xuICAgICAgICAgIGRlbGV0ZWRNZW1vcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBkZWxldGVkRGF0ZUlELFxuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IDEsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBjcmVhdGVkRGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06U1MnKSxcbiAgICAgICAgICAgIGRlbGV0ZWRBdDogZGVsZXRlZERhdGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlTGluZXMgPSBudWxsO1xuICAgIGZpbGVDb250ZW50cyA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIGRlbGV0ZWRNZW1vcztcbn1cblxuZXhwb3J0IGNvbnN0IHNlbmRNZW1vVG9EZWxldGUgPSBhc3luYyAobWVtb0NvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9kZWxldGUubWQnO1xuXG4gIGNvbnN0IGRlbGV0ZUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gIGlmIChkZWxldGVGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGRlbGV0ZUZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgY29uc3QgZGVsZXRlRGF0ZSA9IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgbGV0IGxpbmVOdW07XG4gICAgaWYgKGZpbGVMaW5lcy5sZW5ndGggPT09IDEgJiYgZmlsZUxpbmVzWzBdID09PSAnJykge1xuICAgICAgbGluZU51bSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVOdW0gPSBmaWxlTGluZXMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgY29uc3QgZGVsZXRlRGF0ZUlEID0gZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJykgKyBsaW5lTnVtO1xuXG4gICAgYXdhaXQgY3JlYXRlRGVsZXRlTWVtb0luRmlsZShkZWxldGVGaWxlLCBmaWxlQ29udGVudHMsIG1lbW9Db250ZW50LCBkZWxldGVEYXRlSUQpO1xuXG4gICAgcmV0dXJuIGRlbGV0ZURhdGU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVsZXRlRmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IGNyZWF0ZWRlbGV0ZUZpbGUoZGVsZXRlRmlsZVBhdGgpO1xuICAgIC8vIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgLy8gY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoKTtcbiAgICBjb25zdCBkZWxldGVEYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBjb25zdCBsaW5lTnVtID0gMTtcbiAgICBjb25zdCBkZWxldGVEYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG5cbiAgICBhd2FpdCBjcmVhdGVEZWxldGVNZW1vSW5GaWxlKGZpbGUsICcnLCBtZW1vQ29udGVudCwgZGVsZXRlRGF0ZUlEKTtcblxuICAgIHJldHVybiBkZWxldGVEYXRlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVsZXRlTWVtb0luRmlsZSA9IGFzeW5jIChcbiAgZmlsZTogVEZpbGUsXG4gIGZpbGVDb250ZW50OiBzdHJpbmcsXG4gIG1lbW9Db250ZW50OiBzdHJpbmcsXG4gIGRlbGV0ZURhdGU6IHN0cmluZyxcbik6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGxldCBuZXdDb250ZW50O1xuICBpZiAoZmlsZUNvbnRlbnQgPT09ICcnKSB7XG4gICAgbmV3Q29udGVudCA9IG1lbW9Db250ZW50ICsgJyBkZWxldGVkQXQ6ICcgKyBkZWxldGVEYXRlO1xuICB9IGVsc2Uge1xuICAgIG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudCArICdcXG4nICsgbWVtb0NvbnRlbnQgKyAnIGRlbGV0ZWRBdDogJyArIGRlbGV0ZURhdGU7XG4gIH1cblxuICBhd2FpdCB2YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlZGVsZXRlRmlsZSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiA9PiB7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke3BhdGh9J2AsIGVycik7XG4gICAgbmV3IE5vdGljZSgnVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS4nKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3RJRGZyb21UZXh0ID0gKGxpbmU6IHN0cmluZykgPT4gL14tIChcXGR7MTR9KShcXGQrKVxccyguKylcXHMoZGVsZXRlZEF0OiApKC4rKSQvLmV4ZWMobGluZSk/LlsxXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBleHRyYWN0Q29udGVudGZyb21UZXh0ID0gKGxpbmU6IHN0cmluZykgPT4gL14tIChcXGQrKVxccyguKylcXHMoZGVsZXRlZEF0OiApKC4rKSQvLmV4ZWMobGluZSk/LlsyXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBleHRyYWN0RGVsZXRlRGF0ZWZyb21UZXh0ID0gKGxpbmU6IHN0cmluZykgPT4gL14tIChcXGQrKVxccyguKylcXHMoZGVsZXRlZEF0OiApKC4rKSQvLmV4ZWMobGluZSk/Lls0XTtcbi8vIGNvbnN0IGV4dHJhY3RNZW1vVGFza1R5cGVGcm9tTGluZSA9IChsaW5lOiBzdHJpbmcpID0+XG4vLyAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4vLyAgIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXSlcXHMoLiopJC8uZXhlYyhsaW5lKT8uWzJdO1xuIiwiaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7Z2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuLy8gaW1wb3J0IGFwcFN0b3JlIGZyb20gXCIuLi9zdG9yZXMvYXBwU3RvcmVcIjtcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XG4vLyBpbXBvcnQgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge3NlbmRNZW1vVG9EZWxldGV9IGZyb20gJy4vb2JEZWxldGVNZW1vJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9iSGlkZU1lbW8obWVtb2lkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsLk1lbW8+IHtcbiAgY29uc3Qge2RhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChtZW1vaWQpKSB7XG4gICAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gbWVtb2lkLnNsaWNlKDAsIDEzKTtcbiAgICBjb25zdCBpZFN0cmluZyA9IHBhcnNlSW50KG1lbW9pZC5zbGljZSgxNCkpO1xuICAgIGNvbnN0IGNoYW5nZURhdGUgPSBtb21lbnQodGltZVN0cmluZywgJ1lZWVlNTURESEhtbVNTJyk7XG4gICAgY29uc3QgZGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlKGNoYW5nZURhdGUsIGRhaWx5Tm90ZXMpO1xuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnQpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBleHRyYWN0Q29udGVudGZyb21UZXh0KGZpbGVMaW5lc1tpZFN0cmluZ10pO1xuICAgIGNvbnN0IG9yaWdpbmFsTGluZSA9ICctICcgKyBtZW1vaWQgKyAnICcgKyBjb250ZW50O1xuICAgIGNvbnN0IG5ld0xpbmUgPSBmaWxlTGluZXNbaWRTdHJpbmddO1xuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZShuZXdMaW5lLCAnJyk7XG4gICAgYXdhaXQgdmF1bHQubW9kaWZ5KGRhaWx5Tm90ZSwgbmV3RmlsZUNvbnRlbnQpO1xuICAgIGNvbnN0IGRlbGV0ZURhdGUgPSBhd2FpdCBzZW5kTWVtb1RvRGVsZXRlKG9yaWdpbmFsTGluZSk7XG4gICAgcmV0dXJuIGRlbGV0ZURhdGU7XG4gIH1cbn1cblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3RDb250ZW50ZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9Pi9eXFxzKltcXC1cXCpdXFxzKFxcWyhcXHN8eHxYfFxcXFx8XFwtfFxcPnxEfFxcP3xcXC98XFwrfFJ8XFwhfGl8QnxQfEMpXFxdXFxzPyk/KFxcPHRpbWVcXD4pPygoXFxkezEsMn0pXFw6KFxcZHsyfSkpPyhcXDxcXC90aW1lXFw+KT9cXHM/KC4qKSQvLmV4ZWMoXG4gICAgbGluZSxcbiAgKT8uWzhdO1xuIiwiaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5pbXBvcnQge1RGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge3ZhdWx0LCBtZXRhZGF0YUNhY2hlfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG4gICAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQocXVlcnlJRC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgaWYgKC9eXFxkezE0LH0oLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50cy5yZXBsYWNlKGxpbmUsICcnKTtcbiAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkocXVlcnlGaWxlLCBuZXdGaWxlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuICAvLyByZXR1cm4gZGVsZXRlZE1lbW9zO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgcGluUXVlcnlJbkZpbGUgPSBhc3luYyAocXVlcnlJRDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBmaWxlTGluZXNbb3JpZ2luYWxMaW5lTnVtIC0gMV07XG4gICAgICBjb25zdCBwaW5uZWRBdERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgbGV0IGxpbmVOdW07XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICAgIGxpbmVOdW0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgICAgfVxuICAgICAgY29uc3QgcGlubmVkQXREYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG4gICAgICBjb25zdCBuZXdRdWVyeSA9IG9yaWdpbmFsQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudHMucmVwbGFjZShvcmlnaW5hbENvbnRlbnQsIG5ld1F1ZXJ5KTtcbiAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0NvbnRlbnQpO1xuICAgICAgLy8gYXdhaXQgY3JlYXRlRGVsZXRlTWVtb0luRmlsZShxdWVyeUZpbGUsIGZpbGVDb250ZW50cyAsIG9yaWdpbmFsQ29udGVudCAsIHBpbm5lZEF0RGF0ZUlEKTtcbiAgICAgIHJldHVybiBwaW5uZWRBdERhdGU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdW5waW5RdWVyeUluRmlsZSA9IGFzeW5jIChxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvcXVlcnkubWQnO1xuXG4gIGNvbnN0IHF1ZXJ5RmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChxdWVyeUZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZmlsZUxpbmVzW29yaWdpbmFsTGluZU51bSAtIDFdO1xuICAgIGNvbnN0IHBpbm5lZEF0U3RyaW5nID0gZXh0cmFjdFBpbm5lZEF0ZnJvbVRleHQob3JpZ2luYWxDb250ZW50KTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShwaW5uZWRBdFN0cmluZywgJycpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0ZpbGVDb250ZW50cyk7XG4gIH1cbiAgcmV0dXJuO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlbGV0ZU1lbW9JbkZpbGUgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICBmaWxlQ29udGVudDogc3RyaW5nLFxuICBtZW1vQ29udGVudDogc3RyaW5nLFxuICBwaW5uZWRBdERhdGVJRDogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gbWVtb0NvbnRlbnQgKyAnIHBpbm5lZEF0OiAnICsgcGlubmVkQXREYXRlSUQ7XG4gIH0gZWxzZSB7XG4gICAgbmV3Q29udGVudCA9IGZpbGVDb250ZW50ICsgJ1xcbicgKyBtZW1vQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVxdWVyeUZpbGUgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4gPT4ge1xuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtwYXRofSdgLCBlcnIpO1xuICAgIG5ldyBOb3RpY2UoJ1VuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuJyk7XG4gIH1cbn07XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBleHRyYWN0UGlubmVkQXRmcm9tVGV4dCA9IChsaW5lOiBzdHJpbmcpID0+L14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKylcXF0pKFxcc3Bpbm5lZEF0XFw6IChcXGR7MTQsfSkpJC8uZXhlYyhsaW5lKT8uWzZdO1xuIiwiLy8gaW1wb3J0IHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7ZmluZFF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JHZXRRdWVyaWVzJztcbmltcG9ydCB7Y3JlYXRlT2JzaWRpYW5RdWVyeX0gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnknO1xuaW1wb3J0IHtnZXRNZW1vc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iR2V0TWVtb3MnO1xuaW1wb3J0IHt1cGRhdGVPYnNpZGlhblF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVRdWVyeSc7XG5pbXBvcnQge29iSGlkZU1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vJztcbmltcG9ydCB7ZGVsZXRlRm9yZXZlciwgZ2V0RGVsZXRlZE1lbW9zLCByZXN0b3JlRGVsZXRlZE1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZU1lbW8nO1xuaW1wb3J0IHtkZWxldGVRdWVyeUZvcmV2ZXJ9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5JztcbmltcG9ydCB7cGluUXVlcnlJbkZpbGUsIHVucGluUXVlcnlJbkZpbGV9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5JztcblxuLy8gdHlwZSBSZXNwb25zZVR5cGU8VCA9IHVua25vd24+ID0ge1xuLy8gICBzdWNjZWVkOiBib29sZWFuO1xuLy8gICBtZXNzYWdlOiBzdHJpbmc7XG4vLyAgIGRhdGE6IFQ7XG4vLyB9O1xuXG4vLyB0eXBlIFJlcXVlc3RDb25maWcgPSB7XG4vLyAgIG1ldGhvZDogc3RyaW5nO1xuLy8gICB1cmw6IHN0cmluZztcbi8vICAgZGF0YT86IGFueTtcbi8vICAgZGF0YVR5cGU/OiBcImpzb25cIiB8IFwiZmlsZVwiO1xuLy8gfTtcblxuLy8gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdDxUPihjb25maWc6IFJlcXVlc3RDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlVHlwZTxUPj4ge1xuLy8gICBjb25zdCB7IG1ldGhvZCwgdXJsLCBkYXRhLCBkYXRhVHlwZSB9ID0gY29uZmlnO1xuLy8gICBjb25zdCByZXF1ZXN0Q29uZmlnOiBSZXF1ZXN0SW5pdCA9IHtcbi8vICAgICBtZXRob2QsXG4vLyAgIH07XG5cbi8vICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuLy8gICAgIGlmIChkYXRhVHlwZSA9PT0gXCJmaWxlXCIpIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuYm9keSA9IGRhdGE7XG4vLyAgICAgfSBlbHNlIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuaGVhZGVycyA9IHtcbi8vICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4vLyAgICAgICB9O1xuLy8gICAgICAgcmVxdWVzdENvbmZpZy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4vLyAgICAgfVxuLy8gICB9XG5cbi8vICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHJlcXVlc3RDb25maWcpO1xuLy8gICBjb25zdCByZXNwb25zZURhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZXNwb25zZVR5cGU8VD47XG5cbi8vICAgaWYgKCFyZXNwb25zZURhdGEuc3VjY2VlZCkge1xuLy8gICAgIHRocm93IHJlc3BvbnNlRGF0YTtcbi8vICAgfVxuXG4vLyAgIHJldHVybiByZXNwb25zZURhdGE7XG4vLyB9XG5cbm5hbWVzcGFjZSBhcGkge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0VXNlckluZm8oKSB7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuVXNlcj4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvdXNlci9tZVwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25pbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbmluXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ251cCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbnVwXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25vdXQoKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbm91dFwiLFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVXNlcm5hbWVVc2FibGUodXNlcm5hbWU6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL2NoZWNrdXNlcm5hbWVcIixcbiAgICAvLyAgIGRhdGE6IHsgdXNlcm5hbWUgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja1Bhc3N3b3JkVmFsaWQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL3ZhbGlkcGFzc3dvcmRcIixcbiAgICAvLyAgIGRhdGE6IHsgcGFzc3dvcmQgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVVc2VyaW5mbyh1c2VyaW5mbzogUGFydGlhbDx7dXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgZ2l0aHViTmFtZTogc3RyaW5nfT4pIHtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3VzZXIvbWVcIixcbiAgICAvLyAgIGRhdGE6IHVzZXJpbmZvLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE15TWVtb3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldE1lbW9zKCk7XG5cbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5NZW1vW10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL21lbW8vYWxsXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TXlEZWxldGVkTWVtb3MoKSB7XG4gICAgcmV0dXJuIGdldERlbGV0ZWRNZW1vcygpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW9bXT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9hbGw/ZGVsZXRlZD10cnVlXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICAvLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtbyhjb250ZW50OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gY3JlYXRlTWVtb3MoY29udGVudCk7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuTWVtbz4oe1xuICAvLyAgIC8vICAgbWV0aG9kOiBcIlBVVFwiLFxuICAvLyAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9cIixcbiAgLy8gICAvLyAgIGRhdGE6IHsgY29udGVudCB9LFxuICAvLyAgIC8vIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1lbW8obWVtb0lkOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAvLyAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW8+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAvLyAgIC8vICAgdXJsOiBgL2FwaS9tZW1vLyR7bWVtb0lkfWAsXG4gIC8vICAgLy8gICBkYXRhOiB7IGNvbnRlbnQgfSxcbiAgLy8gICAvLyB9KTtcbiAgLy8gfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBoaWRlTWVtbyhtZW1vSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBvYkhpZGVNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcbiAgICAvLyAgIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gcmVzdG9yZU1lbW8obWVtb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVzdG9yZURlbGV0ZWRNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiBcIlwiLFxuICAgIC8vICAgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVNZW1vKG1lbW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZUZvcmV2ZXIobWVtb0lkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNeVF1ZXJpZXMoKSB7XG4gICAgcmV0dXJuIGZpbmRRdWVyeSgpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5W10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3F1ZXJ5L2FsbFwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5KHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlT2JzaWRpYW5RdWVyeSh0aXRsZSwgcXVlcnlzdHJpbmcpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5Pih7XG4gICAgLy8gICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS9xdWVyeS9cIixcbiAgICAvLyAgIGRhdGE6IHsgdGl0bGUsIHF1ZXJ5c3RyaW5nIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gdXBkYXRlUXVlcnkocXVlcnlJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU9ic2lkaWFuUXVlcnkocXVlcnlJZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5RdWVyeT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyB0aXRsZSwgcXVlcnlzdHJpbmcgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVRdWVyeUJ5SWQocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHBpblF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwaW5RdWVyeUluRmlsZShxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogYC9hcGkvcXVlcnkvJHtxdWVyeUlkfWAsXG4gICAgLy8gICBkYXRhOiB7IHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHVucGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVucGluUXVlcnlJbkZpbGUocXVlcnlJZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyBwaW5uZWRBdDogXCJcIiB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZEZpbGUoZm9ybURhdGE6IEZvcm1EYXRhKSB7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuUmVzb3VyY2U+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQVVRcIixcbiAgLy8gICAvLyAgIHVybDogXCIvYXBpL3Jlc291cmNlL1wiLFxuICAvLyAgIC8vICAgZGF0YTogZm9ybURhdGEsXG4gIC8vICAgLy8gICBkYXRhVHlwZTogXCJmaWxlXCIsXG4gIC8vICAgLy8gfSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXBpO1xuIiwiLy8g56e75Yqo56uv5qC35byP6YCC6YWN6aKd5aSW57G75ZCNXG5leHBvcnQgY29uc3QgU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FID0gJ21vYmlsZS1zaG93LXNpZGViYXInO1xuXG4vLyDpu5jorqTliqjnlLvmjIHnu63ml7bplb9cbmV4cG9ydCBjb25zdCBBTklNQVRJT05fRFVSQVRJT04gPSAyMDA7XG5cbi8vIHRvYXN0IOWKqOeUu+aMgee7reaXtumVv1xuZXhwb3J0IGNvbnN0IFRPQVNUX0FOSU1BVElPTl9EVVJBVElPTiA9IDQwMDtcblxuLy8g5LiA5aSp55qE5q+r56eS5pWwXG5leHBvcnQgY29uc3QgREFJTFlfVElNRVNUQU1QID0gMzYwMCAqIDI0ICogMTAwMDtcblxuLy8g5qCH562+IOato+WImVxuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBjb25zdCBUQUdfUkVHID0gL1xccyMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBjb25zdCBGSVJTVF9UQUdfUkVHID0gLyg8cD58PGJyPikjKFtcXHB7TGV0dGVyfVxccHtFbW9qaV9QcmVzZW50YXRpb259XFxwe051bWJlcn1cXC9fLV0rKS9ndTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5leHBvcnQgY29uc3QgTk9QX0ZJUlNUX1RBR19SRUcgPSAvXiMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBjb25zdCBBTExfVEFHX1JFRyA9IC8oW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL3U7XG5cbi8vIFVSTCDmraPliJlcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5leHBvcnQgY29uc3QgTElOS19SRUcgPSAvKFxcc3zvvJp8PikoKGh0dHB8ZnRwfGh0dHBzKTpcXC9cXC8oW1xcd18tXSsoPzooPzpcXC5bXFx3Xy1dKykrKSkoW1xcdy4sQD9ePSUmOlxcL34rIy1dKltcXHdAP149JSZcXC9+KyMtXSkpL2c7XG5cbi8vIGV4cG9ydCBjb25zdCBDSEVDS19MSU5LX1JFRyA9IC8oXFwoKFxccyopKShodHRwfGZ0cHxodHRwcyk6XFwvXFwvKFtcXHdfLV0rKD86KD86XFwuW1xcd18tXSspKykpKFtcXHcuLEA/Xj0lJjpcXC9+KyMtXSpbXFx3QD9ePSUmXFwvfisjLV0pL2c7XG4vLyBleHBvcnQgY29uc3QgTElOS19SRUcgPSAvKGh0dHBzPzpcXC9cXC9bXlxcczxcXFxcKj4nXSspL2c7XG5cbi8vIE1BUktET1dOIFVSTCDmraPliJlcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5leHBvcnQgY29uc3QgTURfTElOS19SRUcgPSAvXFxbKFtcXHNcXFNdKj8pXFxdXFwoKFtcXHNcXFNdKj8pXFwpL2d1O1xuXG4vLyDlm77niYcg5q2j5YiZXG5leHBvcnQgY29uc3QgSU1BR0VfVVJMX1JFRyA9IC8oW15cXHM8XFxcXCo+J10rXFwuKGpwZWd8anBnfGdpZnxwbmd8c3ZnKSkoXFxdXFxdKT8oXFwpKT8vZztcblxuLy8gTWFya2Rvd24g5YaF6YOo5Zu+54mH5q2j5YiZXG4vLyBHcm91cCAxIOS4uuWbvueJh1xuLy8gR3JvdXAgMiDkuLrnvKnmlL7mr5TkvotcbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9VUkxfUkVHID0gLyghXFxbKFteXFxdXSopKFxcfCk/KC4qPylcXF1cXCgoLio/KShcIig/Oi4qW15cIl0pXCIpP1xccypcXCkpL2c7XG5cbi8vIOajgOa1i+aYr+WQpuS4uuWklumDqOWbvueJh1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9XRUJfVVJMX1JFRyA9IC8oXFxzfO+8mnxeKShodHRwW3NdPzpcXC9cXC8pKFteXFwvXFxzXStcXC8pKC4qPykoanBlZ3xqcGd8Z2lmfHBuZ3xzdmd8Ym1wfHdlcGcpKD8hXFwpKS9nO1xuXG4vLyBXaWtpIOWbvueJh+ato+WImVxuLy8gR3JvdXAgMSDkuLrlm77niYdcbi8vIEdyb3VwIDUg5Li657yp5pS+5q+U5L6LXG5leHBvcnQgY29uc3QgV0lLSV9JTUFHRV9VUkxfUkVHID0gLyFcXFtcXFsoKC4qPylcXC4oanBlZ3xqcGd8Z2lmfHBuZ3xzdmd8Ym1wfHdlcGcpKT8oXFx8KT8oLio/KVxcXVxcXS9nO1xuXG4vLyBtZW1vIOWFs+iBlOato+WImVxuZXhwb3J0IGNvbnN0IE1FTU9fTElOS19SRUcgPSAvXFxbQCguKz8pXFxdXFwoKC4rPylcXCkvZztcblxuLy8gSW50ZXJuYWxcbiIsImltcG9ydCBhcGkgZnJvbSAnLi4vaGVscGVycy9hcGknO1xuaW1wb3J0IHtGSVJTVF9UQUdfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge3dhaXRGb3JJbnNlcnR9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkNyZWF0ZU1lbW8nO1xuaW1wb3J0IHtjaGFuZ2VNZW1vfSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vJztcbi8vIGltcG9ydCB1c2VyU2VydmljZSBmcm9tIFwiLi91c2VyU2VydmljZVwiO1xuXG5jbGFzcyBNZW1vU2VydmljZSB7XG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4gYXBwU3RvcmUuZ2V0U3RhdGUoKS5tZW1vU3RhdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmV0Y2hBbGxNZW1vcygpIHtcbiAgICAvLyBpZiAoIXVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cblxuICAgIC8vIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBpLmdldE15TWVtb3MoKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLmdldE15TWVtb3MoKTtcbiAgICBjb25zdCBtZW1vcyA9IFtdIGFzIGFueVtdO1xuICAgIGZvciAoY29uc3QgbSBvZiBkYXRhKSB7XG4gICAgICBtZW1vcy5wdXNoKG0pO1xuICAgIH1cbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX01FTU9TJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgbWVtb3MsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtb3M7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmV0Y2hEZWxldGVkTWVtb3MoKSB7XG4gICAgLy8gaWYgKCF1c2VyU2VydmljZS5nZXRTdGF0ZSgpLnVzZXIpIHtcbiAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLmdldE15RGVsZXRlZE1lbW9zKCk7XG4gICAgZGF0YS5zb3J0KFxuICAgICAgKGE6IHtkZWxldGVkQXQ6IHN0cmluZyB8IG51bWJlciB8IERhdGV9LCBiOiB7ZGVsZXRlZEF0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlfSkgPT5cbiAgICAgICAgdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuZGVsZXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmRlbGV0ZWRBdCksXG4gICAgKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBwdXNoTWVtbyhtZW1vOiBNb2RlbC5NZW1vKSB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0lOU0VSVF9NRU1PJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgbWVtbzoge1xuICAgICAgICAgIC4uLm1lbW8sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldE1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5nZXRTdGF0ZSgpLm1lbW9zKSB7XG4gICAgICBpZiAobS5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGlkZU1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBhcGkuaGlkZU1lbW8oaWQpO1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdERUxFVEVfTUVNT19CWV9JRCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzdG9yZU1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBhcGkucmVzdG9yZU1lbW8oaWQpO1xuICAgIC8vIG1lbW9TZXJ2aWNlLmNsZWFyTWVtb3MoKTtcbiAgICAvLyBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlTWVtb0J5SWQoaWQ6IHN0cmluZykge1xuICAgIGF3YWl0IGFwaS5kZWxldGVNZW1vKGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0TWVtbyhtZW1vOiBNb2RlbC5NZW1vKSB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0VESVRfTUVNTycsXG4gICAgICBwYXlsb2FkOiBtZW1vLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVRhZ3NTdGF0ZSgpIHtcbiAgICBjb25zdCB7bWVtb3N9ID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbWVtb3MpIHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG0uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcbiAgICAgICAgdGFnc1NldC5hZGQodC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtLmNvbnRlbnQubWF0Y2goTk9QX0ZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xuICAgICAgICB0YWdzU2V0LmFkZCh0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtLmNvbnRlbnQubWF0Y2goRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XG4gICAgICAgIHRhZ3NTZXQuYWRkKHQucmVwbGFjZShGSVJTVF9UQUdfUkVHLCAnJDInKS50cmltKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVEFHUycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHRhZ3M6IEFycmF5LmZyb20odGFnc1NldCksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTWVtb3MoKSB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9NRU1PUycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIG1lbW9zOiBbXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TGlua2VkTWVtb3MobWVtb0lkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsLk1lbW9bXT4ge1xuICAgIGNvbnN0IHttZW1vc30gPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIG1lbW9zLmZpbHRlcigobSkgPT4gbS5jb250ZW50LmluY2x1ZGVzKG1lbW9JZCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZU1lbW8odGV4dDogc3RyaW5nLCBpc0xpc3Q6IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVsLk1lbW8+IHtcbiAgICBjb25zdCBtZW1vID0gYXdhaXQgd2FpdEZvckluc2VydCh0ZXh0LCBpc0xpc3QpO1xuICAgIHJldHVybiBtZW1vO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZU1lbW8obWVtb0lkOiBzdHJpbmcsIG9yaWdpbmFsVGV4dDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IFByb21pc2U8TW9kZWwuTWVtbz4ge1xuICAgIGNvbnN0IG1lbW8gPSBhd2FpdCBjaGFuZ2VNZW1vKG1lbW9JZCwgb3JpZ2luYWxUZXh0LCB0ZXh0LCB0eXBlKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfVxufVxuXG5jb25zdCBtZW1vU2VydmljZSA9IG5ldyBNZW1vU2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBtZW1vU2VydmljZTtcbiIsIi8vIGltcG9ydCB1c2VyU2VydmljZSBmcm9tIFwiLi91c2VyU2VydmljZVwiO1xuaW1wb3J0IGFwaSBmcm9tICcuLi9oZWxwZXJzL2FwaSc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuY2xhc3MgUXVlcnlTZXJ2aWNlIHtcbiAgcHVibGljIGdldFN0YXRlKCkge1xuICAgIHJldHVybiBhcHBTdG9yZS5nZXRTdGF0ZSgpLnF1ZXJ5U3RhdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TXlBbGxRdWVyaWVzKCkge1xuICAgIC8vIGlmICghdXNlclNlcnZpY2UuZ2V0U3RhdGUoKS51c2VyKSB7XG4gICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuXG4gICAgLy8gY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcGkuZ2V0TXlRdWVyaWVzKCk7XG4gICAgLy8gYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgIC8vICAgdHlwZTogXCJTRVRfUVVFUklFU1wiLFxuICAgIC8vICAgcGF5bG9hZDoge1xuICAgIC8vICAgICBxdWVyaWVzOiBkYXRhLFxuICAgIC8vICAgfSxcbiAgICAvLyB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLmdldE15UXVlcmllcygpO1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUklFUycsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHF1ZXJpZXM6IGRhdGEsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHVibGljIGdldFF1ZXJ5QnlJZChpZDogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBxIG9mIHRoaXMuZ2V0U3RhdGUoKS5xdWVyaWVzKSB7XG4gICAgICBpZiAocS5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHB1c2hRdWVyeShxdWVyeTogTW9kZWwuUXVlcnkpIHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnSU5TRVJUX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5xdWVyeSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZWRpdFF1ZXJ5KHF1ZXJ5OiBNb2RlbC5RdWVyeSkge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdVUERBVEVfUVVFUlknLFxuICAgICAgcGF5bG9hZDogcXVlcnksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgYXBpLmRlbGV0ZVF1ZXJ5QnlJZChxdWVyeUlkKTtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnREVMRVRFX1FVRVJZX0JZX0lEJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgaWQ6IHF1ZXJ5SWQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVF1ZXJ5KHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLmNyZWF0ZVF1ZXJ5KHRpdGxlLCBxdWVyeXN0cmluZyk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlUXVlcnkocXVlcnlJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS51cGRhdGVRdWVyeShxdWVyeUlkLCB0aXRsZSwgcXVlcnlzdHJpbmcpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBpblF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZykge1xuICAgIGF3YWl0IGFwaS5waW5RdWVyeShxdWVyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1bnBpblF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZykge1xuICAgIGF3YWl0IGFwaS51bnBpblF1ZXJ5KHF1ZXJ5SWQpO1xuICB9XG59XG5cbmNvbnN0IHF1ZXJ5U2VydmljZSA9IG5ldyBRdWVyeVNlcnZpY2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgcXVlcnlTZXJ2aWNlO1xuIiwiLy8gaW1wb3J0IGFwaSBmcm9tIFwiLi4vaGVscGVycy9hcGlcIjtcblxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7Y3JlYXRlRGFpbHlOb3RlLCBnZXRBbGxEYWlseU5vdGVzLCBnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbi8vIGltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuL2RhaWx5Tm90ZXNTZXJ2aWNlJztcblxuLy8gaW50ZXJmYWNlIEZpbGVEYXRhIHtcbi8vICAgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbi8vICAgbWltZVR5cGU6IHN0cmluZztcbi8vICAgb3JpZ2luYWxOYW1lOiBzdHJpbmc7XG4vLyB9XG5cbmNsYXNzIFJlc291cmNlU2VydmljZSB7XG4gIC8qKlxuICAgKiBVcGxvYWQgcmVzb3VyY2UgZmlsZSB0byBzZXJ2ZXIsXG4gICAqIEBwYXJhbSBmaWxlIGZpbGVcbiAgICogQHJldHVybnMgcmVzb3VyY2U6IGlkLCBmaWxlbmFtZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwbG9hZChmaWxlOiBGaWxlKSB7XG4gICAgLy8gY29uc3QgeyBuYW1lOiBmaWxlbmFtZSwgc2l6ZSB9ID0gZmlsZTtcblxuICAgIGNvbnN0IHt2YXVsdCwgZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gICAgY29uc3QgZmlsZUFycmF5ID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgIGNvbnN0IGV4dCA9IGdldEV4dChmaWxlLnR5cGUpO1xuXG4gICAgLy8gY29uc29sZS5sb2cobmV3T25lKTtcblxuICAgIC8vIGNvbnN0IGZpbGVOYW1lID0gXCJQYXN0ZSBJbWFnZSBcIiArIG1vbWVudCgpLmZvcm1hdChcIllZWVlNTURESEhtbXNzXCIpO1xuICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSBnZXRBbGxEYWlseU5vdGVzKCk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKTtcbiAgICBsZXQgbmV3RmlsZTtcbiAgICBpZiAoIWV4aXN0aW5nRmlsZSkge1xuICAgICAgY29uc3QgZGFpbHlGaWxlID0gYXdhaXQgY3JlYXRlRGFpbHlOb3RlKGRhdGUpO1xuICAgICAgbmV3RmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZUJpbmFyeShcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgYXdhaXQgdmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKGBQYXN0ZWQgSW1hZ2UgJHttb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9YCwgZXh0LCBkYWlseUZpbGUpLFxuICAgICAgICBmaWxlQXJyYXksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXG4gICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhcbiAgICAgICAgICBgUGFzdGVkIEltYWdlICR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfWAsXG4gICAgICAgICAgZXh0LFxuICAgICAgICAgIGV4aXN0aW5nRmlsZSxcbiAgICAgICAgKSxcbiAgICAgICAgZmlsZUFycmF5LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgbmV3RmlsZVBhdGggPSBmaWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhuZXdGaWxlLCBuZXdGaWxlLnBhdGgsICcnLCAnJyk7XG5cbiAgICByZXR1cm4gbmV3RmlsZVBhdGg7XG5cbiAgICAvLyBjb25zdCBmaWxlUGF0aCA9IGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgXCJwbmdcIiwgXCJcIik7XG5cbiAgICAvLyBjb25zdCAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAvLyByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5hcnJheUJ1ZmZlcik7XG4gICAgLy8gcmVhZGVyLm9ubG9hZCA9ICgpID0+e1xuICAgIC8vICAgLy8gY29uc29sZS5sb2coJ1JFU1VMVCcsIHJlYWRlci5yZXN1bHQpXG4gICAgLy8gICBmaWxlQXJyYXJ5ID0gcmVhZGVyLnJlc3VsdDtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGZpbGVBcnJhcnkpO1xuICAgIC8vIH1cblxuICAgIC8vIGlmIChzaXplID4gNSA8PCAyMCkge1xuICAgIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwi6LaF6L+H5pyA5aSn5paH5Lu25aSn5bCPIDVNYlwiKTtcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgLy8gZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwaS51cGxvYWRGaWxlKGZvcm1EYXRhKTtcbiAgfVxufVxuXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZ2V0RXh0ID0gKGxpbmU6IHN0cmluZykgPT4gL15pbWFnZVxcLyguKykkLy5leGVjKGxpbmUpPy5bMV07XG5cbmNvbnN0IHJlc291cmNlU2VydmljZSA9IG5ldyBSZXNvdXJjZVNlcnZpY2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgcmVzb3VyY2VTZXJ2aWNlO1xuIiwiY29uc3QgZ2V0SW5pdGlhbEFjdGlvbiA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImluaXRpYWxUZXh0XCIsXG4gICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIHNlbGVjdGlvblN0YXJ0OiAwLFxuICAgICAgICBzZWxlY3Rpb25FbmQ6IDAsXG4gICAgfTtcbn07XG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIGluaXRpYWxWYWx1ZTogXCJcIixcbiAgICBpbnRlcnZhbDogMzAwLFxufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbnlVbmRvIHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcgPSBkZWZhdWx0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMucnVuVW5kbyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XS5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XS52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJ1blJlZG8gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPCB0aGlzLmFjdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF0uc2VsZWN0aW9uRW5kO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XS52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JQb3NpdGlvbiwgY3Vyc29yUG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldEFjdGlvbnMgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFN0YXRlID0gKGFjdGlvbnMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbLi4uYWN0aW9uc107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGluZGV4IDwgdGhpcy5hY3Rpb25zLmxlbmd0aCA/IGluZGV4IDogdGhpcy5hY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucmVzZXRTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IFtnZXRJbml0aWFsQWN0aW9uKCldO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJtRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUVsZW1lbnRLZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlib2FyZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICBpZiAoa2V5Ym9hcmRFdmVudC5rZXkgPT09IFwielwiICYmICFrZXlib2FyZEV2ZW50LnNoaWZ0S2V5ICYmIChrZXlib2FyZEV2ZW50Lm1ldGFLZXkgfHwga2V5Ym9hcmRFdmVudC5jdHJsS2V5KSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5VbmRvKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoa2V5Ym9hcmRFdmVudC5rZXkgPT09IFwielwiICYmIGtleWJvYXJkRXZlbnQuc2hpZnRLZXkgJiYgKGtleWJvYXJkRXZlbnQubWV0YUtleSB8fCBrZXlib2FyZEV2ZW50LmN0cmxLZXkpKSB8fFxuICAgICAgICAgICAgICAgIChrZXlib2FyZEV2ZW50LmtleSA9PT0gXCJ5XCIgJiYgKGtleWJvYXJkRXZlbnQubWV0YUtleSB8fCBrZXlib2FyZEV2ZW50LmN0cmxLZXkpKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5SZWRvKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudElucHV0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICBjb25zdCBsYXN0QWN0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMucHVzaE5ld0FjdGlvbih7XG4gICAgICAgICAgICAgICAgdHlwZTogaW5wdXRFdmVudC5pbnB1dFR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZWxlbWVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHRoaXMuZWxlbWVudC5zZWxlY3Rpb25FbmQgLSAodGhpcy5lbGVtZW50LnZhbHVlLmxlbmd0aCAtIGxhc3RBY3Rpb24udmFsdWUubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQ6IHRoaXMuZWxlbWVudC5zZWxlY3Rpb25FbmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmhhbmRsZUVsZW1lbnRLZXlkb3duKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy5oYW5kbGVFbGVtZW50SW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJtRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5oYW5kbGVFbGVtZW50S2V5ZG93bik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuaGFuZGxlRWxlbWVudElucHV0KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wdXNoTmV3QWN0aW9uID0gKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGFzdEFjdGlvbiA9IHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF07XG4gICAgICAgICAgICBpZiAobGFzdEFjdGlvbiAmJiBsYXN0QWN0aW9uLnR5cGUgPT09IGFjdGlvbi50eXBlICYmIGFjdGlvbi50aW1lc3RhbXAgLSBsYXN0QWN0aW9uLnRpbWVzdGFtcCA8IHRoaXMuY29uZmlnLmludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbGFzdEFjdGlvbiksIHsgdmFsdWU6IGFjdGlvbi52YWx1ZSwgc2VsZWN0aW9uRW5kOiBhY3Rpb24uc2VsZWN0aW9uRW5kLCB0aW1lc3RhbXA6IGFjdGlvbi50aW1lc3RhbXAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcubWF4U2l6ZSAmJiB0aGlzLmN1cnJlbnRJbmRleCA+PSB0aGlzLmNvbmZpZy5tYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNbMF0gPSBnZXRJbml0aWFsQWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdID0gYWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5zbGljZSgwLCB0aGlzLmN1cnJlbnRJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYiBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGNiKFsuLi50aGlzLmFjdGlvbnNdLCB0aGlzLmN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnKSwgY29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRpYWxBY3Rpb25zICYmIHRoaXMuY29uZmlnLmluaXRpYWxBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuY29uZmlnLmluaXRpYWxBY3Rpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRpYWxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29uZmlnLmluaXRpYWxJbmRleCA8IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuY29uZmlnLmluaXRpYWxJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5hY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMgPSBbZ2V0SW5pdGlhbEFjdGlvbigpXTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbml0aWFsVmFsdWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5zZXJ0VGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jb25maWcuaW5pdGlhbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQ6IHRoaXMuY29uZmlnLmluaXRpYWxWYWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnZhbHVlO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gdXNlUmVmcmVzaCgpIHtcbiAgY29uc3QgWywgc2V0Qm9vbGVhbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3QgcmVmcmVzaCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRCb29sZWFuKChwcykgPT4ge1xuICAgICAgcmV0dXJuICFwcztcbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiByZWZyZXNoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VSZWZyZXNoO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0JztyZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKTt2YXIgZj1yZXF1aXJlKFwicmVhY3RcIiksZz02MDEwMztleHBvcnRzLkZyYWdtZW50PTYwMTA3O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3Ipe3ZhciBoPVN5bWJvbC5mb3I7Zz1oKFwicmVhY3QuZWxlbWVudFwiKTtleHBvcnRzLkZyYWdtZW50PWgoXCJyZWFjdC5mcmFnbWVudFwiKX12YXIgbT1mLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxwPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBxKGMsYSxrKXt2YXIgYixkPXt9LGU9bnVsbCxsPW51bGw7dm9pZCAwIT09ayYmKGU9XCJcIitrKTt2b2lkIDAhPT1hLmtleSYmKGU9XCJcIithLmtleSk7dm9pZCAwIT09YS5yZWYmJihsPWEucmVmKTtmb3IoYiBpbiBhKW4uY2FsbChhLGIpJiYhcC5oYXNPd25Qcm9wZXJ0eShiKSYmKGRbYl09YVtiXSk7aWYoYyYmYy5kZWZhdWx0UHJvcHMpZm9yKGIgaW4gYT1jLmRlZmF1bHRQcm9wcyxhKXZvaWQgMD09PWRbYl0mJihkW2JdPWFbYl0pO3JldHVybnskJHR5cGVvZjpnLHR5cGU6YyxrZXk6ZSxyZWY6bCxwcm9wczpkLF9vd25lcjptLmN1cnJlbnR9fWV4cG9ydHMuanN4PXE7ZXhwb3J0cy5qc3hzPXE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCAqIGFzIGpzeFJ1bnRpbWUgZnJvbSBcIkU6XFxcXG9iZGV2XFxcXC5vYnNpZGlhblxcXFxwbHVnaW5zXFxcXG9ic2lkaWFuLW1lbW9zXFxcXG5vZGVfbW9kdWxlc1xcXFxyZWFjdFxcXFxqc3gtcnVudGltZS5qc1wiXG5leHBvcnQgY29uc3QganN4ID0ganN4UnVudGltZS5qc3hcbmV4cG9ydCBjb25zdCBqc3hzID0ganN4UnVudGltZS5qc3hzXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBqc3hSdW50aW1lLkZyYWdtZW50IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7UmVhY3ROb2RlfSBmcm9tICdyZWFjdCc7XG5cbmludGVyZmFjZSBPbmx5V2hlblByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgd2hlbjogYm9vbGVhbjtcbn1cblxuY29uc3QgT25seVdoZW46IFJlYWN0LkZDPE9ubHlXaGVuUHJvcHM+ID0gKHByb3BzOiBPbmx5V2hlblByb3BzKSA9PiB7XG4gIGNvbnN0IHtjaGlsZHJlbiwgd2hlbn0gPSBwcm9wcztcbiAgcmV0dXJuIHdoZW4gPyA8PntjaGlsZHJlbn08Lz4gOiBudWxsO1xufTtcblxuY29uc3QgT25seSA9IE9ubHlXaGVuO1xuXG5leHBvcnQgZGVmYXVsdCBPbmx5O1xuIiwiLyoganNoaW50IGJyb3dzZXI6IHRydWUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblxuLy8gVGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBjb3B5IGludG8gYSBtaXJyb3JlZCBkaXYuXG4vLyBOb3RlIHRoYXQgc29tZSBicm93c2Vycywgc3VjaCBhcyBGaXJlZm94LFxuLy8gZG8gbm90IGNvbmNhdGVuYXRlIHByb3BlcnRpZXMsIGkuZS4gcGFkZGluZy10b3AsIGJvdHRvbSBldGMuIC0+IHBhZGRpbmcsXG4vLyBzbyB3ZSBoYXZlIHRvIGRvIGV2ZXJ5IHNpbmdsZSBwcm9wZXJ0eSBzcGVjaWZpY2FsbHkuXG52YXIgcHJvcGVydGllcyA9IFtcbiAgJ2RpcmVjdGlvbicsICAvLyBSVEwgc3VwcG9ydFxuICAnYm94U2l6aW5nJyxcbiAgJ3dpZHRoJywgIC8vIG9uIENocm9tZSBhbmQgSUUsIGV4Y2x1ZGUgdGhlIHNjcm9sbGJhciwgc28gdGhlIG1pcnJvciBkaXYgd3JhcHMgZXhhY3RseSBhcyB0aGUgdGV4dGFyZWEgZG9lc1xuICAnaGVpZ2h0JyxcbiAgJ292ZXJmbG93WCcsXG4gICdvdmVyZmxvd1knLCAgLy8gY29weSB0aGUgc2Nyb2xsYmFyIGZvciBJRVxuXG4gICdib3JkZXJUb3BXaWR0aCcsXG4gICdib3JkZXJSaWdodFdpZHRoJyxcbiAgJ2JvcmRlckJvdHRvbVdpZHRoJyxcbiAgJ2JvcmRlckxlZnRXaWR0aCcsXG4gICdib3JkZXJTdHlsZScsXG5cbiAgJ3BhZGRpbmdUb3AnLFxuICAncGFkZGluZ1JpZ2h0JyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAncGFkZGluZ0xlZnQnLFxuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250XG4gICdmb250U3R5bGUnLFxuICAnZm9udFZhcmlhbnQnLFxuICAnZm9udFdlaWdodCcsXG4gICdmb250U3RyZXRjaCcsXG4gICdmb250U2l6ZScsXG4gICdmb250U2l6ZUFkanVzdCcsXG4gICdsaW5lSGVpZ2h0JyxcbiAgJ2ZvbnRGYW1pbHknLFxuXG4gICd0ZXh0QWxpZ24nLFxuICAndGV4dFRyYW5zZm9ybScsXG4gICd0ZXh0SW5kZW50JyxcbiAgJ3RleHREZWNvcmF0aW9uJywgIC8vIG1pZ2h0IG5vdCBtYWtlIGEgZGlmZmVyZW5jZSwgYnV0IGJldHRlciBiZSBzYWZlXG5cbiAgJ2xldHRlclNwYWNpbmcnLFxuICAnd29yZFNwYWNpbmcnLFxuXG4gICd0YWJTaXplJyxcbiAgJ01velRhYlNpemUnXG5cbl07XG5cbnZhciBpc0Jyb3dzZXIgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpO1xudmFyIGlzRmlyZWZveCA9IChpc0Jyb3dzZXIgJiYgd2luZG93Lm1veklubmVyU2NyZWVuWCAhPSBudWxsKTtcblxuZnVuY3Rpb24gZ2V0Q2FyZXRDb29yZGluYXRlcyhlbGVtZW50LCBwb3NpdGlvbiwgb3B0aW9ucykge1xuICBpZighaXNCcm93c2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZXh0YXJlYS1jYXJldC1wb3NpdGlvbiNnZXRDYXJldENvb3JkaW5hdGVzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBhIGJyb3dzZXInKTtcbiAgfVxuXG4gIHZhciBkZWJ1ZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTtcbiAgaWYgKGRlYnVnKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2lucHV0LXRleHRhcmVhLWNhcmV0LXBvc2l0aW9uLW1pcnJvci1kaXYnKTtcbiAgICBpZiAoIGVsICkgeyBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTsgfVxuICB9XG5cbiAgLy8gbWlycm9yZWQgZGl2XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZGl2LmlkID0gJ2lucHV0LXRleHRhcmVhLWNhcmV0LXBvc2l0aW9uLW1pcnJvci1kaXYnO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG5cbiAgdmFyIHN0eWxlID0gZGl2LnN0eWxlO1xuICB2YXIgY29tcHV0ZWQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZT8gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSA6IGVsZW1lbnQuY3VycmVudFN0eWxlOyAgLy8gY3VycmVudFN0eWxlIGZvciBJRSA8IDlcblxuICAvLyBkZWZhdWx0IHRleHRhcmVhIHN0eWxlc1xuICBzdHlsZS53aGl0ZVNwYWNlID0gJ3ByZS13cmFwJztcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgIT09ICdJTlBVVCcpXG4gICAgc3R5bGUud29yZFdyYXAgPSAnYnJlYWstd29yZCc7ICAvLyBvbmx5IGZvciB0ZXh0YXJlYS1zXG5cbiAgLy8gcG9zaXRpb24gb2ZmLXNjcmVlblxuICBzdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7ICAvLyByZXF1aXJlZCB0byByZXR1cm4gY29vcmRpbmF0ZXMgcHJvcGVybHlcbiAgaWYgKCFkZWJ1ZylcbiAgICBzdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7ICAvLyBub3QgJ2Rpc3BsYXk6IG5vbmUnIGJlY2F1c2Ugd2Ugd2FudCByZW5kZXJpbmdcblxuICAvLyB0cmFuc2ZlciB0aGUgZWxlbWVudCdzIHByb3BlcnRpZXMgdG8gdGhlIGRpdlxuICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBzdHlsZVtwcm9wXSA9IGNvbXB1dGVkW3Byb3BdO1xuICB9KTtcblxuICBpZiAoaXNGaXJlZm94KSB7XG4gICAgLy8gRmlyZWZveCBsaWVzIGFib3V0IHRoZSBvdmVyZmxvdyBwcm9wZXJ0eSBmb3IgdGV4dGFyZWFzOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05ODQyNzVcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBwYXJzZUludChjb21wdXRlZC5oZWlnaHQpKVxuICAgICAgc3R5bGUub3ZlcmZsb3dZID0gJ3Njcm9sbCc7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsgIC8vIGZvciBDaHJvbWUgdG8gbm90IHJlbmRlciBhIHNjcm9sbGJhcjsgSUUga2VlcHMgb3ZlcmZsb3dZID0gJ3Njcm9sbCdcbiAgfVxuXG4gIGRpdi50ZXh0Q29udGVudCA9IGVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKTtcbiAgLy8gdGhlIHNlY29uZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBpbnB1dCB0eXBlPVwidGV4dFwiIHZzIHRleHRhcmVhOiBzcGFjZXMgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIG5vbi1icmVha2luZyBzcGFjZXMgLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMzQwMjAzNS8xMjY5MDM3XG4gIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnKVxuICAgIGRpdi50ZXh0Q29udGVudCA9IGRpdi50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJ1xcdTAwYTAnKTtcblxuICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgLy8gV3JhcHBpbmcgbXVzdCBiZSByZXBsaWNhdGVkICpleGFjdGx5KiwgaW5jbHVkaW5nIHdoZW4gYSBsb25nIHdvcmQgZ2V0c1xuICAvLyBvbnRvIHRoZSBuZXh0IGxpbmUsIHdpdGggd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGJlZm9yZSAoIzcpLlxuICAvLyBUaGUgICpvbmx5KiByZWxpYWJsZSB3YXkgdG8gZG8gdGhhdCBpcyB0byBjb3B5IHRoZSAqZW50aXJlKiByZXN0IG9mIHRoZVxuICAvLyB0ZXh0YXJlYSdzIGNvbnRlbnQgaW50byB0aGUgPHNwYW4+IGNyZWF0ZWQgYXQgdGhlIGNhcmV0IHBvc2l0aW9uLlxuICAvLyBmb3IgaW5wdXRzLCBqdXN0ICcuJyB3b3VsZCBiZSBlbm91Z2gsIGJ1dCB3aHkgYm90aGVyP1xuICBzcGFuLnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcocG9zaXRpb24pIHx8ICcuJzsgIC8vIHx8IGJlY2F1c2UgYSBjb21wbGV0ZWx5IGVtcHR5IGZhdXggc3BhbiBkb2Vzbid0IHJlbmRlciBhdCBhbGxcbiAgZGl2LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gIHZhciBjb29yZGluYXRlcyA9IHtcbiAgICB0b3A6IHNwYW4ub2Zmc2V0VG9wICsgcGFyc2VJbnQoY29tcHV0ZWRbJ2JvcmRlclRvcFdpZHRoJ10pLFxuICAgIGxlZnQ6IHNwYW4ub2Zmc2V0TGVmdCArIHBhcnNlSW50KGNvbXB1dGVkWydib3JkZXJMZWZ0V2lkdGgnXSlcbiAgfTtcblxuICBpZiAoZGVidWcpIHtcbiAgICBzcGFuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjYWFhJztcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gIH1cblxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyAhPSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGdldENhcmV0Q29vcmRpbmF0ZXM7XG59IGVsc2UgaWYoaXNCcm93c2VyKXtcbiAgd2luZG93LmdldENhcmV0Q29vcmRpbmF0ZXMgPSBnZXRDYXJldENvb3JkaW5hdGVzO1xufVxuXG59KCkpO1xuIiwiXG52YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSBnbG9iYWwuQ3VzdG9tRXZlbnQ7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoJ2NhdCcsIHsgZGV0YWlsOiB7IGZvbzogJ2JhcicgfSB9KTtcbiAgICByZXR1cm4gICdjYXQnID09PSBwLnR5cGUgJiYgJ2JhcicgPT09IHAuZGV0YWlsLmZvbztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG4gKlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBOYXRpdmVDdXN0b21FdmVudCA6XG5cbi8vIElFID49IDlcbid1bmRlZmluZWQnICE9PSB0eXBlb2YgZG9jdW1lbnQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID8gZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgfSBlbHNlIHtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHZvaWQgMCk7XG4gIH1cbiAgcmV0dXJuIGU7XG59IDpcblxuLy8gSUUgPD0gOFxuZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7XG4gIGUudHlwZSA9IHR5cGU7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBlLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcbiAgICBlLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcbiAgICBlLmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gIH0gZWxzZSB7XG4gICAgZS5idWJibGVzID0gZmFsc2U7XG4gICAgZS5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgZS5kZXRhaWwgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG4iLCIvKipcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNyBKYWt1YiBCZW5lxaEgPGJlbmVzQHdlYnNjb3BlLmlvPlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgZ2V0Q2FyZXRDb29yZGluYXRlcyBmcm9tICd0ZXh0YXJlYS1jYXJldCc7XG5pbXBvcnQgQ3VzdG9tRXZlbnQgZnJvbSAnY3VzdG9tLWV2ZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mMihvYmopO1xufVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogX3R5cGVvZjIob2JqKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG52YXIgS0VZX0NPREVTID0ge1xuICBFU0M6IDI3LFxuICBVUDogMzgsXG4gIERPV046IDQwLFxuICBMRUZUOiAzNyxcbiAgUklHSFQ6IDM5LFxuICBFTlRFUjogMTMsXG4gIFRBQjogOVxufTsgLy8gVGhpcyBpcyBzZWxmLW1hZGUga2V5IHNob3J0Y3V0cyBtYW5hZ2VyLCB1c2VkIGZvciBjYWNoaW5nIGtleSBzdHJva2VzXG5cbnZhciBMaXN0ZW5lciA9IGZ1bmN0aW9uIExpc3RlbmVyKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaXN0ZW5lcik7XG5cbiAgdGhpcy5zdGFydExpc3RlbiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBfdGhpcy5mKTtcbiAgfTtcblxuICB0aGlzLnN0b3BMaXN0ZW4gPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX3RoaXMuZik7XG4gIH07XG5cbiAgdGhpcy5hZGQgPSBmdW5jdGlvbiAoa2V5Q29kZXMsIGZuKSB7XG4gICAgdmFyIGtleUNvZGUgPSBrZXlDb2RlcztcbiAgICBpZiAodHlwZW9mIGtleUNvZGUgIT09IFwib2JqZWN0XCIpIGtleUNvZGUgPSBba2V5Q29kZV07XG4gICAgX3RoaXMubGlzdGVuZXJzW190aGlzLmluZGV4XSA9IHtcbiAgICAgIGtleUNvZGU6IGtleUNvZGUsXG4gICAgICBmbjogZm5cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcy5pbmRleCsrO1xuICB9O1xuXG4gIHRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgZGVsZXRlIF90aGlzLmxpc3RlbmVyc1tpZF07XG4gIH07XG5cbiAgdGhpcy5yZW1vdmVBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMubGlzdGVuZXJzID0ge307XG4gICAgX3RoaXMuaW5kZXggPSAxO1xuICB9O1xuXG4gIHRoaXMuaW5kZXggPSAxO1xuICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuXG4gIHRoaXMuZiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFlKSByZXR1cm47XG4gICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcbiAgICBPYmplY3QudmFsdWVzKF90aGlzLmxpc3RlbmVycykuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGtleUNvZGUgPSBfcmVmLmtleUNvZGUsXG4gICAgICAgICAgZm4gPSBfcmVmLmZuO1xuXG4gICAgICBpZiAoa2V5Q29kZS5pbmNsdWRlcyhjb2RlKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZuKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufTtcblxudmFyIExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lcigpO1xuXG52YXIgSXRlbSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSXRlbSgpIHtcbiAgICB2YXIgX2dldFByb3RvdHlwZU9mMjtcblxuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJdGVtKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfZ2V0UHJvdG90eXBlT2YyID0gX2dldFByb3RvdHlwZU9mKEl0ZW0pKS5jYWxsLmFwcGx5KF9nZXRQcm90b3R5cGVPZjIsIFt0aGlzXS5jb25jYXQoYXJncykpKTtcblxuICAgIF90aGlzLnNlbGVjdEl0ZW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBpdGVtID0gX3RoaXMkcHJvcHMuaXRlbSxcbiAgICAgICAgICBvblNlbGVjdEhhbmRsZXIgPSBfdGhpcyRwcm9wcy5vblNlbGVjdEhhbmRsZXI7XG4gICAgICBvblNlbGVjdEhhbmRsZXIoaXRlbSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtLCBbe1xuICAgIGtleTogXCJzaG91bGRDb21wb25lbnRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgaWYgKHRoaXMucHJvcHMuaXRlbSAhPT0gbmV4dFByb3BzLml0ZW0gfHwgdGhpcy5wcm9wcy5zZWxlY3RlZCAhPT0gbmV4dFByb3BzLnNlbGVjdGVkIHx8IHRoaXMucHJvcHMuc3R5bGUgIT09IG5leHRQcm9wcy5zdHlsZSB8fCB0aGlzLnByb3BzLmNsYXNzTmFtZSAhPT0gbmV4dFByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIENvbXBvbmVudCA9IF90aGlzJHByb3BzMi5jb21wb25lbnQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGUsXG4gICAgICAgICAgb25DbGlja0hhbmRsZXIgPSBfdGhpcyRwcm9wczIub25DbGlja0hhbmRsZXIsXG4gICAgICAgICAgaXRlbSA9IF90aGlzJHByb3BzMi5pdGVtLFxuICAgICAgICAgIHNlbGVjdGVkID0gX3RoaXMkcHJvcHMyLnNlbGVjdGVkLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgaW5uZXJSZWYgPSBfdGhpcyRwcm9wczIuaW5uZXJSZWY7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9faXRlbSAgXCIuY29uY2F0KHNlbGVjdGVkID09PSB0cnVlID8gXCJydGFfX2l0ZW0tLXNlbGVjdGVkXCIgOiBcIlwiLCBcIiBcIikuY29uY2F0KGNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fZW50aXR5IFwiLmNvbmNhdChzZWxlY3RlZCA9PT0gdHJ1ZSA/IFwicnRhX19lbnRpdHktLXNlbGVjdGVkXCIgOiBcIlwiKSxcbiAgICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2tIYW5kbGVyLFxuICAgICAgICBvbkZvY3VzOiB0aGlzLnNlbGVjdEl0ZW0sXG4gICAgICAgIG9uTW91c2VFbnRlcjogdGhpcy5zZWxlY3RJdGVtLFxuICAgICAgICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIG9uVG91Y2hTdGFydCgpIHtcbiAgICAgICAgICBfdGhpczIuY2xpY2tlZCA9IHRydWU7XG5cbiAgICAgICAgICBfdGhpczIuc2VsZWN0SXRlbSgpO1xuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoRW5kOiBmdW5jdGlvbiBvblRvdWNoRW5kKGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMyLmNsaWNrZWQpIHtcbiAgICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCkge1xuICAgICAgICAgIF90aGlzMi5jbGlja2VkID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVG91Y2hDYW5jZWw6IGZ1bmN0aW9uIG9uVG91Y2hDYW5jZWwoKSB7XG4gICAgICAgICAgX3RoaXMyLmNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvKiAkRmxvd0ZpeE1lICovXG4gICAgICAgICxcbiAgICAgICAgcmVmOiBpbm5lclJlZlxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLFxuICAgICAgICBlbnRpdHk6IGl0ZW1cbiAgICAgIH0pKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEl0ZW07XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBMaXN0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMaXN0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMaXN0KCkge1xuICAgIHZhciBfZ2V0UHJvdG90eXBlT2YyO1xuXG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpc3QpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9nZXRQcm90b3R5cGVPZjIgPSBfZ2V0UHJvdG90eXBlT2YoTGlzdCkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJdGVtOiBudWxsXG4gICAgfTtcbiAgICBfdGhpcy5jYWNoZWRJZE9mSXRlbXMgPSBuZXcgTWFwKCk7XG5cbiAgICBfdGhpcy5vblByZXNzRW50ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHR5cGVvZiBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlcyA9IF90aGlzLnByb3BzLnZhbHVlcztcblxuICAgICAgX3RoaXMubW9kaWZ5VGV4dCh2YWx1ZXNbX3RoaXMuZ2V0UG9zaXRpb25Jbkxpc3QoKV0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRQb3NpdGlvbkluTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBfdGhpcy5wcm9wcy52YWx1ZXM7XG4gICAgICB2YXIgc2VsZWN0ZWRJdGVtID0gX3RoaXMuc3RhdGUuc2VsZWN0ZWRJdGVtO1xuICAgICAgaWYgKCFzZWxlY3RlZEl0ZW0pIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHZhbHVlcy5maW5kSW5kZXgoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldElkKGEpID09PSBfdGhpcy5nZXRJZChzZWxlY3RlZEl0ZW0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldElkID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGlmIChfdGhpcy5jYWNoZWRJZE9mSXRlbXMuaGFzKGl0ZW0pKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgcmV0dXJuIF90aGlzLmNhY2hlZElkT2ZJdGVtcy5nZXQoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0ZXh0VG9SZXBsYWNlID0gX3RoaXMucHJvcHMuZ2V0VGV4dFRvUmVwbGFjZShpdGVtKTtcblxuICAgICAgdmFyIGNvbXB1dGVJZCA9IGZ1bmN0aW9uIGNvbXB1dGVJZCgpIHtcbiAgICAgICAgaWYgKHRleHRUb1JlcGxhY2UpIHtcbiAgICAgICAgICBpZiAodGV4dFRvUmVwbGFjZS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0VG9SZXBsYWNlLmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgIWl0ZW0ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dFRvUmVwbGFjZS50ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXRlbS5rZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJdGVtIFwiLmNvbmNhdChKU09OLnN0cmluZ2lmeShpdGVtKSwgXCIgaGFzIHRvIGhhdmUgZGVmaW5lZCBcXFwia2V5XFxcIiBwcm9wZXJ0eVwiKSk7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgICAgcmV0dXJuIGl0ZW0ua2V5O1xuICAgICAgfTtcblxuICAgICAgdmFyIGlkID0gY29tcHV0ZUlkKCk7XG5cbiAgICAgIF90aGlzLmNhY2hlZElkT2ZJdGVtcy5zZXQoaXRlbSwgaWQpO1xuXG4gICAgICByZXR1cm4gaWQ7XG4gICAgfTtcblxuICAgIF90aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgIF90aGlzLml0ZW1zUmVmID0ge307XG5cbiAgICBfdGhpcy5tb2RpZnlUZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICB2YXIgb25TZWxlY3QgPSBfdGhpcy5wcm9wcy5vblNlbGVjdDtcbiAgICAgIG9uU2VsZWN0KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2VsZWN0SXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIga2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIG9uSXRlbUhpZ2hsaWdodGVkID0gX3RoaXMucHJvcHMub25JdGVtSGlnaGxpZ2h0ZWQ7XG4gICAgICBpZiAoX3RoaXMuc3RhdGUuc2VsZWN0ZWRJdGVtID09PSBpdGVtKSByZXR1cm47XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBpdGVtXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9uSXRlbUhpZ2hsaWdodGVkKGl0ZW0pO1xuXG4gICAgICAgIGlmIChrZXlib2FyZCkge1xuICAgICAgICAgIF90aGlzLnByb3BzLmRyb3Bkb3duU2Nyb2xsKF90aGlzLml0ZW1zUmVmW190aGlzLmdldElkKGl0ZW0pXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5zY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIHZhbHVlcyA9IF90aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlIHx8IGUud2hpY2g7XG5cbiAgICAgIHZhciBvbGRQb3NpdGlvbiA9IF90aGlzLmdldFBvc2l0aW9uSW5MaXN0KCk7XG5cbiAgICAgIHZhciBuZXdQb3NpdGlvbjtcblxuICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgS0VZX0NPREVTLkRPV046XG4gICAgICAgICAgbmV3UG9zaXRpb24gPSBvbGRQb3NpdGlvbiArIDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBLRVlfQ09ERVMuVVA6XG4gICAgICAgICAgbmV3UG9zaXRpb24gPSBvbGRQb3NpdGlvbiAtIDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBuZXdQb3NpdGlvbiA9IG9sZFBvc2l0aW9uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBuZXdQb3NpdGlvbiA9IChuZXdQb3NpdGlvbiAlIHZhbHVlcy5sZW5ndGggKyB2YWx1ZXMubGVuZ3RoKSAlIHZhbHVlcy5sZW5ndGg7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAgICAgX3RoaXMuc2VsZWN0SXRlbSh2YWx1ZXNbbmV3UG9zaXRpb25dLCBbS0VZX0NPREVTLkRPV04sIEtFWV9DT0RFUy5VUF0uaW5jbHVkZXMoY29kZSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5pc1NlbGVjdGVkID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBzZWxlY3RlZEl0ZW0gPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEl0ZW07XG4gICAgICBpZiAoIXNlbGVjdGVkSXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIF90aGlzLmdldElkKHNlbGVjdGVkSXRlbSkgPT09IF90aGlzLmdldElkKGl0ZW0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlzdCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKExpc3RlbmVycy5hZGQoW0tFWV9DT0RFUy5ET1dOLCBLRVlfQ09ERVMuVVBdLCB0aGlzLnNjcm9sbCksIExpc3RlbmVycy5hZGQoW0tFWV9DT0RFUy5FTlRFUiwgS0VZX0NPREVTLlRBQl0sIHRoaXMub25QcmVzc0VudGVyKSk7XG4gICAgICB2YXIgdmFsdWVzID0gdGhpcy5wcm9wcy52YWx1ZXM7XG4gICAgICBpZiAodmFsdWVzICYmIHZhbHVlc1swXSkgdGhpcy5zZWxlY3RJdGVtKHZhbHVlc1swXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoX3JlZikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBvbGRWYWx1ZXMgPSBfcmVmLnZhbHVlcztcbiAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIHZhciBvbGRWYWx1ZXNTZXJpYWxpemVkID0gb2xkVmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZ2V0SWQodmFsKTtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgICB2YXIgbmV3VmFsdWVzU2VyaWFsaXplZCA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmdldElkKHZhbCk7XG4gICAgICB9KS5qb2luKFwiXCIpO1xuXG4gICAgICBpZiAob2xkVmFsdWVzU2VyaWFsaXplZCAhPT0gbmV3VmFsdWVzU2VyaWFsaXplZCAmJiB2YWx1ZXMgJiYgdmFsdWVzWzBdKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbSh2YWx1ZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHZhciBsaXN0ZW5lcjtcblxuICAgICAgd2hpbGUgKHRoaXMubGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJzLnBvcCgpO1xuICAgICAgICBMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHZhbHVlcyA9IF90aGlzJHByb3BzLnZhbHVlcyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICBpdGVtQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuaXRlbUNsYXNzTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgaXRlbVN0eWxlID0gX3RoaXMkcHJvcHMuaXRlbVN0eWxlO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJydGFfX2xpc3QgXCIuY29uY2F0KGNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCB2YWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIHtcbiAgICAgICAgICBrZXk6IF90aGlzMy5nZXRJZChpdGVtKSxcbiAgICAgICAgICBpbm5lclJlZjogZnVuY3Rpb24gaW5uZXJSZWYocmVmKSB7XG4gICAgICAgICAgICBfdGhpczMuaXRlbXNSZWZbX3RoaXMzLmdldElkKGl0ZW0pXSA9IHJlZjtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlbGVjdGVkOiBfdGhpczMuaXNTZWxlY3RlZChpdGVtKSxcbiAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgIGNsYXNzTmFtZTogaXRlbUNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogaXRlbVN0eWxlLFxuICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyOiBfdGhpczMub25QcmVzc0VudGVyLFxuICAgICAgICAgIG9uU2VsZWN0SGFuZGxlcjogX3RoaXMzLnNlbGVjdEl0ZW0sXG4gICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpc3Q7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTY3JvbGxUb0l0ZW0oY29udGFpbmVyLCBpdGVtKSB7XG4gIHZhciBpdGVtSGVpZ2h0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpdGVtKS5nZXRQcm9wZXJ0eVZhbHVlKFwiaGVpZ2h0XCIpLCAxMCk7XG4gIHZhciBjb250YWluZXJIaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKS5nZXRQcm9wZXJ0eVZhbHVlKFwiaGVpZ2h0XCIpLCAxMCkgLSBpdGVtSGVpZ2h0O1xuICB2YXIgaXRlbU9mZnNldFRvcCA9IGl0ZW0ub2Zmc2V0VG9wO1xuICB2YXIgYWN0dWFsU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcblxuICBpZiAoaXRlbU9mZnNldFRvcCA8IGFjdHVhbFNjcm9sbFRvcCArIGNvbnRhaW5lckhpZ2h0ICYmIGFjdHVhbFNjcm9sbFRvcCA8IGl0ZW1PZmZzZXRUb3ApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5cblxuICBjb250YWluZXIuc2Nyb2xsVG9wID0gaXRlbU9mZnNldFRvcDtcbn1cblxudmFyIERFRkFVTFRfQ0FSRVRfUE9TSVRJT04gPSBcIm5leHRcIjtcbnZhciBQT1NJVElPTl9DT05GSUdVUkFUSU9OID0ge1xuICBYOiB7XG4gICAgTEVGVDogXCJydGFfX2F1dG9jb21wbGV0ZS0tbGVmdFwiLFxuICAgIFJJR0hUOiBcInJ0YV9fYXV0b2NvbXBsZXRlLS1yaWdodFwiXG4gIH0sXG4gIFk6IHtcbiAgICBUT1A6IFwicnRhX19hdXRvY29tcGxldGUtLXRvcFwiLFxuICAgIEJPVFRPTTogXCJydGFfX2F1dG9jb21wbGV0ZS0tYm90dG9tXCJcbiAgfVxufTtcblxudmFyIGVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBjb25zb2xlLmVycm9yKFwiUlRBOiBkYXRhUHJvdmlkZXIgZmFpbHM6IFwiLmNvbmNhdChtZXNzYWdlLCBcIlxcbiAgICBcXG5DaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvciBjcmVhdGUgaXNzdWUgaWYgeW91IHRoaW5rIGl0J3MgYnVnLiBodHRwczovL2dpdGh1Yi5jb20vd2Vic2NvcGVpby9yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGUvaXNzdWVzXCIpKTtcbn07XG5cbnZhciByZXNlcnZlZFJlZ2V4Q2hhcnMgPSBbXCIuXCIsIFwiXlwiLCBcIiRcIiwgXCIqXCIsIFwiK1wiLCBcIi1cIiwgXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIFwiXFxcXFwiLCBcInxcIl07XG5cbnZhciBlc2NhcGVSZWdleCA9IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHRleHQpIHtcbiAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheSh0ZXh0KS5tYXAoZnVuY3Rpb24gKGNoYXJhY3Rlcikge1xuICAgIHJldHVybiByZXNlcnZlZFJlZ2V4Q2hhcnMuaW5jbHVkZXMoY2hhcmFjdGVyKSA/IFwiXFxcXFwiLmNvbmNhdChjaGFyYWN0ZXIpIDogY2hhcmFjdGVyO1xuICB9KS5qb2luKFwiXCIpO1xufTsgLy8gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGNvbXBvbmVudCBpcyB0byBmaWd1cmUgb3V0IHRvIHdoaWNoIHNpZGUgdGhlIGF1dG9jb21wbGV0ZSBzaG91bGQgYmUgb3BlbmVkXG5cblxudmFyIEF1dG9jb21wbGV0ZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQXV0b2NvbXBsZXRlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBdXRvY29tcGxldGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEF1dG9jb21wbGV0ZSk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKEF1dG9jb21wbGV0ZSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQXV0b2NvbXBsZXRlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBib3VuZGFyaWVzRWxlbWVudCA9IHRoaXMucHJvcHMuYm91bmRhcmllc0VsZW1lbnQ7XG5cbiAgICAgIGlmICh0eXBlb2YgYm91bmRhcmllc0VsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdmFyIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IEludmFsaWQgcHJvcCBib3VuZGFyaWVzRWxlbWVudDogaXQgaGFzIHRvIGJlIHN0cmluZyBvciBIVE1MRWxlbWVudC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsZW0gPSBlbGVtO1xuICAgICAgfSBlbHNlIGlmIChib3VuZGFyaWVzRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWxlbSA9IGJvdW5kYXJpZXNFbGVtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUlRBOiBJbnZhbGlkIHByb3AgYm91bmRhcmllc0VsZW1lbnQ6IGl0IGhhcyB0byBiZSBzdHJpbmcgb3IgSFRNTEVsZW1lbnQuXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuY29udGFpbmVyRWxlbSB8fCAhdGhpcy5jb250YWluZXJFbGVtLmNvbnRhaW5zKHRoaXMucmVmKSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUlRBOiBJbnZhbGlkIHByb3AgYm91bmRhcmllc0VsZW1lbnQ6IGl0IGhhcyB0byBiZSBvbmUgb2YgdGhlIHBhcmVudHMgb2YgdGhlIFJUQS5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpcyRyZWYkY2xhc3NMaXN0LCBfdGhpcyRyZWYkY2xhc3NMaXN0MjtcblxuICAgICAgdmFyIHRvcCA9IHRoaXMucHJvcHMudG9wIHx8IDA7XG4gICAgICB2YXIgbGVmdCA9IHRoaXMucHJvcHMubGVmdCB8fCAwO1xuICAgICAgdmFyIHVzZWRDbGFzc2VzID0gW107XG4gICAgICB2YXIgdW51c2VkQ2xhc3NlcyA9IFtdO1xuICAgICAgdmFyIHRvcFBvc2l0aW9uID0gMDtcbiAgICAgIHZhciBsZWZ0UG9zaXRpb24gPSAwO1xuICAgICAgdmFyIGNvbnRhaW5lckJvdW5kcyA9IHRoaXMuY29udGFpbmVyRWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBkcm9wZG93bkJvdW5kcyA9IHRoaXMucmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHRleHRhcmVhQm91bmRzID0gdGhpcy5wcm9wcy50ZXh0YXJlYVJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZWYpO1xuICAgICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi10b3BcIiksIDEwKTtcbiAgICAgIHZhciBtYXJnaW5Cb3R0b20gPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tYm90dG9tXCIpLCAxMCk7XG4gICAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1sZWZ0XCIpLCAxMCk7XG4gICAgICB2YXIgbWFyZ2luUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tcmlnaHRcIiksIDEwKTtcbiAgICAgIHZhciBkcm9wZG93bkJvdHRvbSA9IG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSArIHRleHRhcmVhQm91bmRzLnRvcCArIHRvcCArIGRyb3Bkb3duQm91bmRzLmhlaWdodDtcbiAgICAgIHZhciBkcm9wZG93blJpZ2h0ID0gbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0ICsgdGV4dGFyZWFCb3VuZHMubGVmdCArIGxlZnQgKyBkcm9wZG93bkJvdW5kcy53aWR0aDtcblxuICAgICAgaWYgKGRyb3Bkb3duUmlnaHQgPiBjb250YWluZXJCb3VuZHMucmlnaHQgJiYgdGV4dGFyZWFCb3VuZHMubGVmdCArIGxlZnQgPiBkcm9wZG93bkJvdW5kcy53aWR0aCkge1xuICAgICAgICBsZWZ0UG9zaXRpb24gPSBsZWZ0IC0gZHJvcGRvd25Cb3VuZHMud2lkdGg7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5YLkxFRlQpO1xuICAgICAgICB1bnVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5YLlJJR0hUKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQb3NpdGlvbiA9IGxlZnQ7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5YLlJJR0hUKTtcbiAgICAgICAgdW51c2VkQ2xhc3Nlcy5wdXNoKFBPU0lUSU9OX0NPTkZJR1VSQVRJT04uWC5MRUZUKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyb3Bkb3duQm90dG9tID4gY29udGFpbmVyQm91bmRzLmJvdHRvbSAmJiB0ZXh0YXJlYUJvdW5kcy50b3AgKyB0b3AgPiBkcm9wZG93bkJvdW5kcy5oZWlnaHQpIHtcbiAgICAgICAgdG9wUG9zaXRpb24gPSB0b3AgLSBkcm9wZG93bkJvdW5kcy5oZWlnaHQ7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5ZLlRPUCk7XG4gICAgICAgIHVudXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlkuQk9UVE9NKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcFBvc2l0aW9uID0gdG9wO1xuICAgICAgICB1c2VkQ2xhc3Nlcy5wdXNoKFBPU0lUSU9OX0NPTkZJR1VSQVRJT04uWS5CT1RUT00pO1xuICAgICAgICB1bnVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5ZLlRPUCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLnJlbmRlclRvQm9keSkge1xuICAgICAgICB0b3BQb3NpdGlvbiArPSB0ZXh0YXJlYUJvdW5kcy50b3A7XG4gICAgICAgIGxlZnRQb3NpdGlvbiArPSB0ZXh0YXJlYUJvdW5kcy5sZWZ0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZi5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCh0b3BQb3NpdGlvbiwgXCJweFwiKTtcbiAgICAgIHRoaXMucmVmLnN0eWxlLmxlZnQgPSBcIlwiLmNvbmNhdChsZWZ0UG9zaXRpb24sIFwicHhcIik7XG5cbiAgICAgIChfdGhpcyRyZWYkY2xhc3NMaXN0ID0gdGhpcy5yZWYuY2xhc3NMaXN0KS5yZW1vdmUuYXBwbHkoX3RoaXMkcmVmJGNsYXNzTGlzdCwgdW51c2VkQ2xhc3Nlcyk7XG5cbiAgICAgIChfdGhpcyRyZWYkY2xhc3NMaXN0MiA9IHRoaXMucmVmLmNsYXNzTGlzdCkuYWRkLmFwcGx5KF90aGlzJHJlZiRjbGFzc0xpc3QyLCB1c2VkQ2xhc3Nlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMuc3R5bGUsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIGlubmVyUmVmID0gX3RoaXMkcHJvcHMuaW5uZXJSZWYsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICByZW5kZXJUb0JvZHkgPSBfdGhpcyRwcm9wcy5yZW5kZXJUb0JvZHk7XG4gICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICB2YXIgYXV0b2NvbXBsZXRlQ29udGFpbmVyID0gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKF9yZWYpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgX3RoaXMucmVmID0gX3JlZjsgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgaW5uZXJSZWYoX3JlZik7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogXCJydGFfX2F1dG9jb21wbGV0ZSBcIi5jb25jYXQoY2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIGNoaWxkcmVuKTtcbiAgICAgIHJldHVybiByZW5kZXJUb0JvZHkgJiYgYm9keSAhPT0gbnVsbCA/IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChhdXRvY29tcGxldGVDb250YWluZXIsIGJvZHkpIDogYXV0b2NvbXBsZXRlQ29udGFpbmVyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBdXRvY29tcGxldGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mikge1xuICBfaW5oZXJpdHMoUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZSwgX1JlYWN0JENvbXBvbmVudDIpO1xuXG4gIGZ1bmN0aW9uIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUoX3Byb3BzKSB7XG4gICAgdmFyIF90aGlzMjtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlKTtcblxuICAgIF90aGlzMiA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlKS5jYWxsKHRoaXMsIF9wcm9wcykpO1xuICAgIF90aGlzMi5zdGF0ZSA9IHtcbiAgICAgIHRvcDogbnVsbCxcbiAgICAgIGxlZnQ6IG51bGwsXG4gICAgICBjdXJyZW50VHJpZ2dlcjogbnVsbCxcbiAgICAgIGFjdHVhbFRva2VuOiBcIlwiLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uRW5kOiAwLFxuICAgICAgY29tcG9uZW50OiBudWxsLFxuICAgICAgdGV4dFRvUmVwbGFjZTogbnVsbFxuICAgIH07XG5cbiAgICBfdGhpczIuZXNjTGlzdGVuZXJJbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpczIuZXNjTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMyLmVzY0xpc3RlbmVyID0gTGlzdGVuZXJzLmFkZChLRVlfQ09ERVMuRVNDLCBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMyLmVzY0xpc3RlbmVyRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpczIuZXNjTGlzdGVuZXIpIHtcbiAgICAgICAgTGlzdGVuZXJzLnJlbW92ZShfdGhpczIuZXNjTGlzdGVuZXIpO1xuICAgICAgICBfdGhpczIuZXNjTGlzdGVuZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpczIuZ2V0U2VsZWN0aW9uUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzMi50ZXh0YXJlYVJlZikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3Rpb25TdGFydDogX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBzZWxlY3Rpb25FbmQ6IF90aGlzMi50ZXh0YXJlYVJlZi5zZWxlY3Rpb25FbmRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzMi5nZXRTZWxlY3RlZFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzMi50ZXh0YXJlYVJlZikgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgX3RoaXMyJHRleHRhcmVhUmVmID0gX3RoaXMyLnRleHRhcmVhUmVmLFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gX3RoaXMyJHRleHRhcmVhUmVmLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IF90aGlzMiR0ZXh0YXJlYVJlZi5zZWxlY3Rpb25FbmQ7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gX3RoaXMyLnN0YXRlLnZhbHVlLnN1YnN0cihzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIC0gc2VsZWN0aW9uU3RhcnQpO1xuICAgIH07XG5cbiAgICBfdGhpczIuc2V0Q2FyZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSByZXR1cm47XG5cbiAgICAgIF90aGlzMi50ZXh0YXJlYVJlZi5mb2N1cygpO1xuXG4gICAgICBfdGhpczIudGV4dGFyZWFSZWYuc2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb24sIHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLmdldENhcmV0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzMi50ZXh0YXJlYVJlZikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvc2l0aW9uID0gX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZDtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9oYW5kbGVDYXJldENoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY2xlYW5MYXN0VHJpZ2dlciA9IGZ1bmN0aW9uIGNsZWFuTGFzdFRyaWdnZXIoKSB7XG4gICAgICAgIHZhciBiZWZvcmVIYW5kbGUgPSBfdGhpczIuZ2V0Q2FyZXRQb3NpdGlvbigpIC0gMTtcbiAgICAgICAgX3RoaXMyLmxhc3RUcmlnZ2VyID0gX3RoaXMyLmxhc3RUcmlnZ2VyID8gYmVmb3JlSGFuZGxlIDogMDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChlLnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICBjYXNlIEtFWV9DT0RFUy5VUDpcbiAgICAgICAgICBjYXNlIEtFWV9DT0RFUy5ET1dOOlxuICAgICAgICAgICAgaWYgKCFfdGhpczIuX2lzQXV0b2NvbXBsZXRlT3BlbigpKSB7XG4gICAgICAgICAgICAgIGNsZWFuTGFzdFRyaWdnZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIEtFWV9DT0RFUy5MRUZUOlxuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLlJJR0hUOlxuICAgICAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcigpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjbGVhbkxhc3RUcmlnZ2VyKCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fb25TZWxlY3QgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZSA9IF90aGlzMi5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBfdGhpczIkc3RhdGUuc2VsZWN0aW9uRW5kLFxuICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyID0gX3RoaXMyJHN0YXRlLmN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICAgIHRleHRhcmVhVmFsdWUgPSBfdGhpczIkc3RhdGUudmFsdWU7XG4gICAgICB2YXIgb25JdGVtU2VsZWN0ZWQgPSBfdGhpczIucHJvcHMub25JdGVtU2VsZWN0ZWQ7XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyKSByZXR1cm47XG5cbiAgICAgIHZhciBnZXRUZXh0VG9SZXBsYWNlRm9yQ3VycmVudFRyaWdnZXIgPSBfdGhpczIuX2dldFRleHRUb1JlcGxhY2UoY3VycmVudFRyaWdnZXIpO1xuXG4gICAgICBpZiAoIWdldFRleHRUb1JlcGxhY2VGb3JDdXJyZW50VHJpZ2dlcikge1xuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3VG9rZW4gPSBnZXRUZXh0VG9SZXBsYWNlRm9yQ3VycmVudFRyaWdnZXIoaXRlbSk7XG5cbiAgICAgIGlmICghbmV3VG9rZW4pIHtcbiAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIG9uSXRlbVNlbGVjdGVkKHtcbiAgICAgICAgICBjdXJyZW50VHJpZ2dlcjogY3VycmVudFRyaWdnZXIsXG4gICAgICAgICAgaXRlbTogaXRlbVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXB1dGVDYXJldFBvc2l0aW9uID0gZnVuY3Rpb24gY29tcHV0ZUNhcmV0UG9zaXRpb24ocG9zaXRpb24sIHRva2VuLCBzdGFydFRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgICAgICBjYXNlIFwic3RhcnRcIjpcbiAgICAgICAgICAgIHJldHVybiBzdGFydFRva2VuO1xuXG4gICAgICAgICAgY2FzZSBcIm5leHRcIjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRUb2tlbiArIHRva2VuLmxlbmd0aDtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUlRBOiBjYXJldFBvc2l0aW9uIHNob3VsZCBiZSBcInN0YXJ0XCIsIFwibmV4dFwiLCBcImVuZFwiIG9yIG51bWJlci4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgdGV4dFRvTW9kaWZ5ID0gdGV4dGFyZWFWYWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25FbmQpO1xuICAgICAgLyoqXG4gICAgICAgKiBJdCdzIGltcG9ydGFudCB0byBlc2NhcGUgdGhlIGN1cnJlbnRUcmlnZ2VyIGNoYXIgZm9yIGNoYXJzIGxpa2UgWywgKCwuLi5cbiAgICAgICAqIFRoaXMgaXMgYSByaWRpY3Vsb3VzIGRhcmsgbWFnaWMsIGJhc2ljYWxseSB3ZSBmb3VuZCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjdXJyZW50IHRva2VuIChmcm9tIGN1cnJlbnQgdHJpZ2dlcikgYW5kIHRoZW4gd2UgcmVwbGFjZSB0aGUgdGV4dCBmcm9tIHRoYXQgcG9zaXRpb24gKGNhbGN1bGF0aW5nIHRoZSBvZmZzZXQpXG4gICAgICAgKi9cblxuICAgICAgdmFyIGVzY2FwZWRDdXJyZW50VHJpZ2dlciA9IGVzY2FwZVJlZ2V4KGN1cnJlbnRUcmlnZ2VyKTtcbiAgICAgIHZhciB0cmlnZ2VyT2Zmc2V0ID0gdGV4dFRvTW9kaWZ5Lmxlbmd0aCAtIHRleHRUb01vZGlmeS5sYXN0SW5kZXhPZihjdXJyZW50VHJpZ2dlcik7XG4gICAgICB2YXIgc3RhcnRPZlRva2VuUG9zaXRpb24gPSB0ZXh0VG9Nb2RpZnkuc2VhcmNoKG5ldyBSZWdFeHAoXCIoPyFcIi5jb25jYXQoZXNjYXBlZEN1cnJlbnRUcmlnZ2VyLCBcIikkXCIpKSkgLSB0cmlnZ2VyT2Zmc2V0OyAvLyB3ZSBhZGQgc3BhY2UgYWZ0ZXIgZW1vamkgaXMgc2VsZWN0ZWQgaWYgYSBjYXJldCBwb3NpdGlvbiBpcyBuZXh0XG5cbiAgICAgIHZhciBuZXdUb2tlblN0cmluZyA9IG5ld1Rva2VuLmNhcmV0UG9zaXRpb24gPT09IFwibmV4dFwiID8gXCJcIi5jb25jYXQobmV3VG9rZW4udGV4dCwgXCIgXCIpIDogbmV3VG9rZW4udGV4dDtcbiAgICAgIHZhciBuZXdDYXJldFBvc2l0aW9uID0gY29tcHV0ZUNhcmV0UG9zaXRpb24obmV3VG9rZW4uY2FyZXRQb3NpdGlvbiwgbmV3VG9rZW5TdHJpbmcsIHN0YXJ0T2ZUb2tlblBvc2l0aW9uKTtcbiAgICAgIHZhciBtb2RpZmllZFRleHQgPSB0ZXh0VG9Nb2RpZnkuc3Vic3RyaW5nKDAsIHN0YXJ0T2ZUb2tlblBvc2l0aW9uKSArIG5ld1Rva2VuU3RyaW5nO1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGV4dGFyZWFWYWx1ZS5yZXBsYWNlKHRleHRUb01vZGlmeSwgbW9kaWZpZWRUZXh0KTsgLy8gc2V0IHRoZSBuZXcgdGV4dGFyZWEgdmFsdWUgYW5kIGFmdGVyIHRoYXQgc2V0IHRoZSBjYXJldCBiYWNrIHRvIGl0cyBwb3NpdGlvblxuXG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgIGRhdGFMb2FkaW5nOiBmYWxzZVxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zZXJ0ZWRUcmlnZ2VyID0gX3RoaXMyLnRva2VuUmVnRXhwRW5kaW5nLmV4ZWMobmV3VG9rZW5TdHJpbmcpO1xuXG4gICAgICAgIHZhciBpbnNlcnRlZFRyaWdnZXJNb2RpZmllciA9IGluc2VydGVkVHJpZ2dlciA/IGluc2VydGVkVHJpZ2dlclswXS5sZW5ndGggOiAxO1xuICAgICAgICBfdGhpczIubGFzdFRyaWdnZXIgPSBuZXdDYXJldFBvc2l0aW9uID8gbmV3Q2FyZXRQb3NpdGlvbiAtIGluc2VydGVkVHJpZ2dlck1vZGlmaWVyIDogbmV3Q2FyZXRQb3NpdGlvbjtcbiAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIF90aGlzMi50ZXh0YXJlYVJlZi5zZWxlY3Rpb25FbmQgPSBuZXdDYXJldFBvc2l0aW9uO1xuXG4gICAgICAgIF90aGlzMi5fY2hhbmdlSGFuZGxlcigpO1xuXG4gICAgICAgIHZhciBzY3JvbGxUb3AgPSBfdGhpczIudGV4dGFyZWFSZWYuc2Nyb2xsVG9wO1xuXG4gICAgICAgIF90aGlzMi5zZXRDYXJldFBvc2l0aW9uKG5ld0NhcmV0UG9zaXRpb24pO1xuICAgICAgICAvKlxuICAgICAgICAgIENocm9tZSBkb2VzIG5vdCBtYWludGFpbiBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICBSZWxldmFudCBkaXNjdXNzaW9uIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzY29wZWlvL3JlYWN0LXRleHRhcmVhLWF1dG9jb21wbGV0ZS9wdWxsLzk3XG4gICAgICAgICovXG5cblxuICAgICAgICBpZiAod2luZG93LmNocm9tZSkge1xuICAgICAgICAgIF90aGlzMi50ZXh0YXJlYVJlZi5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldFRleHRUb1JlcGxhY2UgPSBmdW5jdGlvbiAoY3VycmVudFRyaWdnZXIpIHtcbiAgICAgIHZhciB0cmlnZ2VyU2V0dGluZ3MgPSBfdGhpczIucHJvcHMudHJpZ2dlcltjdXJyZW50VHJpZ2dlcl07XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyIHx8ICF0cmlnZ2VyU2V0dGluZ3MpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG91dHB1dCA9IHRyaWdnZXJTZXR0aW5ncy5vdXRwdXQ7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dHB1dCBmdW5jdG9yIGlzIG5vdCBkZWZpbmVkISBJZiB5b3UgYXJlIHVzaW5nIGl0ZW1zIGFzIG9iamVjdCB5b3UgaGF2ZSB0byBkZWZpbmUgXCJvdXRwdXRcIiBmdW5jdGlvbi4gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlI3RyaWdnZXItdHlwZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgIHZhciB0ZXh0VG9SZXBsYWNlID0gb3V0cHV0KGl0ZW0sIGN1cnJlbnRUcmlnZ2VyKTtcblxuICAgICAgICAgIGlmICh0ZXh0VG9SZXBsYWNlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHRleHRUb1JlcGxhY2UgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk91dHB1dCBmdW5jdG9yIHNob3VsZCByZXR1cm4gc3RyaW5nIG9yIG9iamVjdCBpbiBzaGFwZSB7dGV4dDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiBzdHJpbmcgfCBudW1iZXJ9LlxcbkdvdCBcXFwiXCIuY29uY2F0KFN0cmluZyh0ZXh0VG9SZXBsYWNlKSwgXCJcXFwiLiBDaGVjayB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRyaWdnZXIgXFxcIlwiKS5jb25jYXQoY3VycmVudFRyaWdnZXIsIFwiXFxcIlxcblxcblNlZSBodHRwczovL2dpdGh1Yi5jb20vd2Vic2NvcGVpby9yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGUjdHJpZ2dlci10eXBlIGZvciBtb3JlIGluZm9ybWF0aW9uLlxcblwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRleHRUb1JlcGxhY2UgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0ZXh0VG9SZXBsYWNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0ZXh0OiB0ZXh0VG9SZXBsYWNlLFxuICAgICAgICAgICAgICBjYXJldFBvc2l0aW9uOiBERUZBVUxUX0NBUkVUX1BPU0lUSU9OXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGV4dFRvUmVwbGFjZS50ZXh0ICYmIHR5cGVvZiB0ZXh0VG9SZXBsYWNlLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdXRwdXQgXFxcInRleHRcXFwiIGlzIG5vdCBkZWZpbmVkISBPYmplY3Qgc2hvdWxkIGhhcyBzaGFwZSB7dGV4dDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiBzdHJpbmcgfCBudW1iZXJ9LiBDaGVjayB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRyaWdnZXIgXFxcIlwiLmNvbmNhdChjdXJyZW50VHJpZ2dlciwgXCJcXFwiXFxuXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXRleHRUb1JlcGxhY2UuY2FyZXRQb3NpdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3V0cHV0IFxcXCJjYXJldFBvc2l0aW9uXFxcIiBpcyBub3QgZGVmaW5lZCEgT2JqZWN0IHNob3VsZCBoYXMgc2hhcGUge3RleHQ6IHN0cmluZywgY2FyZXRQb3NpdGlvbjogc3RyaW5nIHwgbnVtYmVyfS4gQ2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0cmlnZ2VyIFxcXCJcIi5jb25jYXQoY3VycmVudFRyaWdnZXIsIFwiXFxcIlxcblwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRleHRUb1JlcGxhY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdXRwdXQgaXRlbSBzaG91bGQgYmUgc3RyaW5nXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiBcIlwiLmNvbmNhdChjdXJyZW50VHJpZ2dlcikuY29uY2F0KGl0ZW0pLmNvbmNhdChjdXJyZW50VHJpZ2dlciksXG4gICAgICAgICAgY2FyZXRQb3NpdGlvbjogREVGQVVMVF9DQVJFVF9QT1NJVElPTlxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9nZXRDdXJyZW50VHJpZ2dlclNldHRpbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGN1cnJlbnRUcmlnZ2VyID0gX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyO1xuICAgICAgaWYgKCFjdXJyZW50VHJpZ2dlcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gX3RoaXMyLnByb3BzLnRyaWdnZXJbY3VycmVudFRyaWdnZXJdO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldFZhbHVlc0Zyb21Qcm92aWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpczIkc3RhdGUyID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyID0gX3RoaXMyJHN0YXRlMi5jdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICBhY3R1YWxUb2tlbiA9IF90aGlzMiRzdGF0ZTIuYWN0dWFsVG9rZW47XG5cbiAgICAgIHZhciB0cmlnZ2VyU2V0dGluZ3MgPSBfdGhpczIuX2dldEN1cnJlbnRUcmlnZ2VyU2V0dGluZ3MoKTtcblxuICAgICAgaWYgKCFjdXJyZW50VHJpZ2dlciB8fCAhdHJpZ2dlclNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGFQcm92aWRlciA9IHRyaWdnZXJTZXR0aW5ncy5kYXRhUHJvdmlkZXIsXG4gICAgICAgICAgY29tcG9uZW50ID0gdHJpZ2dlclNldHRpbmdzLmNvbXBvbmVudDtcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhUHJvdmlkZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmlnZ2VyIHByb3ZpZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uIVwiKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YUxvYWRpbmc6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgcHJvdmlkZWREYXRhID0gZGF0YVByb3ZpZGVyKGFjdHVhbFRva2VuKTtcblxuICAgICAgaWYgKCEocHJvdmlkZWREYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgcHJvdmlkZWREYXRhID0gUHJvbWlzZS5yZXNvbHZlKHByb3ZpZGVkRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHByb3ZpZGVkRGF0YS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyaWdnZXIgcHJvdmlkZXIgaGFzIHRvIHByb3ZpZGUgYW4gYXJyYXkhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBvbmVudCBzaG91bGQgYmUgZGVmaW5lZCFcIik7XG4gICAgICAgIH0gLy8gdGhyb3cgYXdheSBpZiB3ZSByZXNvbHZlZCBvbGQgdHJpZ2dlclxuXG5cbiAgICAgICAgaWYgKGN1cnJlbnRUcmlnZ2VyICE9PSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIpIHJldHVybjsgLy8gaWYgd2UgaGF2ZW4ndCByZXNvbHZlZCBhbnkgZGF0YSBsZXQncyBjbG9zZSB0aGUgYXV0b2NvbXBsZXRlXG5cbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlKGUubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9nZXRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpczIkc3RhdGUzID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyID0gX3RoaXMyJHN0YXRlMy5jdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICBkYXRhID0gX3RoaXMyJHN0YXRlMy5kYXRhO1xuICAgICAgaWYgKCFjdXJyZW50VHJpZ2dlciB8fCAhZGF0YSB8fCBkYXRhICYmICFkYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9jcmVhdGVSZWdFeHAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IF90aGlzMi5wcm9wcy50cmlnZ2VyOyAvLyBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gbWF0Y2ggb25seSB0aGUgdHJpZ2dlciArIHRoZSBhY3R1YWwgdG9rZW4gPSBcImJsYWRod2Q6YWRhd2Q6d29yZCB0ZXN0XCIgPT4gXCI6d29yZFwiXG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODA1NzgyNy8yNzE5OTE3XG5cbiAgICAgIF90aGlzMi50b2tlblJlZ0V4cCA9IG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KE9iamVjdC5rZXlzKHRyaWdnZXIpIC8vIHRoZSBzb3J0IGlzIGltcG9ydGFudCBmb3IgbXVsdGktY2hhciBjb21ib3MgYXMgXCIva2lja1wiLCBcIi9cIlxuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSA+IGIpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gZXNjYXBlUmVnZXgoYSk7XG4gICAgICB9KS5qb2luKFwifFwiKSwgXCIpKCg/Oig/IVxcXFwxKVteXFxcXHNdKSokKVwiKSk7XG4gICAgICBfdGhpczIudG9rZW5SZWdFeHBFbmRpbmcgPSBuZXcgUmVnRXhwKFwiKFwiLmNvbmNhdChPYmplY3Qua2V5cyh0cmlnZ2VyKSAvLyB0aGUgc29ydCBpcyBpbXBvcnRhbnQgZm9yIG11bHRpLWNoYXIgY29tYm9zIGFzIFwiL2tpY2tcIiwgXCIvXCJcbiAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIGlmIChhIDwgYikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgPiBiKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZVJlZ2V4KGEpO1xuICAgICAgfSkuam9pbihcInxcIiksIFwiKSRcIikpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGN1cnJlbnRUcmlnZ2VyID0gX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyO1xuXG4gICAgICBfdGhpczIuZXNjTGlzdGVuZXJEZXN0cm95KCk7XG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGRhdGFMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgY3VycmVudFRyaWdnZXI6IG51bGxcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUcmlnZ2VyKSBfdGhpczIuX29uSXRlbUhpZ2hsaWdodGVkSGFuZGxlcihudWxsKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2NsZWFuVXBQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RTcHJlYWQoe30sIF90aGlzMi5wcm9wcyk7XG5cbiAgICAgIHZhciBub3RTYWZlID0gW1wibG9hZGluZ0NvbXBvbmVudFwiLCBcImJvdW5kYXJpZXNFbGVtZW50XCIsIFwiY29udGFpbmVyU3R5bGVcIiwgXCJtaW5DaGFyXCIsIFwic2Nyb2xsVG9JdGVtXCIsIFwicmVmXCIsIFwiaW5uZXJSZWZcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ2FyZXRQb3NpdGlvbkNoYW5nZVwiLCBcImNsYXNzTmFtZVwiLCBcInZhbHVlXCIsIFwidHJpZ2dlclwiLCBcImxpc3RTdHlsZVwiLCBcIml0ZW1TdHlsZVwiLCBcImNvbnRhaW5lclN0eWxlXCIsIFwibG9hZGVyU3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJjb250YWluZXJDbGFzc05hbWVcIiwgXCJsaXN0Q2xhc3NOYW1lXCIsIFwiaXRlbUNsYXNzTmFtZVwiLCBcImxvYWRlckNsYXNzTmFtZVwiLCBcImRyb3Bkb3duU3R5bGVcIiwgXCJkcm9wZG93bkNsYXNzTmFtZVwiLCBcIm1vdmVQb3B1cEFzWW91VHlwZVwiLCBcInRleHRBcmVhQ29tcG9uZW50XCIsIFwicmVuZGVyVG9Cb2R5XCIsIFwib25JdGVtU2VsZWN0ZWRcIiwgXCJvbkl0ZW1IaWdobGlnaHRlZFwiXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKG5vdFNhZmUuaW5jbHVkZXMocHJvcCkpIGRlbGV0ZSBwcm9wc1twcm9wXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2NoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzMiRwcm9wcyA9IF90aGlzMi5wcm9wcyxcbiAgICAgICAgICB0cmlnZ2VyID0gX3RoaXMyJHByb3BzLnRyaWdnZXIsXG4gICAgICAgICAgb25DaGFuZ2UgPSBfdGhpczIkcHJvcHMub25DaGFuZ2UsXG4gICAgICAgICAgbWluQ2hhciA9IF90aGlzMiRwcm9wcy5taW5DaGFyLFxuICAgICAgICAgIG9uQ2FyZXRQb3NpdGlvbkNoYW5nZSA9IF90aGlzMiRwcm9wcy5vbkNhcmV0UG9zaXRpb25DaGFuZ2UsXG4gICAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlID0gX3RoaXMyJHByb3BzLm1vdmVQb3B1cEFzWW91VHlwZTtcbiAgICAgIHZhciBfdGhpczIkc3RhdGU0ID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIHRvcCA9IF90aGlzMiRzdGF0ZTQudG9wLFxuICAgICAgICAgIGxlZnQgPSBfdGhpczIkc3RhdGU0LmxlZnQ7XG4gICAgICB2YXIgZXZlbnQgPSBlO1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIC8vIGZpcmUgb25DaGFuZ2UgZXZlbnQgYWZ0ZXIgc3VjY2Vzc2Z1bCBzZWxlY3Rpb25cbiAgICAgICAgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIiwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGV4dGFyZWEgPSBldmVudC50YXJnZXQgfHwgX3RoaXMyLnRleHRhcmVhUmVmOyAvLyBmYWxsYmFjayB0byBzdXBwb3J0IFNoYWRvdyBET01cblxuICAgICAgdmFyIHNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnNlbGVjdGlvbkVuZDtcbiAgICAgIHZhciB2YWx1ZSA9IHRleHRhcmVhLnZhbHVlO1xuICAgICAgX3RoaXMyLmxhc3RWYWx1ZUJ1YmJsZWRFdmVudCA9IHZhbHVlO1xuXG4gICAgICBpZiAob25DaGFuZ2UgJiYgZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucGVyc2lzdCAmJiBldmVudC5wZXJzaXN0KCk7XG4gICAgICAgIG9uQ2hhbmdlKG5ldyBQcm94eShldmVudCwge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KG9yaWdpbmFsLCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwidGFyZ2V0XCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRleHRhcmVhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQob3JpZ2luYWwsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uQ2FyZXRQb3NpdGlvbkNoYW5nZSkge1xuICAgICAgICB2YXIgY2FyZXRQb3NpdGlvbiA9IF90aGlzMi5nZXRDYXJldFBvc2l0aW9uKCk7XG5cbiAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlKGNhcmV0UG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2V0VG9wTGVmdCA9IGZ1bmN0aW9uIHNldFRvcExlZnQoKSB7XG4gICAgICAgIHZhciBfZ2V0Q2FyZXRDb29yZGluYXRlcyA9IGdldENhcmV0Q29vcmRpbmF0ZXModGV4dGFyZWEsIHNlbGVjdGlvbkVuZCksXG4gICAgICAgICAgICBuZXdUb3AgPSBfZ2V0Q2FyZXRDb29yZGluYXRlcy50b3AsXG4gICAgICAgICAgICBuZXdMZWZ0ID0gX2dldENhcmV0Q29vcmRpbmF0ZXMubGVmdDtcblxuICAgICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICAgIC8vIG1ha2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGV4dGFyZWFcbiAgICAgICAgICB0b3A6IG5ld1RvcCAtIF90aGlzMi50ZXh0YXJlYVJlZi5zY3JvbGxUb3AgfHwgMCxcbiAgICAgICAgICBsZWZ0OiBuZXdMZWZ0XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdmFyIGNsZWFuTGFzdFRyaWdnZXIgPSBmdW5jdGlvbiBjbGVhbkxhc3RUcmlnZ2VyKHRyaWdnZXJMZW5ndGgpIHtcbiAgICAgICAgX3RoaXMyLmxhc3RUcmlnZ2VyID0gc2VsZWN0aW9uRW5kIC0gdHJpZ2dlckxlbmd0aDtcblxuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgc2V0VG9wTGVmdCgpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHNlbGVjdGlvbkVuZCA8PSBfdGhpczIubGFzdFRyaWdnZXIpIHtcbiAgICAgICAgdmFyIF9hZmZlY3RlZFRleHRhcmVhVmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgICAgIHZhciBfbmV3VHJpZ2dlciA9IF90aGlzMi50b2tlblJlZ0V4cC5leGVjKF9hZmZlY3RlZFRleHRhcmVhVmFsdWUpO1xuXG4gICAgICAgIGNsZWFuTGFzdFRyaWdnZXIoX25ld1RyaWdnZXIgPyBfbmV3VHJpZ2dlclswXS5sZW5ndGggOiAwKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFmZmVjdGVkVGV4dGFyZWFWYWx1ZSA9IHZhbHVlLnNsaWNlKF90aGlzMi5sYXN0VHJpZ2dlciwgc2VsZWN0aW9uRW5kKTtcblxuICAgICAgdmFyIHRva2VuTWF0Y2ggPSBfdGhpczIudG9rZW5SZWdFeHAuZXhlYyhhZmZlY3RlZFRleHRhcmVhVmFsdWUpO1xuXG4gICAgICB2YXIgbGFzdFRva2VuID0gdG9rZW5NYXRjaCAmJiB0b2tlbk1hdGNoWzBdO1xuICAgICAgdmFyIGN1cnJlbnRUcmlnZ2VyID0gdG9rZW5NYXRjaCAmJiB0b2tlbk1hdGNoWzFdIHx8IG51bGw7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXJMZW5ndGggPSBjdXJyZW50VHJpZ2dlciA/IGN1cnJlbnRUcmlnZ2VyLmxlbmd0aCAtIDEgOiAwOyAvLyB3aXRoIHRoaXMgYXBwcm9hY2ggd2Ugd2FudCB0byBrbm93IGlmIHRoZSB1c2VyIGp1c3QgaW5zZXJ0ZWQgYSBuZXcgdHJpZ2dlciBzZXF1ZW5jZVxuXG4gICAgICB2YXIgbmV3VHJpZ2dlciA9IF90aGlzMi50b2tlblJlZ0V4cEVuZGluZy5leGVjKGFmZmVjdGVkVGV4dGFyZWFWYWx1ZSk7XG5cbiAgICAgIGlmIChuZXdUcmlnZ2VyKSB7XG4gICAgICAgIGNsZWFuTGFzdFRyaWdnZXIobmV3VHJpZ2dlclswXS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIGlmICghX3RoaXMyLl9pc0F1dG9jb21wbGV0ZU9wZW4oKSkge1xuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgIGlmIHdlIGxvc3QgdGhlIHRyaWdnZXIgdG9rZW4gb3IgdGhlcmUgaXMgbm8gZm9sbG93aW5nIGNoYXJhY3RlciB3ZSB3YW50IHRvIGNsb3NlXG4gICAgICAgdGhlIGF1dG9jb21wbGV0ZVxuICAgICAgKi9cblxuXG4gICAgICBpZiAoKCFsYXN0VG9rZW4gfHwgbGFzdFRva2VuLmxlbmd0aCA8PSBtaW5DaGFyICsgY3VycmVudFRyaWdnZXJMZW5ndGgpICYmICggLy8gY2hlY2sgaWYgb3VyIGN1cnJlbnQgdHJpZ2dlciBkaXNhbGxvd3Mgd2hpdGVzcGFjZVxuICAgICAgX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyICYmICF0cmlnZ2VyW190aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcl0uYWxsb3dXaGl0ZXNwYWNlIHx8ICFfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIpKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgY29kZSBoYXMgdG8gYmUgc3luYyB0aGF0IGlzIHRoZSByZWFzb24gd2h5IHdlIG9idGFpbiB0aGUgY3VycmVudFRyaWdnZXJcbiAgICAgICAqIGZyb20gY3VycmVudFRyaWdnZXIgbm90IHRoaXMuc3RhdGUuY3VycmVudFRyaWdnZXJcbiAgICAgICAqXG4gICAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudGx5IHR5cGVkIHRva2VuIGhhcyB0byBiZSBhZnRlcldoaXRlc3BhY2UsIG9yIG5vdC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIHNldHRpbmcgbWVhbnMgdGhhdCB0aGVyZSBoYXMgdG8gYmUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIHRva2VuIChvbiBpdCBoYXMgdG8gYmUgdGhlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdHlwZWQgaW50byB0ZXh0YXJlYSlcbiAgICAgICAqL1xuXG5cbiAgICAgIGlmIChjdXJyZW50VHJpZ2dlciAmJiB0cmlnZ2VyW2N1cnJlbnRUcmlnZ2VyXS5hZnRlcldoaXRlc3BhY2UgJiYgIS9cXHMvLnRlc3QodmFsdWVbc2VsZWN0aW9uRW5kIC0gbGFzdFRva2VuLmxlbmd0aCAtIDFdKSAmJiB2YWx1ZVtzZWxlY3Rpb25FbmQgLSBsYXN0VG9rZW4ubGVuZ3RoIC0gMV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgIElmIG91ciBjdXJyZW50IHRyaWdnZXIgYWxsb3dzIHdoaXRlc3BhY2VcbiAgICAgICAgZ2V0IHRoZSBjb3JyZWN0IHRva2VuIGZvciBEYXRhUHJvdmlkZXIsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IG5ldyBSZWdFeHBcbiAgICAgICAqL1xuXG5cbiAgICAgIGlmIChfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIgJiYgdHJpZ2dlcltfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXJdLmFsbG93V2hpdGVzcGFjZSkge1xuICAgICAgICB0b2tlbk1hdGNoID0gbmV3IFJlZ0V4cChcIlwiLmNvbmNhdChlc2NhcGVSZWdleChfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIpLCBcIi4qJFwiKSkuZXhlYyh2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25FbmQpKTtcbiAgICAgICAgbGFzdFRva2VuID0gdG9rZW5NYXRjaCAmJiB0b2tlbk1hdGNoWzBdO1xuXG4gICAgICAgIGlmICghbGFzdFRva2VuKSB7XG4gICAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyaWdnZXIgPSBPYmplY3Qua2V5cyh0cmlnZ2VyKS5maW5kKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgcmV0dXJuIGEuc2xpY2UoMCwgY3VycmVudFRyaWdnZXJMZW5ndGggKyAxKSA9PT0gbGFzdFRva2VuLnNsaWNlKDAsIGN1cnJlbnRUcmlnZ2VyTGVuZ3RoICsgMSk7XG4gICAgICAgIH0pIHx8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBhY3R1YWxUb2tlbiA9IGxhc3RUb2tlbi5zbGljZSgxKTsgLy8gaWYgdHJpZ2dlciBpcyBub3QgY29uZmlndXJlZCBzdGVwIG91dCBmcm9tIHRoZSBmdW5jdGlvbiwgb3RoZXJ3aXNlIHByb2NlZWRcblxuICAgICAgaWYgKCFjdXJyZW50VHJpZ2dlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlUG9wdXBBc1lvdVR5cGUgfHwgdG9wID09PSBudWxsICYmIGxlZnQgPT09IG51bGwgfHwgLy8gaWYgdGhlIHRyaWdnZXIgZ290IGNoYW5nZWQsIGxldCdzIHJlcG9zaXRpb24gdGhlIGF1dG9jb21wbGV0ZVxuICAgICAgX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyICE9PSBjdXJyZW50VHJpZ2dlcikge1xuICAgICAgICBzZXRUb3BMZWZ0KCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5lc2NMaXN0ZW5lckluaXQoKTtcblxuICAgICAgdmFyIHRleHRUb1JlcGxhY2UgPSBfdGhpczIuX2dldFRleHRUb1JlcGxhY2UoY3VycmVudFRyaWdnZXIpO1xuXG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbmQ6IHNlbGVjdGlvbkVuZCxcbiAgICAgICAgY3VycmVudFRyaWdnZXI6IGN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICB0ZXh0VG9SZXBsYWNlOiB0ZXh0VG9SZXBsYWNlLFxuICAgICAgICBhY3R1YWxUb2tlbjogYWN0dWFsVG9rZW5cbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfdGhpczIuX2dldFZhbHVlc0Zyb21Qcm92aWRlcigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9zZWxlY3RIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpczIkcHJvcHMyID0gX3RoaXMyLnByb3BzLFxuICAgICAgICAgIG9uQ2FyZXRQb3NpdGlvbkNoYW5nZSA9IF90aGlzMiRwcm9wczIub25DYXJldFBvc2l0aW9uQ2hhbmdlLFxuICAgICAgICAgIG9uU2VsZWN0ID0gX3RoaXMyJHByb3BzMi5vblNlbGVjdDtcblxuICAgICAgaWYgKG9uQ2FyZXRQb3NpdGlvbkNoYW5nZSkge1xuICAgICAgICB2YXIgY2FyZXRQb3NpdGlvbiA9IF90aGlzMi5nZXRDYXJldFBvc2l0aW9uKCk7XG5cbiAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlKGNhcmV0UG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIG9uU2VsZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpczIuX3Nob3VsZFN0YXlPcGVuID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBlbCA9IGUucmVsYXRlZFRhcmdldDsgLy8gSUUxMSBkb2Vzbid0IGtub3cgYWJvdXQgYHJlbGF0ZWRUYXJnZXRgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80OTMyNTE5Ni8yNzE5OTE3XG5cbiAgICAgIGlmIChlbCA9PT0gbnVsbCkge1xuICAgICAgICBlbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczIuZHJvcGRvd25SZWYgJiYgZWwgaW5zdGFuY2VvZiBOb2RlICYmIF90aGlzMi5kcm9wZG93blJlZi5jb250YWlucyhlbCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNsaWNrID0gX3RoaXMyLnByb3BzLm9uQ2xpY2s7XG5cbiAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgIGUucGVyc2lzdCgpO1xuICAgICAgICBvbkNsaWNrKGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMyLl9zaG91bGRTdGF5T3BlbihlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vbkJsdXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uQmx1ciA9IF90aGlzMi5wcm9wcy5vbkJsdXI7XG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIG9uQmx1cihlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMi5fc2hvdWxkU3RheU9wZW4oZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fb25TY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX29uSXRlbUhpZ2hsaWdodGVkSGFuZGxlciA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgb25JdGVtSGlnaGxpZ2h0ZWQgPSBfdGhpczIucHJvcHMub25JdGVtSGlnaGxpZ2h0ZWQ7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXI7XG5cbiAgICAgIGlmIChvbkl0ZW1IaWdobGlnaHRlZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9uSXRlbUhpZ2hsaWdodGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvbkl0ZW1IaWdobGlnaHRlZCh7XG4gICAgICAgICAgICBjdXJyZW50VHJpZ2dlcjogY3VycmVudFRyaWdnZXIsXG4gICAgICAgICAgICBpdGVtOiBpdGVtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYG9uSXRlbUhpZ2hsaWdodGVkYCBoYXMgdG8gYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpczIuX2Ryb3Bkb3duU2Nyb2xsID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBzY3JvbGxUb0l0ZW0gPSBfdGhpczIucHJvcHMuc2Nyb2xsVG9JdGVtO1xuICAgICAgaWYgKCFzY3JvbGxUb0l0ZW0pIHJldHVybjtcblxuICAgICAgaWYgKHNjcm9sbFRvSXRlbSA9PT0gdHJ1ZSkge1xuICAgICAgICBkZWZhdWx0U2Nyb2xsVG9JdGVtKF90aGlzMi5kcm9wZG93blJlZiwgaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY3JvbGxUb0l0ZW0gIT09IFwiZnVuY3Rpb25cIiB8fCBzY3JvbGxUb0l0ZW0ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImBzY3JvbGxUb0l0ZW1gIGhhcyB0byBiZSBib29sZWFuICh0cnVlIGZvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uKSBvciBmdW5jdGlvbiB3aXRoIHR3byBwYXJhbWV0ZXJzOiBjb250YWluZXIsIGl0ZW0uXCIpO1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUb0l0ZW0oX3RoaXMyLmRyb3Bkb3duUmVmLCBpdGVtKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9pc0F1dG9jb21wbGV0ZU9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMyJHN0YXRlNSA9IF90aGlzMi5zdGF0ZSxcbiAgICAgICAgICBkYXRhTG9hZGluZyA9IF90aGlzMiRzdGF0ZTUuZGF0YUxvYWRpbmcsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGU1LmN1cnJlbnRUcmlnZ2VyO1xuXG4gICAgICB2YXIgc3VnZ2VzdGlvbkRhdGEgPSBfdGhpczIuX2dldFN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgIHJldHVybiAhISgoZGF0YUxvYWRpbmcgfHwgc3VnZ2VzdGlvbkRhdGEpICYmIGN1cnJlbnRUcmlnZ2VyKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl90ZXh0YXJlYVJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIC8vICRGbG93Rml4TWUgLSByZWYgaXMgYWN0dWFsbHkgYSBgP0hUTUxUZXh0QXJlYUVsZW1lbnRgXG4gICAgICBfdGhpczIucHJvcHMuaW5uZXJSZWYgJiYgX3RoaXMyLnByb3BzLmlubmVyUmVmKHJlZik7XG4gICAgICBfdGhpczIudGV4dGFyZWFSZWYgPSByZWY7XG4gICAgfTtcblxuICAgIF90aGlzMi5sYXN0VHJpZ2dlciA9IDA7XG4gICAgX3RoaXMyLmVzY0xpc3RlbmVyID0gbnVsbDtcbiAgICB2YXIgX3RoaXMyJHByb3BzMyA9IF90aGlzMi5wcm9wcyxcbiAgICAgICAgbG9hZGluZ0NvbXBvbmVudCA9IF90aGlzMiRwcm9wczMubG9hZGluZ0NvbXBvbmVudCxcbiAgICAgICAgX3RyaWdnZXIgPSBfdGhpczIkcHJvcHMzLnRyaWdnZXIsXG4gICAgICAgIF92YWx1ZSA9IF90aGlzMiRwcm9wczMudmFsdWU7XG4gICAgaWYgKF92YWx1ZSkgX3RoaXMyLnN0YXRlLnZhbHVlID0gX3ZhbHVlO1xuXG4gICAgX3RoaXMyLl9jcmVhdGVSZWdFeHAoKTtcblxuICAgIGlmICghbG9hZGluZ0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUlRBOiBsb2FkaW5nQ29tcG9uZW50IGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGlmICghX3RyaWdnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJUQTogdHJpZ2dlciBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXMyO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgTGlzdGVuZXJzLnN0YXJ0TGlzdGVuKHRoaXMudGV4dGFyZWFSZWYpOyAvLyBoYW5kbGUgY2FyZXQgY2hhbmdlXG5cbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy5faGFuZGxlQ2FyZXRDaGFuZ2UpO1xuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5faGFuZGxlQ2FyZXRDaGFuZ2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF9yZWYyKSB7XG4gICAgICB2YXIgb2xkVHJpZ2dlciA9IF9yZWYyLnRyaWdnZXIsXG4gICAgICAgICAgb2xkVmFsdWUgPSBfcmVmMi52YWx1ZTtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczIudHJpZ2dlcixcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHByb3BzMi52YWx1ZTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKHRyaWdnZXIpLmpvaW4oXCJcIikgIT09IE9iamVjdC5rZXlzKG9sZFRyaWdnZXIpLmpvaW4oXCJcIikpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUmVnRXhwKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdmFsdWUgJiYgdGhpcy5sYXN0VmFsdWVCdWJibGVkRXZlbnQgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMubGFzdFRyaWdnZXIgPSAwO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZUhhbmRsZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmVzY0xpc3RlbmVyRGVzdHJveSgpO1xuICAgICAgTGlzdGVuZXJzLnN0b3BMaXN0ZW4odGhpcy50ZXh0YXJlYVJlZik7IC8vIGhhbmRsZSBjYXJldCBjaGFuZ2VcblxuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgTG9hZGVyID0gX3RoaXMkcHJvcHMzLmxvYWRpbmdDb21wb25lbnQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczMuc3R5bGUsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLmNsYXNzTmFtZSxcbiAgICAgICAgICBsaXN0U3R5bGUgPSBfdGhpcyRwcm9wczMubGlzdFN0eWxlLFxuICAgICAgICAgIGl0ZW1TdHlsZSA9IF90aGlzJHByb3BzMy5pdGVtU3R5bGUsXG4gICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQgPSBfdGhpcyRwcm9wczMuYm91bmRhcmllc0VsZW1lbnQsXG4gICAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlID0gX3RoaXMkcHJvcHMzLm1vdmVQb3B1cEFzWW91VHlwZSxcbiAgICAgICAgICBsaXN0Q2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLmxpc3RDbGFzc05hbWUsXG4gICAgICAgICAgaXRlbUNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5pdGVtQ2xhc3NOYW1lLFxuICAgICAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgICAgICAgIGRyb3Bkb3duU3R5bGUgPSBfdGhpcyRwcm9wczMuZHJvcGRvd25TdHlsZSxcbiAgICAgICAgICBjb250YWluZXJTdHlsZSA9IF90aGlzJHByb3BzMy5jb250YWluZXJTdHlsZSxcbiAgICAgICAgICBjb250YWluZXJDbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuY29udGFpbmVyQ2xhc3NOYW1lLFxuICAgICAgICAgIGxvYWRlclN0eWxlID0gX3RoaXMkcHJvcHMzLmxvYWRlclN0eWxlLFxuICAgICAgICAgIGxvYWRlckNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5sb2FkZXJDbGFzc05hbWUsXG4gICAgICAgICAgdGV4dEFyZWFDb21wb25lbnQgPSBfdGhpcyRwcm9wczMudGV4dEFyZWFDb21wb25lbnQsXG4gICAgICAgICAgcmVuZGVyVG9Cb2R5ID0gX3RoaXMkcHJvcHMzLnJlbmRlclRvQm9keTtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgbGVmdCA9IF90aGlzJHN0YXRlLmxlZnQsXG4gICAgICAgICAgdG9wID0gX3RoaXMkc3RhdGUudG9wLFxuICAgICAgICAgIGRhdGFMb2FkaW5nID0gX3RoaXMkc3RhdGUuZGF0YUxvYWRpbmcsXG4gICAgICAgICAgY29tcG9uZW50ID0gX3RoaXMkc3RhdGUuY29tcG9uZW50LFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkc3RhdGUudmFsdWUsXG4gICAgICAgICAgdGV4dFRvUmVwbGFjZSA9IF90aGlzJHN0YXRlLnRleHRUb1JlcGxhY2U7XG5cbiAgICAgIHZhciBpc0F1dG9jb21wbGV0ZU9wZW4gPSB0aGlzLl9pc0F1dG9jb21wbGV0ZU9wZW4oKTtcblxuICAgICAgdmFyIHN1Z2dlc3Rpb25EYXRhID0gdGhpcy5fZ2V0U3VnZ2VzdGlvbnMoKTtcblxuICAgICAgdmFyIGV4dHJhQXR0cnMgPSB7fTtcbiAgICAgIHZhciBUZXh0QXJlYUNvbXBvbmVudDtcblxuICAgICAgaWYgKHRleHRBcmVhQ29tcG9uZW50LmNvbXBvbmVudCkge1xuICAgICAgICBUZXh0QXJlYUNvbXBvbmVudCA9IHRleHRBcmVhQ29tcG9uZW50LmNvbXBvbmVudDtcbiAgICAgICAgZXh0cmFBdHRyc1t0ZXh0QXJlYUNvbXBvbmVudC5yZWZdID0gdGhpcy5fdGV4dGFyZWFSZWY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUZXh0QXJlYUNvbXBvbmVudCA9IHRleHRBcmVhQ29tcG9uZW50O1xuICAgICAgICBleHRyYUF0dHJzLnJlZiA9IHRoaXMuX3RleHRhcmVhUmVmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJydGEgXCIuY29uY2F0KGRhdGFMb2FkaW5nID09PSB0cnVlID8gXCJydGEtLWxvYWRpbmdcIiA6IFwiXCIsIFwiIFwiKS5jb25jYXQoY29udGFpbmVyQ2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogY29udGFpbmVyU3R5bGVcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dEFyZWFDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NsZWFuVXBQcm9wcygpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJydGFfX3RleHRhcmVhIFwiLmNvbmNhdChjbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLl9jaGFuZ2VIYW5kbGVyLFxuICAgICAgICBvblNlbGVjdDogdGhpcy5fc2VsZWN0SGFuZGxlcixcbiAgICAgICAgb25TY3JvbGw6IHRoaXMuX29uU2Nyb2xsSGFuZGxlcixcbiAgICAgICAgb25DbGljazogLy8gVGhlIHRleHRhcmVhIGl0c2VsZiBpcyBvdXRzaWRlIHRoZSBhdXRvc2VsZWN0IGRyb3Bkb3duLlxuICAgICAgICB0aGlzLl9vbkNsaWNrLFxuICAgICAgICBvbkJsdXI6IHRoaXMuX29uQmx1cixcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIGV4dHJhQXR0cnMpKSwgaXNBdXRvY29tcGxldGVPcGVuICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlLCB7XG4gICAgICAgIGlubmVyUmVmOiBmdW5jdGlvbiBpbm5lclJlZihyZWYpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgX3RoaXMzLmRyb3Bkb3duUmVmID0gcmVmO1xuICAgICAgICB9LFxuICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgc3R5bGU6IGRyb3Bkb3duU3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICAgIG1vdmVQb3B1cEFzWW91VHlwZTogbW92ZVBvcHVwQXNZb3VUeXBlLFxuICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogYm91bmRhcmllc0VsZW1lbnQsXG4gICAgICAgIHRleHRhcmVhUmVmOiB0aGlzLnRleHRhcmVhUmVmLFxuICAgICAgICByZW5kZXJUb0JvZHk6IHJlbmRlclRvQm9keVxuICAgICAgfSwgc3VnZ2VzdGlvbkRhdGEgJiYgY29tcG9uZW50ICYmIHRleHRUb1JlcGxhY2UgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0LCB7XG4gICAgICAgIHZhbHVlczogc3VnZ2VzdGlvbkRhdGEsXG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgICBzdHlsZTogbGlzdFN0eWxlLFxuICAgICAgICBjbGFzc05hbWU6IGxpc3RDbGFzc05hbWUsXG4gICAgICAgIGl0ZW1DbGFzc05hbWU6IGl0ZW1DbGFzc05hbWUsXG4gICAgICAgIGl0ZW1TdHlsZTogaXRlbVN0eWxlLFxuICAgICAgICBnZXRUZXh0VG9SZXBsYWNlOiB0ZXh0VG9SZXBsYWNlLFxuICAgICAgICBvbkl0ZW1IaWdobGlnaHRlZDogdGhpcy5fb25JdGVtSGlnaGxpZ2h0ZWRIYW5kbGVyLFxuICAgICAgICBvblNlbGVjdDogdGhpcy5fb25TZWxlY3QsXG4gICAgICAgIGRyb3Bkb3duU2Nyb2xsOiB0aGlzLl9kcm9wZG93blNjcm9sbFxuICAgICAgfSksIGRhdGFMb2FkaW5nICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicnRhX19sb2FkZXIgXCIuY29uY2F0KHN1Z2dlc3Rpb25EYXRhICE9PSBudWxsID8gXCJydGFfX2xvYWRlci0tc3VnZ2VzdGlvbi1kYXRhXCIgOiBcInJ0YV9fbG9hZGVyLS1lbXB0eS1zdWdnZXN0aW9uLWRhdGFcIiwgXCIgXCIpLmNvbmNhdChsb2FkZXJDbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIHN0eWxlOiBsb2FkZXJTdHlsZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkZXIsIHtcbiAgICAgICAgZGF0YTogc3VnZ2VzdGlvbkRhdGFcbiAgICAgIH0pKSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZjMpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9yZWYzLnZhbHVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5SZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlLmRlZmF1bHRQcm9wcyA9IHtcbiAgbW92ZVBvcHVwQXNZb3VUeXBlOiBmYWxzZSxcbiAgdmFsdWU6IG51bGwsXG4gIG1pbkNoYXI6IDEsXG4gIGJvdW5kYXJpZXNFbGVtZW50OiBcImJvZHlcIixcbiAgc2Nyb2xsVG9JdGVtOiB0cnVlLFxuICB0ZXh0QXJlYUNvbXBvbmVudDogXCJ0ZXh0YXJlYVwiLFxuICByZW5kZXJUb0JvZHk6IGZhbHNlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlO1xuIiwiLy8gQ3JlZGl0cyBnbyB0byBMaWFtJ3MgUGVyaW9kaWMgTm90ZXMgUGx1Z2luOiBodHRwczovL2dpdGh1Yi5jb20vbGlhbWNhaW4vb2JzaWRpYW4tcGVyaW9kaWMtbm90ZXNcbi8vIGltcG9ydCB7IFRleHRJbnB1dFN1Z2dlc3QgfSBmcm9tIFwiLi9vYlN1Z2dlc3RcIjtcbmltcG9ydCBtZW1vU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9tZW1vU2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCB1c2VkVGFncyA9IChzZWxldGVjVGV4dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHt0YWdzfSA9IG1lbW9TZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IGxvd2VyQ2FzZUlucHV0U3RyID0gc2VsZXRlY1RleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdXNlZFRhZ3MgPSBbXSBhcyBhbnk7XG5cbiAgdGFncy5mb3JFYWNoKCh0YWc6IHN0cmluZykgPT4ge1xuICAgIGlmICh0YWcgJiYgdGFnLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpKSB7XG4gICAgICB1c2VkVGFncy5wdXNoKHtcbiAgICAgICAgbmFtZTogdGFnIGFzIHN0cmluZyxcbiAgICAgICAgY2hhcjogdGFnIGFzIHN0cmluZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVzZWRUYWdzO1xufTtcbiIsIi8vIENyZWRpdHMgZ28gdG8gTGlhbSdzIFBlcmlvZGljIE5vdGVzIFBsdWdpbjogaHR0cHM6Ly9naXRodWIuY29tL2xpYW1jYWluL29ic2lkaWFuLXBlcmlvZGljLW5vdGVzXG5pbXBvcnQge1RBYnN0cmFjdEZpbGUsIFRGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgZ2V0U3VnZ2VzdGlvbnMgPSAoaW5wdXRTdHI6IHN0cmluZykgPT4ge1xuICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG5cbiAgY29uc3QgYWJzdHJhY3RGaWxlcyA9IGFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpO1xuICAvLyBjb25zdCBmaWxlczogVEZpbGVbXSA9IFtdO1xuICBjb25zdCBmaWxlcyA9IFtdIGFzIGFueTtcblxuICBsZXQgYWN0dWFsSW5wdXQ6IHN0cmluZztcblxuICBhYnN0cmFjdEZpbGVzLmZvckVhY2goKGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICBpZiAoaW5wdXRTdHIgPT09ICdbJykge1xuICAgICAgYWN0dWFsSW5wdXQgPSAnJztcbiAgICAgIGNvbnN0IGxvd2VyQ2FzZUlucHV0U3RyID0gYWN0dWFsSW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmXG4gICAgICAgIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAncG5nJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAnanBnJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAnanBlZycgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ2dpZicpICYmXG4gICAgICAgIGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGxvd2VyQ2FzZUlucHV0U3RyKVxuICAgICAgKSB7XG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGZpbGUuYmFzZW5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGNoYXI6IGZpbGUubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZmlsZTogZmlsZSBhcyBURmlsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbnB1dFN0ci5jb250YWlucygnWycpKSB7XG4gICAgICBhY3R1YWxJbnB1dCA9IGlucHV0U3RyLnNsaWNlKDEpO1xuICAgICAgY29uc3QgbG93ZXJDYXNlSW5wdXRTdHIgPSBhY3R1YWxJbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiZcbiAgICAgICAgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdwbmcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGVnJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAnZ2lmJykgJiZcbiAgICAgICAgZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpXG4gICAgICApIHtcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZmlsZS5iYXNlbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgY2hhcjogZmlsZS5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBmaWxlOiBmaWxlIGFzIFRGaWxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmaWxlcztcbn07XG4iLCIvLyDYp9mE2LnYsdio2YrYqVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIMSNZcWhdGluYVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIERhbnNrXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gRGV1dHNjaFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIEVuZ2xpc2hcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBzZXR0aW5nLnRzXG4gICdCYXNpYyBPcHRpb25zJzogJ0Jhc2ljIE9wdGlvbnMnLFxuICAnVXNlciBuYW1lIGluIE1lbW9zJzogJ1VzZXIgbmFtZSBpbiBNZW1vcycsXG4gIFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCI6IFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCIsXG4gICdJbnNlcnQgYWZ0ZXIgaGVhZGluZyc6ICdJbnNlcnQgYWZ0ZXIgaGVhZGluZycsXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XG4gICAgJ1lvdSBzaG91bGQgc2V0IHRoZSBzYW1lIGhlYWRpbmcgYmVsb3cgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGFuZCBwcm9jZXNzIG1lbW9zIGJlbG93IHRoZSBzYW1lIGhlYWRpbmcuJyxcbiAgJ0FsbG93cyBhZG1vbml0aW9ucyB0byBiZSBjcmVhdGVkIHVzaW5nICc6ICdBbGxvd3MgYWRtb25pdGlvbnMgdG8gYmUgY3JlYXRlZCB1c2luZyAnLFxuICAnUHJvY2VzcyBNZW1vcyBiZWxvdyc6ICdQcm9jZXNzIE1lbW9zIGJlbG93JyxcbiAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJzpcbiAgICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nLFxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJyxcbiAgXCJUaGUgdGV4dCBzaG93biBvbiB0aGUgc2F2ZSBNZW1vIGJ1dHRvbiBpbiB0aGUgVUkuICdOT1RFSVQnIGJ5IGRlZmF1bHQuXCI6XG4gICAgXCJUaGUgdGV4dCBzaG93biBvbiB0aGUgc2F2ZSBNZW1vIGJ1dHRvbiBpbiB0aGUgVUkuICdOT1RFSVQnIGJ5IGRlZmF1bHQuXCIsXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJzogJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnLFxuICAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcy4gRm9jdXMgYnkgZGVmYXVsdC4nOiAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcy4gRm9jdXMgYnkgZGVmYXVsdC4nLFxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnOiAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnLFxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nOiAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nLFxuICAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJzogJ09wZW4gTWVtb3Mgd2hlbiBvYnNpZGlhbiBvcGVucycsXG4gICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nOlxuICAgICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nLFxuICAnSGlkZSBkb25lIHRhc2tzIGluIE1lbW8gbGlzdCc6ICdIaWRlIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0JyxcbiAgJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nOlxuICAgICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJyxcbiAgJ0FkdmFuY2VkIE9wdGlvbnMnOiAnQWR2YW5jZWQgT3B0aW9ucycsXG4gICdVSSBsYW5ndWFnZSBmb3IgZGF0ZSc6ICdVSSBsYW5ndWFnZSBmb3IgZGF0ZScsXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XG4gICAgXCJUcmFuc2xhdGVzIHRoZSBkYXRlIFVJIGxhbmd1YWdlLiBPbmx5ICdlbicgYW5kICd6aCcgYXJlIGF2YWlsYWJsZS5cIixcbiAgJ0RlZmF1bHQgcHJlZml4JzogJ0RlZmF1bHQgcHJlZml4JyxcbiAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiOlxuICAgIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIixcbiAgJ0RlZmF1bHQgaW5zZXJ0IGRhdGUgZm9ybWF0JzogJ0RlZmF1bHQgaW5zZXJ0IGRhdGUgZm9ybWF0JyxcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgd2hlbiBpbnNlcnQgZGF0ZSBieSBALCAnVGFza3MnIGJ5IGRlZmF1bHQuXCI6XG4gICAgXCJTZXQgdGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgd2hlbiBpbnNlcnQgZGF0ZSBieSBALCAnVGFza3MnIGJ5IGRlZmF1bHQuXCIsXG4gICdEZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBtb2JpbGUnOiAnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJyxcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcbiAgICBcIlNldCB0aGUgZGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gTW9iaWxlLCAnVG9wJyBieSBkZWZhdWx0LlwiLFxuICAnVXNlIGJ1dHRvbiB0byBzaG93IGVkaXRvciBvbiBtb2JpbGUnOiAnVXNlIGJ1dHRvbiB0byBzaG93IGVkaXRvciBvbiBtb2JpbGUnLFxuICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJzpcbiAgICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJyxcbiAgJ1Nob3cgVGltZSBXaGVuIENvcHkgUmVzdWx0cyc6ICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnLFxuICAnU2hvdyB0aW1lIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSAxMjowMC4gQ29weSB0aW1lIGJ5IGRlZmF1bHQuJzpcbiAgICAnU2hvdyB0aW1lIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSAxMjowMC4gQ29weSB0aW1lIGJ5IGRlZmF1bHQuJyxcbiAgJ1Nob3cgRGF0ZSBXaGVuIENvcHkgUmVzdWx0cyc6ICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnLFxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcbiAgICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJyxcbiAgJ0FkZCBCbGFuayBMaW5lIEJldHdlZW4gRGlmZmVyZW50IERhdGUnOiAnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZScsXG4gICdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0Lic6XG4gICAgJ0FkZCBibGFuayBsaW5lIHdoZW4gY29weSByZXN1bHQgd2l0aCBkYXRlLiBObyBibGFuayBsaW5lIGJ5IGRlZmF1bHQuJyxcbiAgJ1NoYXJlIE9wdGlvbnMnOiAnU2hhcmUgT3B0aW9ucycsXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnOiAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JyxcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtNZW1vc051bX0gdG8gZGlzcGxheSBOdW1iZXIgb2YgbWVtb3MsIHtVc2VkRGF5fSBmb3IgZGF5cy4gJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnIEJ5IGRlZmF1bHRcIjpcbiAgICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge01lbW9zTnVtfSB0byBkaXNwbGF5IE51bWJlciBvZiBtZW1vcywge1VzZWREYXl9IGZvciBkYXlzLiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycgQnkgZGVmYXVsdFwiLFxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIEVuZCc6ICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgRW5kJyxcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCI6XG4gICAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCIsXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZScsXG4gICdTYXZlIGltYWdlIHRvIGZvbGRlciBmb3IgbW9iaWxlLiBEaXNhYmxlIGJ5IERlZmF1bHQnOiAnU2F2ZSBpbWFnZSB0byBmb2xkZXIgZm9yIG1vYmlsZS4gRmFsc2UgYnkgRGVmYXVsdCcsXG4gICdTYXkgVGhhbmsgWW91JzogJ1NheSBUaGFuayBZb3UnLFxuICBEb25hdGU6ICdEb25hdGUnLFxuICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50Oic6XG4gICAgJ0lmIHlvdSBsaWtlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudDonLFxuICBMaXN0OiAnTGlzdCcsXG4gIFRhc2s6ICdUYXNrJyxcbiAgVG9wOiAnVG9wJyxcbiAgQm90dG9tOiAnQm90dG9tJyxcbiAgVEFHOiAnVEFHJyxcbiAgREFZOiAnREFZJyxcbiAgUVVFUlk6ICdRVUVSWScsXG4gIEVESVQ6ICdFRElUJyxcbiAgUElOOiAnUElOJyxcbiAgVU5QSU46ICdVTlBJTicsXG4gIERFTEVURTogJ0RFTEVURScsXG4gICdDT05GSVJN77yBJzogJ0NPTkZJUk3vvIEnLFxuICAnQ1JFQVRFIEZJTFRFUic6ICdDUkVBVEUgRklMVEVSJyxcbiAgU2V0dGluZ3M6ICdTZXR0aW5ncycsXG4gICdSZWN5Y2xlIGJpbic6ICdSZWN5Y2xlIGJpbicsXG4gICdBYm91dCBNZSc6ICdBYm91dCBNZScsXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ0ZldGNoaW5nIGRhdGEuLi4nLFxuICAnSGVyZSBpcyBObyBaZXR0ZWxzLic6ICdIZXJlIGlzIE5vIFpldHRlbHMuJyxcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJyxcbiAgJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLic6ICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nLFxuICBSRUFEOiAnUkVBRCcsXG4gIE1BUks6ICdNQVJLJyxcbiAgU0hBUkU6ICdTSEFSRScsXG4gIFNPVVJDRTogJ1NPVVJDRScsXG4gIFJFU1RPUkU6ICdSRVNUT1JFJyxcbiAgJ0RFTEVURSBBVCc6ICdERUxFVEUgQVQnLFxuICAnTm9vb29wISc6ICdOb29vb3AhJyxcbiAgJ0FsbCBEYXRhIGlzIExvYWRlZCDwn46JJzogJ0FsbCBEYXRhIGlzIExvYWRlZCDwn46JJyxcbiAgJ1F1aWNrIGZpbHRlcic6ICdRdWljayBmaWx0ZXInLFxuICBUWVBFOiAnVFlQRScsXG4gIExJTktFRDogJ0xJTktFRCcsXG4gICdOTyBUQUdTJzogJ05PIFRBR1MnLFxuICAnSEFTIExJTktTJzogJ0hBUyBMSU5LUycsXG4gICdIQVMgSU1BR0VTJzogJ0hBUyBJTUFHRVMnLFxuICBJTkNMVURFOiAnSU5DTFVERScsXG4gIEVYQ0xVREU6ICdFWENMVURFJyxcbiAgVEVYVDogJ1RFWFQnLFxuICBJUzogJ0lTJyxcbiAgSVNOT1Q6ICdJU05PVCcsXG4gIFNFTEVDVDogJ1NFTEVDVCcsXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ0FERCBGSUxURVIgVEVSTVMnLFxuICBGSUxURVI6ICdGSUxURVInLFxuICBUSVRMRTogJ1RJVExFJyxcbiAgJ0NSRUFURSBRVUVSWSc6ICdDUkVBVEUgUVVFUlknLFxuICAnRURJVCBRVUVSWSc6ICdFRElUIFFVRVJZJyxcbiAgTUFUQ0g6ICdNQVRDSCcsXG4gIFRJTUVTOiAnVElNRVMnLFxuICAnU2hhcmUgTWVtbyBJbWFnZSc6ICdTaGFyZSBNZW1vIEltYWdlJyxcbiAgJ+KGl0NsaWNrIHRoZSBidXR0b24gdG8gc2F2ZSc6ICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnLFxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICdJbWFnZSBpcyBnZW5lcmF0aW5nLi4uJyxcbiAgJ0ltYWdlIGlzIGxvYWRpbmcuLi4nOiAnSW1hZ2UgaXMgbG9hZGluZy4uLicsXG4gICdMb2FkaW5nLi4uJzogJ0xvYWRpbmcuLi4nLFxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nLFxuICAnRGFpbHkgTWVtb3MnOiAnRGFpbHkgTWVtb3MnLFxuICAnQ0FOQ0VMIEVESVQnOiAnQ0FOQ0VMIEVESVQnLFxuICAnTElOSyBUTyBUSEUnOiAnTElOSyBUTyBUSEUnLFxufTtcbiIsIi8vIEJyaXRpc2ggRW5nbGlzaFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIEVzcGHDsW9sXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gZnJhbsOnYWlzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g4KS54KS/4KSo4KWN4KSm4KWAXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gQmFoYXNhIEluZG9uZXNpYVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIEl0YWxpYW5vXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g5pel5pys6KqeXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g7ZWc6rWt7Ja0XG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gTmVkZXJsYW5kc1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIE5vcnNrXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gasSZenlrIHBvbHNraVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIFBvcnR1Z3XDqnNcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBQb3J0dWd1w6pzIGRvIEJyYXNpbFxuLy8gQnJhemlsaWFuIFBvcnR1Z3Vlc2VcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBSb23Dom7Eg1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vINGA0YPRgdGB0LrQuNC5XG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gVMO8cmvDp2VcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8vIHNldHRpbmcudHNcbiAgJ0Jhc2ljIE9wdGlvbnMnOiAn5Z+656GA6YCJ6aG5JyxcbiAgJ1VzZXIgbmFtZSBpbiBNZW1vcyc6ICflnKggTWVtb3Mg5Lit5pi+56S655qE55So5oi35ZCNJyxcbiAgXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIjogXCLlnKjov5nph4zorr7nva7kvaDllpzmrKLnmoTnlKjmiLflkI3jgIIg6buY6K6k5Li6ICdNZW1vcyDwn5iPJ1wiLFxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAn5Zyo5oyH5a6a5qCH6aKY5ZCO5o+S5YWlIE1lbW8nLFxuICAnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nOlxuICAgICfkvaDlpoLmnpzmg7PopoHmj5LlhaXmoIfpopjnmoTlkIzml7bmmL7npLrlr7nlupTmoIfpopjkuIvnmoQgTWVtb++8jOS9oOW/hemhu+S/neivgeW9k+WJjeiuvue9ruS4juS4i+aWueeahOino+aekOiuvue9ruaYr+S4gOiHtOeahOOAguW9k+S4uuepuuaXtuaPkuWFpeWIsOaWh+acqycsXG4gICdQcm9jZXNzIE1lbW9zIGJlbG93JzogJ+ino+aekOaMh+Wumuagh+mimOWQjueahCBNZW1vJyxcbiAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJzpcbiAgICAn5Y+q5pyJ5Zyo6K6+572u55qE5qCH6aKY5ZCO55qEIE1lbW8g5omN5Lya6KKr6Kej5p6Q44CC5b2T5Li656m65pe26Kej5p6Q5YWo5paH55qEIE1lbW8nLFxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICfkv53lrZjmjInpkq7kuIrnmoTmlofmnKwnLFxuICBcIlRoZSB0ZXh0IHNob3duIG9uIHRoZSBzYXZlIE1lbW8gYnV0dG9uIGluIHRoZSBVSS4gJ05PVEVJVCcgYnkgZGVmYXVsdC5cIjogXCLlnKjkv53lrZjmjInpkq7kuIrlsZXnpLrnmoTmlofmnKzjgILpu5jorqTkuLogJ05PVEVJVCdcIixcbiAgJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnOiAn6Ieq5Yqo6IGa54Sm5YiwIE1lbW9zIOi+k+WFpeahhicsXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0Lic6ICflvZPmiZPlvIAgTWVtb3Mg55qE5pe25YCZ6Ieq5Yqo6IGa54Sm5YiwIE1lbW9zIOi+k+WFpeahhuOAgum7mOiupOW8gOWQrycsXG4gICdPcGVuIGRhaWx5IG1lbW9zIHdpdGggb3BlbiBtZW1vcyc6ICfmiZPlvIDmr4/ml6UgTWVtbyDnmoTml7blgJnmiZPlvIAgTWVtb3Mg55WM6Z2iJyxcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zLiBPcGVuIGJ5IGRlZmF1bHQuJzogJ+aJk+W8gOavj+aXpSBNZW1vIOeahOaXtuWAmeaJk+W8gCBNZW1vcyDnlYzpnaLjgILpu5jorqTlvIDlkK8nLFxuICAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJzogJ+W9k+W8gOWQryBPYnNpZGlhbiDnmoTml7blgJnoh6rliqjmiZPlvIAgTWVtb3MnLFxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcbiAgICAn5b2T5byA5ZCv6K+l6YCJ6aG5LCBNZW1vcyDkvJrlnKggT2JzaWRpYW4g5omT5byA5pe26Ieq5Yqo5omT5byA44CC6buY6K6k5LiN5byA5ZCv44CCJyxcbiAgJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnOiAn5ZyoIG1lbW8g5YiX6KGo5Lit6ZqQ6JeP5bey5a6M5oiQIG1lbW8nLFxuICAnSGlkZSBhbGwgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QuIFNob3cgZG9uZSB0YXNrcyBieSBkZWZhdWx0Lic6ICflnKggbWVtbyDliJfooajkuK3pmpDol4/lt7LlrozmiJAgbWVtb+OAgum7mOiupOS4jeW8gOWQrycsXG4gICdBZHZhbmNlZCBPcHRpb25zJzogJ+i/m+mYtumAiemhuScsXG4gICdVSSBsYW5ndWFnZSBmb3IgZGF0ZSc6ICfpkojlr7nml6XmnJ/lsZXnpLrnmoTor63oqIDnlYzpnaInLFxuICBcIlRyYW5zbGF0ZXMgdGhlIGRhdGUgVUkgbGFuZ3VhZ2UuIE9ubHkgJ2VuJyBhbmQgJ3poJyBhcmUgYXZhaWxhYmxlLlwiOlxuICAgIFwi5a+55pel5pyf55qE5LiN5ZCM57+76K+R44CC55uu5YmN5Y+q6IO96YCJ5oupICdlbicg5ZKMICd6aCfvvIjmnKrmnaXkvJrlup/nva7vvIlcIixcbiAgJ0RlZmF1bHQgcHJlZml4JzogJ+m7mOiupOWJjee8gCcsXG4gIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIjogJ+iuvue9rum7mOiupOeahOWJjee8gOagt+W8j+OAgum7mOiupOS4uuWIl+ihqCcsXG4gICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCc6ICfmj5LlhaXml6XmnJ/pmYTluKbnmoTmoLflvI8nLFxuICBcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIjpcbiAgICBcIuW9k+S9v+eUqCBAIOadpeW/q+mAn+aPkuWFpeaXpeacn+aXtu+8jOaPkuWFpeaXpeacn+mZhOW4pueahOagt+W8j++8jOm7mOiupOS4uiAnVGFza3MnIOagt+W8j1wiLFxuICAnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJzogJ+WcqOenu+WKqOerr+S4iueahOm7mOiupOe8lui+keWZqOS9jee9ricsXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBNb2JpbGUsICdUb3AnIGJ5IGRlZmF1bHQuXCI6ICforr7nva7lnKjnp7vliqjnq6/kuIrnmoTpu5jorqTnvJbovpHlmajkvY3nva7vvIzpu5jorqTlnKjpobbpg6jjgIInLFxuICAnVXNlIGJ1dHRvbiB0byBzaG93IGVkaXRvciBvbiBtb2JpbGUnOiAn5b2T57yW6L6R5Zmo5L2N572u5Zyo5bqV6YOo5pe277yM55So5oyJ6ZKu5p2l5ZSk5Ye657yW6L6R5ZmoJyxcbiAgJ1NldCBhIGZsb2F0IGJ1dHRvbiB0byBjYWxsIGVkaXRvciBvbiBtb2JpbGUuIE9ubHkgd2hlbiBlZGl0b3IgbG9jYXRlZCBhdCB0aGUgYm90dG9tIHdvcmtzLic6XG4gICAgJ+iuvue9ruS4gOS4qua1ruWKqOaMiemSruadpeWUpOWHuue8lui+keWZqOOAguW9k+WcqOenu+WKqOerr+S4iuWQr+eUqOivpemAiemhueaJjeS8mueUn+aViCcsXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiAn5b2T5aSN5Yi25qOA57Si57uT5p6c5pe26ZmE5bim5pe26Ze0JyxcbiAgJ1Nob3cgdGltZSB3aGVuIHlvdSBjb3B5IHJlc3VsdHMsIGxpa2UgMTI6MDAuIENvcHkgdGltZSBieSBkZWZhdWx0Lic6XG4gICAgJ+WcqOWkjeWItuajgOe0oue7k+aenOaXtumZhOW4puWFtuaXtumXtO+8jOS+i+WmgiAxMjowMCDjgILpu5jorqTlvIDlkK8nLFxuICAnU2hvdyBEYXRlIFdoZW4gQ29weSBSZXN1bHRzJzogJ+W9k+WkjeWItuajgOe0oue7k+aenOaXtumZhOW4puaXpeacnycsXG4gICdTaG93IGRhdGUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIFtbMjAyMi0wMS0wMV1dLiBDb3B5IGRhdGUgYnkgZGVmYXVsdC4nOlxuICAgICflnKjlpI3liLbmo4DntKLnu5Pmnpzml7bpmYTluKblhbbml6XmnJ/vvIzkvovlpoIgW1syMDIyLTAxLTAxXV3jgILpu5jorqTlvIDlkK8nLFxuICAnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZSc6ICflnKjlpI3liLbml6XmnJ/nmoTml7blgJnliqDkuIrnqbrooYwnLFxuICAnQWRkIGJsYW5rIGxpbmUgd2hlbiBjb3B5IHJlc3VsdCB3aXRoIGRhdGUuIE5vIGJsYW5rIGxpbmUgYnkgZGVmYXVsdC4nOlxuICAgICflnKjlpI3liLbml6XmnJ/nmoTml7blgJnlnKjnm7jpgrvnmoTml6XmnJ/kuYvpl7TliqDkuIrnqbrooYzjgILpu5jorqTml6DnqbrooYwnLFxuICAnU2hhcmUgT3B0aW9ucyc6ICfliIbkuqvpgInpobknLFxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JzogJ+WIhuS6qyBtZW1vIOWbvueJh+eahOW3pui+uemhteiEmicsXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCI6XG4gICAgXCLkvaDlj6/ku6XlnKjov5nph4zorr7nva7kvaDmg7PopoHnmoTku7vmhI/mlofmnKzvvIznlKgge01lbW9zTnVtfSDmnaXlsZXnpLrkvaDorrDlvZXnmoQgbWVtbyDmlbDph4/vvIx7VXNlZERheX0g5p2l5bGV56S65L2/55So5pel5pyf44CC6buY6K6k5Li6J3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnXCIsXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgRW5kJzogJ+WIhuS6qyBtZW1vIOWbvueJh+eahOWPs+i+uemhteiEmicsXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiOlxuICAgIFwi5L2g5Y+v5Lul5Zyo6L+Z6YeM6K6+572u5L2g5oOz6KaB55qE5Lu75oSP5paH5pys77yM55SoIHtVc2VyTmFtZX0g5p2l5bGV56S65L2g55qE55So5oi35ZCN44CC6buY6K6k5Li6ICfinI3vuI8gQnkge1VzZXJOYW1lfSdcIixcbiAgJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJzogJ+W9k+WcqOenu+WKqOerr+S4iuaXtuS/neWtmOWbvueJh+WIsOaWh+S7tuWkuScsXG4gICdTYXZlIGltYWdlIHRvIGZvbGRlciBmb3IgbW9iaWxlLiBGYWxzZSBieSBEZWZhdWx0JzogJ+W9k+WcqOenu+WKqOerr+S4iuaXtu+8jOS/neWtmOeUn+aIkOeahOWbvueJh+WIsOaWh+S7tuWkuScsXG4gICdTYXkgVGhhbmsgWW91JzogJ+aEn+iwouW8gOWPkScsXG4gIERvbmF0ZTogJ+aNkOi1oCcsXG4gICdJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiwgY29uc2lkZXIgZG9uYXRpbmcgdG8gc3VwcG9ydCBjb250aW51ZWQgZGV2ZWxvcG1lbnQ6JzpcbiAgICAn5aaC5p6c5L2g5Zac5qyi6L+Z5Liq5o+S5Lu277yM6ICM5LiU5Lmf5biM5pyb57uZ5oiR5Lmw6bih6IW/77yM6YKj5LmI5Y+v5Lul6ICD6JmRIEdpdGh1YiDpobXpnaLlj7PovrnnmoQgU3BvbnNvcn4nLFxuICBMaXN0OiAn5YiX6KGoJyxcbiAgVGFzazogJ+S7u+WKoScsXG4gIFRvcDogJ+mhtumDqCcsXG4gIEJvdHRvbTogJ+W6lemDqCcsXG4gIFRBRzogJ+agh+etvicsXG4gIERBWTogJ+WkqScsXG4gIFFVRVJZOiAn5qOA57Si5byPJyxcbiAgRURJVDogJ+e8lui+kScsXG4gIFBJTjogJ+e9rumhticsXG4gIFVOUElOOiAn5Y+W5raI572u6aG2JyxcbiAgREVMRVRFOiAn5Yig6ZmkJyxcbiAgJ0NPTkZJUk3vvIEnOiAn56Gu5a6a5Yig6ZmkJyxcbiAgJ0NSRUFURSBGSUxURVInOiAn5Yib5bu65qOA57Si5byPJyxcbiAgU2V0dGluZ3M6ICforr7nva4nLFxuICAnUmVjeWNsZSBiaW4nOiAn5Zue5pS256uZJyxcbiAgJ0Fib3V0IE1lJzogJ+WFs+S6jicsXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ+iOt+WPluaVsOaNruS4rS4uLicsXG4gICdIZXJlIGlzIE5vIFpldHRlbHMuJzogJ+ayoeacieaJvuWIsCBtZW1vJyxcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ+W4uOeUqOagh+etvicsXG4gICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nOiAn5L2g546w5Zyo5Zyo5oOz5LuA5LmI77yfJyxcbiAgUkVBRDogJ+mYheivuycsXG4gIE1BUks6ICflvJXnlKgnLFxuICBTSEFSRTogJ+WIhuS6qycsXG4gIFNPVVJDRTogJ+adpea6kCcsXG4gIFJFU1RPUkU6ICfmgaLlpI0nLFxuICAnREVMRVRFIEFUJzogJ+WIoOmZpOS6jicsXG4gICdOb29vb3AhJzogJ+WVpemDveayoeacie+8gScsXG4gICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiSc6ICfmiYDmnInmlbDmja7pg73liqDovb3lpb3llaYg8J+OiScsXG4gICdRdWljayBmaWx0ZXInOiAn5b+r6YCf562b6YCJJyxcbiAgVFlQRTogJ+exu+WeiycsXG4gIExJTktFRDogJ+aciemTvuaOpScsXG4gICdOTyBUQUdTJzogJ+aXoOagh+etvicsXG4gICdIQVMgTElOS1MnOiAn5pyJ6LaF6ZO+5o6lJyxcbiAgJ0hBUyBJTUFHRVMnOiAn5pyJ5Zu+54mHJyxcbiAgSU5DTFVERTogJ+WMheaLrCcsXG4gIEVYQ0xVREU6ICfmjpLpmaQnLFxuICBURVhUOiAn5paH5pysJyxcbiAgSVM6ICfmmK8nLFxuICBJU05PVDogJ+S4jeaYrycsXG4gIFNFTEVDVDogJ+mAieaLqScsXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ+a3u+WKoOajgOe0ouadoeS7ticsXG4gIEZJTFRFUjogJ+ajgOe0ouWZqCcsXG4gIFRJVExFOiAn5qCH6aKYJyxcbiAgJ0NSRUFURSBRVUVSWSc6ICfliJvlu7rmo4DntKLlvI8nLFxuICAnRURJVCBRVUVSWSc6ICfnvJbovpHmo4DntKLlvI8nLFxuICBNQVRDSDogJ+WMuemFjScsXG4gIFRJTUVTOiAn5qyhJyxcbiAgJ1NoYXJlIE1lbW8gSW1hZ2UnOiAn5YiG5LqrIE1lbW8g5Zu+54mHJyxcbiAgJ+KGl0NsaWNrIHRoZSBidXR0b24gdG8gc2F2ZSc6ICfihpfngrnlh7vlj7PkuIrop5LnmoTmjInpkq7mnaXkv53lrZgnLFxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICflm77niYfmraPlnKjnlJ/miJDkuK0uLi4nLFxuICAnSW1hZ2UgaXMgbG9hZGluZy4uLic6ICflm77niYfmraPlnKjliqDovb3kuK0uLi4nLFxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiAn8J+YnyDml6Dms5XliqDovb3lm77niYfvvIzlm77niYfpk77mjqXkuZ/orrjkuI3lrZjlnKgnLFxuICAnTG9hZGluZy4uLic6ICfliqrlipvliqDovb3kuK0uLi4nLFxuICAnRGFpbHkgTWVtb3MnOiAn5q+P5pelIE1lbW9zJyxcbiAgJ0NBTkNFTCBFRElUJzogJ+WPlua2iOe8lui+kScsXG4gICdMSU5LIFRPIFRIRSc6ICfpk77mjqXliLAnLFxufTtcbiIsIi8vIOe5gemrlOS4reaWh1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIENvZGUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdmFsZW50aW5lMTk1L29ic2lkaWFuLWFkbW9uaXRpb24vYmxvYi9tYXN0ZXIvc3JjL2xhbmcvaGVscGVycy50c1xyXG5cclxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCBhciBmcm9tICcuL2xvY2FsZS9hcic7XHJcbmltcG9ydCBjeiBmcm9tICcuL2xvY2FsZS9jeic7XHJcbmltcG9ydCBkYSBmcm9tICcuL2xvY2FsZS9kYSc7XHJcbmltcG9ydCBkZSBmcm9tICcuL2xvY2FsZS9kZSc7XHJcbmltcG9ydCBlbiBmcm9tICcuL2xvY2FsZS9lbic7XHJcbmltcG9ydCBlbkdCIGZyb20gJy4vbG9jYWxlL2VuLWdiJztcclxuaW1wb3J0IGVzIGZyb20gJy4vbG9jYWxlL2VzJztcclxuaW1wb3J0IGZyIGZyb20gJy4vbG9jYWxlL2ZyJztcclxuaW1wb3J0IGhpIGZyb20gJy4vbG9jYWxlL2hpJztcclxuaW1wb3J0IGlkIGZyb20gJy4vbG9jYWxlL2lkJztcclxuaW1wb3J0IGl0IGZyb20gJy4vbG9jYWxlL2l0JztcclxuaW1wb3J0IGphIGZyb20gJy4vbG9jYWxlL2phJztcclxuaW1wb3J0IGtvIGZyb20gJy4vbG9jYWxlL2tvJztcclxuaW1wb3J0IG5sIGZyb20gJy4vbG9jYWxlL25sJztcclxuaW1wb3J0IG5vIGZyb20gJy4vbG9jYWxlL25vJztcclxuaW1wb3J0IHBsIGZyb20gJy4vbG9jYWxlL3BsJztcclxuaW1wb3J0IHB0IGZyb20gJy4vbG9jYWxlL3B0JztcclxuaW1wb3J0IHB0QlIgZnJvbSAnLi9sb2NhbGUvcHQtYnInO1xyXG5pbXBvcnQgcm8gZnJvbSAnLi9sb2NhbGUvcm8nO1xyXG5pbXBvcnQgcnUgZnJvbSAnLi9sb2NhbGUvcnUnO1xyXG5pbXBvcnQgdHIgZnJvbSAnLi9sb2NhbGUvdHInO1xyXG5pbXBvcnQgemhDTiBmcm9tICcuL2xvY2FsZS96aC1jbic7XHJcbmltcG9ydCB6aFRXIGZyb20gJy4vbG9jYWxlL3poLXR3JztcclxuXHJcbmNvbnN0IGxvY2FsZU1hcDoge1trOiBzdHJpbmddOiBQYXJ0aWFsPHR5cGVvZiBlbj59ID0ge1xyXG4gIGFyLFxyXG4gIGNzOiBjeixcclxuICBkYSxcclxuICBkZSxcclxuICBlbixcclxuICAnZW4tZ2InOiBlbkdCLFxyXG4gIGVzLFxyXG4gIGZyLFxyXG4gIGhpLFxyXG4gIGlkLFxyXG4gIGl0LFxyXG4gIGphLFxyXG4gIGtvLFxyXG4gIG5sLFxyXG4gIG5uOiBubyxcclxuICBwbCxcclxuICBwdCxcclxuICAncHQtYnInOiBwdEJSLFxyXG4gIHJvLFxyXG4gIHJ1LFxyXG4gIHRyLFxyXG4gICd6aC1jbic6IHpoQ04sXHJcbiAgJ3poLXR3JzogemhUVyxcclxufTtcclxuXHJcbmNvbnN0IGxvY2FsZSA9IGxvY2FsZU1hcFttb21lbnQubG9jYWxlKCldO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4pOiBzdHJpbmcge1xyXG4gIHJldHVybiAobG9jYWxlICYmIGxvY2FsZVtzdHJdKSB8fCBlbltzdHJdO1xyXG59XHJcbiIsImltcG9ydCB7Zm9yd2FyZFJlZiwgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGlueVVuZG8gZnJvbSAndGlueS11bmRvJztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uLy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB7c3RvcmFnZSwgcmVtb3ZlfSBmcm9tICcuLi8uLi9oZWxwZXJzL3N0b3JhZ2UnO1xuaW1wb3J0IHVzZVJlZnJlc2ggZnJvbSAnLi4vLi4vaG9va3MvdXNlUmVmcmVzaCc7XG5pbXBvcnQgT25seSBmcm9tICcuLi9jb21tb24vT25seVdoZW4nO1xuaW1wb3J0ICcuLi8uLi9sZXNzL2VkaXRvci5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZSBmcm9tICdAd2Vic2NvcGVpby9yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGUnO1xuaW1wb3J0IHt1c2VkVGFnc30gZnJvbSAnLi4vLi4vb2JDb21wb25lbnRzL29iVGFnU3VnZ2VzdGVyJztcbmltcG9ydCAnLi4vLi4vbGVzcy9zdWdnZXN0Lmxlc3MnO1xuaW1wb3J0IHtGb2N1c09uRWRpdG9yLCBTYXZlTWVtb0J1dHRvbkxhYmVsfSBmcm9tICcuLi8uLi9tZW1vcyc7XG5pbXBvcnQge2dldFN1Z2dlc3Rpb25zfSBmcm9tICcuLi8uLi9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi8uLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uLy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG50eXBlIEl0ZW1Qcm9wcyA9IHtcbiAgZW50aXR5OiB7XG4gICAgY2hhcjogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlPzogVEZpbGU7XG4gIH07XG59O1xuXG50eXBlIExvYWRpbmdQcm9wcyA9IHtcbiAgZGF0YTogQXJyYXk8e25hbWU6IHN0cmluZzsgY2hhcjogc3RyaW5nfT47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRvclJlZkFjdGlvbnMge1xuICBlbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICBmb2N1czogRnVuY3Rpb25UeXBlO1xuICBpbnNlcnRUZXh0OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRDb250ZW50OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBnZXRDb250ZW50OiAoKSA9PiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFZGl0b3JQcm9wcyB7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBpbml0aWFsQ29udGVudDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBzaG93Q29uZmlybUJ0bjogYm9vbGVhbjtcbiAgc2hvd0NhbmNlbEJ0bjogYm9vbGVhbjtcbiAgdG9vbHM/OiBSZWFjdE5vZGU7XG4gIG9uQ29uZmlybUJ0bkNsaWNrOiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkNhbmNlbEJ0bkNsaWNrOiAoKSA9PiB2b2lkO1xuICBvbkNvbnRlbnRDaGFuZ2U6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBUSXRlbSA9ICh7ZW50aXR5OiB7bmFtZSwgY2hhciwgZmlsZX19OiBJdGVtUHJvcHMpID0+IHtcbiAgcmV0dXJuIDxkaXY+e2Ake2NoYXJ9YH08L2Rpdj47XG59O1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IExvYWRpbmcgPSAoe2RhdGF9OiBMb2FkaW5nUHJvcHMpID0+IHtcbiAgcmV0dXJuIDxkaXY+TG9hZGluZzwvZGl2Pjtcbn07XG5cbmV4cG9ydCBsZXQgZWRpdG9ySW5wdXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5sZXQgYWN0dWFsVG9rZW46IHN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxuY29uc3QgRWRpdG9yID0gZm9yd2FyZFJlZigocHJvcHM6IEVkaXRvclByb3BzLCByZWY6IFJlYWN0LkZvcndhcmRlZFJlZjxFZGl0b3JSZWZBY3Rpb25zPikgPT4ge1xuICBjb25zdCB7XG4gICAgZ2xvYmFsU3RhdGU6IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZX0sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGluaXRpYWxDb250ZW50LFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNob3dDb25maXJtQnRuLFxuICAgIHNob3dDYW5jZWxCdG4sXG4gICAgb25Db25maXJtQnRuQ2xpY2s6IGhhbmRsZUNvbmZpcm1CdG5DbGlja0NhbGxiYWNrLFxuICAgIG9uQ2FuY2VsQnRuQ2xpY2s6IGhhbmRsZUNhbmNlbEJ0bkNsaWNrQ2FsbGJhY2ssXG4gICAgb25Db250ZW50Q2hhbmdlOiBoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2ssXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCB0aW55VW5kb1JlZiA9IHVzZVJlZjxUaW55VW5kbyB8IG51bGw+KG51bGwpO1xuICBjb25zdCByZWZyZXNoID0gdXNlUmVmcmVzaCgpO1xuICAvLyBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpXG5cbiAgXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxDb250ZW50KSB7XG4gICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9IGluaXRpYWxDb250ZW50O1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlKSB7XG4gICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge3RpbnlVbmRvQWN0aW9uc0NhY2hlLCB0aW55VW5kb0luZGV4Q2FjaGV9ID0gc3RvcmFnZS5nZXQoWyd0aW55VW5kb0FjdGlvbnNDYWNoZScsICd0aW55VW5kb0luZGV4Q2FjaGUnXSk7XG5cbiAgICAgIHRpbnlVbmRvUmVmLmN1cnJlbnQgPSBuZXcgVGlueVVuZG8oZWRpdG9yUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAgICAgIGluaXRpYWxBY3Rpb25zOiB0aW55VW5kb0FjdGlvbnNDYWNoZSxcbiAgICAgICAgaW5pdGlhbEluZGV4OiB0aW55VW5kb0luZGV4Q2FjaGUsXG4gICAgICB9KTtcblxuICAgICAgdGlueVVuZG9SZWYuY3VycmVudC5zdWJzY3JpYmUoKGFjdGlvbnMsIGluZGV4KSA9PiB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0KHtcbiAgICAgICAgICB0aW55VW5kb0FjdGlvbnNDYWNoZTogYWN0aW9ucyxcbiAgICAgICAgICB0aW55VW5kb0luZGV4Q2FjaGU6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0aW55VW5kb1JlZi5jdXJyZW50Py5kZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aW55VW5kb1JlZi5jdXJyZW50Py5kZXN0cm95KCk7XG4gICAgICB0aW55VW5kb1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHN0b3JhZ2UucmVtb3ZlKFsndGlueVVuZG9BY3Rpb25zQ2FjaGUnLCAndGlueVVuZG9JbmRleENhY2hlJ10pO1xuICAgIH1cbiAgfSwgW3VzZVRpbnlVbmRvSGlzdG9yeUNhY2hlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50LnN0eWxlLmhlaWdodCA9IChlZGl0b3JSZWYuY3VycmVudC5zY3JvbGxIZWlnaHQgPz8gMCkgKyAncHgnO1xuICAgIH1cbiAgfSwgW2VkaXRvclJlZi5jdXJyZW50Py52YWx1ZV0pO1xuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUoXG4gICAgcmVmLFxuICAgICgpID0+ICh7XG4gICAgICBlbGVtZW50OiBlZGl0b3JSZWYuY3VycmVudCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgaWYoRm9jdXNPbkVkaXRvcil7XG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBpbnNlcnRUZXh0OiAocmF3VGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudC52YWx1ZTtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPVxuICAgICAgICAgIHByZXZWYWx1ZS5zbGljZSgwLCBlZGl0b3JSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydCkgK1xuICAgICAgICAgIHJhd1RleHQgK1xuICAgICAgICAgIHByZXZWYWx1ZS5zbGljZShlZGl0b3JSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydCk7XG4gICAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudC52YWx1ZSk7XG4gICAgICAgIHJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICBzZXRDb250ZW50OiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID0gdGV4dDtcbiAgICAgICAgICBoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xuICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldENvbnRlbnQ6ICgpOiBzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlID8/ICcnO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnNlcnRUcmlnZ2VyID0gKGV2ZW50OiB7Y3VycmVudFRyaWdnZXI6IHN0cmluZzsgaXRlbTogYW55fSkgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7ZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUcmlnZ2VyID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LnZhbHVlO1xuICAgICAgbGV0IHJlbW92ZUNoYXJOdW07XG4gICAgICBpZiAoYWN0dWFsVG9rZW4gIT09IG51bGwgJiYgYWN0dWFsVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hhck51bSA9IDA7XG4gICAgICB9XG4gICAgICBsZXQgYmVoaW5kQ2hhck51bSA9IGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XG4gICAgICAgICAgYmVoaW5kQ2hhck51bSsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID1cbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgcHJldlZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0IC0gcmVtb3ZlQ2hhck51bSkgK1xuICAgICAgICBldmVudC5pdGVtLmNoYXIgK1xuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoYmVoaW5kQ2hhck51bSk7XG4gICAgICBoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuY3VycmVudFRyaWdnZXIgPT09ICdbWycpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZXZlbnQuaXRlbS5maWxlLCBldmVudC5pdGVtLmZpbGUucGF0aCwgJycsICcnKTtcblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQudmFsdWU7XG4gICAgICBsZXQgcmVtb3ZlQ2hhck51bTtcbiAgICAgIGlmIChhY3R1YWxUb2tlbiAhPT0gbnVsbCAmJiBhY3R1YWxUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChmaWxlUGF0aC5jb250YWlucygnW1snKSkge1xuICAgICAgICAgIHJlbW92ZUNoYXJOdW0gPSBhY3R1YWxUb2tlbi5sZW5ndGggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lml0ZW0uZmlsZS5leHRlbnNpb24gIT09ICdtZCcpIHtcbiAgICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoICsgMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hhck51bSA9IDI7XG4gICAgICB9XG4gICAgICBsZXQgYmVoaW5kQ2hhck51bSA9IGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XG4gICAgICAgICAgYmVoaW5kQ2hhck51bSsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID1cbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgcHJldlZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0IC0gcmVtb3ZlQ2hhck51bSkgK1xuICAgICAgICBmaWxlUGF0aCArXG4gICAgICAgIHByZXZWYWx1ZS5zbGljZShiZWhpbmRDaGFyTnVtKTtcbiAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudC52YWx1ZSk7XG4gICAgICByZWZyZXNoKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRvcklucHV0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudD8udmFsdWUgPz8gJycpO1xuICAgIHJlZnJlc2goKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRvcktleURvd24gPSB1c2VDYWxsYmFjaygoZXZlbnQ6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmIChldmVudC5jb2RlID09PSAnRW50ZXInKSB7XG4gICAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XG4gICAgICAgIGhhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGljaygpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWZyZXNoKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVDb21tb25Db25maXJtQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID0gZ2V0RWRpdG9yQ29udGVudENhY2hlKCk7XG5cbiAgICBoYW5kbGVDb25maXJtQnRuQ2xpY2tDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudC52YWx1ZSk7XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSAnJztcblxuICAgIHJlZnJlc2goKTtcbiAgICAvLyBBZnRlciBjb25maXJtIGJ0biBjbGlja2VkLCB0aW55LXVuZG8gc2hvdWxkIHJlc2V0IHN0YXRlKGNsZWFyIGFjdGlvbnMgYW5kIGluZGV4KVxuICAgIHRpbnlVbmRvUmVmLmN1cnJlbnQ/LnJlc2V0U3RhdGUoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNvbW1vbkNhbmNlbEJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGhhbmRsZUNhbmNlbEJ0bkNsaWNrQ2FsbGJhY2soKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdldEVkaXRvckNvbnRlbnRDYWNoZSA9ICgpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBzdG9yYWdlLmdldChbJ2VkaXRvckNvbnRlbnRDYWNoZSddKS5lZGl0b3JDb250ZW50Q2FjaGUgPz8gJyc7XG4gIH07XG5cbiAgY29uc3QgZ2V0RWRpdG9yQ29udGVudCA9ICgpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9IGdldEVkaXRvckNvbnRlbnRDYWNoZSgpO1xuICAgIC8vIGlmKCBGb2N1c09uRWRpdG9yICl7XG4gICAgLy8gICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gZWRpdG9yUmVmLmN1cnJlbnQudmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17J2NvbW1vbi1lZGl0b3Itd3JhcHBlciAnICsgY2xhc3NOYW1lfT5cbiAgICAgIDxSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlXG4gICAgICAgIC8vIGF1dG9Gb2N1c1xuICAgICAgICBjbGFzc05hbWU9XCJjb21tb24tZWRpdG9yLWlucHV0ZXIgc2Nyb2xsXCJcbiAgICAgICAgbG9hZGluZ0NvbXBvbmVudD17TG9hZGluZ31cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICBtb3ZlUG9wdXBBc1lvdVR5cGU9e3RydWV9XG4gICAgICAgIC8vIHJlbmRlclRvQm9keT17dHJ1ZX1cblxuICAgICAgICByZWY9eyhydGEpID0+IHtcbiAgICAgICAgICBydGEgPSBydGE7XG4gICAgICAgIH19XG4gICAgICAgIHZhbHVlPXtnZXRFZGl0b3JDb250ZW50KCl9XG4gICAgICAgIGlubmVyUmVmPXsodGV4dGFyZWEpID0+IHtcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudCA9IHRleHRhcmVhO1xuICAgICAgICB9fVxuICAgICAgICBvbklucHV0PXtoYW5kbGVFZGl0b3JJbnB1dH1cbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFZGl0b3JLZXlEb3dufVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIG1pbkhlaWdodDogNDgsXG4gICAgICAgIH19XG4gICAgICAgIGRyb3Bkb3duU3R5bGU9e3tcbiAgICAgICAgICBtaW5XaWR0aDogMTgwLFxuICAgICAgICAgIG1heEhlaWdodDogMjUwLFxuICAgICAgICAgIG92ZXJmbG93WTogJ2F1dG8nLFxuICAgICAgICB9fVxuICAgICAgICBtaW5DaGFyPXswfVxuICAgICAgICBvbkl0ZW1TZWxlY3RlZD17aGFuZGxlSW5zZXJ0VHJpZ2dlcn1cbiAgICAgICAgc2Nyb2xsVG9JdGVtPXt0cnVlfVxuICAgICAgICB0cmlnZ2VyPXt7XG4gICAgICAgICAgJyMnOiB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6ICh0b2tlbikgPT4ge1xuICAgICAgICAgICAgICBhY3R1YWxUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICByZXR1cm4gdXNlZFRhZ3ModG9rZW4pLm1hcCgoe25hbWUsIGNoYXJ9KSA9PiAoe25hbWUsIGNoYXJ9KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbXBvbmVudDogVEl0ZW0sXG4gICAgICAgICAgICBhZnRlcldoaXRlc3BhY2U6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXQ6IChpdGVtKSA9PiBpdGVtLmNoYXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnW1snOiB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6ICh0b2tlbikgPT4ge1xuICAgICAgICAgICAgICBhY3R1YWxUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0U3VnZ2VzdGlvbnModG9rZW4pXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDEwKVxuICAgICAgICAgICAgICAgIC5tYXAoKHtuYW1lLCBjaGFyLCBmaWxlfSkgPT4gKHtuYW1lLCBjaGFyLCBmaWxlfSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICBjb21wb25lbnQ6IFRJdGVtLFxuICAgICAgICAgICAgYWZ0ZXJXaGl0ZXNwYWNlOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0OiAoaXRlbSkgPT4gaXRlbS5jaGFyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gXCJbW1wiOiB7XG4gICAgICAgICAgLy8gICBkYXRhUHJvdmlkZXI6IHRva2VuID0+IHtcbiAgICAgICAgICAvLyAgICAgYWN0dWFsVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAvLyAgICAgcmV0dXJuIHVzZWRUYWdzKHRva2VuKVxuICAgICAgICAgIC8vICAgICAgIC5zbGljZSgwLCAxMClcbiAgICAgICAgICAvLyAgICAgICAubWFwKCh7IG5hbWUsIGNoYXIgfSkgPT4gKHsgbmFtZSwgY2hhciB9KSk7XG4gICAgICAgICAgLy8gICB9LFxuICAgICAgICAgIC8vICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAvLyAgIGNvbXBvbmVudDogSXRlbSxcbiAgICAgICAgICAvLyAgIGFmdGVyV2hpdGVzcGFjZTogdHJ1ZSxcbiAgICAgICAgICAvLyAgIG91dHB1dDogKGl0ZW0sIHRyaWdnZXIpID0+IGl0ZW0uY2hhcixcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb21tb24tdG9vbHMtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbW1vbi10b29scy1jb250YWluZXJcIj5cbiAgICAgICAgICA8T25seSB3aGVuPXtwcm9wcy50b29scyAhPT0gdW5kZWZpbmVkfT57cHJvcHMudG9vbHN9PC9Pbmx5PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxPbmx5IHdoZW49e3Nob3dDYW5jZWxCdG59PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIGNhbmNlbC1idG5cIiBvbkNsaWNrPXtoYW5kbGVDb21tb25DYW5jZWxCdG5DbGlja30+XG4gICAgICAgICAgICAgIHt0KCdDQU5DRUwgRURJVCcpfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Pbmx5PlxuICAgICAgICAgIDxPbmx5IHdoZW49e3Nob3dDb25maXJtQnRufT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWN0aW9uLWJ0biBjb25maXJtLWJ0blwiXG4gICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlfVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb21tb25Db25maXJtQnRuQ2xpY2t9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtTYXZlTWVtb0J1dHRvbkxhYmVsfVxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7inI3vuI88L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L09ubHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRWRpdG9yO1xuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJmdW5jdGlvbiBjYW5Vc2VET00oKSB7XG4gIHJldHVybiAhISh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59XG5cbmV4cG9ydCB7IGNhblVzZURPTSB9O1xuIiwiaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjYW5Vc2VET00gfSBmcm9tICcuLi8uLi9jYW4tdXNlLWRvbS9kaXN0L3JlYWNoLXV0aWxzLWNhbi11c2UtZG9tLmVzbS5qcyc7XG5cbi8qKlxuICogUmVhY3QgY3VycmVudGx5IHRocm93cyBhIHdhcm5pbmcgd2hlbiB1c2luZyB1c2VMYXlvdXRFZmZlY3Qgb24gdGhlIHNlcnZlci4gVG9cbiAqIGdldCBhcm91bmQgaXQsIHdlIGNhbiBjb25kaXRpb25hbGx5IHVzZUVmZmVjdCBvbiB0aGUgc2VydmVyIChuby1vcCkgYW5kXG4gKiB1c2VMYXlvdXRFZmZlY3QgaW4gdGhlIGJyb3dzZXIuIFdlIG9jY2FzaW9uYWxseSBuZWVkIHVzZUxheW91dEVmZmVjdCB0b1xuICogZW5zdXJlIHdlIGRvbid0IGdldCBhIHJlbmRlciBmbGFzaCBmb3IgY2VydGFpbiBvcGVyYXRpb25zLCBidXQgd2UgbWF5IGFsc29cbiAqIG5lZWQgYWZmZWN0ZWQgY29tcG9uZW50cyB0byByZW5kZXIgb24gdGhlIHNlcnZlci4gT25lIGV4YW1wbGUgaXMgd2hlbiBzZXR0aW5nXG4gKiBhIGNvbXBvbmVudCdzIGRlc2NlbmRhbnRzIHRvIHJldHJpZXZlIHRoZWlyIGluZGV4IHZhbHVlcy5cbiAqXG4gKiBJbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzaW5nIHRoaXMgaG9vayBhcyBhbiBlc2NhcGUgaGF0Y2ggd2lsbCBicmVhayB0aGVcbiAqIGVzbGludCBkZXBlbmRlbmN5IHdhcm5pbmdzIHVubGVzcyB5b3UgcmVuYW1lIHRoZSBpbXBvcnQgdG8gYHVzZUxheW91dEVmZmVjdGAuXG4gKiBVc2Ugc3BhcmluZ2x5IG9ubHkgd2hlbiB0aGUgZWZmZWN0IHdvbid0IGVmZmVjdCB0aGUgcmVuZGVyZWQgSFRNTCB0byBhdm9pZFxuICogYW55IHNlcnZlci9jbGllbnQgbWlzbWF0Y2guXG4gKlxuICogSWYgYSB1c2VMYXlvdXRFZmZlY3QgaXMgbmVlZGVkIGFuZCB0aGUgcmVzdWx0IHdvdWxkIGNyZWF0ZSBhIG1pc21hdGNoLCBpdCdzXG4gKiBsaWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IGluIHF1ZXN0aW9uIHNob3VsZG4ndCBiZSByZW5kZXJlZCBvbiB0aGUgc2VydmVyIGF0XG4gKiBhbGwsIHNvIGEgYmV0dGVyIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGxhemlseSByZW5kZXIgdGhvc2UgaW4gYSBwYXJlbnRcbiAqIGNvbXBvbmVudCBhZnRlciBjbGllbnQtc2lkZSBoeWRyYXRpb24uXG4gKlxuICogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ2FlYXJvbi9lN2Q5N2NkZjM4YTI5MDc5MjRlYTEyZTRlYmRmM2M4NVxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVhY3QtcmVkdXgvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QuanNcbiAqXG4gKiBAcGFyYW0gZWZmZWN0XG4gKiBAcGFyYW0gZGVwc1xuICovXG5cbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gLyojX19QVVJFX18qL2NhblVzZURPTSgpID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuXG5leHBvcnQgeyB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IH07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJ0ByZWFjaC91dGlscy91c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0JztcblxuLypcbiAqIFdlbGNvbWUgdG8gQHJlYWNoL2F1dG8taWQhXG5cbiAqIExldCdzIHNlZSBpZiB3ZSBjYW4gbWFrZSBzZW5zZSBvZiB3aHkgdGhpcyBob29rIGV4aXN0cyBhbmQgaXRzXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBTb21lIGJhY2tncm91bmQ6XG4gKiAgIDEuIEFjY2Vzc2liaWxpdHkgQVBJcyByZWx5IGhlYXZpbHkgb24gZWxlbWVudCBJRHNcbiAqICAgMi4gUmVxdWlyaW5nIGRldmVsb3BlcnMgdG8gcHV0IElEcyBvbiBldmVyeSBlbGVtZW50IGluIFJlYWNoIFVJIGlzIGJvdGhcbiAqICAgICAgY3VtYmVyc29tZSBhbmQgZXJyb3ItcHJvbmVcbiAqICAgMy4gV2l0aCBhIGNvbXBvbmVudCBtb2RlbCwgd2UgY2FuIGdlbmVyYXRlIElEcyBmb3IgdGhlbSFcbiAqXG4gKiBTb2x1dGlvbiAxOiBHZW5lcmF0ZSByYW5kb20gSURzLlxuICpcbiAqIFRoaXMgd29ya3MgZ3JlYXQgYXMgbG9uZyBhcyB5b3UgZG9uJ3Qgc2VydmVyIHJlbmRlciB5b3VyIGFwcC4gV2hlbiBSZWFjdCAoaW5cbiAqIHRoZSBjbGllbnQpIHRyaWVzIHRvIHJldXNlIHRoZSBtYXJrdXAgZnJvbSB0aGUgc2VydmVyLCB0aGUgSURzIHdvbid0IG1hdGNoXG4gKiBhbmQgUmVhY3Qgd2lsbCB0aGVuIHJlY3JlYXRlIHRoZSBlbnRpcmUgRE9NIHRyZWUuXG4gKlxuICogU29sdXRpb24gMjogSW5jcmVtZW50IGFuIGludGVnZXJcbiAqXG4gKiBUaGlzIHNvdW5kcyBncmVhdC4gU2luY2Ugd2UncmUgcmVuZGVyaW5nIHRoZSBleGFjdCBzYW1lIHRyZWUgb24gdGhlIHNlcnZlclxuICogYW5kIGNsaWVudCwgd2UgY2FuIGluY3JlbWVudCBhIGNvdW50ZXIgYW5kIGdldCBhIGRldGVybWluaXN0aWMgcmVzdWx0IGJldHdlZW5cbiAqIGNsaWVudCBhbmQgc2VydmVyLiBBbHNvLCBKUyBpbnRlZ2VycyBjYW4gZ28gdXAgdG8gbmluZS1xdWFkcmlsbGlvbi4gSSdtXG4gKiBwcmV0dHkgc3VyZSB0aGUgdGFiIHdpbGwgYmUgY2xvc2VkIGJlZm9yZSBhbiBhcHAgbmV2ZXIgbmVlZHNcbiAqIDEwIHF1YWRyaWxsaW9uIElEcyFcbiAqXG4gKiBQcm9ibGVtIHNvbHZlZCwgcmlnaHQ/XG4gKlxuICogQWgsIGJ1dCB0aGVyZSdzIGEgY2F0Y2ghIFJlYWN0J3MgY29uY3VycmVudCByZW5kZXJpbmcgbWFrZXMgdGhpcyBhcHByb2FjaFxuICogbm9uLWRldGVybWluaXN0aWMuIFdoaWxlIHRoZSBjbGllbnQgYW5kIHNlcnZlciB3aWxsIGVuZCB1cCB3aXRoIHRoZSBzYW1lXG4gKiBlbGVtZW50cyBpbiB0aGUgZW5kLCBkZXBlbmRpbmcgb24gc3VzcGVuc2UgYm91bmRhcmllcyAoYW5kIHBvc3NpYmx5IHNvbWUgdXNlclxuICogaW5wdXQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlcikgdGhlIGluY3JlbWVudGluZyBpbnRlZ2VycyB3b24ndCBhbHdheXMgbWF0Y2hcbiAqIHVwLlxuICpcbiAqIFNvbHV0aW9uIDM6IERvbid0IHVzZSBJRHMgYXQgYWxsIG9uIHRoZSBzZXJ2ZXI7IHBhdGNoIGFmdGVyIGZpcnN0IHJlbmRlci5cbiAqXG4gKiBXaGF0IHdlJ3ZlIGRvbmUgaGVyZSBpcyBzb2x1dGlvbiAyIHdpdGggc29tZSB0cmlja3MuIFdpdGggdGhpcyBhcHByb2FjaCwgdGhlXG4gKiBJRCByZXR1cm5lZCBpcyBhbiBlbXB0eSBzdHJpbmcgb24gdGhlIGZpcnN0IHJlbmRlci4gVGhpcyB3YXkgdGhlIHNlcnZlciBhbmRcbiAqIGNsaWVudCBoYXZlIHRoZSBzYW1lIG1hcmt1cCBubyBtYXR0ZXIgaG93IHdpbGQgdGhlIGNvbmN1cnJlbnQgcmVuZGVyaW5nIG1heVxuICogaGF2ZSBnb3R0ZW4uXG4gKlxuICogQWZ0ZXIgdGhlIHJlbmRlciwgd2UgcGF0Y2ggdXAgdGhlIGNvbXBvbmVudHMgd2l0aCBhbiBpbmNyZW1lbnRlZCBJRC4gVGhpc1xuICogY2F1c2VzIGEgZG91YmxlIHJlbmRlciBvbiBhbnkgY29tcG9uZW50cyB3aXRoIGB1c2VJZGAuIFNob3VsZG4ndCBiZSBhIHByb2JsZW1cbiAqIHNpbmNlIHRoZSBjb21wb25lbnRzIHVzaW5nIHRoaXMgaG9vayBzaG91bGQgYmUgc21hbGwsIGFuZCB3ZSdyZSBvbmx5IHVwZGF0aW5nXG4gKiB0aGUgSUQgYXR0cmlidXRlIG9uIHRoZSBET00sIG5vdGhpbmcgYmlnIGlzIGhhcHBlbmluZy5cbiAqXG4gKiBJdCBkb2Vzbid0IGhhdmUgdG8gYmUgYW4gaW5jcmVtZW50ZWQgbnVtYmVyLCB0aG91Z2gtLXdlIGNvdWxkIGRvIGdlbmVyYXRlXG4gKiByYW5kb20gc3RyaW5ncyBpbnN0ZWFkLCBidXQgaW5jcmVtZW50aW5nIGEgbnVtYmVyIGlzIHByb2JhYmx5IHRoZSBjaGVhcGVzdFxuICogdGhpbmcgd2UgY2FuIGRvLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgd2Ugb25seSBkbyB0aGlzIHBhdGNodXAgb24gdGhlIHZlcnkgZmlyc3QgY2xpZW50IHJlbmRlciBldmVyLlxuICogQW55IGNhbGxzIHRvIGB1c2VJZGAgdGhhdCBoYXBwZW4gZHluYW1pY2FsbHkgaW4gdGhlIGNsaWVudCB3aWxsIGJlXG4gKiBwb3B1bGF0ZWQgaW1tZWRpYXRlbHkgd2l0aCBhIHZhbHVlLiBTbywgd2Ugb25seSBnZXQgdGhlIGRvdWJsZSByZW5kZXIgYWZ0ZXJcbiAqIHNlcnZlciBoeWRyYXRpb24gYW5kIG5ldmVyIGFnYWluLCBTTyBCQUNLIE9GRiBBTFJJR0hUP1xuICovXG52YXIgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gZmFsc2U7XG52YXIgaWQgPSAwO1xuXG52YXIgZ2VuSWQgPSBmdW5jdGlvbiBnZW5JZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59O1xuLyoqXG4gKiB1c2VJZFxuICpcbiAqIEF1dG9nZW5lcmF0ZSBJRHMgdG8gZmFjaWxpdGF0ZSBXQUktQVJJQSBhbmQgc2VydmVyIHJlbmRlcmluZy5cbiAqXG4gKiBOb3RlOiBUaGUgcmV0dXJuZWQgSUQgd2lsbCBpbml0aWFsbHkgYmUgYG51bGxgIGFuZCB3aWxsIHVwZGF0ZSBhZnRlciBhXG4gKiBjb21wb25lbnQgbW91bnRzLiBVc2VycyBtYXkgbmVlZCB0byBzdXBwbHkgdGhlaXIgb3duIElEIGlmIHRoZXkgbmVlZFxuICogY29uc2lzdGVudCB2YWx1ZXMgZm9yIFNTUi5cbiAqXG4gKiBAc2VlIERvY3MgaHR0cHM6Ly9yZWFjaC50ZWNoL2F1dG8taWRcbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZUlkKGlkRnJvbVByb3BzKSB7XG4gIC8qXG4gICAqIElmIHRoaXMgaW5zdGFuY2UgaXNuJ3QgcGFydCBvZiB0aGUgaW5pdGlhbCByZW5kZXIsIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhlXG4gICAqIGRvdWJsZSByZW5kZXIvcGF0Y2gtdXAgZGFuY2UuIFdlIGNhbiBqdXN0IGdlbmVyYXRlIHRoZSBJRCBhbmQgcmV0dXJuIGl0LlxuICAgKi9cbiAgdmFyIGluaXRpYWxJZCA9IGlkRnJvbVByb3BzIHx8IChzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPyBnZW5JZCgpIDogbnVsbCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IHVzZVN0YXRlKGluaXRpYWxJZCksXG4gICAgICBpZCA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldElkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgLypcbiAgICAgICAqIFBhdGNoIHRoZSBJRCBhZnRlciByZW5kZXIuIFdlIGRvIHRoaXMgaW4gYHVzZUxheW91dEVmZmVjdGAgdG8gYXZvaWQgYW55XG4gICAgICAgKiByZW5kZXJpbmcgZmxpY2tlciwgdGhvdWdoIGl0J2xsIG1ha2UgdGhlIGZpcnN0IHJlbmRlciBzbG93ZXIgKHVubGlrZWx5XG4gICAgICAgKiB0byBtYXR0ZXIsIGJ1dCB5b3UncmUgd2VsY29tZSB0byBtZWFzdXJlIHlvdXIgYXBwIGFuZCBsZXQgdXMga25vdyBpZlxuICAgICAgICogaXQncyBhIHByb2JsZW0pLlxuICAgICAgICovXG4gICAgICBzZXRJZChnZW5JZCgpKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcblxuICB9LCBbXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8qXG4gICAgICAgKiBGbGFnIGFsbCBmdXR1cmUgdXNlcyBvZiBgdXNlSWRgIHRvIHNraXAgdGhlIHVwZGF0ZSBkYW5jZS4gVGhpcyBpcyBpblxuICAgICAgICogYHVzZUVmZmVjdGAgYmVjYXVzZSBpdCBnb2VzIGFmdGVyIGB1c2VMYXlvdXRFZmZlY3RgLCBlbnN1cmluZyB3ZSBkb24ndFxuICAgICAgICogYWNjaWRlbnRhbGx5IGJhaWwgb3V0IG9mIHRoZSBwYXRjaC11cCBkYW5jZSBwcmVtYXR1cmVseS5cbiAgICAgICAqL1xuICAgICAgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gdHJ1ZTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGlkICE9IG51bGwgPyBTdHJpbmcoaWQpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgeyB1c2VJZCB9O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgdmFyIGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZGlydHlJbmRleCwgZGlydHlPcHRpb25zKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6ICdzdGFuZGFsb25lJztcbiAgICB2YXIgdmFsdWVzQXJyYXk7XG5cbiAgICBpZiAoY29udGV4dCA9PT0gJ2Zvcm1hdHRpbmcnICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgdmFyIGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhciBfd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbX3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tfZGVmYXVsdFdpZHRoXTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2soZGlydHlJbmRleCkgOiBkaXJ0eUluZGV4OyAvLyBAdHMtaWdub3JlOiBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZE1hdGNoUGF0dGVybkZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MubWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuICAgIHZhciBwYXJzZVJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7XG4gICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKSA6IHBhcnNlUmVzdWx0WzBdO1xuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuICAgIHZhciByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgcmVzdDogcmVzdFxuICAgIH07XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICB2YXIgbWF0Y2hQYXR0ZXJuID0gd2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG5cbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuICAgIHZhciBwYXJzZVBhdHRlcm5zID0gd2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLnBhcnNlUGF0dGVybnNbYXJncy5kZWZhdWx0UGFyc2VXaWR0aF07XG4gICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucykgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZyk7XG4gICAgfSkgOiBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpO1xuICAgIH0pO1xuICAgIHZhciB2YWx1ZTtcbiAgICB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkpIDoga2V5O1xuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuICAgIHZhciByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgcmVzdDogcmVzdFxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwcmVkaWNhdGUob2JqZWN0W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAodmFyIGtleSA9IDA7IGtleSA8IGFycmF5Lmxlbmd0aDsga2V5KyspIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVxdWlyZWRBcmdzKHJlcXVpcmVkLCBhcmdzKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA8IHJlcXVpcmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihyZXF1aXJlZCArICcgYXJndW1lbnQnICsgKHJlcXVpcmVkID4gMSA/ICdzJyA6ICcnKSArICcgcmVxdWlyZWQsIGJ1dCBvbmx5ICcgKyBhcmdzLmxlbmd0aCArICcgcHJlc2VudCcpO1xuICB9XG59IiwiaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGFyZ3VtZW50IC0gdGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7IC8vIENsb25lIHRoZSBkYXRlXG5cbiAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgYXJndW1lbnQgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50LmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IE51bWJlcl0nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFwiU3RhcnRpbmcgd2l0aCB2Mi4wLjAtYmV0YS4xIGRhdGUtZm5zIGRvZXNuJ3QgYWNjZXB0IHN0cmluZ3MgYXMgZGF0ZSBhcmd1bWVudHMuIFBsZWFzZSB1c2UgYHBhcnNlSVNPYCB0byBwYXJzZSBzdHJpbmdzLiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2ZqdWxlXCIpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuXG4gICAgICBjb25zb2xlLndhcm4obmV3IEVycm9yKCkuc3RhY2spO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9JbnRlZ2VyKGRpcnR5TnVtYmVyKSB7XG4gIGlmIChkaXJ0eU51bWJlciA9PT0gbnVsbCB8fCBkaXJ0eU51bWJlciA9PT0gdHJ1ZSB8fCBkaXJ0eU51bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG5cbiAgcmV0dXJuIG51bWJlciA8IDAgPyBNYXRoLmNlaWwobnVtYmVyKSA6IE1hdGguZmxvb3IobnVtYmVyKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vdG9JbnRlZ2VyL2luZGV4LmpzXCI7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mVVRDV2VlayhkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZVdlZWtTdGFydHNPbiA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gIHZhciBkZWZhdWx0V2Vla1N0YXJ0c09uID0gbG9jYWxlV2Vla1N0YXJ0c09uID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGxvY2FsZVdlZWtTdGFydHNPbik7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSBvcHRpb25zLndlZWtTdGFydHNPbiA9PSBudWxsID8gZGVmYXVsdFdlZWtTdGFydHNPbiA6IHRvSW50ZWdlcihvcHRpb25zLndlZWtTdGFydHNPbik7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZERheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIGFkZGVkLiBQb3NpdGl2ZSBkZWNpbWFscyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguZmxvb3JgLCBkZWNpbWFscyBsZXNzIHRoYW4gemVybyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguY2VpbGAuXG4gKiBAcmV0dXJucyB7RGF0ZX0gLSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAtIDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAxMCBkYXlzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGREYXlzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxMClcbiAqIC8vPT4gVGh1IFNlcCAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkRGF5cyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcblxuICBpZiAoaXNOYU4oYW1vdW50KSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG5cbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIGRheXMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBhbW91bnQpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtb250aHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IG1vbnRocyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gRmViIDAxIDIwMTUgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNb250aHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG5cbiAgaWYgKGlzTmFOKGFtb3VudCkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBtb250aHMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICB2YXIgZGF5T2ZNb250aCA9IGRhdGUuZ2V0RGF0ZSgpOyAvLyBUaGUgSlMgRGF0ZSBvYmplY3Qgc3VwcG9ydHMgZGF0ZSBtYXRoIGJ5IGFjY2VwdGluZyBvdXQtb2YtYm91bmRzIHZhbHVlcyBmb3JcbiAgLy8gbW9udGgsIGRheSwgZXRjLiBGb3IgZXhhbXBsZSwgbmV3IERhdGUoMjAyMCwgMCwgMCkgcmV0dXJucyAzMSBEZWMgMjAxOSBhbmRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDEpIHJldHVybnMgMSBGZWIgMjAyMS4gIFRoaXMgaXMgKmFsbW9zdCogdGhlIGJlaGF2aW9yIHdlXG4gIC8vIHdhbnQgZXhjZXB0IHRoYXQgZGF0ZXMgd2lsbCB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIGEgbW9udGgsIG1lYW5pbmcgdGhhdFxuICAvLyBuZXcgRGF0ZSgyMDIwLCAxMywgMzEpIHdpbGwgcmV0dXJuIDMgTWFyIDIwMjEgbm90IDI4IEZlYiAyMDIxIGFzIGRlc2lyZWQuIFNvXG4gIC8vIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIGVuZCBvZiB0aGUgZGVzaXJlZCBtb250aCBieSBhZGRpbmcgMSB0byB0aGUgZGVzaXJlZFxuICAvLyBtb250aCBhbmQgdXNpbmcgYSBkYXRlIG9mIDAgdG8gYmFjayB1cCBvbmUgZGF5IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWRcbiAgLy8gbW9udGguXG5cbiAgdmFyIGVuZE9mRGVzaXJlZE1vbnRoID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICBlbmRPZkRlc2lyZWRNb250aC5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgKyAxLCAwKTtcbiAgdmFyIGRheXNJbk1vbnRoID0gZW5kT2ZEZXNpcmVkTW9udGguZ2V0RGF0ZSgpO1xuXG4gIGlmIChkYXlPZk1vbnRoID49IGRheXNJbk1vbnRoKSB7XG4gICAgLy8gSWYgd2UncmUgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBtb250aCwgdGhlbiB0aGlzIGlzIHRoZSBjb3JyZWN0IGRhdGVcbiAgICAvLyBhbmQgd2UncmUgZG9uZS5cbiAgICByZXR1cm4gZW5kT2ZEZXNpcmVkTW9udGg7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSBub3cga25vdyB0aGF0IHNldHRpbmcgdGhlIG9yaWdpbmFsIGRheS1vZi1tb250aCB2YWx1ZSB3b24ndFxuICAgIC8vIGNhdXNlIGFuIG92ZXJmbG93LCBzbyBzZXQgdGhlIGRlc2lyZWQgZGF5LW9mLW1vbnRoLiBOb3RlIHRoYXQgd2UgY2FuJ3RcbiAgICAvLyBqdXN0IHNldCB0aGUgZGF0ZSBvZiBgZW5kT2ZEZXNpcmVkTW9udGhgIGJlY2F1c2UgdGhhdCBvYmplY3QgbWF5IGhhdmUgaGFkXG4gICAgLy8gaXRzIHRpbWUgY2hhbmdlZCBpbiB0aGUgdW51c3VhbCBjYXNlIHdoZXJlIHdoZXJlIGEgRFNUIHRyYW5zaXRpb24gd2FzIG9uXG4gICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCBhbmQgaXRzIGxvY2FsIHRpbWUgd2FzIGluIHRoZSBob3VyIHNraXBwZWQgb3JcbiAgICAvLyByZXBlYXRlZCBuZXh0IHRvIGEgRFNUIHRyYW5zaXRpb24uICBTbyB3ZSB1c2UgYGRhdGVgIGluc3RlYWQgd2hpY2ggaXNcbiAgICAvLyBndWFyYW50ZWVkIHRvIHN0aWxsIGhhdmUgdGhlIG9yaWdpbmFsIHRpbWUuXG4gICAgZGF0ZS5zZXRGdWxsWWVhcihlbmRPZkRlc2lyZWRNb250aC5nZXRGdWxsWWVhcigpLCBlbmRPZkRlc2lyZWRNb250aC5nZXRNb250aCgpLCBkYXlPZk1vbnRoKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZE1pbGxpc2Vjb25kcyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgdGltZXN0YW1wID0gdG9EYXRlKGRpcnR5RGF0ZSkuZ2V0VGltZSgpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCArIGFtb3VudCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIHdlZWtcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgb3B0aW9ucyA9IGRpcnR5T3B0aW9ucyB8fCB7fTtcbiAgdmFyIGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlO1xuICB2YXIgbG9jYWxlV2Vla1N0YXJ0c09uID0gbG9jYWxlICYmIGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLndlZWtTdGFydHNPbjtcbiAgdmFyIGRlZmF1bHRXZWVrU3RhcnRzT24gPSBsb2NhbGVXZWVrU3RhcnRzT24gPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIobG9jYWxlV2Vla1N0YXJ0c09uKTtcbiAgdmFyIHdlZWtTdGFydHNPbiA9IG9wdGlvbnMud2Vla1N0YXJ0c09uID09IG51bGwgPyBkZWZhdWx0V2Vla1N0YXJ0c09uIDogdG9JbnRlZ2VyKG9wdGlvbnMud2Vla1N0YXJ0c09uKTsgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAwIGFuZCA2IF9hbmRfIGlzIG5vdCBOYU5cblxuICBpZiAoISh3ZWVrU3RhcnRzT24gPj0gMCAmJiB3ZWVrU3RhcnRzT24gPD0gNikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignd2Vla1N0YXJ0c09uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2IGluY2x1c2l2ZWx5Jyk7XG4gIH1cblxuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF5ID0gZGF0ZS5nZXREYXkoKTtcbiAgdmFyIGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHtcbiAgdmFyIHV0Y0RhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyhkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpLCBkYXRlLmdldE1pbGxpc2Vjb25kcygpKSk7XG4gIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIC0gdXRjRGF0ZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIHN0YXJ0IG9mIGEgZGF5XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDAyIDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mRGF5KGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgZnJvbSBcIi4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZEYXkgZnJvbSBcIi4uL3N0YXJ0T2ZEYXkvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX0RBWSA9IDg2NDAwMDAwO1xuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBlYXJsaWVyIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5c1xuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzowMDowMCBhbmQgMiBKdWx5IDIwMTIgMDA6MDA6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTIsIDYsIDIsIDAsIDApLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgMClcbiAqIClcbiAqIC8vPT4gMzY2XG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzo1OTowMCBhbmQgMyBKdWx5IDIwMTEgMDA6MDE6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDMsIDAsIDEpLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgNTkpXG4gKiApXG4gKiAvLz0+IDFcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBzdGFydE9mRGF5TGVmdCA9IHN0YXJ0T2ZEYXkoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBzdGFydE9mRGF5UmlnaHQgPSBzdGFydE9mRGF5KGRpcnR5RGF0ZVJpZ2h0KTtcbiAgdmFyIHRpbWVzdGFtcExlZnQgPSBzdGFydE9mRGF5TGVmdC5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKHN0YXJ0T2ZEYXlMZWZ0KTtcbiAgdmFyIHRpbWVzdGFtcFJpZ2h0ID0gc3RhcnRPZkRheVJpZ2h0LmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZkRheVJpZ2h0KTsgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIGRheSBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIGRheSBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG5cbiAgcmV0dXJuIE1hdGgucm91bmQoKHRpbWVzdGFtcExlZnQgLSB0aW1lc3RhbXBSaWdodCkgLyBNSUxMSVNFQ09ORFNfSU5fREFZKTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IGFkZERheXMgZnJvbSBcIi4uL2FkZERheXMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZFdlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiB3ZWVrcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB3ZWVrcyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNCB3ZWVrcyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkV2Vla3MobmV3IERhdGUoMjAxNCwgOCwgMSksIDQpXG4gKiAvLz0+IE1vbiBTZXAgMjkgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFdlZWtzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuICB2YXIgZGF5cyA9IGFtb3VudCAqIDc7XG4gIHJldHVybiBhZGREYXlzKGRpcnR5RGF0ZSwgZGF5cyk7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGRNb250aHMgZnJvbSBcIi4uL2FkZE1vbnRocy9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiB5ZWFycyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB5ZWFycyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNSB5ZWFycyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkWWVhcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxOSAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFllYXJzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuICByZXR1cm4gYWRkTW9udGhzKGRpcnR5RGF0ZSwgYW1vdW50ICogMTIpO1xufSIsImltcG9ydCBzdGFydE9mRGF5IGZyb20gXCIuLi9zdGFydE9mRGF5L2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1NhbWVEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKT9cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciAwNjowMDowMCBhbmQgNCBTZXB0ZW1iZXIgMTg6MDA6MDAgaW4gdGhlIHNhbWUgZGF5P1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0LCA2LCAwKSwgbmV3IERhdGUoMjAxNCwgOCwgNCwgMTgsIDApKVxuICogLy89PiB0cnVlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgYW5kIDQgT2N0b2JlciBpbiB0aGUgc2FtZSBkYXk/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQpLCBuZXcgRGF0ZSgyMDE0LCA5LCA0KSlcbiAqIC8vPT4gZmFsc2VcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciwgMjAxNCBhbmQgNCBTZXB0ZW1iZXIsIDIwMTUgaW4gdGhlIHNhbWUgZGF5P1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNSwgOCwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTYW1lRGF5KGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZUxlZnRTdGFydE9mRGF5ID0gc3RhcnRPZkRheShkaXJ0eURhdGVMZWZ0KTtcbiAgdmFyIGRhdGVSaWdodFN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGRpcnR5RGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIGRhdGVMZWZ0U3RhcnRPZkRheS5nZXRUaW1lKCkgPT09IGRhdGVSaWdodFN0YXJ0T2ZEYXkuZ2V0VGltZSgpO1xufSIsImltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIHRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGF0ZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKG5ldyBEYXRlKCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZShOYU4pKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBzb21lIHZhbHVlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKCcyMDE0LTAyLTMxJylcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIG9iamVjdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSh7fSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXSc7XG59IiwiaW1wb3J0IGlzRGF0ZSBmcm9tIFwiLi4vaXNEYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzVmFsaWRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdmFsaWQ/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGFyZ3VtZW50IGlzIEludmFsaWQgRGF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBBcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gRGF0ZSB1c2luZyBgdG9EYXRlYC4gU2VlIFt0b0RhdGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvdG9EYXRlfVxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiAtIE5vdyBgaXNWYWxpZGAgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb25cbiAqICAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICogICBJbnN0ZWFkLCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgYmVmb3JlaGFuZCB1c2luZyBgdG9EYXRlYC5cbiAqXG4gKiAgIEV4YW1wbGVzOlxuICpcbiAqICAgfCBgaXNWYWxpZGAgYXJndW1lbnQgICAgICAgIHwgQmVmb3JlIHYyLjAuMCB8IHYyLjAuMCBvbndhcmQgfFxuICogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18XG4gKiAgIHwgYG5ldyBEYXRlKClgICAgICAgICAgICAgICB8IGB0cnVlYCAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgbmV3IERhdGUoJzIwMTYtMDEtMDEnKWAgIHwgYHRydWVgICAgICAgICB8IGB0cnVlYCAgICAgICAgfFxuICogICB8IGBuZXcgRGF0ZSgnJylgICAgICAgICAgICAgfCBgZmFsc2VgICAgICAgIHwgYGZhbHNlYCAgICAgICB8XG4gKiAgIHwgYG5ldyBEYXRlKDE0ODgzNzA4MzUwODEpYCB8IGB0cnVlYCAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgbmV3IERhdGUoTmFOKWAgICAgICAgICAgIHwgYGZhbHNlYCAgICAgICB8IGBmYWxzZWAgICAgICAgfFxuICogICB8IGAnMjAxNi0wMS0wMSdgICAgICAgICAgICAgfCBgVHlwZUVycm9yYCAgIHwgYGZhbHNlYCAgICAgICB8XG4gKiAgIHwgYCcnYCAgICAgICAgICAgICAgICAgICAgICB8IGBUeXBlRXJyb3JgICAgfCBgZmFsc2VgICAgICAgIHxcbiAqICAgfCBgMTQ4ODM3MDgzNTA4MWAgICAgICAgICAgIHwgYFR5cGVFcnJvcmAgICB8IGB0cnVlYCAgICAgICAgfFxuICogICB8IGBOYU5gICAgICAgICAgICAgICAgICAgICAgfCBgVHlwZUVycm9yYCAgIHwgYGZhbHNlYCAgICAgICB8XG4gKlxuICogICBXZSBpbnRyb2R1Y2UgdGhpcyBjaGFuZ2UgdG8gbWFrZSAqZGF0ZS1mbnMqIGNvbnNpc3RlbnQgd2l0aCBFQ01BU2NyaXB0IGJlaGF2aW9yXG4gKiAgIHRoYXQgdHJ5IHRvIGNvZXJjZSBhcmd1bWVudHMgdG8gdGhlIGV4cGVjdGVkIHR5cGVcbiAqICAgKHdoaWNoIGlzIGFsc28gdGhlIGNhc2Ugd2l0aCBvdGhlciAqZGF0ZS1mbnMqIGZ1bmN0aW9ucykuXG4gKlxuICogQHBhcmFtIHsqfSBkYXRlIC0gdGhlIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZSBpcyB2YWxpZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoMjAxNCwgMSwgMzEpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsdWUsIGNvbnZlcnRhYmxlIGludG8gYSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZCgxMzkzODA0ODAwMDAwKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgnJykpXG4gKiAvLz0+IGZhbHNlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKCFpc0RhdGUoZGlydHlEYXRlKSAmJiB0eXBlb2YgZGlydHlEYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHJldHVybiAhaXNOYU4oTnVtYmVyKGRhdGUpKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZUxlZnQgLSB0aGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVJpZ2h0IC0gdGhlIGVhcmxpZXIgZGF0ZVxuICogQHJldHVybnMge051bWJlcn0gdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgbW9udGhzIGFyZSBiZXR3ZWVuIDMxIEphbnVhcnkgMjAxNCBhbmQgMSBTZXB0ZW1iZXIgMjAxND9cbiAqIHZhciByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhcbiAqICAgbmV3IERhdGUoMjAxNCwgOCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDAsIDMxKVxuICogKVxuICogLy89PiA4XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlTGVmdCA9IHRvRGF0ZShkaXJ0eURhdGVMZWZ0KTtcbiAgdmFyIGRhdGVSaWdodCA9IHRvRGF0ZShkaXJ0eURhdGVSaWdodCk7XG4gIHZhciB5ZWFyRGlmZiA9IGRhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBkYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG1vbnRoRGlmZiA9IGRhdGVMZWZ0LmdldE1vbnRoKCkgLSBkYXRlUmlnaHQuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIHllYXJEaWZmICogMTIgKyBtb250aERpZmY7XG59IiwiaW1wb3J0IHN0YXJ0T2ZXZWVrIGZyb20gXCIuLi9zdGFydE9mV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgZnJvbSBcIi4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fV0VFSyA9IDYwNDgwMDAwMDtcbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciB3ZWVrcyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHJldHVybnMge051bWJlcn0gdGhlIG51bWJlciBvZiBjYWxlbmRhciB3ZWVrc1xuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciB3ZWVrcyBhcmUgYmV0d2VlbiA1IEp1bHkgMjAxNCBhbmQgMjAgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMjApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCA1KVxuICogKVxuICogLy89PiAzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksXG4gKiAvLyBob3cgbWFueSBjYWxlbmRhciB3ZWVrcyBhcmUgYmV0d2VlbiA1IEp1bHkgMjAxNCBhbmQgMjAgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMjApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCA1KSxcbiAqICAgeyB3ZWVrU3RhcnRzT246IDEgfVxuICogKVxuICogLy89PiAyXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgc3RhcnRPZldlZWtMZWZ0ID0gc3RhcnRPZldlZWsoZGlydHlEYXRlTGVmdCwgZGlydHlPcHRpb25zKTtcbiAgdmFyIHN0YXJ0T2ZXZWVrUmlnaHQgPSBzdGFydE9mV2VlayhkaXJ0eURhdGVSaWdodCwgZGlydHlPcHRpb25zKTtcbiAgdmFyIHRpbWVzdGFtcExlZnQgPSBzdGFydE9mV2Vla0xlZnQuZ2V0VGltZSgpIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mV2Vla0xlZnQpO1xuICB2YXIgdGltZXN0YW1wUmlnaHQgPSBzdGFydE9mV2Vla1JpZ2h0LmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZldlZWtSaWdodCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG5cbiAgcmV0dXJuIE1hdGgucm91bmQoKHRpbWVzdGFtcExlZnQgLSB0aW1lc3RhbXBSaWdodCkgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSyk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBlbmRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgZW5kIG9mIGEgbW9udGhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMzAgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbmRPZk1vbnRoKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGggKyAxLCAwKTtcbiAgZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZk1vbnRoKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgZGF0ZS5zZXREYXRlKDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIHN0YXJ0IG9mIGEgeWVhclxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHllYXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDAwKSlcbiAqIC8vPT4gV2VkIEphbiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlllYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgY2xlYW5EYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXRlID0gbmV3IERhdGUoMCk7XG4gIGRhdGUuc2V0RnVsbFllYXIoY2xlYW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgZW5kIG9mIGEgd2Vla1xuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFNhdCBTZXAgMDYgMjAxNCAyMzo1OTo1OS45OTlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIGVuZCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVuZE9mV2VlayhkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZVdlZWtTdGFydHNPbiA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gIHZhciBkZWZhdWx0V2Vla1N0YXJ0c09uID0gbG9jYWxlV2Vla1N0YXJ0c09uID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGxvY2FsZVdlZWtTdGFydHNPbik7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSBvcHRpb25zLndlZWtTdGFydHNPbiA9PSBudWxsID8gZGVmYXVsdFdlZWtTdGFydHNPbiA6IHRvSW50ZWdlcihvcHRpb25zLndlZWtTdGFydHNPbik7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IC03IDogMCkgKyA2IC0gKGRheSAtIHdlZWtTdGFydHNPbik7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRpZmYpO1xuICBkYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBkYXRlO1xufSIsInZhciBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogJ2xlc3MgdGhhbiBhIHNlY29uZCcsXG4gICAgb3RoZXI6ICdsZXNzIHRoYW4ge3tjb3VudH19IHNlY29uZHMnXG4gIH0sXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiAnMSBzZWNvbmQnLFxuICAgIG90aGVyOiAne3tjb3VudH19IHNlY29uZHMnXG4gIH0sXG4gIGhhbGZBTWludXRlOiAnaGFsZiBhIG1pbnV0ZScsXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBvbmU6ICdsZXNzIHRoYW4gYSBtaW51dGUnLFxuICAgIG90aGVyOiAnbGVzcyB0aGFuIHt7Y291bnR9fSBtaW51dGVzJ1xuICB9LFxuICB4TWludXRlczoge1xuICAgIG9uZTogJzEgbWludXRlJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBtaW51dGVzJ1xuICB9LFxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogJ2Fib3V0IDEgaG91cicsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gaG91cnMnXG4gIH0sXG4gIHhIb3Vyczoge1xuICAgIG9uZTogJzEgaG91cicsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gaG91cnMnXG4gIH0sXG4gIHhEYXlzOiB7XG4gICAgb25lOiAnMSBkYXknLFxuICAgIG90aGVyOiAne3tjb3VudH19IGRheXMnXG4gIH0sXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiAnYWJvdXQgMSB3ZWVrJyxcbiAgICBvdGhlcjogJ2Fib3V0IHt7Y291bnR9fSB3ZWVrcydcbiAgfSxcbiAgeFdlZWtzOiB7XG4gICAgb25lOiAnMSB3ZWVrJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSB3ZWVrcydcbiAgfSxcbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgb25lOiAnYWJvdXQgMSBtb250aCcsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gbW9udGhzJ1xuICB9LFxuICB4TW9udGhzOiB7XG4gICAgb25lOiAnMSBtb250aCcsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gbW9udGhzJ1xuICB9LFxuICBhYm91dFhZZWFyczoge1xuICAgIG9uZTogJ2Fib3V0IDEgeWVhcicsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIHhZZWFyczoge1xuICAgIG9uZTogJzEgeWVhcicsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6ICdvdmVyIDEgeWVhcicsXG4gICAgb3RoZXI6ICdvdmVyIHt7Y291bnR9fSB5ZWFycydcbiAgfSxcbiAgYWxtb3N0WFllYXJzOiB7XG4gICAgb25lOiAnYWxtb3N0IDEgeWVhcicsXG4gICAgb3RoZXI6ICdhbG1vc3Qge3tjb3VudH19IHllYXJzJ1xuICB9XG59O1xuXG52YXIgZm9ybWF0RGlzdGFuY2UgPSBmdW5jdGlvbiAodG9rZW4sIGNvdW50LCBvcHRpb25zKSB7XG4gIHZhciByZXN1bHQ7XG4gIHZhciB0b2tlblZhbHVlID0gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dO1xuXG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlO1xuICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vdGhlci5yZXBsYWNlKCd7e2NvdW50fX0nLCBjb3VudC50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuICdpbiAnICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgJyBhZ28nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXREaXN0YW5jZTsiLCJpbXBvcnQgYnVpbGRGb3JtYXRMb25nRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanNcIjtcbnZhciBkYXRlRm9ybWF0cyA9IHtcbiAgZnVsbDogJ0VFRUUsIE1NTU0gZG8sIHknLFxuICBsb25nOiAnTU1NTSBkbywgeScsXG4gIG1lZGl1bTogJ01NTSBkLCB5JyxcbiAgc2hvcnQ6ICdNTS9kZC95eXl5J1xufTtcbnZhciB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogJ2g6bW06c3MgYSB6enp6JyxcbiAgbG9uZzogJ2g6bW06c3MgYSB6JyxcbiAgbWVkaXVtOiAnaDptbTpzcyBhJyxcbiAgc2hvcnQ6ICdoOm1tIGEnXG59O1xudmFyIGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06ICd7e2RhdGV9fSwge3t0aW1lfX0nLFxuICBzaG9ydDogJ3t7ZGF0ZX19LCB7e3RpbWV9fSdcbn07XG52YXIgZm9ybWF0TG9uZyA9IHtcbiAgZGF0ZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pLFxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSksXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0TG9uZzsiLCJ2YXIgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiAnUCdcbn07XG5cbnZhciBmb3JtYXRSZWxhdGl2ZSA9IGZ1bmN0aW9uICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdFJlbGF0aXZlOyIsImltcG9ydCBidWlsZExvY2FsaXplRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzXCI7XG52YXIgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnQicsICdBJ10sXG4gIGFiYnJldmlhdGVkOiBbJ0JDJywgJ0FEJ10sXG4gIHdpZGU6IFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXG59O1xudmFyIHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWycxJywgJzInLCAnMycsICc0J10sXG4gIGFiYnJldmlhdGVkOiBbJ1ExJywgJ1EyJywgJ1EzJywgJ1E0J10sXG4gIHdpZGU6IFsnMXN0IHF1YXJ0ZXInLCAnMm5kIHF1YXJ0ZXInLCAnM3JkIHF1YXJ0ZXInLCAnNHRoIHF1YXJ0ZXInXVxufTsgLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuXG52YXIgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICBhYmJyZXZpYXRlZDogWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLFxuICB3aWRlOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXVxufTtcbnZhciBkYXlWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWydTJywgJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJ10sXG4gIHNob3J0OiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG4gIGFiYnJldmlhdGVkOiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxuICB3aWRlOiBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J11cbn07XG52YXIgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogJ2EnLFxuICAgIHBtOiAncCcsXG4gICAgbWlkbmlnaHQ6ICdtaScsXG4gICAgbm9vbjogJ24nLFxuICAgIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgICBuaWdodDogJ25pZ2h0J1xuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiAnQU0nLFxuICAgIHBtOiAnUE0nLFxuICAgIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICAgIG5vb246ICdub29uJyxcbiAgICBtb3JuaW5nOiAnbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnZXZlbmluZycsXG4gICAgbmlnaHQ6ICduaWdodCdcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiAnYS5tLicsXG4gICAgcG06ICdwLm0uJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ21vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnbmlnaHQnXG4gIH1cbn07XG52YXIgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06ICdhJyxcbiAgICBwbTogJ3AnLFxuICAgIG1pZG5pZ2h0OiAnbWknLFxuICAgIG5vb246ICduJyxcbiAgICBtb3JuaW5nOiAnaW4gdGhlIG1vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2luIHRoZSBhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdpbiB0aGUgZXZlbmluZycsXG4gICAgbmlnaHQ6ICdhdCBuaWdodCdcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogJ0FNJyxcbiAgICBwbTogJ1BNJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ2luIHRoZSBtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdpbiB0aGUgYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnaW4gdGhlIGV2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnYXQgbmlnaHQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ2EubS4nLFxuICAgIHBtOiAncC5tLicsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdpbiB0aGUgbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnaW4gdGhlIGFmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2luIHRoZSBldmVuaW5nJyxcbiAgICBuaWdodDogJ2F0IG5pZ2h0J1xuICB9XG59O1xuXG52YXIgb3JkaW5hbE51bWJlciA9IGZ1bmN0aW9uIChkaXJ0eU51bWJlciwgX29wdGlvbnMpIHtcbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7IC8vIElmIG9yZGluYWwgbnVtYmVycyBkZXBlbmQgb24gY29udGV4dCwgZm9yIGV4YW1wbGUsXG4gIC8vIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGdyYW1tYXRpY2FsIGdlbmRlcnMsXG4gIC8vIHVzZSBgb3B0aW9ucy51bml0YC5cbiAgLy9cbiAgLy8gYHVuaXRgIGNhbiBiZSAneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF0ZScsICdkYXlPZlllYXInLFxuICAvLyAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcuXG5cbiAgdmFyIHJlbTEwMCA9IG51bWJlciAlIDEwMDtcblxuICBpZiAocmVtMTAwID4gMjAgfHwgcmVtMTAwIDwgMTApIHtcbiAgICBzd2l0Y2ggKHJlbTEwMCAlIDEwKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnc3QnO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnbmQnO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAncmQnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudW1iZXIgKyAndGgnO1xufTtcblxudmFyIGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyOiBvcmRpbmFsTnVtYmVyLFxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIHF1YXJ0ZXI6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IGZ1bmN0aW9uIChxdWFydGVyKSB7XG4gICAgICByZXR1cm4gcXVhcnRlciAtIDE7XG4gICAgfVxuICB9KSxcbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJ1xuICB9KSxcbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBkYXlQZXJpb2Q6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZScsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiAnd2lkZSdcbiAgfSlcbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGl6ZTsiLCJpbXBvcnQgYnVpbGRNYXRjaEZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi9pbmRleC5qc1wiO1xuaW1wb3J0IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi9pbmRleC5qc1wiO1xudmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKSh0aHxzdHxuZHxyZCk/L2k7XG52YXIgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG52YXIgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihifGEpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihiXFwuP1xccz9jXFwuP3xiXFwuP1xccz9jXFwuP1xccz9lXFwuP3xhXFwuP1xccz9kXFwuP3xjXFwuP1xccz9lXFwuPykvaSxcbiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pXG59O1xudmFyIHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9eYi9pLCAvXihhfGMpL2ldXG59O1xudmFyIG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2lcbn07XG52YXIgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldXG59O1xudmFyIG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pXG59O1xudmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15qL2ksIC9eZi9pLCAvXm0vaSwgL15hL2ksIC9ebS9pLCAvXmovaSwgL15qL2ksIC9eYS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV0sXG4gIGFueTogWy9eamEvaSwgL15mL2ksIC9ebWFyL2ksIC9eYXAvaSwgL15tYXkvaSwgL15qdW4vaSwgL15qdWwvaSwgL15hdS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV1cbn07XG52YXIgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaVxufTtcbnZhciBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV1cbn07XG52YXIgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2lcbn07XG52YXIgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pXG4gIH1cbn07XG52YXIgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH0pLFxuICBlcmE6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknLFxuICAgIHZhbHVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgcmV0dXJuIGluZGV4ICsgMTtcbiAgICB9XG4gIH0pLFxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pLFxuICBkYXk6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pLFxuICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ2FueScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogJ2FueSdcbiAgfSlcbn07XG5leHBvcnQgZGVmYXVsdCBtYXRjaDsiLCJpbXBvcnQgZm9ybWF0RGlzdGFuY2UgZnJvbSBcIi4vX2xpYi9mb3JtYXREaXN0YW5jZS9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdExvbmcgZnJvbSBcIi4vX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0UmVsYXRpdmUgZnJvbSBcIi4vX2xpYi9mb3JtYXRSZWxhdGl2ZS9pbmRleC5qc1wiO1xuaW1wb3J0IGxvY2FsaXplIGZyb20gXCIuL19saWIvbG9jYWxpemUvaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9fbGliL21hdGNoL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQHR5cGUge0xvY2FsZX1cbiAqIEBjYXRlZ29yeSBMb2NhbGVzXG4gKiBAc3VtbWFyeSBFbmdsaXNoIGxvY2FsZSAoVW5pdGVkIFN0YXRlcykuXG4gKiBAbGFuZ3VhZ2UgRW5nbGlzaFxuICogQGlzby02MzktMiBlbmdcbiAqIEBhdXRob3IgU2FzaGEgS29zcyBbQGtvc3Nub2NvcnBde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Nzbm9jb3JwfVxuICogQGF1dGhvciBMZXNoYSBLb3NzIFtAbGVzaGFrb3NzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbGVzaGFrb3NzfVxuICovXG52YXIgbG9jYWxlID0ge1xuICBjb2RlOiAnZW4tVVMnLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDBcbiAgICAvKiBTdW5kYXkgKi9cbiAgICAsXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxXG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGRNaWxsaXNlY29uZHMgZnJvbSBcIi4uL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc3ViTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgc3VidHJhY3RlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgc3VidHJhY3RlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA3NTAgbWlsbGlzZWNvbmRzIGZyb20gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1Yk1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjI5LjI1MFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN1Yk1pbGxpc2Vjb25kcyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkaXJ0eURhdGUsIC1hbW91bnQpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX0RBWSA9IDg2NDAwMDAwOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDRGF5T2ZZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgc3RhcnRPZlllYXJUaW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgdmFyIGRpZmZlcmVuY2UgPSB0aW1lc3RhbXAgLSBzdGFydE9mWWVhclRpbWVzdGFtcDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoZGlmZmVyZW5jZSAvIE1JTExJU0VDT05EU19JTl9EQVkpICsgMTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWsoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gMTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ0lTT1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzXCI7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB5ZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICB2YXIgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IG5ldyBEYXRlKDApO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldFVUQ0Z1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIpO1xuICB2YXIgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IG5ldyBEYXRlKDApO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldFVUQ0Z1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZlVUQ0lTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcik7XG5cbiAgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufSIsImltcG9ydCBnZXRVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWtZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIHllYXIgPSBnZXRVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpO1xuICB2YXIgZm91cnRoT2ZKYW51YXJ5ID0gbmV3IERhdGUoMCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fV0VFSyA9IDYwNDgwMDAwMDsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ0lTT1dlZWsoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGlmZiA9IHN0YXJ0T2ZVVENJU09XZWVrKGRhdGUpLmdldFRpbWUoKSAtIHN0YXJ0T2ZVVENJU09XZWVrWWVhcihkYXRlKS5nZXRUaW1lKCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIE1JTExJU0VDT05EU19JTl9XRUVLKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDV2Vla1llYXIoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB5ZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICB2YXIgb3B0aW9ucyA9IGRpcnR5T3B0aW9ucyB8fCB7fTtcbiAgdmFyIGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlO1xuICB2YXIgbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlICYmIGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAxIGFuZCA3IF9hbmRfIGlzIG5vdCBOYU5cblxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cblxuICB2YXIgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldFVUQ0Z1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZlVUQ1dlZWsoZmlyc3RXZWVrT2ZOZXh0WWVhciwgZGlydHlPcHRpb25zKTtcbiAgdmFyIGZpcnN0V2Vla09mVGhpc1llYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZlVUQ1dlZWsoZmlyc3RXZWVrT2ZUaGlzWWVhciwgZGlydHlPcHRpb25zKTtcblxuICBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59IiwiaW1wb3J0IGdldFVUQ1dlZWtZZWFyIGZyb20gXCIuLi9nZXRVVENXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi90b0ludGVnZXIvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENXZWVrWWVhcihkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGU7XG4gIHZhciBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyAxIDogdG9JbnRlZ2VyKGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIHZhciBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA6IHRvSW50ZWdlcihvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIHZhciB5ZWFyID0gZ2V0VVRDV2Vla1llYXIoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vlay5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBkYXRlID0gc3RhcnRPZlVUQ1dlZWsoZmlyc3RXZWVrLCBkaXJ0eU9wdGlvbnMpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENXZWVrKGRpcnR5RGF0ZSwgb3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRpZmYgPSBzdGFydE9mVVRDV2VlayhkYXRlLCBvcHRpb25zKS5nZXRUaW1lKCkgLSBzdGFydE9mVVRDV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykuZ2V0VGltZSgpOyAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlclxuICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSykgKyAxO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgPyAnLScgOiAnJztcbiAgdmFyIG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKTtcblxuICB3aGlsZSAob3V0cHV0Lmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgIG91dHB1dCA9ICcwJyArIG91dHB1dDtcbiAgfVxuXG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufSIsImltcG9ydCBhZGRMZWFkaW5nWmVyb3MgZnJvbSBcIi4uLy4uL2FkZExlYWRpbmdaZXJvcy9pbmRleC5qc1wiO1xuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cblxudmFyIGZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG4gICAgdmFyIHNpZ25lZFllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7IC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG5cbiAgICB2YXIgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09ICd5eScgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTW9udGhcbiAgTTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgIHJldHVybiB0b2tlbiA9PT0gJ00nID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDRGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBBTSBvciBQTVxuICBhOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRVVENIb3VycygpIC8gMTIgPj0gMSA/ICdwbScgOiAnYW0nO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYSc6XG4gICAgICBjYXNlICdhYSc6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgY2FzZSAnYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTtcblxuICAgICAgY2FzZSAnYWFhYWEnOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlWzBdO1xuXG4gICAgICBjYXNlICdhYWFhJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWUgPT09ICdhbScgPyAnYS5tLicgOiAncC5tLic7XG4gICAgfVxuICB9LFxuICAvLyBIb3VyIFsxLTEyXVxuICBoOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDSG91cnMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRVVENNaW51dGVzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDU2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoO1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICAgIHZhciBmcmFjdGlvbmFsU2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzZWNvbmRzICogTWF0aC5wb3coMTAsIG51bWJlck9mRGlnaXRzIC0gMykpO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZnJhY3Rpb25hbFNlY29uZHMsIHRva2VuLmxlbmd0aCk7XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtYXR0ZXJzOyIsImltcG9ydCBnZXRVVENEYXlPZlllYXIgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDRGF5T2ZZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDSVNPV2VlayBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENJU09XZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENXZWVrIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENXZWVrWWVhciBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IGFkZExlYWRpbmdaZXJvcyBmcm9tIFwiLi4vLi4vYWRkTGVhZGluZ1plcm9zL2luZGV4LmpzXCI7XG5pbXBvcnQgbGlnaHRGb3JtYXR0ZXJzIGZyb20gXCIuLi9saWdodEZvcm1hdHRlcnMvaW5kZXguanNcIjtcbnZhciBkYXlQZXJpb2RFbnVtID0ge1xuICBhbTogJ2FtJyxcbiAgcG06ICdwbScsXG4gIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICBub29uOiAnbm9vbicsXG4gIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICBuaWdodDogJ25pZ2h0J1xufTtcbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG52YXIgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZXJhID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpID4gMCA/IDEgOiAwO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlICdHJzpcbiAgICAgIGNhc2UgJ0dHJzpcbiAgICAgIGNhc2UgJ0dHRyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCdcbiAgICAgICAgfSk7XG4gICAgICAvLyBBLCBCXG5cbiAgICAgIGNhc2UgJ0dHR0dHJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdydcbiAgICAgICAgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuXG4gICAgICBjYXNlICdHR0dHJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSAneW8nKSB7XG4gICAgICB2YXIgc2lnbmVkWWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTsgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcblxuICAgICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHllYXIsIHtcbiAgICAgICAgdW5pdDogJ3llYXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnkoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2lnbmVkV2Vla1llYXIgPSBnZXRVVENXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcblxuICAgIHZhciB3ZWVrWWVhciA9IHNpZ25lZFdlZWtZZWFyID4gMCA/IHNpZ25lZFdlZWtZZWFyIDogMSAtIHNpZ25lZFdlZWtZZWFyOyAvLyBUd28gZGlnaXQgeWVhclxuXG4gICAgaWYgKHRva2VuID09PSAnWVknKSB7XG4gICAgICB2YXIgdHdvRGlnaXRZZWFyID0gd2Vla1llYXIgJSAxMDA7XG4gICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHR3b0RpZ2l0WWVhciwgMik7XG4gICAgfSAvLyBPcmRpbmFsIG51bWJlclxuXG5cbiAgICBpZiAodG9rZW4gPT09ICdZbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7XG4gICAgICAgIHVuaXQ6ICd5ZWFyJ1xuICAgICAgfSk7XG4gICAgfSAvLyBQYWRkaW5nXG5cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHZhciBpc29XZWVrWWVhciA9IGdldFVUQ0lTT1dlZWtZZWFyKGRhdGUpOyAvLyBQYWRkaW5nXG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBFeHRlbmRlZCB5ZWFyLiBUaGlzIGlzIGEgc2luZ2xlIG51bWJlciBkZXNpZ25hdGluZyB0aGUgeWVhciBvZiB0aGlzIGNhbGVuZGFyIHN5c3RlbS5cbiAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIGxvY2FsaXplcnMgYXJlIEIuQy4geWVhcnM6XG4gIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gIC8vIHwtLS0tLS18LS0tLS18LS0tLS18XG4gIC8vIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gIC8vIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gIC8vIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLlxuICB1OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIFF1YXJ0ZXJcbiAgUTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSAnUSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuXG4gICAgICBjYXNlICdRUSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcblxuICAgICAgY2FzZSAnUW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7XG4gICAgICAgICAgdW5pdDogJ3F1YXJ0ZXInXG4gICAgICAgIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcblxuICAgICAgY2FzZSAnUVFRJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuXG4gICAgICBjYXNlICdRUVFRUSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cblxuICAgICAgY2FzZSAnUVFRUSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgLyAzKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgJ3EnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcblxuICAgICAgY2FzZSAncXEnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG5cbiAgICAgIGNhc2UgJ3FvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwge1xuICAgICAgICAgIHVuaXQ6ICdxdWFydGVyJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG5cbiAgICAgIGNhc2UgJ3FxcSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcblxuICAgICAgY2FzZSAncXFxcXEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG5cbiAgICAgIGNhc2UgJ3FxcXEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gTW9udGhcbiAgTTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBtb250aCA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ00nOlxuICAgICAgY2FzZSAnTU0nOlxuICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLk0oZGF0ZSwgdG9rZW4pO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuXG4gICAgICBjYXNlICdNbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwge1xuICAgICAgICAgIHVuaXQ6ICdtb250aCdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcblxuICAgICAgY2FzZSAnTU1NJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG5cbiAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG5cbiAgICAgIGNhc2UgJ01NTU0nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBtb250aFxuICBMOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSAnTCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobW9udGggKyAxKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuXG4gICAgICBjYXNlICdMTCc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcblxuICAgICAgY2FzZSAnTG8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHtcbiAgICAgICAgICB1bml0OiAnbW9udGgnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG5cbiAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuXG4gICAgICBjYXNlICdMTExMTCc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuXG4gICAgICBjYXNlICdMTExMJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG4gIHc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgd2VlayA9IGdldFVUQ1dlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09ICd3bycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWssIHtcbiAgICAgICAgdW5pdDogJ3dlZWsnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIElTTyB3ZWVrIG9mIHllYXJcbiAgSTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBpc29XZWVrID0gZ2V0VVRDSVNPV2VlayhkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gJ0lvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2Vlaywge1xuICAgICAgICB1bml0OiAnd2VlaydcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnZG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ0RhdGUoKSwge1xuICAgICAgICB1bml0OiAnZGF0ZSdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIERheSBvZiB5ZWFyXG4gIEQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZGF5T2ZZZWFyID0gZ2V0VVRDRGF5T2ZZZWFyKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSAnRG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHtcbiAgICAgICAgdW5pdDogJ2RheU9mWWVhcidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF5T2ZZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgJ0UnOlxuICAgICAgY2FzZSAnRUUnOlxuICAgICAgY2FzZSAnRUVFJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG5cbiAgICAgIGNhc2UgJ0VFRUVFJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcblxuICAgICAgY2FzZSAnRUVFRUVFJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3Nob3J0JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG5cbiAgICAgIGNhc2UgJ0VFRUUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSAnZSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuXG4gICAgICBjYXNlICdlZSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG5cbiAgICAgIGNhc2UgJ2VvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHtcbiAgICAgICAgICB1bml0OiAnZGF5J1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZWVlJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG5cbiAgICAgIGNhc2UgJ2VlZWVlJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcblxuICAgICAgY2FzZSAnZWVlZWVlJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3Nob3J0JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG5cbiAgICAgIGNhc2UgJ2VlZWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoc2FtZSBhcyBpbiBgZWApXG4gICAgICBjYXNlICdjJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG5cbiAgICAgIGNhc2UgJ2NjJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuXG4gICAgICBjYXNlICdjbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2NjYyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuXG4gICAgICBjYXNlICdjY2NjYyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG5cbiAgICAgIGNhc2UgJ2NjY2NjYyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuXG4gICAgICBjYXNlICdjY2NjJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBJU08gZGF5IG9mIHdlZWtcbiAgaTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBkYXlPZldlZWsgPSBkYXRlLmdldFVUQ0RheSgpO1xuICAgIHZhciBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSAnaSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG5cbiAgICAgIGNhc2UgJ2lpJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcblxuICAgICAgY2FzZSAnaW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHtcbiAgICAgICAgICB1bml0OiAnZGF5J1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZVxuXG4gICAgICBjYXNlICdpaWknOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcblxuICAgICAgY2FzZSAnaWlpaWknOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuXG4gICAgICBjYXNlICdpaWlpaWknOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnc2hvcnQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcblxuICAgICAgY2FzZSAnaWlpaSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICB2YXIgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gJ3BtJyA6ICdhbSc7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdhJzpcbiAgICAgIGNhc2UgJ2FhJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2FhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGNhc2UgJ2FhYWFhJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdhYWFhJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBBTSwgUE0sIG1pZG5pZ2h0LCBub29uXG4gIGI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcblxuICAgIGlmIChob3VycyA9PT0gMTIpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1pZG5pZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyAncG0nIDogJ2FtJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdiJzpcbiAgICAgIGNhc2UgJ2JiJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2JiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGNhc2UgJ2JiYmJiJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdiYmJiJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBpbiB0aGUgbW9ybmluZywgaW4gdGhlIGFmdGVybm9vbiwgaW4gdGhlIGV2ZW5pbmcsIGF0IG5pZ2h0XG4gIEI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcblxuICAgIGlmIChob3VycyA+PSAxNykge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ldmVuaW5nO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gMTIpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uYWZ0ZXJub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gNCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5tb3JuaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5pZ2h0O1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ0InOlxuICAgICAgY2FzZSAnQkInOlxuICAgICAgY2FzZSAnQkJCJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ0JCQkJCJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdCQkJCJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBIb3VyIFsxLTEyXVxuICBoOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnaG8nKSB7XG4gICAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7XG4gICAgICAgIHVuaXQ6ICdob3VyJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ0hvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENIb3VycygpLCB7XG4gICAgICAgIHVuaXQ6ICdob3VyJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0xMV1cbiAgSzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyO1xuXG4gICAgaWYgKHRva2VuID09PSAnS28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3Vycywge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSAna28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3Vycywge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnbW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ01pbnV0ZXMoKSwge1xuICAgICAgICB1bml0OiAnbWludXRlJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5tKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdzbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0VVRDU2Vjb25kcygpLCB7XG4gICAgICAgIHVuaXQ6ICdzZWNvbmQnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gVGltZXpvbmUgKElTTy04NjAxLiBJZiBvZmZzZXQgaXMgMCwgb3V0cHV0IGlzIGFsd2F5cyBgJ1onYClcbiAgWDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiAnWic7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgJ1gnOlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKHRpbWV6b25lT2Zmc2V0KTtcbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuXG4gICAgICBjYXNlICdYWFhYJzpcbiAgICAgIGNhc2UgJ1hYJzpcbiAgICAgICAgLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWFhgXG5cbiAgICAgIGNhc2UgJ1hYWFhYJzpcbiAgICAgIGNhc2UgJ1hYWCc6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSBvcmlnaW5hbERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlICd4JzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcblxuICAgICAgY2FzZSAneHh4eCc6XG4gICAgICBjYXNlICd4eCc6XG4gICAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuXG4gICAgICBjYXNlICd4eHh4eCc6XG4gICAgICBjYXNlICd4eHgnOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgIH1cbiAgfSxcbiAgLy8gVGltZXpvbmUgKEdNVClcbiAgTzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSAnTyc6XG4gICAgICBjYXNlICdPTyc6XG4gICAgICBjYXNlICdPT08nOlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgICAgLy8gTG9uZ1xuXG4gICAgICBjYXNlICdPT09PJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnR01UJyArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgIH1cbiAgfSxcbiAgLy8gVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdGlvbilcbiAgejogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSAneic6XG4gICAgICBjYXNlICd6eic6XG4gICAgICBjYXNlICd6enonOlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgICAgLy8gTG9uZ1xuXG4gICAgICBjYXNlICd6enp6JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnR01UJyArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgIH1cbiAgfSxcbiAgLy8gU2Vjb25kcyB0aW1lc3RhbXBcbiAgdDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWVzdGFtcCA9IE1hdGguZmxvb3Iob3JpZ2luYWxEYXRlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lc3RhbXAgPSBvcmlnaW5hbERhdGUuZ2V0VGltZSgpO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVNob3J0KG9mZnNldCwgZGlydHlEZWxpbWl0ZXIpIHtcbiAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICB2YXIgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihhYnNPZmZzZXQgLyA2MCk7XG4gIHZhciBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7XG5cbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gc2lnbiArIFN0cmluZyhob3Vycyk7XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZGlydHlEZWxpbWl0ZXIgfHwgJyc7XG4gIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKSArIGRlbGltaXRlciArIGFkZExlYWRpbmdaZXJvcyhtaW51dGVzLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKG9mZnNldCwgZGlydHlEZWxpbWl0ZXIpIHtcbiAgaWYgKG9mZnNldCAlIDYwID09PSAwKSB7XG4gICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICAgIHJldHVybiBzaWduICsgYWRkTGVhZGluZ1plcm9zKE1hdGguYWJzKG9mZnNldCkgLyA2MCwgMik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkaXJ0eURlbGltaXRlcik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGlydHlEZWxpbWl0ZXIpIHtcbiAgdmFyIGRlbGltaXRlciA9IGRpcnR5RGVsaW1pdGVyIHx8ICcnO1xuICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAnLScgOiAnKyc7XG4gIHZhciBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICB2YXIgaG91cnMgPSBhZGRMZWFkaW5nWmVyb3MoTWF0aC5mbG9vcihhYnNPZmZzZXQgLyA2MCksIDIpO1xuICB2YXIgbWludXRlcyA9IGFkZExlYWRpbmdaZXJvcyhhYnNPZmZzZXQgJSA2MCwgMik7XG4gIHJldHVybiBzaWduICsgaG91cnMgKyBkZWxpbWl0ZXIgKyBtaW51dGVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXR0ZXJzOyIsImZ1bmN0aW9uIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSAnUCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnUFAnOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7XG4gICAgICAgIHdpZHRoOiAnbWVkaXVtJ1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdQUFAnOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7XG4gICAgICAgIHdpZHRoOiAnbG9uZydcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnUFBQUCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0aW1lTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKSB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgJ3AnOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7XG4gICAgICAgIHdpZHRoOiAnc2hvcnQnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ3BwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAncHBwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ3BwcHAnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdmdWxsJ1xuICAgICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgdmFyIG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIHZhciBkYXRlUGF0dGVybiA9IG1hdGNoUmVzdWx0WzFdO1xuICB2YXIgdGltZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsyXTtcblxuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG5cbiAgdmFyIGRhdGVUaW1lRm9ybWF0O1xuXG4gIHN3aXRjaCAoZGF0ZVBhdHRlcm4pIHtcbiAgICBjYXNlICdQJzpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnc2hvcnQnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUFAnOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdtZWRpdW0nXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUFBQJzpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnbG9uZydcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdQUFBQJzpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdmdWxsJ1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBkYXRlVGltZUZvcm1hdC5yZXBsYWNlKCd7e2RhdGV9fScsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSkucmVwbGFjZSgne3t0aW1lfX0nLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufVxuXG52YXIgbG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXJcbn07XG5leHBvcnQgZGVmYXVsdCBsb25nRm9ybWF0dGVyczsiLCJ2YXIgcHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW5zID0gWydEJywgJ0REJ107XG52YXIgcHJvdGVjdGVkV2Vla1llYXJUb2tlbnMgPSBbJ1lZJywgJ1lZWVknXTtcbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSB7XG4gIHJldHVybiBwcm90ZWN0ZWREYXlPZlllYXJUb2tlbnMuaW5kZXhPZih0b2tlbikgIT09IC0xO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gcHJvdGVjdGVkV2Vla1llYXJUb2tlbnMuaW5kZXhPZih0b2tlbikgIT09IC0xO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgaWYgKHRva2VuID09PSAnWVlZWScpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgKGluIGBcIi5jb25jYXQoZm9ybWF0LCBcImApIGZvciBmb3JtYXR0aW5nIHllYXJzIHRvIHRoZSBpbnB1dCBgXCIpLmNvbmNhdChpbnB1dCwgXCJgOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clwiKSk7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09ICdEJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCAoaW4gYFwiLmNvbmNhdChmb3JtYXQsIFwiYCkgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdG8gdGhlIGlucHV0IGBcIikuY29uY2F0KGlucHV0LCBcImA7IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcIikpO1xuICB9IGVsc2UgaWYgKHRva2VuID09PSAnREQnKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgKGluIGBcIi5jb25jYXQoZm9ybWF0LCBcImApIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHRvIHRoZSBpbnB1dCBgXCIpLmNvbmNhdChpbnB1dCwgXCJgOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXCIpKTtcbiAgfVxufSIsImltcG9ydCBpc1ZhbGlkIGZyb20gXCIuLi9pc1ZhbGlkL2luZGV4LmpzXCI7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tIFwiLi4vbG9jYWxlL2VuLVVTL2luZGV4LmpzXCI7XG5pbXBvcnQgc3ViTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9zdWJNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdHRlcnMgZnJvbSBcIi4uL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMvaW5kZXguanNcIjtcbmltcG9ydCBsb25nRm9ybWF0dGVycyBmcm9tIFwiLi4vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMvaW5kZXguanNcIjtcbmltcG9ydCBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4sIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiwgdGhyb3dQcm90ZWN0ZWRFcnJvciB9IGZyb20gXCIuLi9fbGliL3Byb3RlY3RlZFRva2Vucy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7IC8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuXG52YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZzsgLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuXG52YXIgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcbnZhciBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87XG52YXIgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcbnZhciB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBGb3JtYXQgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiA+IOKaoO+4jyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqXG4gKiBUaGUgY2hhcmFjdGVycyB3cmFwcGVkIGJldHdlZW4gdHdvIHNpbmdsZSBxdW90ZXMgY2hhcmFjdGVycyAoJykgYXJlIGVzY2FwZWQuXG4gKiBUd28gc2luZ2xlIHF1b3RlcyBpbiBhIHJvdywgd2hldGhlciBpbnNpZGUgb3Igb3V0c2lkZSBhIHF1b3RlZCBzZXF1ZW5jZSwgcmVwcmVzZW50IGEgJ3JlYWwnIHNpbmdsZSBxdW90ZS5cbiAqIChzZWUgdGhlIGxhc3QgZXhhbXBsZSlcbiAqXG4gKiBGb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNyBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIEFjY2VwdGVkIHBhdHRlcm5zOlxuICogfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0dGVybiB8IFJlc3VsdCBleGFtcGxlcyAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS18XG4gKiB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHLi5HR0cgIHwgQUQsIEJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICB8IEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgfCBBLCBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENhbGVuZGFyIHllYXIgICAgICAgICAgICAgICAgICAgfCB5ICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeW8gICAgICB8IDQ0dGgsIDFzdCwgMHRoLCAxN3RoICAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5ICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXl5ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgfCBZICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCAyMDE3dGggICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVlZICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICAgfCBSICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlIgICAgICB8IC00MywgMDAsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUiAgICAgfCAtMDQzLCAwMDAsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSICAgIHwgLTAwNDMsIDAwMDAsIDAwMDEsIDE5MDAsIDIwMTcgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUlIgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSw3IHxcbiAqIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgICB8IHUgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dSAgICAgIHwgLTQzLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1ICAgICB8IC0wNDMsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXUgICAgfCAtMDA0MywgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1dSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBRdWFydGVyIChmb3JtYXR0aW5nKSAgICAgICAgICAgIHwgUSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRUSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBRdWFydGVyIChzdGFuZC1hbG9uZSkgICAgICAgICAgIHwgcSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxcSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBNb250aCAoZm9ybWF0dGluZykgICAgICAgICAgICAgIHwgTSAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1vICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTSAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU0gICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NTSAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNb250aCAoc3RhbmQtYWxvbmUpICAgICAgICAgICAgIHwgTCAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTEwgICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgIHwgdyAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgIHwgSSAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJSSAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgIHwgZCAgICAgICB8IDEsIDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzMXN0ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgIHwgMDEsIDAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgIHwgRCAgICAgICB8IDEsIDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzNjV0aCwgMzY2dGggICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBERCAgICAgIHwgMDEsIDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREREICAgICB8IDAwMSwgMDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREREQgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IERheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICAgICAgfCBFLi5FRUUgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRUUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgIHwgaSAgICAgICB8IDEsIDIsIDMsIC4uLiwgNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA3dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaSAgICAgIHwgMDEsIDAyLCAuLi4sIDA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWkgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyLDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWlpICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8IDcgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICB8IGUgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWUgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlZSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChzdGFuZC1hbG9uZSkgfCBjICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY28gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2MgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjYyAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjY2MgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS4uYWEgICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYSAgICAgfCBhbSwgcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8IGIuLmJiICAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmIgICAgIHwgYW0sIHBtLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICAgfCBTICAgICAgIHwgMCwgMSwgLi4uLCA5ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1MgICAgICB8IDAwLCAwMSwgLi4uLCA5OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgfCAwMDAsIDAwMSwgLi4uLCA5OTkgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1NTICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgICB8IE8uLi5PT08gfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPT09PICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgIHwgei4uLnp6eiB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8IDYgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHp6enogICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyLDYgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgIHwgUCAgICAgICB8IDA0LzI5LzE0NTMgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQICAgICAgfCBBcHIgMjksIDE0NTMgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFAgICAgIHwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUCAgICB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgICB8IHAgICAgICAgfCAxMjowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcCAgICAgIHwgMTI6MDA6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwICAgICB8IDEyOjAwOjAwIEFNIEdNVCsyICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcHAgICAgfCAxMjowMDowMCBBTSBHTVQrMDI6MDAgICAgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCBQcCAgICAgIHwgMDQvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBwcCAgICB8IEFwciAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUHBwcCAgfCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQcHBwcHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgIHwgMiw3ICAgfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhcjpcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIExMTEwnLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIE1NTU0nLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkdSdgXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlIChlLmcuIGBFRUVFRUVFRUVFRWApXG4gKiAgICB0aGUgb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgZGVmYXVsdCBwYXR0ZXJuIGZvciB0aGlzIHVuaXQsIHVzdWFsbHlcbiAqICAgIHRoZSBsb25nZXN0IG9uZSAoaW4gY2FzZSBvZiBJU08gd2Vla2RheXMsIGBFRUVFYCkuIERlZmF1bHQgcGF0dGVybnMgZm9yIHVuaXRzXG4gKiAgICBhcmUgbWFya2VkIHdpdGggXCIyXCIgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTScpIC8vPT4gJ05vdidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU0nKSAvLz0+ICdOJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogMy4gU29tZSBwYXR0ZXJucyBjb3VsZCBiZSB1bmxpbWl0ZWQgbGVuZ3RoIChzdWNoIGFzIGB5eXl5eXl5eWApLlxuICogICAgVGhlIG91dHB1dCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIHBhdHRlcm4uXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICd5eXl5eXl5eScpIC8vPT4gJzAwMDAyMDE3J2BcbiAqXG4gKiA0LiBgUVFRUVFgIGFuZCBgcXFxcXFgIGNvdWxkIGJlIG5vdCBzdHJpY3RseSBudW1lcmljYWwgaW4gc29tZSBsb2NhbGVzLlxuICogICAgVGhlc2UgdG9rZW5zIHJlcHJlc2VudCB0aGUgc2hvcnRlc3QgZm9ybSBvZiB0aGUgcXVhcnRlci5cbiAqXG4gKiA1LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgcGF0dGVybnMgYXJlIEIuQy4geWVhcnM6XG4gKlxuICogICAgfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS18LS0tLS18XG4gKiAgICB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICogICAgfCBCQyAxIHwgICAxIHwgICAwIHxcbiAqICAgIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gKlxuICogICAgQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICogICAgd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkOlxuICpcbiAqICAgIHwgWWVhciB8IGB5eWAgfCBgdXVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAqICAgIHwgMSAgICB8ICAgMDEgfCAgIDAxIHxcbiAqICAgIHwgMTQgICB8ICAgMTQgfCAgIDE0IHxcbiAqICAgIHwgMzc2ICB8ICAgNzYgfCAgMzc2IHxcbiAqICAgIHwgMTQ1MyB8ICAgNTMgfCAxNDUzIHxcbiAqXG4gKiAgICBUaGUgc2FtZSBkaWZmZXJlbmNlIGlzIHRydWUgZm9yIGxvY2FsIGFuZCBJU08gd2Vlay1udW1iZXJpbmcgeWVhcnMgKGBZYCBhbmQgYFJgKSxcbiAqICAgIGV4Y2VwdCBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFycyBhcmUgZGVwZW5kZW50IG9uIGBvcHRpb25zLndlZWtTdGFydHNPbmBcbiAqICAgIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIChjb21wYXJlIFtnZXRJU09XZWVrWWVhcl17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRJU09XZWVrWWVhcn1cbiAqICAgIGFuZCBbZ2V0V2Vla1llYXJde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0V2Vla1llYXJ9KS5cbiAqXG4gKiA2LiBTcGVjaWZpYyBub24tbG9jYXRpb24gdGltZXpvbmVzIGFyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gYGRhdGUtZm5zYCxcbiAqICAgIHNvIHJpZ2h0IG5vdyB0aGVzZSB0b2tlbnMgZmFsbCBiYWNrIHRvIEdNVCB0aW1lem9uZXMuXG4gKlxuICogNy4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgdGA6IHNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBUYDogbWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA4LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIC0gVGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3cgcmVxdWlyZWQgZm9yIHRoZSBzYWtlIG9mIGV4cGxpY2l0bmVzcy5cbiAqXG4gKiAgIGBgYGphdmFzY3JpcHRcbiAqICAgLy8gQmVmb3JlIHYyLjAuMFxuICogICBmb3JtYXQobmV3IERhdGUoMjAxNiwgMCwgMSkpXG4gKlxuICogICAvLyB2Mi4wLjAgb253YXJkXG4gKiAgIGZvcm1hdChuZXcgRGF0ZSgyMDE2LCAwLCAxKSwgXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTeHh4XCIpXG4gKiAgIGBgYFxuICpcbiAqIC0gTmV3IGZvcm1hdCBzdHJpbmcgQVBJIGZvciBgZm9ybWF0YCBmdW5jdGlvblxuICogICB3aGljaCBpcyBiYXNlZCBvbiBbVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1XShodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlKS5cbiAqICAgU2VlIFt0aGlzIHBvc3RdKGh0dHBzOi8vYmxvZy5kYXRlLWZucy5vcmcvcG9zdC91bmljb2RlLXRva2Vucy1pbi1kYXRlLWZucy12Mi1zcmVhdHlraTkxamcpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogLSBDaGFyYWN0ZXJzIGFyZSBub3cgZXNjYXBlZCB1c2luZyBzaW5nbGUgcXVvdGUgc3ltYm9scyAoYCdgKSBpbnN0ZWFkIG9mIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgLSB0aGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM9ZmFsc2VdIC0gaWYgdHJ1ZSwgYWxsb3dzIHVzYWdlIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyIHRva2VucyBgWVlgIGFuZCBgWVlZWWA7XG4gKiAgIHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vucz1mYWxzZV0gLSBpZiB0cnVlLCBhbGxvd3MgdXNhZ2Ugb2YgdGhlIGRheSBvZiB5ZWFyIHRva2VucyBgRGAgYW5kIGBERGA7XG4gKiAgIHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBkYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBsb2NhbGl6ZWAgcHJvcGVydHlcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgN1xuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGB5eXl5YCBpbnN0ZWFkIG9mIGBZWVlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSB1c2UgYGRgIGluc3RlYWQgb2YgYERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSB1c2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIHZhciByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgMSwgMTEpLCAnTU0vZGQveXl5eScpXG4gKiAvLz0+ICcwMi8xMS8yMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMiBKdWx5IDIwMTQgaW4gRXNwZXJhbnRvOlxuICogaW1wb3J0IHsgZW9Mb2NhbGUgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiB2YXIgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBcImRvICdkZScgTU1NTSB5eXl5XCIsIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJzItYSBkZSBqdWxpbyAyMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFc2NhcGUgc3RyaW5nIGJ5IHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzOlxuICogdmFyIHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoZGlydHlEYXRlLCBkaXJ0eUZvcm1hdFN0ciwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZm9ybWF0U3RyID0gU3RyaW5nKGRpcnR5Rm9ybWF0U3RyKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBkZWZhdWx0TG9jYWxlO1xuICB2YXIgbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlO1xuICB2YXIgZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gMSA6IHRvSW50ZWdlcihsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgOiB0b0ludGVnZXIob3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDEgYW5kIDcgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA+PSAxICYmIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA8PSA3KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdmaXJzdFdlZWtDb250YWluc0RhdGUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDcgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIHZhciBsb2NhbGVXZWVrU3RhcnRzT24gPSBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gIHZhciBkZWZhdWx0V2Vla1N0YXJ0c09uID0gbG9jYWxlV2Vla1N0YXJ0c09uID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGxvY2FsZVdlZWtTdGFydHNPbik7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSBvcHRpb25zLndlZWtTdGFydHNPbiA9PSBudWxsID8gZGVmYXVsdFdlZWtTdGFydHNPbiA6IHRvSW50ZWdlcihvcHRpb25zLndlZWtTdGFydHNPbik7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgaWYgKCFsb2NhbGUubG9jYWxpemUpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbG9jYWxlIG11c3QgY29udGFpbiBsb2NhbGl6ZSBwcm9wZXJ0eScpO1xuICB9XG5cbiAgaWYgKCFsb2NhbGUuZm9ybWF0TG9uZykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsb2NhbGUgbXVzdCBjb250YWluIGZvcm1hdExvbmcgcHJvcGVydHknKTtcbiAgfVxuXG4gIHZhciBvcmlnaW5hbERhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcblxuICBpZiAoIWlzVmFsaWQob3JpZ2luYWxEYXRlKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgfSAvLyBDb252ZXJ0IHRoZSBkYXRlIGluIHN5c3RlbSB0aW1lem9uZSB0byB0aGUgc2FtZSBkYXRlIGluIFVUQyswMDowMCB0aW1lem9uZS5cbiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBVVEMgZnVuY3Rpb25zIHdpbGwgYmUgaW1wbGVtZW50ZWQsIGxvY2FsZXMgd2lsbCBiZSBjb21wYXRpYmxlIHdpdGggdGhlbS5cbiAgLy8gU2VlIGFuIGlzc3VlIGFib3V0IFVUQyBmdW5jdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cblxuICB2YXIgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSk7XG4gIHZhciB1dGNEYXRlID0gc3ViTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSwgdGltZXpvbmVPZmZzZXQpO1xuICB2YXIgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT246IHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBfb3JpZ2luYWxEYXRlOiBvcmlnaW5hbERhdGVcbiAgfTtcbiAgdmFyIHJlc3VsdCA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKGZ1bmN0aW9uIChzdWJzdHJpbmcpIHtcbiAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG5cbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICdwJyB8fCBmaXJzdENoYXJhY3RlciA9PT0gJ1AnKSB7XG4gICAgICB2YXIgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJzdHJpbmc7XG4gIH0pLmpvaW4oJycpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnNSZWdFeHApLm1hcChmdW5jdGlvbiAoc3Vic3RyaW5nKSB7XG4gICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgcmV0dXJuIFwiJ1wiO1xuICAgIH1cblxuICAgIHZhciBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcblxuICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gXCInXCIpIHtcbiAgICAgIHJldHVybiBjbGVhbkVzY2FwZWRTdHJpbmcoc3Vic3RyaW5nKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG5cbiAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICBpZiAoIW9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbihzdWJzdHJpbmcpKSB7XG4gICAgICAgIHRocm93UHJvdGVjdGVkRXJyb3Ioc3Vic3RyaW5nLCBkaXJ0eUZvcm1hdFN0ciwgZGlydHlEYXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbihzdWJzdHJpbmcpKSB7XG4gICAgICAgIHRocm93UHJvdGVjdGVkRXJyb3Ioc3Vic3RyaW5nLCBkaXJ0eUZvcm1hdFN0ciwgZGlydHlEYXRlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlcih1dGNEYXRlLCBzdWJzdHJpbmcsIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0Zvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgJyArIGZpcnN0Q2hhcmFjdGVyICsgJ2AnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic3RyaW5nO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKVsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBnZXREYXlzSW5Nb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHJldHVybnMge051bWJlcn0gdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBkYXlzIGFyZSBpbiBGZWJydWFyeSAyMDAwP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5c0luTW9udGgobmV3IERhdGUoMjAwMCwgMSkpXG4gKiAvLz0+IDI5XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG1vbnRoSW5kZXggPSBkYXRlLmdldE1vbnRoKCk7XG4gIHZhciBsYXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aEluZGV4ICsgMSwgMCk7XG4gIGxhc3REYXlPZk1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gbGFzdERheU9mTW9udGguZ2V0RGF0ZSgpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgZ2V0VGltZVxuICogQGNhdGVnb3J5IFRpbWVzdGFtcCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGdpdmVuIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSB0aW1lc3RhbXBcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIHRpbWVzdGFtcCBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1LjEyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldFRpbWUobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSwgMTIzKSlcbiAqIC8vPT4gMTMzMDUxNTkwNTEyM1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFRpbWUoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIHJldHVybiB0aW1lc3RhbXA7XG59IiwiaW1wb3J0IGdldFRpbWUgZnJvbSBcIi4uL2dldFRpbWUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGdldFVuaXhUaW1lXG4gKiBAY2F0ZWdvcnkgVGltZXN0YW1wIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgc2Vjb25kcyB0aW1lc3RhbXAgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgdGltZXN0YW1wXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSB0aW1lc3RhbXAgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNSBDRVQ6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRVbml4VGltZShuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1KSlcbiAqIC8vPT4gMTMzMDUxMjMwNVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVuaXhUaW1lKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoZ2V0VGltZShkaXJ0eURhdGUpIC8gMTAwMCk7XG59IiwiaW1wb3J0IHN0YXJ0T2ZXZWVrIGZyb20gXCIuLi9zdGFydE9mV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1dlZWtfbnVtYmVyaW5nXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHBhcmFtIHsxfDJ8M3w0fDV8Nnw3fSBbb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGU9MV0gLSB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhclxuICogQHJldHVybnMge051bWJlcn0gdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgN1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5ncz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNikpXG4gKiAvLz0+IDIwMDVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHdlZWsgc3RhcnRzIG9uIFNhdHVyZGF5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyB3ZWVrU3RhcnRzT246IDYgfSlcbiAqIC8vPT4gMjAwNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgdGhlIGZpcnN0IHdlZWsgY29udGFpbnMgNCBKYW51YXJ5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXZWVrWWVhcihkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9vcHRpb25zJGxvY2FsZSwgX29wdGlvbnMkbG9jYWxlJG9wdGlvO1xuXG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8uZmlyc3RXZWVrQ29udGFpbnNEYXRlO1xuICB2YXIgZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gMSA6IHRvSW50ZWdlcihsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAxIGFuZCA3IF9hbmRfIGlzIG5vdCBOYU5cblxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cblxuICB2YXIgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZOZXh0WWVhciwgb3B0aW9ucyk7XG4gIHZhciBmaXJzdFdlZWtPZlRoaXNZZWFyID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIG9wdGlvbnMpO1xuXG4gIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0V2Vla1llYXIgZnJvbSBcIi4uL2dldFdlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZldlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1dlZWtfbnVtYmVyaW5nXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHBhcmFtIHsxfDJ8M3w0fDV8Nnw3fSBbb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGU9MV0gLSB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhclxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgN1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNSB3aXRoIGRlZmF1bHQgc2V0dGluZ3M6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IFN1biBEZWMgMjYgMjAwNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNVxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2Ygd2Vla1xuICogLy8gYW5kIDQgSmFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXI6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlO1xuICB2YXIgZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gMSA6IHRvSW50ZWdlcihsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgOiB0b0ludGVnZXIob3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgeWVhciA9IGdldFdlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKTtcbiAgdmFyIGZpcnN0V2VlayA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2VlaywgZGlydHlPcHRpb25zKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHN0YXJ0T2ZXZWVrIGZyb20gXCIuLi9zdGFydE9mV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZXZWVrWWVhciBmcm9tIFwiLi4vc3RhcnRPZldlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7XG4vKipcbiAqIEBuYW1lIGdldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNXZWVrX251bWJlcmluZ1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEBwYXJhbSB7MXwyfDN8NHw1fDZ8N30gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSB3ZWVrXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IDUzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2VlayhkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkaWZmID0gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucykuZ2V0VGltZSgpIC0gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKTsgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdClcblxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gTUlMTElTRUNPTkRTX0lOX1dFRUspICsgMTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGxhc3REYXlPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgbGFzdCBkYXkgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGxhc3QgZGF5IG9mIGEgbW9udGhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgbGFzdCBkYXkgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIHZhciByZXN1bHQgPSBsYXN0RGF5T2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDMwIDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXN0RGF5T2ZNb250aChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzIGZyb20gXCIuLi9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzL2luZGV4LmpzXCI7XG5pbXBvcnQgbGFzdERheU9mTW9udGggZnJvbSBcIi4uL2xhc3REYXlPZk1vbnRoL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZk1vbnRoIGZyb20gXCIuLi9zdGFydE9mTW9udGgvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla3NJbk1vbnRoXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciB3ZWVrcyBhIG1vbnRoIHNwYW5zLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgdGhlIG1vbnRoIGluIHRoZSBnaXZlbiBkYXRlIHNwYW5zLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3NcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgZG9lcyBGZWJydWFyeSAyMDE1IHNwYW4/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrc0luTW9udGgobmV3IERhdGUoMjAxNSwgMSwgOCkpXG4gKiAvLz0+IDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSxcbiAqIC8vIGhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGRvZXMgSnVseSAyMDE3IHNwYW4/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrc0luTW9udGgobmV3IERhdGUoMjAxNywgNiwgNSksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IDZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2Vla3NJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhc3REYXlPZk1vbnRoKGRhdGUpLCBzdGFydE9mTW9udGgoZGF0ZSksIG9wdGlvbnMpICsgMTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzQWZ0ZXJcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBhZnRlciB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBhZnRlciB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlVG9Db21wYXJlIC0gdGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGZpcnN0IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZCBkYXRlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBhZnRlciAxMSBGZWJydWFyeSAxOTg3P1xuICogdmFyIHJlc3VsdCA9IGlzQWZ0ZXIobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IHRydWVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0FmdGVyKGRpcnR5RGF0ZSwgZGlydHlEYXRlVG9Db21wYXJlKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF0ZVRvQ29tcGFyZSA9IHRvRGF0ZShkaXJ0eURhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gZGF0ZS5nZXRUaW1lKCkgPiBkYXRlVG9Db21wYXJlLmdldFRpbWUoKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBiZWZvcmUgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVRvQ29tcGFyZSAtIHRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGJlZm9yZSAxMSBGZWJydWFyeSAxOTg3P1xuICogdmFyIHJlc3VsdCA9IGlzQmVmb3JlKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQmVmb3JlKGRpcnR5RGF0ZSwgZGlydHlEYXRlVG9Db21wYXJlKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF0ZVRvQ29tcGFyZSA9IHRvRGF0ZShkaXJ0eURhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gZGF0ZS5nZXRUaW1lKCkgPCBkYXRlVG9Db21wYXJlLmdldFRpbWUoKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzU2FtZU1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZUxlZnQgLSB0aGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVJpZ2h0IC0gdGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSBtb250aD9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNCwgOCwgMjUpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNSBpbiB0aGUgc2FtZSBtb250aD9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNSwgOCwgMjUpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZU1vbnRoKGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZUxlZnQgPSB0b0RhdGUoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBkYXRlUmlnaHQgPSB0b0RhdGUoZGlydHlEYXRlUmlnaHQpO1xuICByZXR1cm4gZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCkgJiYgZGF0ZUxlZnQuZ2V0TW9udGgoKSA9PT0gZGF0ZVJpZ2h0LmdldE1vbnRoKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1NhbWVZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIHllYXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIHllYXI/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNCwgOCwgMjUpKVxuICogLy89PiB0cnVlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTYW1lWWVhcihkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0ID0gdG9EYXRlKGRpcnR5RGF0ZUxlZnQpO1xuICB2YXIgZGF0ZVJpZ2h0ID0gdG9EYXRlKGRpcnR5RGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIGRhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IGRhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBnZXREYXlzSW5Nb250aCBmcm9tIFwiLi4vZ2V0RGF5c0luTW9udGgvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHNldE1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBtb250aCB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG1vbnRoIC0gdGhlIG1vbnRoIG9mIHRoZSBuZXcgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aCBzZXRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IEZlYnJ1YXJ5IHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMSlcbiAqIC8vPT4gU2F0IEZlYiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0TW9udGgoZGlydHlEYXRlLCBkaXJ0eU1vbnRoKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgbW9udGggPSB0b0ludGVnZXIoZGlydHlNb250aCk7XG4gIHZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICB2YXIgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gIHZhciBkYXRlV2l0aERlc2lyZWRNb250aCA9IG5ldyBEYXRlKDApO1xuICBkYXRlV2l0aERlc2lyZWRNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgMTUpO1xuICBkYXRlV2l0aERlc2lyZWRNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIGRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGgoZGF0ZVdpdGhEZXNpcmVkTW9udGgpOyAvLyBTZXQgdGhlIGxhc3QgZGF5IG9mIHRoZSBuZXcgbW9udGhcbiAgLy8gaWYgdGhlIG9yaWdpbmFsIGRhdGUgd2FzIHRoZSBsYXN0IGRheSBvZiB0aGUgbG9uZ2VyIG1vbnRoXG5cbiAgZGF0ZS5zZXRNb250aChtb250aCwgTWF0aC5taW4oZGF5LCBkYXlzSW5Nb250aCkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzZXRZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHllYXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHllYXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IHllYXIgLSB0aGUgeWVhciBvZiB0aGUgbmV3IGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhciBzZXRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHllYXIgMjAxMyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0WWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMjAxMylcbiAqIC8vPT4gU3VuIFNlcCAwMSAyMDEzIDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0WWVhcihkaXJ0eURhdGUsIGRpcnR5WWVhcikge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHllYXIgPSB0b0ludGVnZXIoZGlydHlZZWFyKTsgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBJbnZhbGlkIERhdGUgYmVjYXVzZSBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciBpZ25vcmVzIHRoZSB2YWx1ZSBvZiBJbnZhbGlkIERhdGVcblxuICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICBkYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lWWVhciwgc2V0TW9udGggYXMgc2V0RGF0ZU1vbnRoLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgdGhlIGRyb3Bkb3duIHRvIG5hdmlnYXRlIGJldHdlZW4gbW9udGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTW9udGhzRHJvcGRvd24ocHJvcHMpIHtcbiAgICB2YXIgZGlzcGxheU1vbnRoID0gcHJvcHMuZGlzcGxheU1vbnRoO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBmcm9tRGF0ZSA9IF9hLmZyb21EYXRlLCB0b0RhdGUgPSBfYS50b0RhdGUsIHN0eWxlcyA9IF9hLnN0eWxlcywgbG9jYWxlID0gX2EubG9jYWxlLCBmb3JtYXRNb250aENhcHRpb24gPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdE1vbnRoQ2FwdGlvbiwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIERyb3Bkb3duID0gX2EuY29tcG9uZW50cy5Ecm9wZG93biwgbGFiZWxNb250aERyb3Bkb3duID0gX2EubGFiZWxzLmxhYmVsTW9udGhEcm9wZG93bjtcbiAgICBpZiAoIWZyb21EYXRlICYmICF0b0RhdGUpIHtcbiAgICAgICAgLy8gVE9ETzogdXNlIHR5cGUgZ3VhcmRzXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsKTtcbiAgICB9XG4gICAgdmFyIGRyb3Bkb3duTW9udGhzID0gW107XG4gICAgaWYgKGZyb21EYXRlICYmIHRvRGF0ZSkge1xuICAgICAgICBpZiAoaXNTYW1lWWVhcihmcm9tRGF0ZSwgdG9EYXRlKSkge1xuICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBtb250aHMgaW5jbHVkZWQgaW4gdGhlIHJhbmdlXG4gICAgICAgICAgICBmb3IgKHZhciBtb250aCA9IGZyb21EYXRlLmdldE1vbnRoKCk7IG1vbnRoIDw9IHRvRGF0ZS5nZXRNb250aCgpOyBtb250aCsrKSB7XG4gICAgICAgICAgICAgICAgZHJvcGRvd25Nb250aHMucHVzaChzZXREYXRlTW9udGgoc3RhcnRPZk1vbnRoKGZyb21EYXRlKSwgbW9udGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRpc3BsYXkgYWxsIHRoZSAxMiBtb250aHNcbiAgICAgICAgICAgIGZvciAodmFyIG1vbnRoID0gMDsgbW9udGggPD0gMTE7IG1vbnRoKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYW55RGF0ZSA9IG5ldyBEYXRlKCk7IC8vIGFueSBkYXRlIGlzIE9LLCB3ZSBqdXN0IG5lZWQgdGhlIHllYXJcbiAgICAgICAgICAgICAgICBkcm9wZG93bk1vbnRocy5wdXNoKHNldERhdGVNb250aChzdGFydE9mTW9udGgoYW55RGF0ZSksIG1vbnRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBuZXdNb250aCA9IHNldERhdGVNb250aChuZXcgRGF0ZShkaXNwbGF5TW9udGgpLCBOdW1iZXIoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgcHJvcHMub25DaGFuZ2UobmV3TW9udGgpO1xuICAgIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLCB7IFwiYXJpYS1sYWJlbFwiOiBsYWJlbE1vbnRoRHJvcGRvd24oKSwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duX21vbnRoLCBzdHlsZTogc3R5bGVzLmRyb3Bkb3duX21vbnRoLCBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLCB2YWx1ZTogZGlzcGxheU1vbnRoLmdldE1vbnRoKCksIGNhcHRpb246IGZvcm1hdE1vbnRoQ2FwdGlvbihkaXNwbGF5TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSkgfSwgZHJvcGRvd25Nb250aHMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCB7IGtleTogbS5nZXRNb250aCgpLCB2YWx1ZTogbS5nZXRNb250aCgpIH0sIGZvcm1hdE1vbnRoQ2FwdGlvbihtLCB7IGxvY2FsZTogbG9jYWxlIH0pKSk7IH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb250aHNEcm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG4vKipcbiAqIFJlbmRlciBhIGJ1dHRvbiBIVE1MIGVsZW1lbnQgYXBwbHlpbmcgdGhlIHJlc2V0IGNsYXNzIG5hbWUuXG4gKi9cbmV4cG9ydCB2YXIgQnV0dG9uID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzO1xuICAgIHZhciBjbGFzc05hbWVzQXJyID0gW2NsYXNzTmFtZXMuYnV0dG9uX3Jlc2V0LCBjbGFzc05hbWVzLmJ1dHRvbl07XG4gICAgaWYgKHByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgICBjbGFzc05hbWVzQXJyLnB1c2gocHJvcHMuY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNBcnIuam9pbignICcpO1xuICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMuYnV0dG9uX3Jlc2V0KSwgc3R5bGVzLmJ1dHRvbik7XG4gICAgaWYgKHByb3BzLnN0eWxlKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHByb3BzLnN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9fYXNzaWduKHt9LCBwcm9wcywgeyByZWY6IHJlZiwgdHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBjbGFzc05hbWUsIHN0eWxlOiBzdHlsZSB9KSkpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CdXR0b24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9CdXR0b24nO1xuLyoqIEEgY29tcG9uZW50IHJlbmRlcmluZyB0aGUgbmF2aWdhdGlvbiBidXR0b25zIG9yIHRoZSBkcm9wLWRvd25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE5hdmlnYXRpb24ocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIF9iID0gdXNlRGF5UGlja2VyKCksIGRpciA9IF9iLmRpciwgbG9jYWxlID0gX2IubG9jYWxlLCBjbGFzc05hbWVzID0gX2IuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Iuc3R5bGVzLCBfYyA9IF9iLmxhYmVscywgbGFiZWxQcmV2aW91cyA9IF9jLmxhYmVsUHJldmlvdXMsIGxhYmVsTmV4dCA9IF9jLmxhYmVsTmV4dCwgX2QgPSBfYi5jb21wb25lbnRzLCBJY29uUmlnaHQgPSBfZC5JY29uUmlnaHQsIEljb25MZWZ0ID0gX2QuSWNvbkxlZnQ7XG4gICAgdmFyIG9uUHJldmlvdXNDbGljayA9IHByb3BzLm9uUHJldmlvdXNDbGljaywgb25OZXh0Q2xpY2sgPSBwcm9wcy5vbk5leHRDbGljaztcbiAgICBpZiAoZGlyID09PSAncnRsJykge1xuICAgICAgICBfYSA9IFtvblByZXZpb3VzQ2xpY2ssIG9uTmV4dENsaWNrXSwgb25OZXh0Q2xpY2sgPSBfYVswXSwgb25QcmV2aW91c0NsaWNrID0gX2FbMV07XG4gICAgfVxuICAgIHZhciBwcmV2aW91c01vbnRoID0gcHJvcHMucHJldmlvdXNNb250aCwgbmV4dE1vbnRoID0gcHJvcHMubmV4dE1vbnRoO1xuICAgIHZhciBwcmV2aW91c0xhYmVsID0gbGFiZWxQcmV2aW91cyhwcmV2aW91c01vbnRoLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIHZhciBwcmV2aW91c0NsYXNzTmFtZSA9IFtcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uLFxuICAgICAgICBjbGFzc05hbWVzLm5hdl9idXR0b25fcHJldmlvdXNcbiAgICBdLmpvaW4oJyAnKTtcbiAgICB2YXIgbmV4dExhYmVsID0gbGFiZWxOZXh0KG5leHRNb250aCwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICB2YXIgbmV4dENsYXNzTmFtZSA9IFtcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uLFxuICAgICAgICBjbGFzc05hbWVzLm5hdl9idXR0b25fbmV4dFxuICAgIF0uam9pbignICcpO1xuICAgIGlmICghbmV4dE1vbnRoICYmICFwcmV2aW91c01vbnRoKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdiwgc3R5bGU6IHN0eWxlcy5uYXYgfSxcbiAgICAgICAgIXByb3BzLmhpZGVQcmV2aW91cyAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHsgXCJhcmlhLWxhYmVsXCI6IHByZXZpb3VzTGFiZWwsIGNsYXNzTmFtZTogcHJldmlvdXNDbGFzc05hbWUsIHN0eWxlOiBzdHlsZXMubmF2X2J1dHRvbl9uZXh0LCBkaXNhYmxlZDogIXByZXZpb3VzTW9udGgsIG9uQ2xpY2s6IGRpciA9PT0gJ3J0bCcgPyBvbk5leHRDbGljayA6IG9uUHJldmlvdXNDbGljayB9LCBkaXIgPT09ICdydGwnID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblJpZ2h0LCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5uYXZfaWNvbiwgc3R5bGU6IHN0eWxlcy5uYXZfaWNvbiB9KSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChJY29uTGVmdCwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMubmF2X2ljb24sIHN0eWxlOiBzdHlsZXMubmF2X2ljb24gfSkpKSksXG4gICAgICAgICFwcm9wcy5oaWRlTmV4dCAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHsgXCJhcmlhLWxhYmVsXCI6IG5leHRMYWJlbCwgY2xhc3NOYW1lOiBuZXh0Q2xhc3NOYW1lLCBzdHlsZTogc3R5bGVzLm5hdl9idXR0b25fbmV4dCwgZGlzYWJsZWQ6ICFuZXh0TW9udGgsIG9uQ2xpY2s6IGRpciA9PT0gJ3J0bCcgPyBvblByZXZpb3VzQ2xpY2sgOiBvbk5leHRDbGljayB9LCBkaXIgPT09ICdydGwnID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbkxlZnQsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdl9pY29uLCBzdHlsZTogc3R5bGVzLm5hdl9pY29uIH0pKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KEljb25SaWdodCwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMubmF2X2ljb24sIHN0eWxlOiBzdHlsZXMubmF2X2ljb24gfSkpKSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdmlnYXRpb24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHNldFllYXIsIHN0YXJ0T2ZZZWFyIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIGEgZHJvcGRvd24gdG8gY2hhbmdlIHRoZSB5ZWFyLiBUYWtlIGluIGFjY291bnQgdGhlIGBuYXYuZnJvbURhdGVgIGFuZFxuICogYHRvRGF0ZWAgZnJvbSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gWWVhcnNEcm9wZG93bihwcm9wcykge1xuICAgIHZhciBkaXNwbGF5TW9udGggPSBwcm9wcy5kaXNwbGF5TW9udGg7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGZyb21EYXRlID0gX2EuZnJvbURhdGUsIHRvRGF0ZSA9IF9hLnRvRGF0ZSwgbG9jYWxlID0gX2EubG9jYWxlLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBEcm9wZG93biA9IF9hLmNvbXBvbmVudHMuRHJvcGRvd24sIGZvcm1hdFllYXJDYXB0aW9uID0gX2EuZm9ybWF0dGVycy5mb3JtYXRZZWFyQ2FwdGlvbiwgbGFiZWxZZWFyRHJvcGRvd24gPSBfYS5sYWJlbHMubGFiZWxZZWFyRHJvcGRvd247XG4gICAgdmFyIHllYXJzID0gW107XG4gICAgaWYgKGZyb21EYXRlICYmIHRvRGF0ZSkge1xuICAgICAgICB2YXIgZnJvbVllYXIgPSBmcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgdG9ZZWFyID0gdG9EYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGZvciAodmFyIHllYXIgPSBmcm9tWWVhcjsgeWVhciA8PSB0b1llYXI7IHllYXIrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChzZXRZZWFyKHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKCkpLCB5ZWFyKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBuZXdNb250aCA9IHNldFllYXIobmV3IERhdGUoZGlzcGxheU1vbnRoKSwgTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgIHByb3BzLm9uQ2hhbmdlKG5ld01vbnRoKTtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93biwgeyBcImFyaWEtbGFiZWxcIjogbGFiZWxZZWFyRHJvcGRvd24oKSwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duX21vbnRoLCBzdHlsZTogc3R5bGVzLmRyb3Bkb3duX21vbnRoLCBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLCB2YWx1ZTogZGlzcGxheU1vbnRoLmdldEZ1bGxZZWFyKCksIGNhcHRpb246IGZvcm1hdFllYXJDYXB0aW9uKGRpc3BsYXlNb250aCwgeyBsb2NhbGU6IGxvY2FsZSB9KSB9LCB5ZWFycy5tYXAoZnVuY3Rpb24gKHllYXIpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIsIHsga2V5OiB5ZWFyLmdldEZ1bGxZZWFyKCksIHZhbHVlOiB5ZWFyLmdldEZ1bGxZZWFyKCkgfSwgZm9ybWF0WWVhckNhcHRpb24oeWVhciwgeyBsb2NhbGU6IGxvY2FsZSB9KSkpOyB9KSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WWVhcnNEcm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBIZWxwZXIgaG9vayBmb3IgdXNpbmcgY29udHJvbGxlZC91bmNvbnRyb2xsZWQgdmFsdWVzIGZyb20gYSBjb21wb25lbnQgcHJvcHMuXG4gKlxuICogV2hlbiB0aGUgdmFsdWUgaXMgbm90IGNvbnRyb2xsZWQsIHBhc3MgYHVuZGVmaW5lZGAgYXMgYGNvbnRyb2xsZWRWYWx1ZWAgYW5kXG4gKiB1c2UgdGhlIHJldHVybmVkIHNldHRlciB0byB1cGRhdGUgaXQuXG4gKlxuICogV2hlbiB0aGUgdmFsdWUgaXMgY29udHJvbGxlZCwgcGFzcyB0aGUgY29udHJvbGxlZCB2YWx1ZSBhcyBzZWNvbmRcbiAqIGFyZ3VtZW50LCB3aGljaCB3aWxsIGJlIGFsd2F5cyByZXR1cm5lZCBhcyBgdmFsdWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udHJvbGxlZFZhbHVlKGRlZmF1bHRWYWx1ZSwgY29udHJvbGxlZFZhbHVlKSB7XG4gICAgdmFyIF9hID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFZhbHVlKSwgdW5jb250cm9sbGVkVmFsdWUgPSBfYVswXSwgc2V0VmFsdWUgPSBfYVsxXTtcbiAgICB2YXIgdmFsdWUgPSBjb250cm9sbGVkVmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuY29udHJvbGxlZFZhbHVlIDogY29udHJvbGxlZFZhbHVlO1xuICAgIHJldHVybiBbdmFsdWUsIHNldFZhbHVlXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZUNvbnRyb2xsZWRWYWx1ZS5qcy5tYXAiLCJpbXBvcnQgeyBhZGRNb250aHMsIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG4vKiogUmV0dXJuIHRoZSBpbml0aWFsIG1vbnRoIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbml0aWFsTW9udGgoY29udGV4dCkge1xuICAgIHZhciBtb250aCA9IGNvbnRleHQubW9udGgsIGRlZmF1bHRNb250aCA9IGNvbnRleHQuZGVmYXVsdE1vbnRoLCB0b2RheSA9IGNvbnRleHQudG9kYXk7XG4gICAgdmFyIGluaXRpYWxNb250aCA9IG1vbnRoIHx8IGRlZmF1bHRNb250aCB8fCB0b2RheSB8fCBuZXcgRGF0ZSgpO1xuICAgIHZhciB0b0RhdGUgPSBjb250ZXh0LnRvRGF0ZSwgZnJvbURhdGUgPSBjb250ZXh0LmZyb21EYXRlLCBfYSA9IGNvbnRleHQubnVtYmVyT2ZNb250aHMsIG51bWJlck9mTW9udGhzID0gX2EgPT09IHZvaWQgMCA/IDEgOiBfYTtcbiAgICAvLyBGaXggdGhlIGluaXRpYWxNb250aCBpZiBpcyBhZnRlciB0aGUgdG8tZGF0ZVxuICAgIGlmICh0b0RhdGUgJiYgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHModG9EYXRlLCBpbml0aWFsTW9udGgpIDwgMCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gLTEgKiAobnVtYmVyT2ZNb250aHMgLSAxKTtcbiAgICAgICAgaW5pdGlhbE1vbnRoID0gYWRkTW9udGhzKHRvRGF0ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gRml4IHRoZSBpbml0aWFsTW9udGggaWYgaXMgYmVmb3JlIHRoZSBmcm9tLWRhdGVcbiAgICBpZiAoZnJvbURhdGUgJiYgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoaW5pdGlhbE1vbnRoLCBmcm9tRGF0ZSkgPCAwKSB7XG4gICAgICAgIGluaXRpYWxNb250aCA9IGZyb21EYXRlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRPZk1vbnRoKGluaXRpYWxNb250aCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRJbml0aWFsTW9udGguanMubWFwIiwiaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZUNvbnRyb2xsZWRWYWx1ZSc7XG5pbXBvcnQgeyBnZXRJbml0aWFsTW9udGggfSBmcm9tICcuL3V0aWxzL2dldEluaXRpYWxNb250aCc7XG4vKiogQ29udHJvbHMgdGhlIG5hdmlnYXRpb24gc3RhdGUuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTmF2aWdhdGlvblN0YXRlKCkge1xuICAgIHZhciBjb250ZXh0ID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIGluaXRpYWxNb250aCA9IGdldEluaXRpYWxNb250aChjb250ZXh0KTtcbiAgICB2YXIgX2EgPSB1c2VDb250cm9sbGVkVmFsdWUoaW5pdGlhbE1vbnRoLCBjb250ZXh0Lm1vbnRoKSwgbW9udGggPSBfYVswXSwgc2V0TW9udGggPSBfYVsxXTtcbiAgICB2YXIgZ29Ub01vbnRoID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuZGlzYWJsZU5hdmlnYXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHNldE1vbnRoKGRhdGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFttb250aCwgZ29Ub01vbnRoXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZU5hdmlnYXRpb25TdGF0ZS5qcy5tYXAiLCJpbXBvcnQgeyBhZGRNb250aHMsIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFJldHVybiB0aGUgbW9udGhzIHRvIGRpc3BsYXkgaW4gdGhlIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZlxuICogbW9udGhzIGFuZCB0aGUgZnJvbS90byBkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcGxheU1vbnRocyhtb250aCwgX2EpIHtcbiAgICB2YXIgcmV2ZXJzZU1vbnRocyA9IF9hLnJldmVyc2VNb250aHMsIG51bWJlck9mTW9udGhzID0gX2EubnVtYmVyT2ZNb250aHM7XG4gICAgdmFyIHN0YXJ0ID0gc3RhcnRPZk1vbnRoKG1vbnRoKTtcbiAgICB2YXIgZW5kID0gc3RhcnRPZk1vbnRoKGFkZE1vbnRocyhzdGFydCwgbnVtYmVyT2ZNb250aHMpKTtcbiAgICB2YXIgbW9udGhzRGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGVuZCwgc3RhcnQpO1xuICAgIHZhciBtb250aHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vbnRoc0RpZmY7IGkrKykge1xuICAgICAgICB2YXIgbmV4dE1vbnRoID0gYWRkTW9udGhzKHN0YXJ0LCBpKTtcbiAgICAgICAgbW9udGhzLnB1c2gobmV4dE1vbnRoKTtcbiAgICB9XG4gICAgaWYgKHJldmVyc2VNb250aHMpXG4gICAgICAgIG1vbnRocyA9IG1vbnRocy5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIG1vbnRocztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldERpc3BsYXlNb250aHMuanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0IG1vbnRoIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZSB0byBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuXG4gKiBvcHRpb25zLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIG5leHQgbW9udGggaXMgbm90IGFsd2F5cyB0aGUgbmV4dCBjYWxlbmRhciBtb250aDpcbiAqXG4gKiAtIGlmIGFmdGVyIHRoZSBgdG9EYXRlYCByYW5nZSwgaXMgdW5kZWZpbmVkO1xuICogLSBpZiB0aGUgbmF2aWdhdGlvbiBpcyBwYWdlZCwgaXMgdGhlIG51bWJlciBvZiBtb250aHMgZGlzcGxheWVkIGFoZWFkLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRNb250aChzdGFydGluZ01vbnRoLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZU5hdmlnYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHRvRGF0ZSA9IG9wdGlvbnMudG9EYXRlLCBwYWdlZE5hdmlnYXRpb24gPSBvcHRpb25zLnBhZ2VkTmF2aWdhdGlvbiwgX2EgPSBvcHRpb25zLm51bWJlck9mTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hID09PSB2b2lkIDAgPyAxIDogX2E7XG4gICAgdmFyIG9mZnNldCA9IHBhZ2VkTmF2aWdhdGlvbiA/IG51bWJlck9mTW9udGhzIDogMTtcbiAgICB2YXIgbW9udGggPSBzdGFydE9mTW9udGgoc3RhcnRpbmdNb250aCk7XG4gICAgaWYgKCF0b0RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGFkZE1vbnRocyhtb250aCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgdmFyIG1vbnRoc0RpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyh0b0RhdGUsIHN0YXJ0aW5nTW9udGgpO1xuICAgIGlmIChtb250aHNEaWZmIDwgbnVtYmVyT2ZNb250aHMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gSnVtcCBmb3J3YXJkIGFzIHRoZSBudW1iZXIgb2YgbW9udGhzIHdoZW4gcGFnZWQgbmF2aWdhdGlvblxuICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIG9mZnNldCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXROZXh0TW9udGguanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0IHByZXZpb3VzIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZSB0bywgYWNjb3JkaW5nIHRvIHRoZSBnaXZlblxuICogb3B0aW9ucy5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBwcmV2aW91cyBtb250aCBpcyBub3QgYWx3YXlzIHRoZSBwcmV2aW91cyBjYWxlbmRhclxuICogbW9udGg6XG4gKlxuICogLSBpZiBiZWZvcmUgdGhlIGBmcm9tRGF0ZWAgZGF0ZSwgaXMgYHVuZGVmaW5lZGA7XG4gKiAtIGlmIHRoZSBuYXZpZ2F0aW9uIGlzIHBhZ2VkLCBpcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBkaXNwbGF5ZWQgYmVmb3JlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzTW9udGgoc3RhcnRpbmdNb250aCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRpc2FibGVOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBmcm9tRGF0ZSA9IG9wdGlvbnMuZnJvbURhdGUsIHBhZ2VkTmF2aWdhdGlvbiA9IG9wdGlvbnMucGFnZWROYXZpZ2F0aW9uLCBfYSA9IG9wdGlvbnMubnVtYmVyT2ZNb250aHMsIG51bWJlck9mTW9udGhzID0gX2EgPT09IHZvaWQgMCA/IDEgOiBfYTtcbiAgICB2YXIgb2Zmc2V0ID0gcGFnZWROYXZpZ2F0aW9uID8gbnVtYmVyT2ZNb250aHMgOiAxO1xuICAgIHZhciBtb250aCA9IHN0YXJ0T2ZNb250aChzdGFydGluZ01vbnRoKTtcbiAgICBpZiAoIWZyb21EYXRlKSB7XG4gICAgICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIC1vZmZzZXQpO1xuICAgIH1cbiAgICB2YXIgbW9udGhzRGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG1vbnRoLCBmcm9tRGF0ZSk7XG4gICAgaWYgKG1vbnRoc0RpZmYgPD0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBKdW1wIGJhY2sgYXMgdGhlIG51bWJlciBvZiBtb250aHMgd2hlbiBwYWdlZCBuYXZpZ2F0aW9uXG4gICAgcmV0dXJuIGFkZE1vbnRocyhtb250aCwgLW9mZnNldCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRQcmV2aW91c01vbnRoLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi9EYXlQaWNrZXInO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvblN0YXRlIH0gZnJvbSAnLi91c2VOYXZpZ2F0aW9uU3RhdGUnO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vbnRocyB9IGZyb20gJy4vdXRpbHMvZ2V0RGlzcGxheU1vbnRocyc7XG5pbXBvcnQgeyBnZXROZXh0TW9udGggfSBmcm9tICcuL3V0aWxzL2dldE5leHRNb250aCc7XG5pbXBvcnQgeyBnZXRQcmV2aW91c01vbnRoIH0gZnJvbSAnLi91dGlscy9nZXRQcmV2aW91c01vbnRoJztcbi8qKlxuICogVGhlIE5hdmlnYXRpb24gY29udGV4dCBzaGFyZXMgZGV0YWlscyBhYm91dCB0aGUgbW9udGhzIGJlaW5nIG5hdmlnYXRlZCBpbiBEYXlQaWNrZXIuXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZU5hdmlnYXRpb25dXSBob29rLlxuICovXG5leHBvcnQgdmFyIE5hdmlnYXRpb25Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW05hdmlnYXRpb25Db250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gTmF2aWdhdGlvblByb3ZpZGVyKHByb3BzKSB7XG4gICAgdmFyIGNvbnRleHQgPSB1c2VEYXlQaWNrZXIoKTtcbiAgICB2YXIgX2EgPSB1c2VOYXZpZ2F0aW9uU3RhdGUoKSwgbW9udGggPSBfYVswXSwgZ29Ub01vbnRoID0gX2FbMV07XG4gICAgdmFyIGRpc3BsYXlNb250aHMgPSBnZXREaXNwbGF5TW9udGhzKG1vbnRoLCBjb250ZXh0KTtcbiAgICB2YXIgbmV4dE1vbnRoID0gZ2V0TmV4dE1vbnRoKG1vbnRoLCBjb250ZXh0KTtcbiAgICB2YXIgcHJldmlvdXNNb250aCA9IGdldFByZXZpb3VzTW9udGgobW9udGgsIGNvbnRleHQpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZToge1xuICAgICAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICAgICAgZGlzcGxheU1vbnRoczogZGlzcGxheU1vbnRocyxcbiAgICAgICAgICAgIGdvVG9Nb250aDogZ29Ub01vbnRoLFxuICAgICAgICAgICAgcHJldmlvdXNNb250aDogcHJldmlvdXNNb250aCxcbiAgICAgICAgICAgIG5leHRNb250aDogbmV4dE1vbnRoXG4gICAgICAgIH0gfSwgcHJvcHMuY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdmlnYXRpb25Db250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29udGV4dCB9IGZyb20gJy4vTmF2aWdhdGlvbkNvbnRleHQnO1xuLyoqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW05hdmlnYXRpb25Db250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTmF2aWdhdGlvbigpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZU5hdmlnYXRpb24gbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE5hdmlnYXRpb25Qcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZU5hdmlnYXRpb24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzU2FtZU1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgTW9udGhzRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01vbnRoc0Ryb3Bkb3duJztcbmltcG9ydCB7IE5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL05hdmlnYXRpb24nO1xuaW1wb3J0IHsgWWVhcnNEcm9wZG93biB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvWWVhcnNEcm9wZG93bic7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvbiB9IGZyb20gJy4uLy4uL2NvbnRleHRzL05hdmlnYXRpb24nO1xuLyoqXG4gKiBSZW5kZXIgdGhlIGNhcHRpb24gb2YgYSBtb250aCwgd2hpY2ggaW5jbHVkZXMgdGl0bGUgYW5kIG5hdmlnYXRpb24gYnV0dG9ucy5cbiAqIFRoZSBjYXB0aW9uIGhhcyBhIGRpZmZlcmVudCBsYXlvdXQgd2hlbiBzZXR0aW5nIHRoZSBbW0RheVBpY2tlclByb3BzLmNhcHRpb25MYXlvdXRdXSBwcm9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FwdGlvbihwcm9wcykge1xuICAgIHZhciBfYTtcbiAgICB2YXIgZGlzcGxheU1vbnRoID0gcHJvcHMuZGlzcGxheU1vbnRoO1xuICAgIHZhciBjb250ZXh0ID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBjb250ZXh0LmNsYXNzTmFtZXMsIG51bWJlck9mTW9udGhzID0gY29udGV4dC5udW1iZXJPZk1vbnRocywgZGlzYWJsZU5hdmlnYXRpb24gPSBjb250ZXh0LmRpc2FibGVOYXZpZ2F0aW9uLCBzdHlsZXMgPSBjb250ZXh0LnN0eWxlcywgY2FwdGlvbkxheW91dCA9IGNvbnRleHQuY2FwdGlvbkxheW91dCwgb25Nb250aENoYW5nZSA9IGNvbnRleHQub25Nb250aENoYW5nZSwgZGlyID0gY29udGV4dC5kaXIsIENhcHRpb25MYWJlbCA9IGNvbnRleHQuY29tcG9uZW50cy5DYXB0aW9uTGFiZWw7XG4gICAgdmFyIF9iID0gdXNlTmF2aWdhdGlvbigpLCBwcmV2aW91c01vbnRoID0gX2IucHJldmlvdXNNb250aCwgbmV4dE1vbnRoID0gX2IubmV4dE1vbnRoLCBnb1RvTW9udGggPSBfYi5nb1RvTW9udGgsIGRpc3BsYXlNb250aHMgPSBfYi5kaXNwbGF5TW9udGhzO1xuICAgIHZhciBoYW5kbGVQcmV2aW91c0NsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXByZXZpb3VzTW9udGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGdvVG9Nb250aChwcmV2aW91c01vbnRoKTtcbiAgICAgICAgb25Nb250aENoYW5nZSA9PT0gbnVsbCB8fCBvbk1vbnRoQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vbnRoQ2hhbmdlKHByZXZpb3VzTW9udGgpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZU5leHRDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFuZXh0TW9udGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGdvVG9Nb250aChuZXh0TW9udGgpO1xuICAgICAgICBvbk1vbnRoQ2hhbmdlID09PSBudWxsIHx8IG9uTW9udGhDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW9udGhDaGFuZ2UobmV4dE1vbnRoKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVNb250aENoYW5nZSA9IGZ1bmN0aW9uIChuZXdNb250aCkge1xuICAgICAgICBnb1RvTW9udGgobmV3TW9udGgpO1xuICAgICAgICBvbk1vbnRoQ2hhbmdlID09PSBudWxsIHx8IG9uTW9udGhDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW9udGhDaGFuZ2UobmV3TW9udGgpO1xuICAgIH07XG4gICAgdmFyIGRpc3BsYXlJbmRleCA9IGRpc3BsYXlNb250aHMuZmluZEluZGV4KGZ1bmN0aW9uIChtb250aCkge1xuICAgICAgICByZXR1cm4gaXNTYW1lTW9udGgoZGlzcGxheU1vbnRoLCBtb250aCk7XG4gICAgfSk7XG4gICAgdmFyIGlzRmlyc3QgPSBkaXNwbGF5SW5kZXggPT09IDA7XG4gICAgdmFyIGlzTGFzdCA9IGRpc3BsYXlJbmRleCA9PT0gZGlzcGxheU1vbnRocy5sZW5ndGggLSAxO1xuICAgIGlmIChkaXIgPT09ICdydGwnKSB7XG4gICAgICAgIF9hID0gW2lzRmlyc3QsIGlzTGFzdF0sIGlzTGFzdCA9IF9hWzBdLCBpc0ZpcnN0ID0gX2FbMV07XG4gICAgfVxuICAgIHZhciBoaWRlTmV4dCA9IG51bWJlck9mTW9udGhzID4gMSAmJiAoaXNGaXJzdCB8fCAhaXNMYXN0KTtcbiAgICB2YXIgaGlkZVByZXZpb3VzID0gbnVtYmVyT2ZNb250aHMgPiAxICYmIChpc0xhc3QgfHwgIWlzRmlyc3QpO1xuICAgIHZhciBjYXB0aW9uTGFiZWwgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChDYXB0aW9uTGFiZWwsIHsgaWQ6IHByb3BzLmlkLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCB9KSk7XG4gICAgdmFyIGNhcHRpb25Db250ZW50O1xuICAgIGlmIChkaXNhYmxlTmF2aWdhdGlvbikge1xuICAgICAgICBjYXB0aW9uQ29udGVudCA9IGNhcHRpb25MYWJlbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2FwdGlvbkxheW91dCA9PT0gJ2Ryb3Bkb3duJykge1xuICAgICAgICBjYXB0aW9uQ29udGVudCA9IChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNhcHRpb25fZHJvcGRvd25zLCBzdHlsZTogc3R5bGVzLmNhcHRpb25fZHJvcGRvd25zIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4gfSwgY2FwdGlvbkxhYmVsKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTW9udGhzRHJvcGRvd24sIHsgb25DaGFuZ2U6IGhhbmRsZU1vbnRoQ2hhbmdlLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCB9KSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoWWVhcnNEcm9wZG93biwgeyBvbkNoYW5nZTogaGFuZGxlTW9udGhDaGFuZ2UsIGRpc3BsYXlNb250aDogZGlzcGxheU1vbnRoIH0pKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0aW9uQ29udGVudCA9IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgY2FwdGlvbkxhYmVsLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uLCB7IGRpc3BsYXlNb250aDogZGlzcGxheU1vbnRoLCBoaWRlTmV4dDogaGlkZU5leHQsIGhpZGVQcmV2aW91czogaGlkZVByZXZpb3VzLCBuZXh0TW9udGg6IG5leHRNb250aCwgcHJldmlvdXNNb250aDogcHJldmlvdXNNb250aCwgb25QcmV2aW91c0NsaWNrOiBoYW5kbGVQcmV2aW91c0NsaWNrLCBvbk5leHRDbGljazogaGFuZGxlTmV4dENsaWNrIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jYXB0aW9uLCBzdHlsZTogc3R5bGVzLmNhcHRpb24gfSwgY2FwdGlvbkNvbnRlbnQpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcHRpb24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG4vKiogUmVuZGVyIHRoZSBjYXB0aW9uIGZvciB0aGUgZGlzcGxheWVkIG1vbnRoLiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHdoZW4gYGNhcHRpb25MYXlvdXQ9XCJidXR0b25zXCJgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhcHRpb25MYWJlbChwcm9wcykge1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBsb2NhbGUgPSBfYS5sb2NhbGUsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGZvcm1hdENhcHRpb24gPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdENhcHRpb247XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2FwdGlvbl9sYWJlbCwgc3R5bGU6IHN0eWxlcy5jYXB0aW9uX2xhYmVsLCBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLCBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiLCBpZDogcHJvcHMuaWQgfSwgZm9ybWF0Q2FwdGlvbihwcm9wcy5kaXNwbGF5TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcHRpb25MYWJlbC5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BzIGFyZSBvZiB0eXBlIFtbRGF5UGlja2VyTXVsdGlwbGVdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RheVBpY2tlck11bHRpcGxlKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLm1vZGUgPT09ICdtdWx0aXBsZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlQaWNrZXJNdWx0aXBsZS5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNEYXlQaWNrZXJNdWx0aXBsZSB9IGZyb20gJy4uLy4uL3R5cGVzL0RheVBpY2tlck11bHRpcGxlJztcbi8qKlxuICogVGhlIFNlbGVjdE11bHRpcGxlIGNvbnRleHQgc2hhcmVzIGRldGFpbHMgYWJvdXQgdGhlIHNlbGVjdGVkIGRheXMgd2hlbiBpblxuICogbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUuXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZVNlbGVjdE11bHRpcGxlXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3RNdWx0aXBsZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKiogUHJvdmlkZXMgdGhlIHZhbHVlcyBmb3IgdGhlIFtbU2VsZWN0TXVsdGlwbGVDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVQcm92aWRlcihwcm9wcykge1xuICAgIGlmICghaXNEYXlQaWNrZXJNdWx0aXBsZShwcm9wcy5pbml0aWFsUHJvcHMpKSB7XG4gICAgICAgIHZhciBlbXB0eUNvbnRleHRWYWx1ZSA9IHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdE11bHRpcGxlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZW1wdHlDb250ZXh0VmFsdWUgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdE11bHRpcGxlUHJvdmlkZXJJbnRlcm5hbCwgeyBpbml0aWFsUHJvcHM6IHByb3BzLmluaXRpYWxQcm9wcywgY2hpbGRyZW46IHByb3BzLmNoaWxkcmVuIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RNdWx0aXBsZVByb3ZpZGVySW50ZXJuYWwoX2EpIHtcbiAgICB2YXIgaW5pdGlhbFByb3BzID0gX2EuaW5pdGlhbFByb3BzLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBzZWxlY3RlZCA9IGluaXRpYWxQcm9wcy5zZWxlY3RlZDtcbiAgICB2YXIgb25EYXlDbGljayA9IGZ1bmN0aW9uIChkYXksIG1vZGlmaWVycywgZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2EgPSBpbml0aWFsUHJvcHMub25EYXlDbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoaW5pdGlhbFByb3BzLCBkYXksIG1vZGlmaWVycywgZSk7XG4gICAgICAgIHZhciBpc01pblNlbGVjdGVkID0gQm9vbGVhbihpbml0aWFsUHJvcHMubWluICYmXG4gICAgICAgICAgICBtb2RpZmllcnMuc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkICYmXG4gICAgICAgICAgICBzZWxlY3RlZC5sZW5ndGggPT09IGluaXRpYWxQcm9wcy5taW4pO1xuICAgICAgICBpZiAoaXNNaW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc01heFNlbGVjdGVkID0gQm9vbGVhbihpbml0aWFsUHJvcHMubWF4ICYmXG4gICAgICAgICAgICAhbW9kaWZpZXJzLnNlbGVjdGVkICYmXG4gICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWQubGVuZ3RoID09PSBpbml0aWFsUHJvcHMubWF4KTtcbiAgICAgICAgaWYgKGlzTWF4U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyA9IHNlbGVjdGVkID8gX19zcHJlYWRBcnJheShbXSwgc2VsZWN0ZWQsIHRydWUpIDogW107XG4gICAgICAgIGlmIChtb2RpZmllcnMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGRheXMuZmluZEluZGV4KGZ1bmN0aW9uIChzZWxlY3RlZERheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1NhbWVEYXkoZGF5LCBzZWxlY3RlZERheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRheXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRheXMucHVzaChkYXkpO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IGluaXRpYWxQcm9wcy5vblNlbGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoaW5pdGlhbFByb3BzLCBkYXlzLCBkYXksIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgbW9kaWZpZXJzID0ge1xuICAgICAgICBkaXNhYmxlZDogW11cbiAgICB9O1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBtb2RpZmllcnMuZGlzYWJsZWQgPSBbXG4gICAgICAgICAgICBmdW5jdGlvbiBkaXNhYmxlRGF5KGRheSkge1xuICAgICAgICAgICAgICAgIHZhciBpc01heFNlbGVjdGVkID0gaW5pdGlhbFByb3BzLm1heCAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5sZW5ndGggPiBpbml0aWFsUHJvcHMubWF4IC0gMTtcbiAgICAgICAgICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IHNlbGVjdGVkID09PSBudWxsIHx8IHNlbGVjdGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZC5zb21lKGZ1bmN0aW9uIChzZWxlY3RlZERheSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTYW1lRGF5KHNlbGVjdGVkRGF5LCBkYXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGlzTWF4U2VsZWN0ZWQgJiYgIWlzU2VsZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cbiAgICB2YXIgY29udGV4dFZhbHVlID0geyBzZWxlY3RlZDogc2VsZWN0ZWQsIG9uRGF5Q2xpY2s6IG9uRGF5Q2xpY2ssIG1vZGlmaWVyczogbW9kaWZpZXJzIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdE11bHRpcGxlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY29udGV4dFZhbHVlIH0sIGNoaWxkcmVuKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZWxlY3RNdWx0aXBsZUNvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNlbGVjdE11bHRpcGxlQ29udGV4dCB9IGZyb20gJy4vU2VsZWN0TXVsdGlwbGVDb250ZXh0Jztcbi8qKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tTZWxlY3RNdWx0aXBsZUNvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3RNdWx0aXBsZSgpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU2VsZWN0TXVsdGlwbGVDb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VTZWxlY3RNdWx0aXBsZSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgU2VsZWN0TXVsdGlwbGVQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZVNlbGVjdE11bHRpcGxlLmpzLm1hcCIsIi8qKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcHJvcHMgYXJlIG9mIHR5cGUgW1tEYXlQaWNrZXJSYW5nZV1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF5UGlja2VyUmFuZ2UocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMubW9kZSA9PT0gJ3JhbmdlJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURheVBpY2tlclJhbmdlLmpzLm1hcCIsImltcG9ydCB7IGlzQWZ0ZXIsIGlzQmVmb3JlLCBpc1NhbWVEYXkgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIEFkZCBhIGRheSB0byBhbiBleGlzdGluZyByYW5nZS5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcmFuZ2UgdGFrZXMgaW4gYWNjb3VudCB0aGUgYHVuZGVmaW5lZGAgdmFsdWVzIGFuZCBpZiB0aGUgYWRkZWRcbiAqIGRheSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9SYW5nZShkYXksIHJhbmdlKSB7XG4gICAgdmFyIF9hID0gcmFuZ2UgfHwge30sIGZyb20gPSBfYS5mcm9tLCB0byA9IF9hLnRvO1xuICAgIGlmICghZnJvbSkge1xuICAgICAgICByZXR1cm4geyBmcm9tOiBkYXksIHRvOiBkYXkgfTtcbiAgICB9XG4gICAgaWYgKCF0byAmJiBpc1NhbWVEYXkoZnJvbSwgZGF5KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRvICYmIGlzQmVmb3JlKGRheSwgZnJvbSkpIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZGF5LCB0bzogZnJvbSB9O1xuICAgIH1cbiAgICBpZiAoIXRvKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IGZyb20sIHRvOiBkYXkgfTtcbiAgICB9XG4gICAgaWYgKGlzU2FtZURheSh0bywgZGF5KSAmJiBpc1NhbWVEYXkoZnJvbSwgZGF5KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNTYW1lRGF5KHRvLCBkYXkpKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHRvLCB0bzogdG8gfTtcbiAgICB9XG4gICAgaWYgKGlzU2FtZURheShmcm9tLCBkYXkpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpc0FmdGVyKGZyb20sIGRheSkpIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZGF5LCB0bzogdG8gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZnJvbTogZnJvbSwgdG86IGRheSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkVG9SYW5nZS5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLCBpc0FmdGVyLCBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGlzRGF5UGlja2VyUmFuZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9EYXlQaWNrZXJSYW5nZSc7XG5pbXBvcnQgeyBhZGRUb1JhbmdlIH0gZnJvbSAnLi91dGlscy9hZGRUb1JhbmdlJztcbi8qKlxuICogVGhlIFNlbGVjdFJhbmdlIGNvbnRleHQgc2hhcmVzIGRldGFpbHMgYWJvdXQgdGhlIHNlbGVjdGVkIGRheXMgd2hlbiBpblxuICogcmFuZ2Ugc2VsZWN0aW9uIG1vZGUuXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZVNlbGVjdFJhbmdlXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3RSYW5nZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKiogUHJvdmlkZXMgdGhlIHZhbHVlcyBmb3IgdGhlIFtbU2VsZWN0UmFuZ2VQcm92aWRlcl1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdFJhbmdlUHJvdmlkZXIocHJvcHMpIHtcbiAgICBpZiAoIWlzRGF5UGlja2VyUmFuZ2UocHJvcHMuaW5pdGlhbFByb3BzKSkge1xuICAgICAgICB2YXIgZW1wdHlDb250ZXh0VmFsdWUgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICAgICAgcmFuZ2Vfc3RhcnQ6IFtdLFxuICAgICAgICAgICAgICAgIHJhbmdlX2VuZDogW10sXG4gICAgICAgICAgICAgICAgcmFuZ2VfbWlkZGxlOiBbXSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFJhbmdlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZW1wdHlDb250ZXh0VmFsdWUgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFJhbmdlUHJvdmlkZXJJbnRlcm5hbCwgeyBpbml0aWFsUHJvcHM6IHByb3BzLmluaXRpYWxQcm9wcywgY2hpbGRyZW46IHByb3BzLmNoaWxkcmVuIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RSYW5nZVByb3ZpZGVySW50ZXJuYWwoX2EpIHtcbiAgICB2YXIgaW5pdGlhbFByb3BzID0gX2EuaW5pdGlhbFByb3BzLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBzZWxlY3RlZCA9IGluaXRpYWxQcm9wcy5zZWxlY3RlZDtcbiAgICB2YXIgbWluID0gaW5pdGlhbFByb3BzLm1pbjtcbiAgICB2YXIgbWF4ID0gaW5pdGlhbFByb3BzLm1heDtcbiAgICB2YXIgb25EYXlDbGljayA9IGZ1bmN0aW9uIChkYXksIG1vZGlmaWVycywgZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2EgPSBpbml0aWFsUHJvcHMub25EYXlDbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoaW5pdGlhbFByb3BzLCBkYXksIG1vZGlmaWVycywgZSk7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGFkZFRvUmFuZ2UoZGF5LCBzZWxlY3RlZCk7XG4gICAgICAgIGlmICgobWluIHx8IG1heCkgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkICYmXG4gICAgICAgICAgICAobmV3VmFsdWUgPT09IG51bGwgfHwgbmV3VmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld1ZhbHVlLnRvKSAmJlxuICAgICAgICAgICAgbmV3VmFsdWUuZnJvbSAmJlxuICAgICAgICAgICAgbmV3VmFsdWUuZnJvbSAhPT0gbmV3VmFsdWUudG8pIHtcbiAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKG5ld1ZhbHVlID09PSBudWxsIHx8IG5ld1ZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWx1ZS50bywgbmV3VmFsdWUgPT09IG51bGwgfHwgbmV3VmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld1ZhbHVlLmZyb20pKTtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZGlmZiA8IG1pbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXggJiYgZGlmZiA+PSBtYXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKF9iID0gaW5pdGlhbFByb3BzLm9uU2VsZWN0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChpbml0aWFsUHJvcHMsIG5ld1ZhbHVlLCBkYXksIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgbW9kaWZpZXJzID0ge1xuICAgICAgICByYW5nZV9zdGFydDogW10sXG4gICAgICAgIHJhbmdlX2VuZDogW10sXG4gICAgICAgIHJhbmdlX21pZGRsZTogW10sXG4gICAgICAgIGRpc2FibGVkOiBbXVxuICAgIH07XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZC5mcm9tKSB7XG4gICAgICAgICAgICBtb2RpZmllcnMucmFuZ2Vfc3RhcnQgPSBbc2VsZWN0ZWQuZnJvbV07XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQudG8pIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcnMucmFuZ2VfbWlkZGxlID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlcjogc2VsZWN0ZWQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZTogc2VsZWN0ZWQudG9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKG1heCB8fCBtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLmRpc2FibGVkID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnRvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCZWZvcmUoZGF0ZSwgc2VsZWN0ZWQuZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoc2VsZWN0ZWQudG8sIGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+PSBtYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQudG8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuZnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyKGRhdGUsIHNlbGVjdGVkLnRvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXRlLCBzZWxlY3RlZC5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPj0gbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluICYmIHNlbGVjdGVkLmZyb20gJiYgaXNCZWZvcmUoZGF0ZSwgc2VsZWN0ZWQuZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoc2VsZWN0ZWQuZnJvbSwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnRvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihkYXRlLCBzZWxlY3RlZC50bykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZSwgc2VsZWN0ZWQuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZGlmaWVycy5yYW5nZV9lbmQgPSBbc2VsZWN0ZWQudG9dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzLnJhbmdlX2VuZCA9IFtzZWxlY3RlZC5mcm9tXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0UmFuZ2VDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB7IHNlbGVjdGVkOiBzZWxlY3RlZCwgb25EYXlDbGljazogb25EYXlDbGljaywgbW9kaWZpZXJzOiBtb2RpZmllcnMgfSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0UmFuZ2VDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTZWxlY3RSYW5nZUNvbnRleHQgfSBmcm9tICcuL1NlbGVjdFJhbmdlQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbU2VsZWN0UmFuZ2VDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2VsZWN0UmFuZ2UoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdFJhbmdlQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0UmFuZ2UgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFNlbGVjdFJhbmdlUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VTZWxlY3RSYW5nZS5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BzIGFyZSBvZiB0eXBlIFtbRGF5UGlja2VyU2luZ2xlXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXlQaWNrZXJTaW5nbGUocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMubW9kZSA9PT0gJ3NpbmdsZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlQaWNrZXJTaW5nbGUuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRGF5UGlja2VyU2luZ2xlIH0gZnJvbSAnLi4vLi4vdHlwZXMvRGF5UGlja2VyU2luZ2xlJztcbi8qKlxuICogVGhlIFNlbGVjdFNpbmdsZSBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBzZWxlY3RlZCBkYXlzIHdoZW4gaW5cbiAqIHNpbmdsZSBzZWxlY3Rpb24gbW9kZS5cbiAqXG4gKiBBY2Nlc3MgdGhpcyBjb250ZXh0IGZyb20gdGhlIFtbdXNlU2VsZWN0U2luZ2xlXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3RTaW5nbGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW1NlbGVjdFNpbmdsZVByb3ZpZGVyXV0uICovXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0U2luZ2xlUHJvdmlkZXIocHJvcHMpIHtcbiAgICBpZiAoIWlzRGF5UGlja2VyU2luZ2xlKHByb3BzLmluaXRpYWxQcm9wcykpIHtcbiAgICAgICAgdmFyIGVtcHR5Q29udGV4dFZhbHVlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0U2luZ2xlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZW1wdHlDb250ZXh0VmFsdWUgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZVByb3ZpZGVySW50ZXJuYWwsIHsgaW5pdGlhbFByb3BzOiBwcm9wcy5pbml0aWFsUHJvcHMsIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0U2luZ2xlUHJvdmlkZXJJbnRlcm5hbChfYSkge1xuICAgIHZhciBpbml0aWFsUHJvcHMgPSBfYS5pbml0aWFsUHJvcHMsIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIG9uRGF5Q2xpY2sgPSBmdW5jdGlvbiAoZGF5LCBkYXlNb2RpZmllcnMsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKGRheU1vZGlmaWVycy5zZWxlY3RlZCAmJiAhaW5pdGlhbFByb3BzLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAoX2EgPSBpbml0aWFsUHJvcHMub25TZWxlY3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGluaXRpYWxQcm9wcywgdW5kZWZpbmVkLCBkYXksIGRheU1vZGlmaWVycywgZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKF9iID0gaW5pdGlhbFByb3BzLm9uU2VsZWN0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChpbml0aWFsUHJvcHMsIGRheSwgZGF5LCBkYXlNb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGNvbnRleHRWYWx1ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWQ6IGluaXRpYWxQcm9wcy5zZWxlY3RlZCxcbiAgICAgICAgb25EYXlDbGljazogb25EYXlDbGlja1xuICAgIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHRWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0U2luZ2xlQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2VsZWN0U2luZ2xlQ29udGV4dCB9IGZyb20gJy4vU2VsZWN0U2luZ2xlQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbU2VsZWN0U2luZ2xlQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdFNpbmdsZSgpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU2VsZWN0U2luZ2xlQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0U2luZ2xlIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBTZWxlY3RTaW5nbGVQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZVNlbGVjdFNpbmdsZS5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gdG9NYXRjaGVyQXJyYXkobW9kaWZpZXJGcm9tUHJvcCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGlmaWVyRnJvbVByb3ApKSB7XG4gICAgICAgIHJldHVybiBtb2RpZmllckZyb21Qcm9wO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RpZmllckZyb21Qcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFttb2RpZmllckZyb21Qcm9wXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b01hdGNoZXJBcnJheS5qcy5tYXAiLCJpbXBvcnQgeyB0b01hdGNoZXJBcnJheSB9IGZyb20gJy4vdG9NYXRjaGVyQXJyYXknO1xuLyoqIFJldHVybiB0aGUgW1tDdXN0b21Nb2RpZmllcnNdXSBmcm9tIHRoZSBEYXlQaWNrZXIgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21Nb2RpZmllcnMoZGF5UGlja2VyKSB7XG4gICAgdmFyIGN1c3RvbU1vZGlmaWVycyA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKGRheVBpY2tlci5tb2RpZmllcnMpLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBtb2RpZmllciA9IF9hWzBdLCBtYXRjaGVyID0gX2FbMV07XG4gICAgICAgIGN1c3RvbU1vZGlmaWVyc1ttb2RpZmllcl0gPSB0b01hdGNoZXJBcnJheShtYXRjaGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tTW9kaWZpZXJzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q3VzdG9tTW9kaWZpZXJzLmpzLm1hcCIsIi8qKiBUaGUgbW9kaWZpZXJzIHRoYXQgYXJlIHVzZWQgaW50ZXJuYWxseSBieSBEYXlQaWNrZXIuICovXG5leHBvcnQgdmFyIEludGVybmFsTW9kaWZpZXI7XG4oZnVuY3Rpb24gKEludGVybmFsTW9kaWZpZXIpIHtcbiAgICAvKiogTmFtZSBvZiB0aGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgZGlzYWJsZWQgZGF5cywgdXNpbmcgdGhlIGBkaXNhYmxlZGAgcHJvcC4gKi9cbiAgICBJbnRlcm5hbE1vZGlmaWVyW1wiRGlzYWJsZWRcIl0gPSBcImRpc2FibGVkXCI7XG4gICAgLyoqIE5hbWUgb2YgdGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIHNlbGVjdGVkIGRheXMgdXNpbmcgdGhlIGBzZWxlY3RlZGAgcHJvcCkuICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlNlbGVjdGVkXCJdID0gXCJzZWxlY3RlZFwiO1xuICAgIC8qKiBOYW1lIG9mIHRoZSBtb2RpZmllciBhcHBsaWVkIHRvIHRoZSBoaWRkZW4gZGF5cyB1c2luZyB0aGUgYGhpZGRlbmAgcHJvcCkuICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIkhpZGRlblwiXSA9IFwiaGlkZGVuXCI7XG4gICAgLyoqIE5hbWUgb2YgdGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheSBzcGVjaWZpZWQgdXNpbmcgdGhlIGB0b2RheWAgcHJvcCkuICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlRvZGF5XCJdID0gXCJ0b2RheVwiO1xuICAgIC8qKiBUaGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgZGF5IHN0YXJ0aW5nIGEgc2VsZWN0ZWQgcmFuZ2UsIHdoZW4gaW4gcmFuZ2Ugc2VsZWN0aW9uIG1vZGUuICAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJSYW5nZVN0YXJ0XCJdID0gXCJyYW5nZV9zdGFydFwiO1xuICAgIC8qKiBUaGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgZGF5IGVuZGluZyBhIHNlbGVjdGVkIHJhbmdlLCB3aGVuIGluIHJhbmdlIHNlbGVjdGlvbiBtb2RlLiAgKi9cbiAgICBJbnRlcm5hbE1vZGlmaWVyW1wiUmFuZ2VFbmRcIl0gPSBcInJhbmdlX2VuZFwiO1xuICAgIC8qKiBUaGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgZGF5cyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiBhIHNlbGVjdGVkIHJhbmdlLCB3aGVuIGluIHJhbmdlIHNlbGVjdGlvbiBtb2RlLiAgKi9cbiAgICBJbnRlcm5hbE1vZGlmaWVyW1wiUmFuZ2VNaWRkbGVcIl0gPSBcInJhbmdlX21pZGRsZVwiO1xufSkoSW50ZXJuYWxNb2RpZmllciB8fCAoSW50ZXJuYWxNb2RpZmllciA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2RpZmllcnMuanMubWFwIiwiaW1wb3J0IHsgaXNEYXlQaWNrZXJNdWx0aXBsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlck11bHRpcGxlJztcbmltcG9ydCB7IGlzRGF5UGlja2VyUmFuZ2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9EYXlQaWNrZXJSYW5nZSc7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvTW9kaWZpZXJzJztcbmltcG9ydCB7IHRvTWF0Y2hlckFycmF5IH0gZnJvbSAnLi90b01hdGNoZXJBcnJheSc7XG4vKiogUmV0dXJuIHRoZSBbW0ludGVybmFsTW9kaWZpZXJzXV0gZnJvbSB0aGUgRGF5UGlja2VyIGFuZCBzZWxlY3QgY29udGV4dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxNb2RpZmllcnMoZGF5UGlja2VyLCBzZWxlY3RNdWx0aXBsZSwgc2VsZWN0UmFuZ2UpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGludGVybmFsTW9kaWZpZXJzID0gKF9hID0ge30sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuU2VsZWN0ZWRdID0gdG9NYXRjaGVyQXJyYXkoZGF5UGlja2VyLnNlbGVjdGVkKSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5EaXNhYmxlZF0gPSB0b01hdGNoZXJBcnJheShkYXlQaWNrZXIuZGlzYWJsZWQpLFxuICAgICAgICBfYVtJbnRlcm5hbE1vZGlmaWVyLkhpZGRlbl0gPSB0b01hdGNoZXJBcnJheShkYXlQaWNrZXIuaGlkZGVuKSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5Ub2RheV0gPSBbZGF5UGlja2VyLnRvZGF5XSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5SYW5nZUVuZF0gPSBbXSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5SYW5nZU1pZGRsZV0gPSBbXSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5SYW5nZVN0YXJ0XSA9IFtdLFxuICAgICAgICBfYSk7XG4gICAgaWYgKGRheVBpY2tlci5mcm9tRGF0ZSkge1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5wdXNoKHsgYmVmb3JlOiBkYXlQaWNrZXIuZnJvbURhdGUgfSk7XG4gICAgfVxuICAgIGlmIChkYXlQaWNrZXIudG9EYXRlKSB7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLmRpc2FibGVkLnB1c2goeyBhZnRlcjogZGF5UGlja2VyLnRvRGF0ZSB9KTtcbiAgICB9XG4gICAgaWYgKGlzRGF5UGlja2VyTXVsdGlwbGUoZGF5UGlja2VyKSkge1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZCA9IGludGVybmFsTW9kaWZpZXJzLmRpc2FibGVkLmNvbmNhdChzZWxlY3RNdWx0aXBsZS5tb2RpZmllcnMuZGlzYWJsZWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RheVBpY2tlclJhbmdlKGRheVBpY2tlcikpIHtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQgPSBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5jb25jYXQoc2VsZWN0UmFuZ2UubW9kaWZpZXJzLmRpc2FibGVkKTtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMucmFuZ2Vfc3RhcnQgPSBzZWxlY3RSYW5nZS5tb2RpZmllcnMucmFuZ2Vfc3RhcnQ7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLnJhbmdlX21pZGRsZSA9IHNlbGVjdFJhbmdlLm1vZGlmaWVycy5yYW5nZV9taWRkbGU7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLnJhbmdlX2VuZCA9IHNlbGVjdFJhbmdlLm1vZGlmaWVycy5yYW5nZV9lbmQ7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbE1vZGlmaWVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEludGVybmFsTW9kaWZpZXJzLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZVNlbGVjdE11bHRpcGxlIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvU2VsZWN0TXVsdGlwbGUnO1xuaW1wb3J0IHsgdXNlU2VsZWN0UmFuZ2UgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9TZWxlY3RSYW5nZSc7XG5pbXBvcnQgeyBnZXRDdXN0b21Nb2RpZmllcnMgfSBmcm9tICcuL3V0aWxzL2dldEN1c3RvbU1vZGlmaWVycyc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbE1vZGlmaWVycyB9IGZyb20gJy4vdXRpbHMvZ2V0SW50ZXJuYWxNb2RpZmllcnMnO1xuLyoqIFRoZSBNb2RpZmllcnMgY29udGV4dCBzdG9yZSB0aGUgbW9kaWZpZXJzIHVzZWQgaW4gRGF5UGlja2VyLiBUbyBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoaXMgY29udGV4dCwgdXNlIFtbdXNlTW9kaWZpZXJzXV0uICovXG5leHBvcnQgdmFyIE1vZGlmaWVyc0NvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKiogUHJvdmlkZSB0aGUgdmFsdWUgZm9yIHRoZSBbW01vZGlmaWVyc0NvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb2RpZmllcnNQcm92aWRlcihwcm9wcykge1xuICAgIHZhciBkYXlQaWNrZXIgPSB1c2VEYXlQaWNrZXIoKTtcbiAgICB2YXIgc2VsZWN0TXVsdGlwbGUgPSB1c2VTZWxlY3RNdWx0aXBsZSgpO1xuICAgIHZhciBzZWxlY3RSYW5nZSA9IHVzZVNlbGVjdFJhbmdlKCk7XG4gICAgdmFyIGludGVybmFsTW9kaWZpZXJzID0gZ2V0SW50ZXJuYWxNb2RpZmllcnMoZGF5UGlja2VyLCBzZWxlY3RNdWx0aXBsZSwgc2VsZWN0UmFuZ2UpO1xuICAgIHZhciBjdXN0b21Nb2RpZmllcnMgPSBnZXRDdXN0b21Nb2RpZmllcnMoZGF5UGlja2VyKTtcbiAgICB2YXIgbW9kaWZpZXJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGludGVybmFsTW9kaWZpZXJzKSwgY3VzdG9tTW9kaWZpZXJzKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTW9kaWZpZXJzQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogbW9kaWZpZXJzIH0sIHByb3BzLmNoaWxkcmVuKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb2RpZmllcnNDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNb2RpZmllcnNDb250ZXh0IH0gZnJvbSAnLi9Nb2RpZmllcnNDb250ZXh0Jztcbi8qKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tNb2RpZmllcnNDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTW9kaWZpZXJzKCkge1xuICAgIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChNb2RpZmllcnNDb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VNb2RpZmllcnMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE1vZGlmaWVyc1Byb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlTW9kaWZpZXJzLmpzLm1hcCIsIi8qKiBSZXR1cm5zIHRydWUgaWYgYG1hdGNoZXJgIGlzIG9mIHR5cGUgW1tEYXRlSW50ZXJ2YWxdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVJbnRlcnZhbChtYXRjaGVyKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF0Y2hlciAmJlxuICAgICAgICB0eXBlb2YgbWF0Y2hlciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgJ2JlZm9yZScgaW4gbWF0Y2hlciAmJlxuICAgICAgICAnYWZ0ZXInIGluIG1hdGNoZXIpO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgW1tEYXRlUmFuZ2VdXSB0eXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVJhbmdlKHZhbHVlKSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZGF0ZXM/IVxuICAgIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2Zyb20nIGluIHZhbHVlKTtcbn1cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBvZiB0eXBlIFtbRGF0ZUFmdGVyXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlQWZ0ZXJUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnYWZ0ZXInIGluIHZhbHVlKTtcbn1cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBvZiB0eXBlIFtbRGF0ZUJlZm9yZV1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZUJlZm9yZVR5cGUodmFsdWUpIHtcbiAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdiZWZvcmUnIGluIHZhbHVlKTtcbn1cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIFtbRGF5T2ZXZWVrXV0gdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RheU9mV2Vla1R5cGUodmFsdWUpIHtcbiAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdkYXlPZldlZWsnIGluIHZhbHVlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hdGNoZXJzLmpzLm1hcCIsImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqIFJldHVybiBgdHJ1ZWAgd2hldGhlciB0aGUgZ2l2ZW4gZGF0ZSBpcyBpbnNpZGUgdGhlIHJhbmdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZUluUmFuZ2UoZGF0ZSwgcmFuZ2UpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGZyb20gPSByYW5nZS5mcm9tLCB0byA9IHJhbmdlLnRvO1xuICAgIGlmICghZnJvbSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdG8gJiYgaXNTYW1lRGF5KGZyb20sIGRhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGlzVG9CZWZvcmVGcm9tID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHRvLCBmcm9tKSA8IDA7XG4gICAgaWYgKHRvICYmIGlzVG9CZWZvcmVGcm9tKSB7XG4gICAgICAgIF9hID0gW3RvLCBmcm9tXSwgZnJvbSA9IF9hWzBdLCB0byA9IF9hWzFdO1xuICAgIH1cbiAgICByZXR1cm4gKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXRlLCBmcm9tKSA+PSAwICYmXG4gICAgICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyh0bywgZGF0ZSkgPj0gMCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0RhdGVJblJhbmdlLmpzLm1hcCIsImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgaXNEYXRlLCBpc1NhbWVEYXkgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBpc0RhdGVBZnRlclR5cGUsIGlzRGF0ZUJlZm9yZVR5cGUsIGlzRGF0ZUludGVydmFsLCBpc0RhdGVSYW5nZSwgaXNEYXlPZldlZWtUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvTWF0Y2hlcnMnO1xuaW1wb3J0IHsgaXNEYXRlSW5SYW5nZSB9IGZyb20gJy4vaXNEYXRlSW5SYW5nZSc7XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBEYXRlIHR5cGUuICovXG5mdW5jdGlvbiBpc0RhdGVUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzRGF0ZSh2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgb2YgdmFsaWQgZGF0ZXMuICovXG5mdW5jdGlvbiBpc0FycmF5T2ZEYXRlcyh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShpc0RhdGUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGV0aGVyIHRoZSBkYXkgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBnaXZlbiBtYXRjaGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2goZGF5LCBtYXRjaGVycykge1xuICAgIHJldHVybiBtYXRjaGVycy5zb21lKGZ1bmN0aW9uIChtYXRjaGVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzU2FtZURheShkYXksIG1hdGNoZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5T2ZEYXRlcyhtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuaW5jbHVkZXMoZGF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlUmFuZ2UobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGVJblJhbmdlKGRheSwgbWF0Y2hlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF5T2ZXZWVrVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZGF5T2ZXZWVrLmluY2x1ZGVzKGRheS5nZXREYXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZUludGVydmFsKG1hdGNoZXIpKSB7XG4gICAgICAgICAgICB2YXIgaXNCZWZvcmUgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobWF0Y2hlci5iZWZvcmUsIGRheSkgPiAwO1xuICAgICAgICAgICAgdmFyIGlzQWZ0ZXIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF5LCBtYXRjaGVyLmFmdGVyKSA+IDA7XG4gICAgICAgICAgICByZXR1cm4gaXNCZWZvcmUgJiYgaXNBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlQWZ0ZXJUeXBlKG1hdGNoZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRheSwgbWF0Y2hlci5hZnRlcikgPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RhdGVCZWZvcmVUeXBlKG1hdGNoZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKG1hdGNoZXIuYmVmb3JlLCBkYXkpID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGRheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNNYXRjaC5qcy5tYXAiLCJpbXBvcnQgeyBpc01hdGNoIH0gZnJvbSAnLi9pc01hdGNoJztcbi8qKlxuICogUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG1vZGlmaWVycyB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RpZmllclN0YXR1cyhkYXRlLCBcbi8qKiBUaGUgbW9kaWZpZXJzIHRvIG1hdGNoIGZvciB0aGUgZ2l2ZW4gZGF0ZS4gKi9cbm1vZGlmaWVycykge1xuICAgIHZhciBtb2RpZmllcnNMaXN0ID0gT2JqZWN0LmtleXMobW9kaWZpZXJzKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgbW9kaWZpZXIgPSBtb2RpZmllcnNba2V5XTtcbiAgICAgICAgaWYgKGlzTWF0Y2goZGF0ZSwgbW9kaWZpZXIpKSB7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIG1vZGlmaWVyc1N0YXR1cyA9IHt9O1xuICAgIG1vZGlmaWVyc0xpc3QuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHsgcmV0dXJuIChtb2RpZmllcnNTdGF0dXNbbW9kaWZpZXJdID0gdHJ1ZSk7IH0pO1xuICAgIHJldHVybiBtb2RpZmllcnNTdGF0dXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRNb2RpZmllclN0YXR1cy5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU1vZGlmaWVycyB9IGZyb20gJy4uLy4uL2NvbnRleHRzL01vZGlmaWVycyc7XG5pbXBvcnQgeyBnZXRNb2RpZmllclN0YXR1cyB9IGZyb20gJy4vdXRpbHMvZ2V0TW9kaWZpZXJTdGF0dXMnO1xuLyoqIFJldHVybiB0aGUgbW9kaWZpZXJzIGFuZCBpdHMgc3R5bGVzIGZvciB0aGUgc3BlY2lmaWVkIGRhdGUuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF5TW9kaWZpZXJzKGRhdGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBtb2RpZmllcnNDb250ZXh0ID0gdXNlTW9kaWZpZXJzKCk7XG4gICAgLy8gVE9ETzogSXMgdGhlcmUgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIHR5cGUgTW9kaWZpZXJTdGF0dXM/XG4gICAgdmFyIG1vZGlmaWVycyA9IGdldE1vZGlmaWVyU3RhdHVzKGRhdGUsIG1vZGlmaWVyc0NvbnRleHQpO1xuICAgIHZhciBtb2RpZmllckNsYXNzTmFtZXMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtb2RpZmllcnMpLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgIHZhciBjdXN0b21DbGFzc05hbWUgPSBjb250ZXh0Lm1vZGlmaWVyQ2xhc3NOYW1lc1ttb2RpZmllcl07XG4gICAgICAgIGlmIChjdXN0b21DbGFzc05hbWUpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyQ2xhc3NOYW1lcy5wdXNoKGN1c3RvbUNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb2RpZmllckNsYXNzTmFtZXMucHVzaChcIlwiICsgY29udGV4dC5tb2RpZmllclByZWZpeCArIG1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBtb2RpZmllclN0eWxlID0ge307XG4gICAgaWYgKGNvbnRleHQubW9kaWZpZXJTdHlsZXMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobW9kaWZpZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgbW9kaWZpZXJTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtb2RpZmllclN0eWxlKSwgKF9hID0gY29udGV4dC5tb2RpZmllclN0eWxlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW21vZGlmaWVyXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtb2RpZmllcnM6IG1vZGlmaWVycyxcbiAgICAgICAgbW9kaWZpZXJDbGFzc05hbWVzOiBtb2RpZmllckNsYXNzTmFtZXMsXG4gICAgICAgIG1vZGlmaWVyU3R5bGU6IG1vZGlmaWVyU3R5bGVcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRGF5TW9kaWZpZXJzLmpzLm1hcCIsImltcG9ydCB7IGFkZERheXMsIGVuZE9mTW9udGgsIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGdldE1vZGlmaWVyU3RhdHVzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRGF5TW9kaWZpZXJzL3V0aWxzL2dldE1vZGlmaWVyU3RhdHVzJztcbnZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChtb2RpZmllcnMpIHtcbiAgICByZXR1cm4gIW1vZGlmaWVycy5kaXNhYmxlZCAmJiAhbW9kaWZpZXJzLmhpZGRlbjtcbn07XG4vKipcbiAqIFJldHVybnMgdGhlIGRheSB0aGF0IHNob3VsZCBiZSB0aGUgdGFyZ2V0IG9mIHRoZSBmb2N1cyB3aGVuIGluaXRpYWxseVxuICogcmVuZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOlxuICogIDEuIGlmIHRoZXJlIGlzIGEgc2VsZWN0ZWQgZGF5LCBmb2N1cyBvbiB0aGUgKGZpcnN0KSBzZWxlY3RlZCBkYXlcbiAqICAyLiBlbHNlIGlmIHRoZSBkaXNwbGF5IG1vbnRocyBpbmNsdWRlIHRoZSBjdXJyZW50IGRhdGUgKHRvZGF5KSBmb2N1cyBvbiB0aGUgY3VycmVudCBkYXRlXG4gKiAgMy4gZWxzZSBmb2N1cyBvbiB0aGUgZmlyc3QgZm9jdXNhYmxlIGRheVxuICogIDQuIGVsc2UgdGhlcmUgaXMgbm90aGluZyB0byBmb2N1cyBvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0KGRpc3BsYXlNb250aHMsIG1vZGlmaWVyc0NvbnRleHQpIHtcbiAgICB2YXIgZmlyc3REYXlJbk1vbnRoID0gc3RhcnRPZk1vbnRoKGRpc3BsYXlNb250aHNbMF0pO1xuICAgIHZhciBsYXN0RGF5SW5Nb250aCA9IGVuZE9mTW9udGgoZGlzcGxheU1vbnRoc1tkaXNwbGF5TW9udGhzLmxlbmd0aCAtIDFdKTtcbiAgICB2YXIgZmlyc3RGb2N1c2FibGVEYXk7XG4gICAgdmFyIHRvZGF5O1xuICAgIHZhciBkYXRlID0gZmlyc3REYXlJbk1vbnRoO1xuICAgIHdoaWxlIChkYXRlIDw9IGxhc3REYXlJbk1vbnRoKSB7XG4gICAgICAgIHZhciBtb2RpZmllcnMgPSBnZXRNb2RpZmllclN0YXR1cyhkYXRlLCBtb2RpZmllcnNDb250ZXh0KTtcbiAgICAgICAgaWYgKCFpc0ZvY3VzYWJsZShtb2RpZmllcnMpKSB7XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RpZmllcnMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RpZmllcnMudG9kYXkgJiYgIXRvZGF5KSB7XG4gICAgICAgICAgICB0b2RheSA9IGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaXJzdEZvY3VzYWJsZURheSkge1xuICAgICAgICAgICAgZmlyc3RGb2N1c2FibGVEYXkgPSBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGRhdGUgPSBhZGREYXlzKGRhdGUsIDEpO1xuICAgIH1cbiAgICBpZiAodG9kYXkpIHtcbiAgICAgICAgcmV0dXJuIHRvZGF5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Rm9jdXNhYmxlRGF5O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEluaXRpYWxGb2N1c1RhcmdldC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYWRkRGF5cywgYWRkTW9udGhzLCBhZGRXZWVrcywgYWRkWWVhcnMsIGVuZE9mV2VlaywgaXNTYW1lTW9udGgsIHN0YXJ0T2ZXZWVrIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU1vZGlmaWVycyB9IGZyb20gJy4uL01vZGlmaWVycyc7XG5pbXBvcnQgeyB1c2VOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vTmF2aWdhdGlvbi91c2VOYXZpZ2F0aW9uJztcbmltcG9ydCB7IGdldEluaXRpYWxGb2N1c1RhcmdldCB9IGZyb20gJy4vZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0Jztcbi8qKlxuICogVGhlIEZvY3VzIGNvbnRleHQgc2hhcmVzIGRldGFpbHMgYWJvdXQgdGhlIGZvY3VzZWQgZGF5IGZvciB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqXG4gKiBBY2Nlc3MgdGhpcyBjb250ZXh0IGZyb20gdGhlIFtbdXNlRm9jdXNdXSBob29rLlxuICovXG5leHBvcnQgdmFyIEZvY3VzQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKiBUaGUgcHJvdmlkZXIgZm9yIHRoZSBbW0ZvY3VzQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZvY3VzUHJvdmlkZXIoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgX2IgPSBSZWFjdC51c2VTdGF0ZSgpLCBmb2N1c2VkRGF5ID0gX2JbMF0sIHNldERheSA9IF9iWzFdO1xuICAgIHZhciBfYyA9IHVzZU5hdmlnYXRpb24oKSwgZ29Ub01vbnRoID0gX2MuZ29Ub01vbnRoLCBkaXNwbGF5TW9udGhzID0gX2MuZGlzcGxheU1vbnRocztcbiAgICB2YXIgbnVtYmVyT2ZNb250aHMgPSB1c2VEYXlQaWNrZXIoKS5udW1iZXJPZk1vbnRocztcbiAgICB2YXIgbW9kaWZpZXJzQ29udGV4dCA9IHVzZU1vZGlmaWVycygpO1xuICAgIHZhciBpbml0aWFsRm9jdXNUYXJnZXQgPSBnZXRJbml0aWFsRm9jdXNUYXJnZXQoZGlzcGxheU1vbnRocywgbW9kaWZpZXJzQ29udGV4dCk7XG4gICAgdmFyIF9kID0gUmVhY3QudXNlU3RhdGUoKSwgbGFzdEZvY3VzZWREYXkgPSBfZFswXSwgc2V0TGFzdEZvY3VzZWREYXkgPSBfZFsxXTtcbiAgICB2YXIgaXNXaXRoaW5EaXNwbGF5TW9udGhzID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlNb250aHMuc29tZShmdW5jdGlvbiAoZGlzcGxheU1vbnRoKSB7IHJldHVybiBpc1NhbWVNb250aChkYXRlLCBkaXNwbGF5TW9udGgpOyB9KTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1RhcmdldCA9IChmb2N1c2VkRGF5ICE9PSBudWxsICYmIGZvY3VzZWREYXkgIT09IHZvaWQgMCA/IGZvY3VzZWREYXkgOiAobGFzdEZvY3VzZWREYXkgJiYgaXNXaXRoaW5EaXNwbGF5TW9udGhzKGxhc3RGb2N1c2VkRGF5KSkpXG4gICAgICAgID8gbGFzdEZvY3VzZWREYXlcbiAgICAgICAgOiBpbml0aWFsRm9jdXNUYXJnZXQ7XG4gICAgdmFyIGJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldExhc3RGb2N1c2VkRGF5KGZvY3VzZWREYXkpO1xuICAgICAgICBzZXREYXkodW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIHZhciBmb2N1cyA9IGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiBzZXREYXkoZGF0ZSk7IH07XG4gICAgdmFyIHN3aXRjaE1vbnRoID0gZnVuY3Rpb24gKGRhdGUsIG9mZnNldCkge1xuICAgICAgICBpZiAoZGlzcGxheU1vbnRocy5zb21lKGZ1bmN0aW9uIChtKSB7IHJldHVybiBpc1NhbWVNb250aChkYXRlLCBtKTsgfSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICBnb1RvTW9udGgoYWRkTW9udGhzKGRhdGUsIDEgKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdvVG9Nb250aChkYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGZvY3VzRGF5QmVmb3JlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBiZWZvcmUgPSBhZGREYXlzKGZvY3VzZWREYXksIC0xKTtcbiAgICAgICAgZm9jdXMoYmVmb3JlKTtcbiAgICAgICAgc3dpdGNoTW9udGgoYmVmb3JlLCBudW1iZXJPZk1vbnRocyAqIC0xKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c0RheUFmdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBhZnRlciA9IGFkZERheXMoZm9jdXNlZERheSwgMSk7XG4gICAgICAgIGZvY3VzKGFmdGVyKTtcbiAgICAgICAgc3dpdGNoTW9udGgoYWZ0ZXIsIG51bWJlck9mTW9udGhzKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1dlZWtCZWZvcmVEYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIHVwID0gYWRkV2Vla3MoZm9jdXNlZERheSwgLTEpO1xuICAgICAgICBmb2N1cyh1cCk7XG4gICAgICAgIHN3aXRjaE1vbnRoKHVwLCBudW1iZXJPZk1vbnRocyAqIC0xKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1dlZWtBZnRlckRheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZG93biA9IGFkZFdlZWtzKGZvY3VzZWREYXksIDEpO1xuICAgICAgICBmb2N1cyhkb3duKTtcbiAgICAgICAgc3dpdGNoTW9udGgoZG93biwgbnVtYmVyT2ZNb250aHMpO1xuICAgIH07XG4gICAgdmFyIGZvY3VzU3RhcnRPZldlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGRheVRvRm9jdXMgPSBzdGFydE9mV2Vlayhmb2N1c2VkRGF5KTtcbiAgICAgICAgc3dpdGNoTW9udGgoZGF5VG9Gb2N1cywgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyhkYXlUb0ZvY3VzKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c0VuZE9mV2VlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZGF5VG9Gb2N1cyA9IGVuZE9mV2Vlayhmb2N1c2VkRGF5KTtcbiAgICAgICAgc3dpdGNoTW9udGgoZGF5VG9Gb2N1cywgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyhkYXlUb0ZvY3VzKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c01vbnRoQmVmb3JlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBtb250aEJlZm9yZSA9IGFkZE1vbnRocyhmb2N1c2VkRGF5LCAtMSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKG1vbnRoQmVmb3JlLCBudW1iZXJPZk1vbnRocyk7XG4gICAgICAgIGZvY3VzKG1vbnRoQmVmb3JlKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c01vbnRoQWZ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIG1vbnRoQWZ0ZXIgPSBhZGRNb250aHMoZm9jdXNlZERheSwgMSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKG1vbnRoQWZ0ZXIsIG51bWJlck9mTW9udGhzKTtcbiAgICAgICAgZm9jdXMobW9udGhBZnRlcik7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNZZWFyQmVmb3JlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB5ZWFyQmVmb3JlID0gYWRkWWVhcnMoZm9jdXNlZERheSwgLTEpO1xuICAgICAgICBzd2l0Y2hNb250aCh5ZWFyQmVmb3JlLCBudW1iZXJPZk1vbnRocyk7XG4gICAgICAgIGZvY3VzKHllYXJCZWZvcmUpO1xuICAgIH07XG4gICAgdmFyIGZvY3VzWWVhckFmdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB5ZWFyQWZ0ZXIgPSBhZGRZZWFycyhmb2N1c2VkRGF5LCAxKTtcbiAgICAgICAgc3dpdGNoTW9udGgoeWVhckFmdGVyLCBudW1iZXJPZk1vbnRocyk7XG4gICAgICAgIGZvY3VzKHllYXJBZnRlcik7XG4gICAgfTtcbiAgICB2YXIgdmFsdWUgPSB7XG4gICAgICAgIGZvY3VzZWREYXk6IGZvY3VzZWREYXksXG4gICAgICAgIGZvY3VzVGFyZ2V0OiBmb2N1c1RhcmdldCxcbiAgICAgICAgYmx1cjogYmx1cixcbiAgICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgICBmb2N1c0RheUFmdGVyOiBmb2N1c0RheUFmdGVyLFxuICAgICAgICBmb2N1c0RheUJlZm9yZTogZm9jdXNEYXlCZWZvcmUsXG4gICAgICAgIGZvY3VzV2Vla0FmdGVyRGF5OiBmb2N1c1dlZWtBZnRlckRheSxcbiAgICAgICAgZm9jdXNXZWVrQmVmb3JlRGF5OiBmb2N1c1dlZWtCZWZvcmVEYXksXG4gICAgICAgIGZvY3VzTW9udGhCZWZvcmU6IGZvY3VzTW9udGhCZWZvcmUsXG4gICAgICAgIGZvY3VzTW9udGhBZnRlcjogZm9jdXNNb250aEFmdGVyLFxuICAgICAgICBmb2N1c1llYXJCZWZvcmU6IGZvY3VzWWVhckJlZm9yZSxcbiAgICAgICAgZm9jdXNZZWFyQWZ0ZXI6IGZvY3VzWWVhckFmdGVyLFxuICAgICAgICBmb2N1c1N0YXJ0T2ZXZWVrOiBmb2N1c1N0YXJ0T2ZXZWVrLFxuICAgICAgICBmb2N1c0VuZE9mV2VlazogZm9jdXNFbmRPZldlZWtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHZhbHVlIH0sIGNoaWxkcmVuKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb2N1c0NvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZvY3VzQ29udGV4dCB9IGZyb20gJy4vRm9jdXNDb250ZXh0Jztcbi8qKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tGb2N1c0NvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb2N1cygpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9jdXNDb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VGb2N1cyBtdXN0IGJlIHVzZWQgd2l0aGluIGEgRm9jdXNQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZUZvY3VzLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1NhbWVEYXkgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgdXNlRm9jdXMgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9Gb2N1cyc7XG4vKiogSGFuZGxlIHRoZSBmb2N1cyBmb3IgdGhlIGRheSBlbGVtZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheUZvY3VzKGRhdGUsIGJ1dHRvblJlZikge1xuICAgIHZhciBfYSA9IHVzZUZvY3VzKCksIGZvY3VzZWREYXkgPSBfYS5mb2N1c2VkRGF5LCBmb2N1c1RhcmdldCA9IF9hLmZvY3VzVGFyZ2V0LCBmb2N1c0RheUFmdGVyID0gX2EuZm9jdXNEYXlBZnRlciwgZm9jdXNEYXlCZWZvcmUgPSBfYS5mb2N1c0RheUJlZm9yZSwgZm9jdXNXZWVrQWZ0ZXJEYXkgPSBfYS5mb2N1c1dlZWtBZnRlckRheSwgZm9jdXNXZWVrQmVmb3JlRGF5ID0gX2EuZm9jdXNXZWVrQmVmb3JlRGF5LCBibHVyID0gX2EuYmx1ciwgZm9jdXMgPSBfYS5mb2N1cywgZm9jdXNNb250aEJlZm9yZSA9IF9hLmZvY3VzTW9udGhCZWZvcmUsIGZvY3VzTW9udGhBZnRlciA9IF9hLmZvY3VzTW9udGhBZnRlciwgZm9jdXNZZWFyQmVmb3JlID0gX2EuZm9jdXNZZWFyQmVmb3JlLCBmb2N1c1llYXJBZnRlciA9IF9hLmZvY3VzWWVhckFmdGVyLCBmb2N1c1N0YXJ0T2ZXZWVrID0gX2EuZm9jdXNTdGFydE9mV2VlaywgZm9jdXNFbmRPZldlZWsgPSBfYS5mb2N1c0VuZE9mV2VlaztcbiAgICB2YXIgZGlyID0gdXNlRGF5UGlja2VyKCkuZGlyO1xuICAgIC8vIEZvY3VzIHRoZSBIVE1MIGVsZW1lbnQgaWYgdGhpcyBpcyB0aGUgZm9jdXNlZCBkYXkuXG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChpc1NhbWVEYXkoZm9jdXNlZERheSwgZGF0ZSkpIHtcbiAgICAgICAgICAgIChfYSA9IGJ1dHRvblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH0sIFtmb2N1c2VkRGF5LCBkYXRlLCBidXR0b25SZWZdKTtcbiAgICB2YXIgZm9jdXNPbktleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGRpciA9PT0gJ3J0bCcgPyBmb2N1c0RheUFmdGVyKCkgOiBmb2N1c0RheUJlZm9yZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZGlyID09PSAncnRsJyA/IGZvY3VzRGF5QmVmb3JlKCkgOiBmb2N1c0RheUFmdGVyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGZvY3VzV2Vla0FmdGVyRGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c1dlZWtCZWZvcmVEYXkoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZS5zaGlmdEtleSA/IGZvY3VzWWVhckJlZm9yZSgpIDogZm9jdXNNb250aEJlZm9yZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUuc2hpZnRLZXkgPyBmb2N1c1llYXJBZnRlcigpIDogZm9jdXNNb250aEFmdGVyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YXJ0T2ZXZWVrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbmQnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGZvY3VzRW5kT2ZXZWVrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBpc0ZvY3VzVGFyZ2V0ID0gQm9vbGVhbihmb2N1c1RhcmdldCAmJiBpc1NhbWVEYXkoZm9jdXNUYXJnZXQsIGRhdGUpKTtcbiAgICByZXR1cm4geyBmb2N1czogZm9jdXMsIGJsdXI6IGJsdXIsIGZvY3VzT25LZXlEb3duOiBmb2N1c09uS2V5RG93biwgaXNGb2N1c1RhcmdldDogaXNGb2N1c1RhcmdldCB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRGF5Rm9jdXMuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1NhbWVNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VTZWxlY3RNdWx0aXBsZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlJztcbmltcG9ydCB7IHVzZVNlbGVjdFJhbmdlIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvU2VsZWN0UmFuZ2UnO1xuaW1wb3J0IHsgdXNlU2VsZWN0U2luZ2xlIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvU2VsZWN0U2luZ2xlJztcbmltcG9ydCB7IHVzZURheU1vZGlmaWVycyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZURheU1vZGlmaWVycyc7XG5pbXBvcnQgeyBpc0RheVBpY2tlck11bHRpcGxlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvRGF5UGlja2VyTXVsdGlwbGUnO1xuaW1wb3J0IHsgaXNEYXlQaWNrZXJSYW5nZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlclJhbmdlJztcbmltcG9ydCB7IGlzRGF5UGlja2VyU2luZ2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvRGF5UGlja2VyU2luZ2xlJztcbmltcG9ydCB7IHVzZURheUZvY3VzIH0gZnJvbSAnLi91c2VEYXlGb2N1cyc7XG4vKipcbiAqIFRoaXMgaG9vayByZXR1cm5zIGRldGFpbHMgYWJvdXQgdGhlIGNvbnRlbnQgdG8gcmVuZGVyIGluIHRoZSBkYXkgY2VsbC5cbiAqXG4gKlxuICogV2hlbiBhIGRheSBjZWxsIGlzIHJlbmRlcmVkIGluIHRoZSB0YWJsZSwgRGF5UGlja2VyIGNhbiBlaXRoZXI6XG4gKlxuICogLSByZW5kZXIgbm90aGluZzogd2hlbiB0aGUgZGF5IGlzIG91dHNpZGUgdGhlIG1vbnRoIG9yIGhhcyBtYXRjaGVkIHRoZVxuICogICBcImhpZGRlblwiIG1vZGlmaWVyLlxuICogLSByZW5kZXIgYSBidXR0b24uIFdoZW4gYSBzZWxlY3Rpb24gbW9kZSBpcyBzZXQsIERheVBpY2tlciByZW5kZXJzIGEgYnV0dG9uXG4gKiAgIHRvIGFsbG93IHRoZSBmb2N1cyBhbmQgdGhlIHNlbGVjdGlvbi4gSW4gY2FzZSBvZiBgY3VzdG9tYCBzZWxlY3Rpb25cbiAqICAgbW9kZSwgRGF5UGlja2VyIGV4cGVjdHMgYSBgb25EYXlDbGlja2AgcHJvcCB0byByZW5kZXIgYSBidXR0b24uXG4gKiAtIHJlbmRlciBhIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50OiB3aGVuIG5vIHNlbGVjdGlvbiBtb2RlIGlzIHNldCwgdGhlIGRheVxuICogICBjZWxsIHNob3VsZG7igJl0IHJlc3BvbmQgdG8gYW55IGludGVyYWN0aW9uLiBEYXlQaWNrZXIgc2hvdWxkIHJlbmRlciBhIGBkaXZgXG4gKiAgIG9yIGEgYHNwYW5gLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqIFVzZSB0aGlzIGhvb2sgdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvciBvZiB0aGUgW1tEYXldXSBjb21wb25lbnQuIENyZWF0ZSBhXG4gKiBuZXcgYERheWAgY29tcG9uZW50IHVzaW5nIHRoaXMgaG9vayBhbmQgcGFzcyBpdCB0byB0aGUgYGNvbXBvbmVudHNgIHByb3AuXG4gKiBUaGUgc291cmNlIG9mIFtbRGF5XV0gY2FuIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludC5cbiAqXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheShcbi8qKiBUaGUgZGF5IHJlbmRlcmVkIGluIHRoZSBtb250aC4gKi9cbmRhdGUsIFxuLyoqIFRoZSBtb250aCB3aGVyZSB0aGUgZGF0ZSBpcyBkaXNwbGF5ZWQuIERheVBpY2tlciByZW5kZXJzIGRheXMgb3V0c2lkZSB0aGUgZGlzcGxheSBtb250aCB3aGVuIGBzaG93T3V0c2lkZURheXNgIGlzIHRydWUuICovXG5kaXNwbGF5TW9udGgsIFxuLyoqIEEgcmVmIHRvIHRoZSBidXR0b24gZWxlbWVudC4gKi9cbmJ1dHRvblJlZikge1xuICAgIHZhciBjb250ZXh0ID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIHNpbmdsZSA9IHVzZVNlbGVjdFNpbmdsZSgpO1xuICAgIHZhciBtdWx0aXBsZSA9IHVzZVNlbGVjdE11bHRpcGxlKCk7XG4gICAgdmFyIHJhbmdlID0gdXNlU2VsZWN0UmFuZ2UoKTtcbiAgICB2YXIgX2EgPSB1c2VEYXlGb2N1cyhkYXRlLCBidXR0b25SZWYpLCBmb2N1cyA9IF9hLmZvY3VzLCBibHVyID0gX2EuYmx1ciwgZm9jdXNPbktleURvd24gPSBfYS5mb2N1c09uS2V5RG93biwgaXNGb2N1c1RhcmdldCA9IF9hLmlzRm9jdXNUYXJnZXQ7XG4gICAgdmFyIF9iID0gdXNlRGF5TW9kaWZpZXJzKGRhdGUpLCBtb2RpZmllcnMgPSBfYi5tb2RpZmllcnMsIG1vZGlmaWVyQ2xhc3NOYW1lcyA9IF9iLm1vZGlmaWVyQ2xhc3NOYW1lcywgbW9kaWZpZXJTdHlsZSA9IF9iLm1vZGlmaWVyU3R5bGU7XG4gICAgdmFyIGlzT3V0c2lkZSA9ICFpc1NhbWVNb250aChkYXRlLCBkaXNwbGF5TW9udGgpO1xuICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgaXNPdXRzaWRlOiBpc091dHNpZGUsXG4gICAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzLFxuICAgICAgICBzZWxlY3RlZDogaXNEYXlQaWNrZXJTaW5nbGUoY29udGV4dClcbiAgICAgICAgICAgID8gc2luZ2xlLnNlbGVjdGVkXG4gICAgICAgICAgICA6IGlzRGF5UGlja2VyTXVsdGlwbGUoY29udGV4dClcbiAgICAgICAgICAgICAgICA/IG11bHRpcGxlLnNlbGVjdGVkXG4gICAgICAgICAgICAgICAgOiBpc0RheVBpY2tlclJhbmdlKGNvbnRleHQpXG4gICAgICAgICAgICAgICAgICAgID8gcmFuZ2Uuc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHNpbmdsZTogc2luZ2xlLFxuICAgICAgICBtdWx0aXBsZTogbXVsdGlwbGUsXG4gICAgICAgIHJhbmdlOiByYW5nZVxuICAgIH07XG4gICAgaWYgKGlzT3V0c2lkZSAmJiAhY29udGV4dC5zaG93T3V0c2lkZURheXMpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmhpZGRlbikge1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfVxuICAgIHZhciBjbGFzc05hbWVzID0gW2NvbnRleHQuY2xhc3NOYW1lcy5kYXldLmNvbmNhdChtb2RpZmllckNsYXNzTmFtZXMpO1xuICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb250ZXh0LnN0eWxlcy5kYXkpLCBtb2RpZmllclN0eWxlKTtcbiAgICBpZiAoaXNPdXRzaWRlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChjb250ZXh0LmNsYXNzTmFtZXMuZGF5X291dHNpZGUpO1xuICAgICAgICBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb250ZXh0LnN0eWxlcyksIGNvbnRleHQuc3R5bGVzLmRheV9vdXRzaWRlKTtcbiAgICB9XG4gICAgdmFyIERheUNvbnRlbnQgPSBjb250ZXh0LmNvbXBvbmVudHMuRGF5Q29udGVudDtcbiAgICB2YXIgY2hpbGRyZW4gPSAoUmVhY3QuY3JlYXRlRWxlbWVudChEYXlDb250ZW50LCB7IGRhdGU6IGRhdGUsIGRpc3BsYXlNb250aDogZGlzcGxheU1vbnRoLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KSk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuam9pbignICcpO1xuICAgIGlmICghY29udGV4dC5tb2RlICYmICFjb250ZXh0Lm9uRGF5Q2xpY2spIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXR1cm5WYWx1ZSksIHsgbm9uSW50ZXJhY3RpdmVQcm9wczoge1xuICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgICAgIH0gfSk7XG4gICAgfVxuICAgIC8vICNyZWdpb24gRXZlbnQgaGFuZGxlcnNcbiAgICB2YXIgaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGlmIChpc0RheVBpY2tlclNpbmdsZShjb250ZXh0KSkge1xuICAgICAgICAgICAgKF9hID0gc2luZ2xlLm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHNpbmdsZSwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RheVBpY2tlck11bHRpcGxlKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAoX2IgPSBtdWx0aXBsZS5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChtdWx0aXBsZSwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RheVBpY2tlclJhbmdlKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAoX2MgPSByYW5nZS5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FsbChyYW5nZSwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICAgICAgfVxuICAgICAgICAoX2QgPSBjb250ZXh0Lm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGZvY3VzKGRhdGUpO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5Rm9jdXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgYmx1cigpO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5Qmx1cikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBmb2N1c09uS2V5RG93bihlKTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheUtleURvd24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlS2V5VXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlLZXlVcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVNb3VzZUVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5TW91c2VFbnRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVNb3VzZUxlYXZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5TW91c2VMZWF2ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVUb3VjaENhbmNlbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheVRvdWNoQ2FuY2VsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVRvdWNoRW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5VG91Y2hFbmQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5VG91Y2hNb3ZlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlUb3VjaFN0YXJ0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgaWYgKGlzT3V0c2lkZSkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goY29udGV4dC5jbGFzc05hbWVzLmRheV9vdXRzaWRlKTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dC5zdHlsZXMpLCBjb250ZXh0LnN0eWxlcy5kYXlfb3V0c2lkZSk7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuam9pbignICcpO1xuICAgIHZhciBzZWxlY3RlZCA9IG1vZGlmaWVycy5zZWxlY3RlZCwgZGlzYWJsZWQgPSBtb2RpZmllcnMuZGlzYWJsZWQ7XG4gICAgdmFyIHRhYkluZGV4ID0gaXNGb2N1c1RhcmdldCA/IDAgOiAtMTtcbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHJldHVyblZhbHVlKSwgeyBidXR0b25Qcm9wczoge1xuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgICAgICAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAgICAgICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgICAgICAgICAgb25CbHVyOiBoYW5kbGVCbHVyLFxuICAgICAgICAgICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgICAgICAgICAgb25LZXlVcDogaGFuZGxlS2V5VXAsXG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI6IGhhbmRsZU1vdXNlRW50ZXIsXG4gICAgICAgICAgICBvbk1vdXNlTGVhdmU6IGhhbmRsZU1vdXNlTGVhdmUsXG4gICAgICAgICAgICBvblRvdWNoQ2FuY2VsOiBoYW5kbGVUb3VjaENhbmNlbCxcbiAgICAgICAgICAgIG9uVG91Y2hFbmQ6IGhhbmRsZVRvdWNoRW5kLFxuICAgICAgICAgICAgb25Ub3VjaE1vdmU6IGhhbmRsZVRvdWNoTW92ZSxcbiAgICAgICAgICAgIG9uVG91Y2hTdGFydDogaGFuZGxlVG91Y2hTdGFydFxuICAgICAgICB9IH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRGF5LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi4vQnV0dG9uJztcbmltcG9ydCB7IHVzZURheSB9IGZyb20gJy4vaG9va3MvdXNlRGF5Jztcbi8qKlxuICogVGhlIGNvbnRlbnQgb2YgYSBkYXkgY2VsbCDigJMgYXMgYSBidXR0b24gb3Igc3BhbiBlbGVtZW50IGFjY29yZGluZyB0byBpdHNcbiAqIG1vZGlmaWVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERheShwcm9wcykge1xuICAgIHZhciBidXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgdmFyIGRheSA9IHVzZURheShwcm9wcy5kYXRlLCBwcm9wcy5kaXNwbGF5TW9udGgsIGJ1dHRvblJlZik7XG4gICAgdmFyIGJ1dHRvblByb3BzID0gZGF5LmJ1dHRvblByb3BzLCBub25JbnRlcmFjdGl2ZVByb3BzID0gZGF5Lm5vbkludGVyYWN0aXZlUHJvcHM7XG4gICAgaWYgKCFidXR0b25Qcm9wcyAmJiAhbm9uSW50ZXJhY3RpdmVQcm9wcykge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCk7XG4gICAgfVxuICAgIGlmIChub25JbnRlcmFjdGl2ZVByb3BzKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9fYXNzaWduKHt9LCBub25JbnRlcmFjdGl2ZVByb3BzKSk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwgX19hc3NpZ24oeyByZWY6IGJ1dHRvblJlZiB9LCBidXR0b25Qcm9wcykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGRheSBjZWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGF5Q29udGVudChwcm9wcykge1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBsb2NhbGUgPSBfYS5sb2NhbGUsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGxhYmVsRGF5ID0gX2EubGFiZWxzLmxhYmVsRGF5LCBmb3JtYXREYXkgPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdERheTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIiB9LCBmb3JtYXREYXkocHJvcHMuZGF0ZSwgeyBsb2NhbGU6IGxvY2FsZSB9KSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4sIHN0eWxlOiBzdHlsZXMudmhpZGRlbiB9LCBsYWJlbERheShwcm9wcy5kYXRlLCBwcm9wcy5tb2RpZmllcnMsIHsgbG9jYWxlOiBsb2NhbGUgfSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlDb250ZW50LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgYSBzdHlsZWQgc2VsZWN0IGNvbXBvbmVudCDigJMgZGlzcGxheWluZyBhIGNhcHRpb24gYW5kIGEgY3VzdG9tXG4gKiBkcm9wLWRvd24gaWNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERyb3Bkb3duKHByb3BzKSB7XG4gICAgdmFyIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsIHZhbHVlID0gcHJvcHMudmFsdWUsIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sIGNhcHRpb24gPSBwcm9wcy5jYXB0aW9uLCBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZXMgPSBfYS5zdHlsZXMsIEljb25Ecm9wZG93biA9IF9hLmNvbXBvbmVudHMuSWNvbkRyb3Bkb3duO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMudmhpZGRlbiB9LCBwcm9wc1snYXJpYS1sYWJlbCddKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLCB7IFwiYXJpYS1sYWJlbFwiOiBwcm9wc1snYXJpYS1sYWJlbCddLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuZHJvcGRvd24sIHN0eWxlOiBzdHlsZXMuZHJvcGRvd24sIHZhbHVlOiB2YWx1ZSwgb25DaGFuZ2U6IG9uQ2hhbmdlIH0sIGNoaWxkcmVuKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jYXB0aW9uX2xhYmVsLCBzdHlsZTogc3R5bGVzLmNhcHRpb25fbGFiZWwsIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSxcbiAgICAgICAgICAgIGNhcHRpb24sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEljb25Ecm9wZG93biwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuZHJvcGRvd25faWNvbiwgc3R5bGU6IHN0eWxlcy5kcm9wZG93bl9pY29uIH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJvcGRvd24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG4vKiogUmVuZGVyIHRoZSBGb290ZXIgY29tcG9uZW50IChlbXB0eSBhcyBkZWZhdWx0KS4qL1xuZXhwb3J0IGZ1bmN0aW9uIEZvb3RlcigpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgZm9vdGVyID0gX2EuZm9vdGVyLCBzdHlsZXMgPSBfYS5zdHlsZXMsIHRmb290ID0gX2EuY2xhc3NOYW1lcy50Zm9vdDtcbiAgICBpZiAoIWZvb3RlcilcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRmb290XCIsIHsgY2xhc3NOYW1lOiB0Zm9vdCwgc3R5bGU6IHN0eWxlcy50Zm9vdCB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNvbFNwYW46IDggfSwgZm9vdGVyKSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZvb3Rlci5qcy5tYXAiLCJpbXBvcnQgeyBhZGREYXlzLCBzdGFydE9mV2VlayB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogR2VuZXJhdGUgYSBzZXJpZXMgb2YgNyBkYXlzLCBzdGFydGluZyBmcm9tIHRoZSB3ZWVrLCB0byB1c2UgZm9yIGZvcm1hdHRpbmdcbiAqIHRoZSB3ZWVrZGF5IG5hbWVzIChNb25kYXksIFR1ZXNkYXksIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla2RheXMobG9jYWxlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoKSwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICB2YXIgZGF5cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIHZhciBkYXkgPSBhZGREYXlzKHN0YXJ0LCBpKTtcbiAgICAgICAgZGF5cy5wdXNoKGRheSk7XG4gICAgfVxuICAgIHJldHVybiBkYXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0V2Vla2RheXMuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyBnZXRXZWVrZGF5cyB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBSZW5kZXIgdGhlIEhlYWQgY29tcG9uZW50IC0gaS5lLiB0aGUgdGFibGUgaGVhZCB3aXRoIHRoZSB3ZWVrZGF5IG5hbWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGVhZCgpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9hLnN0eWxlcywgc2hvd1dlZWtOdW1iZXIgPSBfYS5zaG93V2Vla051bWJlciwgbG9jYWxlID0gX2EubG9jYWxlLCBmb3JtYXRXZWVrZGF5TmFtZSA9IF9hLmZvcm1hdHRlcnMuZm9ybWF0V2Vla2RheU5hbWUsIGxhYmVsV2Vla2RheSA9IF9hLmxhYmVscy5sYWJlbFdlZWtkYXk7XG4gICAgdmFyIHdlZWtkYXlzID0gZ2V0V2Vla2RheXMobG9jYWxlKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aGVhZFwiLCB7IHN0eWxlOiBzdHlsZXMuaGVhZCwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmhlYWQgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgc3R5bGU6IHN0eWxlcy5oZWFkX3JvdywgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmhlYWRfcm93IH0sXG4gICAgICAgICAgICBzaG93V2Vla051bWJlciAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRoXCIsIHsgc2NvcGU6IFwiY29sXCIsIHN0eWxlOiBzdHlsZXMuaGVhZF9jZWxsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuaGVhZF9jZWxsIH0pKSxcbiAgICAgICAgICAgIHdlZWtkYXlzLm1hcChmdW5jdGlvbiAod2Vla2RheSwgaSkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7IGtleTogaSwgc2NvcGU6IFwiY29sXCIsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5oZWFkX2NlbGwsIHN0eWxlOiBzdHlsZXMuaGVhZF9jZWxsIH0sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUgfSwgZm9ybWF0V2Vla2RheU5hbWUod2Vla2RheSwgeyBsb2NhbGU6IGxvY2FsZSB9KSksXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMudmhpZGRlbiB9LCBsYWJlbFdlZWtkYXkod2Vla2RheSwgeyBsb2NhbGU6IGxvY2FsZSB9KSkpKTsgfSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IZWFkLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSZW5kZXIgdGhlIGljb24gaW4gdGhlIHN0eWxlZCBkcm9wLWRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJY29uRHJvcGRvd24ocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19hc3NpZ24oeyB3aWR0aDogXCI4cHhcIiwgaGVpZ2h0OiBcIjhweFwiLCB2aWV3Qm94OiBcIjAgMCAxMjAgMTIwXCIsIFwiZGF0YS10ZXN0aWRcIjogXCJpY29uRHJvcGRvd25cIiB9LCBwcm9wcyksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNNC4yMjE4MjU0MSw0OC4yMjE4MjU0IEM4LjQ0MjIyODI4LDQ0LjAwMTQyMjUgMTUuMjM4ODQ5NCw0My45MjczODA0IDE5LjU0OTY0NTksNDcuOTk5Njk4OSBMMTkuNzc4MTc0Niw0OC4yMjE4MjU0IEw2MCw4OC40NDMgTDEwMC4yMjE4MjUsNDguMjIxODI1NCBDMTA0LjQ0MjIyOCw0NC4wMDE0MjI1IDExMS4yMzg4NDksNDMuOTI3MzgwNCAxMTUuNTQ5NjQ2LDQ3Ljk5OTY5ODkgTDExNS43NzgxNzUsNDguMjIxODI1NCBDMTE5Ljk5ODU3Nyw1Mi40NDIyMjgzIDEyMC4wNzI2Miw1OS4yMzg4NDk0IDExNi4wMDAzMDEsNjMuNTQ5NjQ1OSBMMTE1Ljc3ODE3NSw2My43NzgxNzQ2IEw2Ny43NzgxNzQ2LDExMS43NzgxNzUgQzYzLjU1Nzc3MTcsMTE1Ljk5ODU3NyA1Ni43NjExNTA2LDExNi4wNzI2MiA1Mi40NTAzNTQxLDExMi4wMDAzMDEgTDUyLjIyMTgyNTQsMTExLjc3ODE3NSBMNC4yMjE4MjU0MSw2My43NzgxNzQ2IEMtMC4wNzM5NDE4MDIzLDU5LjQ4MjQwNzQgLTAuMDczOTQxODAyMyw1Mi41MTc1OTI2IDQuMjIxODI1NDEsNDguMjIxODI1NCBaXCIsIGZpbGw6IFwiY3VycmVudENvbG9yXCIsIGZpbGxSdWxlOiBcIm5vbnplcm9cIiB9KSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWNvbkRyb3Bkb3duLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSZW5kZXIgdGhlIFwicHJldmlvdXMgbW9udGhcIiBidXR0b24gaW4gdGhlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJY29uTGVmdChwcm9wcykge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX2Fzc2lnbih7IHdpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIiwgdmlld0JveDogXCIwIDAgMTIwIDEyMFwiLCBcImRhdGEtdGVzdGlkXCI6IFwiaWNvbkxlZnRcIiB9LCBwcm9wcyksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNNjkuNDkwMzMyLDMuMzQzMTQ1NzUgQzcyLjYxNDUyNjMsMC4yMTg5NTE0MTYgNzcuNjc5ODQ2MiwwLjIxODk1MTQxNiA4MC44MDQwNDA1LDMuMzQzMTQ1NzUgQzgzLjg2MTc2MjYsNi40MDA4Njc4NiA4My45MjY4MjA1LDExLjMxNzk5MzEgODAuOTk5MjE0MywxNC40NTQ4Mzg4IEw4MC44MDQwNDA1LDE0LjY1Njg1NDIgTDM1LjQ2MSw2MCBMODAuODA0MDQwNSwxMDUuMzQzMTQ2IEM4My44NjE3NjI2LDEwOC40MDA4NjggODMuOTI2ODIwNSwxMTMuMzE3OTkzIDgwLjk5OTIxNDMsMTE2LjQ1NDgzOSBMODAuODA0MDQwNSwxMTYuNjU2ODU0IEM3Ny43NDYzMTg0LDExOS43MTQ1NzYgNzIuODI5MTkzMSwxMTkuNzc5NjM0IDY5LjY5MjM0NzUsMTE2Ljg1MjAyOCBMNjkuNDkwMzMyLDExNi42NTY4NTQgTDE4LjQ5MDMzMiw2NS42NTY4NTQyIEMxNS40MzI2MDk5LDYyLjU5OTEzMjEgMTUuMzY3NTUyLDU3LjY4MjAwNjkgMTguMjk1MTU4Myw1NC41NDUxNjEyIEwxOC40OTAzMzIsNTQuMzQzMTQ1OCBMNjkuNDkwMzMyLDMuMzQzMTQ1NzUgWlwiLCBmaWxsOiBcImN1cnJlbnRDb2xvclwiLCBmaWxsUnVsZTogXCJub256ZXJvXCIgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUljb25MZWZ0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSZW5kZXIgdGhlIFwibmV4dCBtb250aFwiIGJ1dHRvbiBpbiB0aGUgbmF2aWdhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEljb25SaWdodChwcm9wcykge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX2Fzc2lnbih7IHdpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIiwgdmlld0JveDogXCIwIDAgMTIwIDEyMFwiIH0sIHByb3BzLCB7IFwiZGF0YS10ZXN0aWRcIjogXCJpY29uUmlnaHRcIiB9KSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk00OS44MDQwNDA1LDMuMzQzMTQ1NzUgQzQ2LjY3OTg0NjIsMC4yMTg5NTE0MTYgNDEuNjE0NTI2MywwLjIxODk1MTQxNiAzOC40OTAzMzIsMy4zNDMxNDU3NSBDMzUuNDMyNjA5OSw2LjQwMDg2Nzg2IDM1LjM2NzU1MiwxMS4zMTc5OTMxIDM4LjI5NTE1ODMsMTQuNDU0ODM4OCBMMzguNDkwMzMyLDE0LjY1Njg1NDIgTDgzLjgzMzM3MjUsNjAgTDM4LjQ5MDMzMiwxMDUuMzQzMTQ2IEMzNS40MzI2MDk5LDEwOC40MDA4NjggMzUuMzY3NTUyLDExMy4zMTc5OTMgMzguMjk1MTU4MywxMTYuNDU0ODM5IEwzOC40OTAzMzIsMTE2LjY1Njg1NCBDNDEuNTQ4MDU0MSwxMTkuNzE0NTc2IDQ2LjQ2NTE3OTQsMTE5Ljc3OTYzNCA0OS42MDIwMjUsMTE2Ljg1MjAyOCBMNDkuODA0MDQwNSwxMTYuNjU2ODU0IEwxMDAuODA0MDQxLDY1LjY1Njg1NDIgQzEwMy44NjE3NjMsNjIuNTk5MTMyMSAxMDMuOTI2ODIxLDU3LjY4MjAwNjkgMTAwLjk5OTIxNCw1NC41NDUxNjEyIEwxMDAuODA0MDQxLDU0LjM0MzE0NTggTDQ5LjgwNDA0MDUsMy4zNDMxNDU3NSBaXCIsIGZpbGw6IFwiY3VycmVudENvbG9yXCIgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUljb25SaWdodC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VW5peFRpbWUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgYSByb3cgaW4gdGhlIGNhbGVuZGFyLCB3aXRoIHRoZSBkYXlzIGFuZCBvcHRpb25hbGx5IHRoZSB3ZWVrIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJvdyhwcm9wcykge1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzaG93V2Vla051bWJlciA9IF9hLnNob3dXZWVrTnVtYmVyLCBfYiA9IF9hLmNvbXBvbmVudHMsIERheSA9IF9iLkRheSwgV2Vla051bWJlciA9IF9iLldlZWtOdW1iZXI7XG4gICAgdmFyIHdlZWtOdW1iZXJDZWxsO1xuICAgIGlmIChzaG93V2Vla051bWJlcikge1xuICAgICAgICB3ZWVrTnVtYmVyQ2VsbCA9IChSZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2VsbCwgc3R5bGU6IHN0eWxlcy5jZWxsIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdlZWtOdW1iZXIsIHsgbnVtYmVyOiBwcm9wcy53ZWVrTnVtYmVyLCBkYXRlczogcHJvcHMuZGF0ZXMgfSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMucm93LCBzdHlsZTogc3R5bGVzLnJvdyB9LFxuICAgICAgICB3ZWVrTnVtYmVyQ2VsbCxcbiAgICAgICAgcHJvcHMuZGF0ZXMubWFwKGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNlbGwsIHN0eWxlOiBzdHlsZXMuY2VsbCwga2V5OiBnZXRVbml4VGltZShkYXRlKSB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEYXksIHsgZGlzcGxheU1vbnRoOiBwcm9wcy5kaXNwbGF5TW9udGgsIGRhdGU6IGRhdGUgfSkpKTsgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvdy5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uL0J1dHRvbic7XG4vKipcbiAqIFJlbmRlciB0aGUgd2VlayBudW1iZXIgZWxlbWVudC4gSWYgYG9uV2Vla051bWJlckNsaWNrYCBpcyBwYXNzZWQgdG8gRGF5UGlja2VyLCBpdFxuICogcmVuZGVycyBhIGJ1dHRvbiwgb3RoZXJ3aXNlIGEgc3BhbiBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gV2Vla051bWJlcihwcm9wcykge1xuICAgIHZhciB3ZWVrTnVtYmVyID0gcHJvcHMubnVtYmVyLCBkYXRlcyA9IHByb3BzLmRhdGVzO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBvbldlZWtOdW1iZXJDbGljayA9IF9hLm9uV2Vla051bWJlckNsaWNrLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBsb2NhbGUgPSBfYS5sb2NhbGUsIGxhYmVsV2Vla051bWJlciA9IF9hLmxhYmVscy5sYWJlbFdlZWtOdW1iZXIsIGZvcm1hdFdlZWtOdW1iZXIgPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdFdlZWtOdW1iZXI7XG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgb25XZWVrTnVtYmVyQ2xpY2sgPT09IG51bGwgfHwgb25XZWVrTnVtYmVyQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uV2Vla051bWJlckNsaWNrKHdlZWtOdW1iZXIsIGRhdGVzLCBlKTtcbiAgICB9O1xuICAgIHZhciBjb250ZW50ID0gZm9ybWF0V2Vla051bWJlcihOdW1iZXIod2Vla051bWJlciksIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgaWYgKCFvbldlZWtOdW1iZXJDbGljaykge1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLndlZWtudW1iZXIsIHN0eWxlOiBzdHlsZXMud2Vla251bWJlciB9LCBjb250ZW50KSk7XG4gICAgfVxuICAgIHZhciBsYWJlbCA9IGxhYmVsV2Vla051bWJlcihOdW1iZXIod2Vla051bWJlciksIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwgeyBcImFyaWEtbGFiZWxcIjogbGFiZWwsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy53ZWVrbnVtYmVyLCBzdHlsZTogc3R5bGVzLndlZWtudW1iZXIsIG9uQ2xpY2s6IGhhbmRsZUNsaWNrIH0sIGNvbnRlbnQpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlZWtOdW1iZXIuanMubWFwIiwiLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBDU1MgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IHZhciBkZWZhdWx0Q2xhc3NOYW1lcyA9IHtcbiAgICByb290OiAncmRwJyxcbiAgICBtdWx0aXBsZV9tb250aHM6ICdyZHAtbXVsdGlwbGVfbW9udGhzJyxcbiAgICB3aXRoX3dlZWtudW1iZXI6ICdyZHAtd2l0aF93ZWVrbnVtYmVyJyxcbiAgICB2aGlkZGVuOiAncmRwLXZoaWRkZW4nLFxuICAgIGJ1dHRvbl9yZXNldDogJ3JkcC1idXR0b25fcmVzZXQnLFxuICAgIGJ1dHRvbjogJ3JkcC1idXR0b24nLFxuICAgIGNhcHRpb246ICdyZHAtY2FwdGlvbicsXG4gICAgY2FwdGlvbl9zdGFydDogJ3JkcC1jYXB0aW9uX3N0YXJ0JyxcbiAgICBjYXB0aW9uX2VuZDogJ3JkcC1jYXB0aW9uX2VuZCcsXG4gICAgY2FwdGlvbl9iZXR3ZWVuOiAncmRwLWNhcHRpb25fYmV0d2VlbicsXG4gICAgY2FwdGlvbl9sYWJlbDogJ3JkcC1jYXB0aW9uX2xhYmVsJyxcbiAgICBjYXB0aW9uX2Ryb3Bkb3duczogJ3JkcC1jYXB0aW9uX2Ryb3Bkb3ducycsXG4gICAgZHJvcGRvd246ICdyZHAtZHJvcGRvd24nLFxuICAgIGRyb3Bkb3duX21vbnRoOiAncmRwLWRyb3Bkb3duX21vbnRoJyxcbiAgICBkcm9wZG93bl95ZWFyOiAncmRwLWRyb3Bkb3duX3llYXInLFxuICAgIGRyb3Bkb3duX2ljb246ICdyZHAtZHJvcGRvd25faWNvbicsXG4gICAgbW9udGhzOiAncmRwLW1vbnRocycsXG4gICAgbW9udGg6ICdyZHAtbW9udGgnLFxuICAgIHRhYmxlOiAncmRwLXRhYmxlJyxcbiAgICB0Ym9keTogJ3JkcC10Ym9keScsXG4gICAgdGZvb3Q6ICdyZHAtdGZvb3QnLFxuICAgIGhlYWQ6ICdyZHAtaGVhZCcsXG4gICAgaGVhZF9yb3c6ICdyZHAtaGVhZF9yb3cnLFxuICAgIGhlYWRfY2VsbDogJ3JkcC1oZWFkX2NlbGwnLFxuICAgIG5hdjogJ3JkcC1uYXYnLFxuICAgIG5hdl9idXR0b246ICdyZHAtbmF2X2J1dHRvbicsXG4gICAgbmF2X2J1dHRvbl9wcmV2aW91czogJ3JkcC1uYXZfYnV0dG9uX3ByZXZpb3VzJyxcbiAgICBuYXZfYnV0dG9uX25leHQ6ICdyZHAtbmF2X2J1dHRvbl9uZXh0JyxcbiAgICBuYXZfaWNvbjogJ3JkcC1uYXZfaWNvbicsXG4gICAgcm93OiAncmRwLXJvdycsXG4gICAgd2Vla251bWJlcjogJ3JkcC13ZWVrbnVtYmVyJyxcbiAgICBjZWxsOiAncmRwLWNlbGwnLFxuICAgIGRheTogJ3JkcC1kYXknLFxuICAgIGRheV9vdXRzaWRlOiAncmRwLWRheV9vdXRzaWRlJ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHRDbGFzc05hbWVzLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgY2FwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhcHRpb24obW9udGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KG1vbnRoLCAnTExMTCB5Jywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRDYXB0aW9uLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgRGF5IGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheShkYXksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KGRheSwgJ2QnLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdERheS5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIE1vbnRoIGNhcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNb250aENhcHRpb24obW9udGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KG1vbnRoLCAnTExMTCcsIG9wdGlvbnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0TW9udGhDYXB0aW9uLmpzLm1hcCIsIi8qKlxuICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgd2VlayBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyKHdlZWtOdW1iZXIpIHtcbiAgICByZXR1cm4gXCJcIiArIHdlZWtOdW1iZXI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRXZWVrTnVtYmVyLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgbmFtZSBvZiB0aGUgd2Vla2RheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOYW1lKHdlZWtkYXksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KHdlZWtkYXksICdjY2NjY2MnLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdFdlZWtkYXlOYW1lLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgZm9ybWF0dGVyIGZvciB0aGUgWWVhciBjYXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0WWVhckNhcHRpb24oeWVhciwgb3B0aW9ucykge1xuICAgIHJldHVybiBmb3JtYXQoeWVhciwgJ3l5eXknLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdFllYXJDYXB0aW9uLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgQVJJQSBsYWJlbCBmb3IgdGhlIGRheSBidXR0b24uXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxEYXkgPSBmdW5jdGlvbiAoZGF5LCBtb2RpZmVycywgb3B0aW9ucykge1xuICAgIHJldHVybiBmb3JtYXQoZGF5LCAnZG8gTU1NTSAoRUVFRSknLCBvcHRpb25zKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbERheS5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrTnVtYmVyIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxNb250aERyb3Bkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnTW9udGg6ICc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxNb250aERyb3Bkb3duLmpzLm1hcCIsIi8qKlxuICogVGhlIGRlZmF1bHQgQVJJQSBsYWJlbCBmb3IgbmV4dCBtb250aCBidXR0b24gaW4gbmF2aWdhdGlvblxuICovXG5leHBvcnQgdmFyIGxhYmVsTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ0dvIHRvIG5leHQgbW9udGgnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsTmV4dC5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHByZXZpb3VzIG1vbnRoIGJ1dHRvbiBpbiBuYXZpZ2F0aW9uXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxQcmV2aW91cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ0dvIHRvIHByZXZpb3VzIG1vbnRoJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbFByZXZpb3VzLmpzLm1hcCIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogVGhlIGRlZmF1bHQgQVJJQSBsYWJlbCBmb3IgdGhlIFdlZWtkYXkgZWxlbWVudC5cbiAqL1xuZXhwb3J0IHZhciBsYWJlbFdlZWtkYXkgPSBmdW5jdGlvbiAoZGF5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChkYXksICdjY2NjJywgb3B0aW9ucyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxXZWVrZGF5LmpzLm1hcCIsIi8qKlxuICogVGhlIGRlZmF1bHQgQVJJQSBsYWJlbCBmb3IgdGhlIFdlZWtOdW1iZXIgZWxlbWVudC5cbiAqL1xuZXhwb3J0IHZhciBsYWJlbFdlZWtOdW1iZXIgPSBmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBcIldlZWsgbi4gXCIgKyBuO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsV2Vla051bWJlci5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrTnVtYmVyIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxZZWFyRHJvcGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdZZWFyOiAnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsWWVhckRyb3Bkb3duLmpzLm1hcCIsImltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogQnVpbGQgdGhlIGBmcm9tRGF0ZWAgYW5kIGB0b0RhdGVgIHZhbHVlcywgZ2l2ZW4gdGhlIGZyb21Nb250aC90b01vbnRoXG4gKiBvciBmcm9tWWVhci90b1llYXIgcHJvcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb21Ub1Byb3BzKHByb3BzKSB7XG4gICAgdmFyIGZyb21ZZWFyID0gcHJvcHMuZnJvbVllYXIsIHRvWWVhciA9IHByb3BzLnRvWWVhciwgZnJvbU1vbnRoID0gcHJvcHMuZnJvbU1vbnRoLCB0b01vbnRoID0gcHJvcHMudG9Nb250aDtcbiAgICB2YXIgZnJvbURhdGUgPSBwcm9wcy5mcm9tRGF0ZSwgdG9EYXRlID0gcHJvcHMudG9EYXRlO1xuICAgIGlmIChmcm9tTW9udGgpIHtcbiAgICAgICAgZnJvbURhdGUgPSBzdGFydE9mTW9udGgoZnJvbU1vbnRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZnJvbVllYXIpIHtcbiAgICAgICAgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tWWVhciwgMCwgMSk7XG4gICAgfVxuICAgIGlmICh0b01vbnRoKSB7XG4gICAgICAgIHRvRGF0ZSA9IHN0YXJ0T2ZNb250aCh0b01vbnRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9ZZWFyKSB7XG4gICAgICAgIHRvRGF0ZSA9IG5ldyBEYXRlKHRvWWVhciwgMTEsIDMxKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbURhdGU6IGZyb21EYXRlID8gc3RhcnRPZkRheShmcm9tRGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRvRGF0ZTogdG9EYXRlID8gc3RhcnRPZkRheSh0b0RhdGUpIDogdW5kZWZpbmVkXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlRnJvbVRvUHJvcHMuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGVuVVMgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUnO1xuaW1wb3J0IHsgQ2FwdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ2FwdGlvbic7XG5pbXBvcnQgeyBDYXB0aW9uTGFiZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0NhcHRpb25MYWJlbCc7XG5pbXBvcnQgeyBEYXkgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0RheSc7XG5pbXBvcnQgeyBEYXlDb250ZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9EYXlDb250ZW50JztcbmltcG9ydCB7IERyb3Bkb3duIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Ecm9wZG93bic7XG5pbXBvcnQgeyBGb290ZXIgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0Zvb3Rlcic7XG5pbXBvcnQgeyBIZWFkIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9IZWFkJztcbmltcG9ydCB7IEljb25Ecm9wZG93biB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSWNvbkRyb3Bkb3duJztcbmltcG9ydCB7IEljb25MZWZ0IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9JY29uTGVmdCc7XG5pbXBvcnQgeyBJY29uUmlnaHQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0ljb25SaWdodCc7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1Jvdyc7XG5pbXBvcnQgeyBXZWVrTnVtYmVyIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9XZWVrTnVtYmVyJztcbmltcG9ydCB7IGRlZmF1bHRDbGFzc05hbWVzIH0gZnJvbSAnLi9kZWZhdWx0Q2xhc3NOYW1lcyc7XG5pbXBvcnQgKiBhcyBmb3JtYXR0ZXJzIGZyb20gJy4vZm9ybWF0dGVycyc7XG5pbXBvcnQgKiBhcyBsYWJlbHMgZnJvbSAnLi9sYWJlbHMnO1xuaW1wb3J0IHsgcGFyc2VGcm9tVG9Qcm9wcyB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBUaGUgRGF5UGlja2VyIENvbnRleHQgc2hhcmVzIHRoZSBwcm9wcyBwYXNzZWQgdG8gRGF5UGlja2VyIHdpdGhpbiBpbnRlcm5hbFxuICogYW5kIGN1c3RvbSBjb21wb25lbnRzLiBJdCBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgYW5kIHBlcmZvcm1cbiAqIG9uZS10aW1lIGNhbGN1bGF0aW9ucyByZXF1aXJlZCB0byByZW5kZXIgdGhlIGRheXMuXG4gKlxuICogRGV2ZWxvcGVycyBtYXkgYWNjZXNzIHRvIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZURheVBpY2tlcl1dIGhvb2sgd2hlblxuICogdXNpbmcgY3VzdG9tIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB2YXIgRGF5UGlja2VyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKlxuICogVGhlIHByb3ZpZGVyIGZvciB0aGUgW1tEYXlQaWNrZXJDb250ZXh0XV0uXG4gKlxuICogVGhlIGNvbnRleHQgdmFsdWUgaXMgc2V0IGJ5IGFzc2lnbmluZyBkZWZhdWx0cyBmcm9tIHRoZSBpbml0aWFsIERheVBpY2tlclxuICogcHJvcHMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERheVBpY2tlclByb3ZpZGVyKHByb3BzKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBpbml0aWFsUHJvcHMgPSBwcm9wcy5pbml0aWFsUHJvcHM7XG4gICAgdmFyIGxvY2FsZSA9IChfYSA9IGluaXRpYWxQcm9wcy5sb2NhbGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGVuVVM7XG4gICAgdmFyIG51bWJlck9mTW9udGhzID0gKF9iID0gaW5pdGlhbFByb3BzLm51bWJlck9mTW9udGhzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAxO1xuICAgIHZhciB0b2RheSA9IChfYyA9IGluaXRpYWxQcm9wcy50b2RheSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IERhdGUoKTtcbiAgICAvLyBMaW1pdCBuYXZpZ2F0aW9uXG4gICAgdmFyIF9oID0gcGFyc2VGcm9tVG9Qcm9wcyhpbml0aWFsUHJvcHMpLCBmcm9tRGF0ZSA9IF9oLmZyb21EYXRlLCB0b0RhdGUgPSBfaC50b0RhdGU7XG4gICAgLy8gRGVmYXVsdCBjYXB0aW9uIGxheW91dC4gSWYgY2FsZW5kYXIgbmF2aWdhdGlvbiBpcyB1bmxpbWl0ZWQsIGl0IG11c3QgYmVcbiAgICAvLyBhbHdheXMgYGJ1dHRvbnNgIOKAkyBhcyB3ZSBjYW5ub3QgZGlzcGxheSB5ZXQgaW5maW5pdGUgb3B0aW9ucyBpbiB0aGUgZHJvcGRvd24uXG4gICAgdmFyIGNhcHRpb25MYXlvdXQgPSAoX2QgPSBpbml0aWFsUHJvcHMuY2FwdGlvbkxheW91dCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJ2J1dHRvbnMnO1xuICAgIGlmICghZnJvbURhdGUgJiYgIXRvRGF0ZSlcbiAgICAgICAgY2FwdGlvbkxheW91dCA9ICdidXR0b25zJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgdmFyIHRvWWVhciA9IGluaXRpYWxQcm9wcy50b1llYXIsIGZyb21ZZWFyID0gaW5pdGlhbFByb3BzLmZyb21ZZWFyLCB0b01vbnRoID0gaW5pdGlhbFByb3BzLnRvTW9udGgsIGZyb21Nb250aCA9IGluaXRpYWxQcm9wcy5mcm9tTW9udGgsIGNvbnRleHRQcm9wcyA9IF9fcmVzdChpbml0aWFsUHJvcHMsIFtcInRvWWVhclwiLCBcImZyb21ZZWFyXCIsIFwidG9Nb250aFwiLCBcImZyb21Nb250aFwiXSk7XG4gICAgdmFyIGNvbnRleHQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dFByb3BzKSwgeyBjYXB0aW9uTGF5b3V0OiBjYXB0aW9uTGF5b3V0LCBmcm9tRGF0ZTogZnJvbURhdGUsIHRvRGF0ZTogdG9EYXRlLCB0b2RheTogdG9kYXksIGxvY2FsZTogbG9jYWxlLCBtb2RpZmllckNsYXNzTmFtZXM6IChfZSA9IGluaXRpYWxQcm9wcy5tb2RpZmllckNsYXNzTmFtZXMpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHt9LCBcbiAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgaW5pdGlhbFByb3BzLm1vZGlmaWVyUHJlZml4ID8/ICdyZHAtZGF5Xyc/XG4gICAgICAgIG1vZGlmaWVyUHJlZml4OiAncmRwLWRheV8nLCBtb2RpZmllcnM6IChfZiA9IGluaXRpYWxQcm9wcy5tb2RpZmllcnMpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHt9LCBudW1iZXJPZk1vbnRoczogbnVtYmVyT2ZNb250aHMsIHN0eWxlczogKF9nID0gaW5pdGlhbFByb3BzLnN0eWxlcykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDoge30sIGNsYXNzTmFtZXM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0Q2xhc3NOYW1lcyksIGluaXRpYWxQcm9wcy5jbGFzc05hbWVzKSwgZm9ybWF0dGVyczogX19hc3NpZ24oX19hc3NpZ24oe30sIGZvcm1hdHRlcnMpLCBpbml0aWFsUHJvcHMuZm9ybWF0dGVycyksIGxhYmVsczogX19hc3NpZ24oX19hc3NpZ24oe30sIGxhYmVscyksIGluaXRpYWxQcm9wcy5sYWJlbHMpLCBjb21wb25lbnRzOiBfX2Fzc2lnbih7IENhcHRpb246IENhcHRpb24sIENhcHRpb25MYWJlbDogQ2FwdGlvbkxhYmVsLCBEYXk6IERheSwgRGF5Q29udGVudDogRGF5Q29udGVudCwgRHJvcGRvd246IERyb3Bkb3duLCBGb290ZXI6IEZvb3RlciwgSGVhZDogSGVhZCwgSWNvbkRyb3Bkb3duOiBJY29uRHJvcGRvd24sIEljb25SaWdodDogSWNvblJpZ2h0LCBJY29uTGVmdDogSWNvbkxlZnQsIFJvdzogUm93LCBXZWVrTnVtYmVyOiBXZWVrTnVtYmVyIH0sIGluaXRpYWxQcm9wcy5jb21wb25lbnRzKSB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5UGlja2VyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY29udGV4dCB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRGF5UGlja2VyQ29udGV4dCB9IGZyb20gJy4vRGF5UGlja2VyQ29udGV4dCc7XG4vKipcbiAqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW0RheVBpY2tlckNvbnRleHRdXS5cbiAqXG4gKiBUbyB1c2UgdGhpcyBob29rIG1ha2Ugc3VyZSB0byB3cmFwIHRoZSBjb21wb25lbnRzIHdpdGggYSBvbmVcbiAqIFtbRGF5UGlja2VyUHJvdmlkZXJdXS5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF5UGlja2VyKCkge1xuICAgIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEYXlQaWNrZXJDb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBub3QgZGVmaW5lZC4gdXNlRGF5UGlja2VyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBEYXlQaWNrZXJQcm92aWRlciB3aXRoIGEgdmFsaWQgdmFsdWVzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VEYXlQaWNrZXIuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLCBlbmRPZldlZWsgfSBmcm9tICdkYXRlLWZucyc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0c2lkZUVuZERheXMobW9udGgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5cyA9IFtdO1xuICAgIHZhciBsYXN0RGF5T2ZXZWVrID0gZW5kT2ZXZWVrKG1vbnRoLCBvcHRpb25zKTtcbiAgICB2YXIgZW5kRGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXN0RGF5T2ZXZWVrLCBtb250aCk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gZW5kRGlmZjsgaSsrKSB7XG4gICAgICAgIHZhciBkYXlEYXRlID0gYWRkRGF5cyhtb250aCwgaSk7XG4gICAgICAgIGRheXMucHVzaChkYXlEYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRPdXRzaWRlRW5kRGF5cy5qcy5tYXAiLCJpbXBvcnQgeyBhZGREYXlzLCBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIHN0YXJ0T2ZXZWVrIH0gZnJvbSAnZGF0ZS1mbnMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dHNpZGVTdGFydERheXMobW9udGgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5cyA9IFtdO1xuICAgIHZhciBmaXJzdERheU9mV2VlayA9IHN0YXJ0T2ZXZWVrKG1vbnRoLCBvcHRpb25zKTtcbiAgICB2YXIgc3RhcnREaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKG1vbnRoLCBmaXJzdERheU9mV2Vlayk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydERpZmY7IGkrKykge1xuICAgICAgICB2YXIgbmV3RGF5ID0gYWRkRGF5cyhmaXJzdERheU9mV2VlaywgaSk7XG4gICAgICAgIGRheXMucHVzaChuZXdEYXkpO1xuICAgIH1cbiAgICByZXR1cm4gZGF5cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE91dHNpZGVTdGFydERheXMuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgYWRkV2Vla3MsIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgZW5kT2ZNb250aCwgZ2V0V2VlaywgZ2V0V2Vla3NJbk1vbnRoLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBnZXRPdXRzaWRlRW5kRGF5cyB9IGZyb20gJy4vZ2V0T3V0c2lkZUVuZERheXMnO1xuaW1wb3J0IHsgZ2V0T3V0c2lkZVN0YXJ0RGF5cyB9IGZyb20gJy4vZ2V0T3V0c2lkZVN0YXJ0RGF5cyc7XG4vKipcbiAqIFJldHVybiB0aGUgd2Vla3MgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBtb250aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtzKG1vbnRoLCBfYSkge1xuICAgIHZhciBsb2NhbGUgPSBfYS5sb2NhbGUsIGZpeGVkV2Vla3MgPSBfYS5maXhlZFdlZWtzO1xuICAgIHZhciBtb250aFN0YXJ0ID0gc3RhcnRPZk1vbnRoKG1vbnRoKTtcbiAgICB2YXIgbW9udGhFbmQgPSBlbmRPZk1vbnRoKG1vbnRoKTtcbiAgICB2YXIgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhtb250aEVuZCwgbW9udGhTdGFydCk7XG4gICAgdmFyIHdlZWtzID0gW107XG4gICAgdmFyIGxhc3RXZWVrID0geyB3ZWVrTnVtYmVyOiAwLCBkYXRlczogW10gfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkaWZmOyBpKyspIHtcbiAgICAgICAgdmFyIGRhdGUgPSBhZGREYXlzKG1vbnRoU3RhcnQsIGkpO1xuICAgICAgICB2YXIgd2VlayA9IGdldFdlZWsoZGF0ZSwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICAgICAgaWYgKGxhc3RXZWVrLndlZWtOdW1iZXIgIT09IHdlZWspIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyB3ZWVrIGJ5IGFkZGluZyBvdXRzaWRlIHN0YXJ0IGRheXNcbiAgICAgICAgICAgIHZhciBzdGFydERheXMgPSBnZXRPdXRzaWRlU3RhcnREYXlzKGRhdGUsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgICAgICAgICBsYXN0V2VlayA9IHsgd2Vla051bWJlcjogd2VlaywgZGF0ZXM6IHN0YXJ0RGF5cyB9O1xuICAgICAgICAgICAgd2Vla3MucHVzaChsYXN0V2Vlayk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFdlZWsuZGF0ZXMucHVzaChkYXRlKTtcbiAgICB9XG4gICAgdmFyIGxhc3REYXkgPSBsYXN0V2Vlay5kYXRlc1tsYXN0V2Vlay5kYXRlcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgZW5kRGF5cyA9IGdldE91dHNpZGVFbmREYXlzKGxhc3REYXksIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgbGFzdFdlZWsuZGF0ZXMgPSBsYXN0V2Vlay5kYXRlcy5jb25jYXQoZW5kRGF5cyk7XG4gICAgLy8gQWRkIGV4dHJhIHdlZWtzIHRvIHRoZSBtb250aCwgdXAgdG8gNiB3ZWVrc1xuICAgIGlmIChmaXhlZFdlZWtzKSB7XG4gICAgICAgIHZhciBsYXN0V2Vla0RhdGUgPSBsYXN0V2Vlay5kYXRlc1tsYXN0V2Vlay5kYXRlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdmFyIHdlZWtzSW5Nb250aCA9IGdldFdlZWtzSW5Nb250aChtb250aCwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICAgICAgaWYgKHdlZWtzSW5Nb250aCA8IDYpIHtcbiAgICAgICAgICAgIHZhciBkaWZmRGF5cyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhhZGRXZWVrcyhsYXN0V2Vla0RhdGUsIDYgLSB3ZWVrc0luTW9udGgpLCBsYXN0V2Vla0RhdGUpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmRGF5czsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBhZGREYXlzKGxhc3RXZWVrRGF0ZSwgaSArIDEpO1xuICAgICAgICAgICAgICAgIHZhciB3ZWVrID0gZ2V0V2VlayhkYXRlLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0V2Vlay53ZWVrTnVtYmVyICE9PSB3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXZWVrID0geyB3ZWVrTnVtYmVyOiB3ZWVrLCBkYXRlczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgd2Vla3MucHVzaChsYXN0V2Vlayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3RXZWVrLmRhdGVzLnB1c2goZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdlZWtzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0V2Vla3MuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyBnZXRXZWVrcyB9IGZyb20gJy4vdXRpbHMvZ2V0V2Vla3MnO1xuLyoqXG4gKiBSZW5kZXIgdGhlIHRhYmxlIHdpdGggdGhlIGNhbGVuZGFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGFibGUocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgbG9jYWxlID0gX2EubG9jYWxlLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBoaWRlSGVhZCA9IF9hLmhpZGVIZWFkLCBmaXhlZFdlZWtzID0gX2EuZml4ZWRXZWVrcywgX2IgPSBfYS5jb21wb25lbnRzLCBIZWFkID0gX2IuSGVhZCwgUm93ID0gX2IuUm93LCBGb290ZXIgPSBfYi5Gb290ZXI7XG4gICAgdmFyIHdlZWtzID0gZ2V0V2Vla3MocHJvcHMuZGlzcGxheU1vbnRoLCB7IGxvY2FsZTogbG9jYWxlLCBmaXhlZFdlZWtzOiBmaXhlZFdlZWtzIH0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnRhYmxlLCBzdHlsZTogc3R5bGVzLnRhYmxlLCByb2xlOiBcImdyaWRcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIjogcHJvcHNbJ2FyaWEtbGFiZWxsZWRieSddIH0sXG4gICAgICAgICFoaWRlSGVhZCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KEhlYWQsIG51bGwpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMudGJvZHksIHN0eWxlOiBzdHlsZXMudGJvZHkgfSwgd2Vla3MubWFwKGZ1bmN0aW9uICh3ZWVrKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSb3csIHsgZGlzcGxheU1vbnRoOiBwcm9wcy5kaXNwbGF5TW9udGgsIGtleTogd2Vlay53ZWVrTnVtYmVyLCBkYXRlczogd2Vlay5kYXRlcywgd2Vla051bWJlcjogd2Vlay53ZWVrTnVtYmVyIH0pKTsgfSkpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZvb3RlciwgbnVsbCkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlSWQgfSBmcm9tICdAcmVhY2gvYXV0by1pZCc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvVGFibGUnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb250ZXh0cy9OYXZpZ2F0aW9uJztcbi8qKiBSZW5kZXIgYSBtb250aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb250aChwcm9wcykge1xuICAgIHZhciBfYTtcbiAgICB2YXIgX2IgPSB1c2VEYXlQaWNrZXIoKSwgZGlyID0gX2IuZGlyLCBjbGFzc05hbWVzID0gX2IuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Iuc3R5bGVzLCBDYXB0aW9uID0gX2IuY29tcG9uZW50cy5DYXB0aW9uO1xuICAgIHZhciBkaXNwbGF5TW9udGhzID0gdXNlTmF2aWdhdGlvbigpLmRpc3BsYXlNb250aHM7XG4gICAgdmFyIGNhcHRpb25JZCA9IHVzZUlkKCk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IFtjbGFzc05hbWVzLm1vbnRoXTtcbiAgICB2YXIgc3R5bGUgPSBzdHlsZXMubW9udGg7XG4gICAgdmFyIGlzU3RhcnQgPSBwcm9wcy5kaXNwbGF5SW5kZXggPT09IDA7XG4gICAgdmFyIGlzRW5kID0gcHJvcHMuZGlzcGxheUluZGV4ID09PSBkaXNwbGF5TW9udGhzLmxlbmd0aCAtIDE7XG4gICAgdmFyIGlzQ2VudGVyID0gIWlzU3RhcnQgJiYgIWlzRW5kO1xuICAgIGlmIChkaXIgPT09ICdydGwnKSB7XG4gICAgICAgIF9hID0gW2lzU3RhcnQsIGlzRW5kXSwgaXNFbmQgPSBfYVswXSwgaXNTdGFydCA9IF9hWzFdO1xuICAgIH1cbiAgICBpZiAoaXNTdGFydCkge1xuICAgICAgICBjbGFzc05hbWUucHVzaChjbGFzc05hbWVzLmNhcHRpb25fc3RhcnQpO1xuICAgICAgICBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZSksIHN0eWxlcy5jYXB0aW9uX3N0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGlzRW5kKSB7XG4gICAgICAgIGNsYXNzTmFtZS5wdXNoKGNsYXNzTmFtZXMuY2FwdGlvbl9lbmQpO1xuICAgICAgICBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZSksIHN0eWxlcy5jYXB0aW9uX2VuZCk7XG4gICAgfVxuICAgIGlmIChpc0NlbnRlcikge1xuICAgICAgICBjbGFzc05hbWUucHVzaChjbGFzc05hbWVzLmNhcHRpb25fYmV0d2Vlbik7XG4gICAgICAgIHN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlKSwgc3R5bGVzLmNhcHRpb25fYmV0d2Vlbik7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGtleTogcHJvcHMuZGlzcGxheUluZGV4LCBjbGFzc05hbWU6IGNsYXNzTmFtZS5qb2luKCcgJyksIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENhcHRpb24sIHsgaWQ6IGNhcHRpb25JZCwgZGlzcGxheU1vbnRoOiBwcm9wcy5kaXNwbGF5TW9udGggfSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGUsIHsgXCJhcmlhLWxhYmVsbGVkYnlcIjogY2FwdGlvbklkLCBkaXNwbGF5TW9udGg6IHByb3BzLmRpc3BsYXlNb250aCB9KSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9udGguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNb250aCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvTW9udGgnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZUZvY3VzIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRm9jdXMnO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvbiB9IGZyb20gJy4uLy4uL2NvbnRleHRzL05hdmlnYXRpb24nO1xuLyoqXG4gKiBSZW5kZXIgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBtb250aHMgYW5kIHRoZWlyIGNhcHRpb25zLiBUaGUgbnVtYmVyIG9mIG1vbnRoc1xuICogcmVuZGVyZWQgZGVwZW5kcyBieSB0aGUgYG51bWJlck9mTW9udGhzYCBwcm9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUm9vdCgpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgZGlyID0gX2EuZGlyLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZSA9IF9hLnN0eWxlLCBzdHlsZXMgPSBfYS5zdHlsZXMsIG51bWJlck9mTW9udGhzID0gX2EubnVtYmVyT2ZNb250aHMsIHNob3dXZWVrTnVtYmVyID0gX2Euc2hvd1dlZWtOdW1iZXIsIGluaXRpYWxGb2N1cyA9IF9hLmluaXRpYWxGb2N1cztcbiAgICB2YXIgX2IgPSB1c2VGb2N1cygpLCBmb2N1c1RhcmdldCA9IF9iLmZvY3VzVGFyZ2V0LCBmb2N1cyA9IF9iLmZvY3VzO1xuICAgIHZhciBfYyA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSwgaGFzSW5pdGlhbEZvY3VzID0gX2NbMF0sIHNldEhhc0luaXRpYWxGb2N1cyA9IF9jWzFdO1xuICAgIHZhciBkaXNwbGF5TW9udGhzID0gdXNlTmF2aWdhdGlvbigpLmRpc3BsYXlNb250aHM7XG4gICAgdmFyIHJvb3RDbGFzc05hbWVzID0gW2NsYXNzTmFtZSAhPT0gbnVsbCAmJiBjbGFzc05hbWUgIT09IHZvaWQgMCA/IGNsYXNzTmFtZSA6IGNsYXNzTmFtZXMucm9vdF07XG4gICAgaWYgKG51bWJlck9mTW9udGhzID4gMSkge1xuICAgICAgICByb290Q2xhc3NOYW1lcy5wdXNoKGNsYXNzTmFtZXMubXVsdGlwbGVfbW9udGhzKTtcbiAgICB9XG4gICAgaWYgKHNob3dXZWVrTnVtYmVyKSB7XG4gICAgICAgIHJvb3RDbGFzc05hbWVzLnB1c2goY2xhc3NOYW1lcy53aXRoX3dlZWtudW1iZXIpO1xuICAgIH1cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaW5pdGlhbEZvY3VzICYmICFoYXNJbml0aWFsRm9jdXMgJiYgZm9jdXNUYXJnZXQpIHtcbiAgICAgICAgICAgIGZvY3VzKGZvY3VzVGFyZ2V0KTtcbiAgICAgICAgICAgIHNldEhhc0luaXRpYWxGb2N1cyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH0sIFtpbml0aWFsRm9jdXMsIGhhc0luaXRpYWxGb2N1cywgZm9jdXMsIGZvY3VzVGFyZ2V0XSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiByb290Q2xhc3NOYW1lcy5qb2luKCcgJyksIHN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzLnJvb3QpLCBzdHlsZSksIGRpcjogZGlyIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMubW9udGhzLCBzdHlsZTogc3R5bGVzLm1vbnRocyB9LCBkaXNwbGF5TW9udGhzLm1hcChmdW5jdGlvbiAobW9udGgsIGkpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoLCB7IGtleTogaSwgZGlzcGxheUluZGV4OiBpLCBkaXNwbGF5TW9udGg6IG1vbnRoIH0pKTsgfSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb290LmpzLm1hcCIsImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERheVBpY2tlclByb3ZpZGVyIH0gZnJvbSAnLi9EYXlQaWNrZXInO1xuaW1wb3J0IHsgRm9jdXNQcm92aWRlciB9IGZyb20gJy4vRm9jdXMnO1xuaW1wb3J0IHsgTW9kaWZpZXJzUHJvdmlkZXIgfSBmcm9tICcuL01vZGlmaWVycyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uUHJvdmlkZXIgfSBmcm9tICcuL05hdmlnYXRpb24nO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlwbGVQcm92aWRlciB9IGZyb20gJy4vU2VsZWN0TXVsdGlwbGUnO1xuaW1wb3J0IHsgU2VsZWN0UmFuZ2VQcm92aWRlciB9IGZyb20gJy4vU2VsZWN0UmFuZ2UnO1xuaW1wb3J0IHsgU2VsZWN0U2luZ2xlUHJvdmlkZXIgfSBmcm9tICcuL1NlbGVjdFNpbmdsZSc7XG4vKiogUHJvdmlkZSB0aGUgdmFsdWUgZm9yIGFsbCB0aGUgY29udGV4dCBwcm92aWRlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gUm9vdFByb3ZpZGVyKHByb3BzKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sIGluaXRpYWxQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEYXlQaWNrZXJQcm92aWRlciwgeyBpbml0aWFsUHJvcHM6IGluaXRpYWxQcm9wcyB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE5hdmlnYXRpb25Qcm92aWRlciwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0U2luZ2xlUHJvdmlkZXIsIHsgaW5pdGlhbFByb3BzOiBpbml0aWFsUHJvcHMgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdE11bHRpcGxlUHJvdmlkZXIsIHsgaW5pdGlhbFByb3BzOiBpbml0aWFsUHJvcHMgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RSYW5nZVByb3ZpZGVyLCB7IGluaXRpYWxQcm9wczogaW5pdGlhbFByb3BzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE1vZGlmaWVyc1Byb3ZpZGVyLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNQcm92aWRlciwgbnVsbCwgY2hpbGRyZW4pKSkpKSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJvb3RQcm92aWRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICcuL2NvbXBvbmVudHMvUm9vdCc7XG5pbXBvcnQgeyBSb290UHJvdmlkZXIgfSBmcm9tICcuL2NvbnRleHRzL1Jvb3RQcm92aWRlcic7XG4vKipcbiAqIERheVBpY2tlciByZW5kZXIgYSBkYXRlIHBpY2tlciBjb21wb25lbnQgdG8gbGV0IHVzZXJzIHBpY2sgZGF0ZXMgZnJvbSBhXG4gKiBjYWxlbmRhci4gU2VlIGh0dHA6Ly9yZWFjdC1kYXktcGlja2VyLmpzLm9yZyBmb3IgdXBkYXRlZCBkb2N1bWVudGF0aW9uIGFuZFxuICogZXhhbXBsZXMuXG4gKlxuICogIyMjIEN1c3RvbWl6YXRpb25cbiAqXG4gKiBEYXlQaWNrZXIgb2ZmZXJzIGRpZmZlcmVudCBjdXN0b21pemF0aW9uIHByb3BzLiBGb3IgZXhhbXBsZSxcbiAqXG4gKiAtIHNob3cgbXVsdGlwbGUgbW9udGhzIHVzaW5nIGBudW1iZXJPZk1vbnRoc2BcbiAqIC0gZGlzcGxheSBhIGRyb3Bkb3duIHRvIG5hdmlnYXRlIHRoZSBtb250aHMgdmlhIGBjYXB0aW9uTGF5b3V0YFxuICogLSBkaXNwbGF5IHRoZSB3ZWVrIG51bWJlcnMgd2l0aCBgc2hvd1dlZWtOdW1iZXJzYFxuICogLSBkaXNhYmxlIG9yIGhpZGUgZGF5cyB3aXRoIGBkaXNhYmxlZGAgb3IgYGhpZGRlbmBcbiAqXG4gKiAjIyMgQ29udHJvbGxpbmcgdGhlIG1vbnRoc1xuICpcbiAqIENoYW5nZSB0aGUgaW5pdGlhbGx5IGRpc3BsYXllZCBtb250aCB1c2luZyB0aGUgYGRlZmF1bHRNb250aGAgcHJvcC4gVGhlXG4gKiBkaXNwbGF5ZWQgbW9udGhzIGFyZSBjb250cm9sbGVkIGJ5IERheVBpY2tlciBhbmQgc3RvcmVkIGluIGl0cyBpbnRlcm5hbFxuICogc3RhdGUuIFRvIGNvbnRyb2wgdGhlIG1vbnRocyB5b3Vyc2VsZiwgdXNlIGBtb250aGAgaW5zdGVhZCBvZiBgZGVmYXVsdE1vbnRoYFxuICogYW5kIHVzZSB0aGUgYG9uTW9udGhDaGFuZ2VgIGV2ZW50IHRvIHNldCBpdC5cbiAqXG4gKiBUbyBsaW1pdCB0aGUgbW9udGhzIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZSB0bywgdXNlXG4gKiBgZnJvbURhdGVgL2Bmcm9tTW9udGhgL2Bmcm9tWWVhcmAgb3IgYHRvRGF0ZWAvYHRvTW9udGhgL2B0b1llYXJgLlxuICpcbiAqICMjIyBTZWxlY3Rpb24gbW9kZXNcbiAqXG4gKiBEYXlQaWNrZXIgc3VwcG9ydHMgZGlmZmVyZW50IHNlbGVjdGlvbiBtb2RlIHRoYXQgY2FuIGJlIHRvZ2dsZWQgdXNpbmcgdGhlXG4gKiBgbW9kZWAgcHJvcDpcbiAqXG4gKiAtIGBtb2RlPVwic2luZ2xlXCJgOiBvbmx5IG9uZSBkYXkgY2FuIGJlIHNlbGVjdGVkLiBVc2UgYHJlcXVpcmVkYCB0byBtYWtlIHRoZVxuICogICBzZWxlY3Rpb24gcmVxdWlyZWQuIFVzZSB0aGUgYG9uU2VsZWN0YCBldmVudCBoYW5kbGVyIHRvIGdldCB0aGUgc2VsZWN0ZWRcbiAqICAgZGF5cy5cbiAqIC0gYG1vZGU9XCJtdWx0aXBsZVwiYDogdXNlcnMgY2FuIHNlbGVjdCBvbmUgb3IgbW9yZSBkYXlzLiBMaW1pdCB0aGUgYW1vdW50IG9mXG4gKiAgIGRheXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGUgYG1pbmAgb3IgdGhlIGBtYXhgIHByb3BzLlxuICogLSBgbW9kZT1cInJhbmdlXCJgOiB1c2VycyBjYW4gc2VsZWN0IGEgcmFuZ2Ugb2YgZGF5cy4gTGltaXQgdGhlIGFtb3VudCBvZiBkYXlzXG4gKiAgIGluIHRoZSByYW5nZSB3aXRoIHRoZSBgbWluYCBvciB0aGUgYG1heGAgcHJvcHMuXG4gKiAtIGBtb2RlPVwiY3VzdG9tXCJgOiBpbXBsZW1lbnQgeW91ciBvd24gc2VsZWN0aW9uIG1vZGUgd2l0aCBgb25EYXlDbGlja2AuXG4gKlxuICogVGhlc2Ugc2VsZWN0aW9uIG1vZGVzIHNob3VsZCBjb3ZlciB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2VzLiBJbiBjYXNlIHlvdVxuICogbmVlZCBhIG1vcmUgcmVmaW5lZCB3YXkgb2Ygc2VsZWN0aW5nIGRheXMsIHVzZSBgbW9kZT1cImN1c3RvbVwiYC4gVXNlIHRoZVxuICogYHNlbGVjdGVkYCBwcm9wcyBhbmQgYWRkIHRoZSBkYXkgZXZlbnQgaGFuZGxlcnMgdG8gYWRkL3JlbW92ZSBkYXlzIGZyb20gdGhlXG4gKiBzZWxlY3Rpb24uXG4gKlxuICogIyMjIE1vZGlmaWVyc1xuICpcbiAqIEEgX21vZGlmaWVyXyByZXByZXNlbnRzIGRpZmZlcmVudCBzdHlsZXMgb3Igc3RhdGVzIGZvciB0aGUgZGF5cyBkaXNwbGF5ZWQgaW5cbiAqIHRoZSBjYWxlbmRhciAobGlrZSBcInNlbGVjdGVkXCIgb3IgXCJkaXNhYmxlZFwiKS4gRGVmaW5lIGN1c3RvbSBtb2RpZmllcnMgdXNpbmdcbiAqIHRoZSBgbW9kaWZpZXJzYCBwcm9wLlxuICpcbiAqICMjIyBGb3JtYXR0ZXJzIGFuZCBjdXN0b20gY29tcG9uZW50XG4gKlxuICogWW91IGNhbiBjdXN0b21pemUgaG93IHRoZSBjb250ZW50IGlzIGRpc3BsYXllZCBpbiB0aGUgZGF0ZSBwaWNrZXIgYnkgdXNpbmdcbiAqIGVpdGhlciB0aGUgZm9ybWF0dGVycyBvciByZXBsYWNpbmcgdGhlIGludGVybmFsIGNvbXBvbmVudHMuXG4gKlxuICogRm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlcyB5b3Ugd2FudCB0byB1c2UgdGhlIGBmb3JtYXR0ZXJzYCBwcm9wIHRvIGNoYW5nZSBob3dcbiAqIHRoZSBjb250ZW50IGlzIGZvcm1hdHRlZCBpbiB0aGUgY2FsZW5kYXIuIFVzZSB0aGUgYGNvbXBvbmVudHNgIHByb3AgdG9cbiAqIHJlcGxhY2UgdGhlIGludGVybmFsIGNvbXBvbmVudHMsIGxpa2UgdGhlIG5hdmlnYXRpb24gaWNvbnMuXG4gKlxuICogIyMjIFN0eWxpbmdcbiAqXG4gKiBEYXlQaWNrZXIgY29tZXMgd2l0aCBhIGRlZmF1bHQsIGJhc2ljIHN0eWxlIGluIGByZWFjdC1kYXktcGlja2VyL3N0eWxlYCDigJMgdXNlXG4gKiBpdCBhcyB0ZW1wbGF0ZSBmb3IgeW91ciBvd24gc3R5bGUuXG4gKlxuICogSWYgeW91IGFyZSB1c2luZyBDU1MgbW9kdWxlcywgcGFzcyB0aGUgaW1wb3J0ZWQgc3R5bGVzIG9iamVjdCB0aGVcbiAqIGBjbGFzc05hbWVzYCBwcm9wcy5cbiAqXG4gKiBZb3UgY2FuIGFsc28gc3R5bGUgdGhlIGVsZW1lbnRzIHZpYSBpbmxpbmUtc3R5bGVzIHVzaW5nIHRoZSBgc3R5bGVzYCBwcm9wLlxuICpcbiAqICMjIyBGb3JtIGZpZWxkc1xuICpcbiAqIElmIHlvdSBuZWVkIHRvIGJpbmQgdGhlIGRhdGUgcGlja2VyIHRvIGEgZm9ybSBmaWVsZCwgeW91IGNhbiB1c2UgdGhlXG4gKiBgdXNlSW5wdXRgIGhvb2tzIGZvciBhIGJhc2ljIGJlaGF2aW9yLiBTZWUgdGhlIGB1c2VJbnB1dGAgc291cmNlIGFzIGFuXG4gKiBleGFtcGxlIHRvIGJpbmQgdGhlIGRhdGUgcGlja2VyIHdpdGggZm9ybSBmaWVsZHMuXG4gKlxuICogIyMjIExvY2FsaXphdGlvblxuICpcbiAqIFRvIGxvY2FsaXplIERheVBpY2tlciwgaW1wb3J0IHRoZSBsb2NhbGUgZnJvbSBgZGF0ZS1mbnNgIHBhY2thZ2UgYW5kIHVzZSB0aGVcbiAqIGBsb2NhbGVgIHByb3AuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRvIHVzZSBTcGFuaXNoIGxvY2FsZTpcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCBlcyBmcm9tICdkYXRlLWZucy9sb2NhbGUvZXMnO1xuICogPERheVBpY2tlciBsb2NhbGU9e2VzfSAvPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXlQaWNrZXIocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm9vdFByb3ZpZGVyLCBfX2Fzc2lnbih7fSwgcHJvcHMpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFJvb3QsIG51bGwpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlQaWNrZXIuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCBpZiBpdCdzIGFuIGFycmF5LCByZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcnJheSxcbiAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBhcmd1bWVudC4gVXNlZCBmb3IgUHJlYWN0IGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCB2YXIgdW53cmFwQXJyYXkgPSBmdW5jdGlvbiB1bndyYXBBcnJheShhcmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKSA/IGFyZ1swXSA6IGFyZztcbn07XG4vKipcbiAqIFRha2VzIGEgbWF5YmUtdW5kZWZpbmVkIGZ1bmN0aW9uIGFuZCBhcmJpdHJhcnkgYXJncyBhbmQgaW52b2tlcyB0aGUgZnVuY3Rpb25cbiAqIG9ubHkgaWYgaXQgaXMgZGVmaW5lZC5cbiAqL1xuXG5leHBvcnQgdmFyIHNhZmVJbnZva2UgPSBmdW5jdGlvbiBzYWZlSW52b2tlKGZuKSB7XG4gIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgfVxufTtcbi8qKlxuICogU2V0cyBhIHJlZiB1c2luZyBlaXRoZXIgYSByZWYgY2FsbGJhY2sgb3IgYSByZWYgb2JqZWN0XG4gKi9cblxuZXhwb3J0IHZhciBzZXRSZWYgPSBmdW5jdGlvbiBzZXRSZWYocmVmLCBub2RlKSB7XG4gIC8vIGlmIGl0cyBhIGZ1bmN0aW9uIGNhbGwgaXRcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FmZUludm9rZShyZWYsIG5vZGUpO1xuICB9IC8vIG90aGVyd2lzZSB3ZSBzaG91bGQgdHJlYXQgaXQgYXMgYSByZWYgb2JqZWN0XG4gIGVsc2UgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gICAgfVxufTtcbi8qKlxuICogU2ltcGxlIHBvbnlmaWxsIGZvciBPYmplY3QuZnJvbUVudHJpZXNcbiAqL1xuXG5leHBvcnQgdmFyIGZyb21FbnRyaWVzID0gZnVuY3Rpb24gZnJvbUVudHJpZXMoZW50cmllcykge1xuICByZXR1cm4gZW50cmllcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmWzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWZbMV07XG4gICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59O1xuLyoqXG4gKiBTbWFsbCB3cmFwcGVyIGFyb3VuZCBgdXNlTGF5b3V0RWZmZWN0YCB0byBnZXQgcmlkIG9mIHRoZSB3YXJuaW5nIG9uIFNTUiBlbnZzXG4gKi9cblxuZXhwb3J0IHZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0OyIsImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChub2RlKSB7XG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9OyIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7IC8vIFRoaXMgbW9kaWZpZXIgdGFrZXMgdGhlIHN0eWxlcyBwcmVwYXJlZCBieSB0aGUgYGNvbXB1dGVTdHlsZXNgIG1vZGlmaWVyXG4vLyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBIVE1MRWxlbWVudHMgc3VjaCBhcyBwb3BwZXIgYW5kIGFycm93XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGVzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZTtcbiAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS5zdHlsZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRmxvdyBkb2Vzbid0IHN1cHBvcnQgdG8gZXh0ZW5kIHRoaXMgcHJvcGVydHksIGJ1dCBpdCdzIHRoZSBtb3N0XG4gICAgLy8gZWZmZWN0aXZlIHdheSB0byBhcHBseSBzdHlsZXMgdG8gYW4gSFRNTEVsZW1lbnRcbiAgICAvLyAkRmxvd0ZpeE1lW2Nhbm5vdC13cml0ZV1cblxuXG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcblxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlID09PSB0cnVlID8gJycgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG4gIHZhciBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnXG4gICAgfSxcbiAgICBhcnJvdzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LFxuICAgIHJlZmVyZW5jZToge31cbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcbiAgc3RhdGUuc3R5bGVzID0gaW5pdGlhbFN0eWxlcztcblxuICBpZiAoc3RhdGUuZWxlbWVudHMuYXJyb3cpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgICB2YXIgc3R5bGVQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc3RhdGUuc3R5bGVzLmhhc093blByb3BlcnR5KG5hbWUpID8gc3RhdGUuc3R5bGVzW25hbWVdIDogaW5pdGlhbFN0eWxlc1tuYW1lXSk7IC8vIFNldCBhbGwgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZyB0byB1bnNldCB0aGVtXG5cbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlUHJvcGVydGllcy5yZWR1Y2UoZnVuY3Rpb24gKHN0eWxlLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdHlsZVtwcm9wZXJ0eV0gPSAnJztcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSwge30pOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBhcHBseVN0eWxlcyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXVxufTsiLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwiZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDsiLCJpbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpc0hUTUxFbGVtZW50KGVsZW1lbnQpICYmIGluY2x1ZGVTY2FsZSkge1xuICAgIHZhciBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoOyAvLyBEbyBub3QgYXR0ZW1wdCB0byBkaXZpZGUgYnkgMCwgb3RoZXJ3aXNlIHdlIGdldCBgSW5maW5pdHlgIGFzIHNjYWxlXG4gICAgLy8gRmFsbGJhY2sgdG8gMSBpbiBjYXNlIGJvdGggdmFsdWVzIGFyZSBgMGBcblxuICAgIGlmIChvZmZzZXRXaWR0aCA+IDApIHtcbiAgICAgIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gb2Zmc2V0V2lkdGggfHwgMTtcbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0SGVpZ2h0ID4gMCkge1xuICAgICAgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gb2Zmc2V0SGVpZ2h0IHx8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCAvIHNjYWxlWCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0IC8gc2NhbGVZLFxuICAgIHRvcDogcmVjdC50b3AgLyBzY2FsZVksXG4gICAgcmlnaHQ6IHJlY3QucmlnaHQgLyBzY2FsZVgsXG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSAvIHNjYWxlWSxcbiAgICBsZWZ0OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeDogcmVjdC5sZWZ0IC8gc2NhbGVYLFxuICAgIHk6IHJlY3QudG9wIC8gc2NhbGVZXG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuICB2YXIgaXNJRSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpICE9PSAtMTtcblxuICBpZiAoaXNJRSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gSW4gSUUgOSwgMTAgYW5kIDExIGZpeGVkIGVsZW1lbnRzIGNvbnRhaW5pbmcgYmxvY2sgaXMgYWx3YXlzIGVzdGFibGlzaGVkIGJ5IHRoZSB2aWV3cG9ydFxuICAgIHZhciBlbGVtZW50Q3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgIGlmIChlbGVtZW50Q3NzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXJyb3dcIiBlbGVtZW50IG11c3QgYmUgYW4gSFRNTEVsZW1lbnQgKG5vdCBhbiBTVkdFbGVtZW50KS4nLCAnVG8gdXNlIGFuIFNWRyBhcnJvdywgd3JhcCBpdCBpbiBhbiBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgdXNlZCBhcycsICd0aGUgYXJyb3cuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXJyb3dcIiBtb2RpZmllclxcJ3MgYGVsZW1lbnRgIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgcG9wcGVyJywgJ2VsZW1lbnQuJ10uam9pbignICcpKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYpIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55O1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZHByID0gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZCh4ICogZHByKSAvIGRwciB8fCAwLFxuICAgIHk6IHJvdW5kKHkgKiBkcHIpIC8gZHByIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgdmFyaWF0aW9uID0gX3JlZjIudmFyaWF0aW9uLFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cyxcbiAgICAgIGlzRml4ZWQgPSBfcmVmMi5pc0ZpeGVkO1xuICB2YXIgX29mZnNldHMkeCA9IG9mZnNldHMueCxcbiAgICAgIHggPSBfb2Zmc2V0cyR4ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeCxcbiAgICAgIF9vZmZzZXRzJHkgPSBvZmZzZXRzLnksXG4gICAgICB5ID0gX29mZnNldHMkeSA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHk7XG5cbiAgdmFyIF9yZWYzID0gdHlwZW9mIHJvdW5kT2Zmc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHJvdW5kT2Zmc2V0cyh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmMy54O1xuICB5ID0gX3JlZjMueTtcbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIHZhciBfcmVmNCA9IHJvdW5kT2Zmc2V0cyA9PT0gdHJ1ZSA/IHJvdW5kT2Zmc2V0c0J5RFBSKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWY0Lng7XG4gIHkgPSBfcmVmNC55O1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY1KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY1Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJ2YXIgaGFzaCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwOyAvLyBOQjogVGhpcyBpc24ndCBzdXBwb3J0ZWQgb24gaU9TIDw9IDEyLiBJZiB0aGUga2V5Ym9hcmQgaXMgb3BlbiwgdGhlIHBvcHBlclxuICAvLyBjYW4gYmUgb2JzY3VyZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gQWxzbywgYGh0bWwuY2xpZW50SGVpZ2h0YCBhZGRzIHRoZSBib3R0b20gYmFyIGhlaWdodCBpbiBTYWZhcmkgaU9TLCBldmVuXG4gIC8vIGlmIGl0IGlzbid0IG9wZW4sIHNvIGlmIHRoaXMgaXNuJ3QgYXZhaWxhYmxlLCB0aGUgcG9wcGVyIHdpbGwgYmUgZGV0ZWN0ZWRcbiAgLy8gdG8gb3ZlcmZsb3cgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvbyBlYXJseS5cblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDsgLy8gVXNlcyBMYXlvdXQgVmlld3BvcnQgKGxpa2UgQ2hyb21lOyBTYWZhcmkgZG9lcyBub3QgY3VycmVudGx5KVxuICAgIC8vIEluIENocm9tZSwgaXQgcmV0dXJucyBhIHZhbHVlIHZlcnkgY2xvc2UgdG8gMCAoKy8tKSBidXQgY29udGFpbnMgcm91bmRpbmdcbiAgICAvLyBlcnJvcnMgZHVlIHRvIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgcHJlY2lzaW9uLlxuICAgIC8vIFNhZmFyaSByZXR1cm5zIGEgbnVtYmVyIDw9IDAsIHVzdWFsbHkgPCAtMSB3aGVuIHBpbmNoLXpvb21lZFxuICAgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxzIGluIG1vYmlsZSBlbXVsYXRpb24gbW9kZSBpbiBDaHJvbWUuXG4gICAgLy8gTWF0aC5hYnMod2luLmlubmVyV2lkdGggLyB2aXN1YWxWaWV3cG9ydC5zY2FsZSAtIHZpc3VhbFZpZXdwb3J0LndpZHRoKSA8XG4gICAgLy8gMC4wMDFcbiAgICAvLyBGYWxsYmFjayBoZXJlOiBcIk5vdCBTYWZhcmlcIiB1c2VyQWdlbnRcblxuICAgIGlmICghL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gRmlyZWZveCB3YW50cyB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WTtcblxuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKTtcbn0iLCJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsImltcG9ydCBnZXRTY3JvbGxQYXJlbnQgZnJvbSBcIi4vZ2V0U2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlXG5yZWZlcmVuY2UgZWxlbWVudCdzIHBvc2l0aW9uLlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoZWxlbWVudCwgbGlzdCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50ID09PSAoKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5KTtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhzY3JvbGxQYXJlbnQpO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdKSA6IHNjcm9sbFBhcmVudDtcbiAgdmFyIHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcbiAgcmV0dXJuIGlzQm9keSA/IHVwZGF0ZWRMaXN0IDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4vZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHJlZmVyZW5jZSA9IF9yZWYucmVmZXJlbmNlLFxuICAgICAgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQgPyBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZWxlbWVudC53aWR0aCAvIDI7XG4gIHZhciBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgdmFyIG9mZnNldHM7XG5cbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGJvdHRvbTpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSByaWdodDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cblxuICB2YXIgbWFpbkF4aXMgPSBiYXNlUGxhY2VtZW50ID8gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgc3dpdGNoICh2YXJpYXRpb24pIHtcbiAgICAgIGNhc2Ugc3RhcnQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gLSAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIGVuZDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSArIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59IiwiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsImltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgY29tcHV0ZUF1dG9QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyBib3R0b20sIHRvcCwgc3RhcnQsIHJpZ2h0LCBsZWZ0LCBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5mdW5jdGlvbiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwbGFjZW1lbnQpIHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbmZ1bmN0aW9uIGZsaXAoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgPSBvcHRpb25zLmZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9IG9wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGZsaXBWYXJpYXRpbyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IG9wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzO1xuICB2YXIgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gYmFzZVBsYWNlbWVudCA9PT0gcHJlZmVycmVkUGxhY2VtZW50O1xuICB2YXIgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocHJlZmVycmVkUGxhY2VtZW50KSk7XG4gIHZhciBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudF0uY29uY2F0KGZhbGxiYWNrUGxhY2VtZW50cykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0byA/IGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zOiBmbGlwVmFyaWF0aW9ucyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogYWxsb3dlZEF1dG9QbGFjZW1lbnRzXG4gICAgfSkgOiBwbGFjZW1lbnQpO1xuICB9LCBbXSk7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIHZhciBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuXG4gICAgdmFyIF9iYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIGlzU3RhcnRWYXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gc3RhcnQ7XG4gICAgdmFyIGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoX2Jhc2VQbGFjZW1lbnQpID49IDA7XG4gICAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSk7XG4gICAgdmFyIG1haW5WYXJpYXRpb25TaWRlID0gaXNWZXJ0aWNhbCA/IGlzU3RhcnRWYXJpYXRpb24gPyByaWdodCA6IGxlZnQgOiBpc1N0YXJ0VmFyaWF0aW9uID8gYm90dG9tIDogdG9wO1xuXG4gICAgaWYgKHJlZmVyZW5jZVJlY3RbbGVuXSA+IHBvcHBlclJlY3RbbGVuXSkge1xuICAgICAgbWFpblZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgfVxuXG4gICAgdmFyIGFsdFZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgdmFyIGNoZWNrcyA9IFtdO1xuXG4gICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W19iYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1ttYWluVmFyaWF0aW9uU2lkZV0gPD0gMCwgb3ZlcmZsb3dbYWx0VmFyaWF0aW9uU2lkZV0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgIHJldHVybiBjaGVjaztcbiAgICB9KSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyDigJMgcmVzZWFyY2ggbGF0ZXJcbiAgICB2YXIgbnVtYmVyT2ZDaGVja3MgPSBmbGlwVmFyaWF0aW9ucyA/IDMgOiAxO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgIHZhciBmaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50cy5maW5kKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IGNoZWNrc01hcC5nZXQocGxhY2VtZW50KTtcblxuICAgICAgICBpZiAoY2hlY2tzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrcy5zbGljZSgwLCBfaSkuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZml0dGluZ1BsYWNlbWVudCkge1xuICAgICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBmaXR0aW5nUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IG51bWJlck9mQ2hlY2tzOyBfaSA+IDA7IF9pLS0pIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoX2kpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUucGxhY2VtZW50ICE9PSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwID0gdHJ1ZTtcbiAgICBzdGF0ZS5wbGFjZW1lbnQgPSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgc3RhdGUucmVzZXQgPSB0cnVlO1xuICB9XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdmbGlwJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGZsaXAsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG4gIGRhdGE6IHtcbiAgICBfc2tpcDogZmFsc2VcbiAgfVxufTsiLCJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07IiwiaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuLi91dGlscy9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuXG5mdW5jdGlvbiBwb3BwZXJPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3BvcHBlck9mZnNldHMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3JlYWQnLFxuICBmbjogcG9wcGVyT2Zmc2V0cyxcbiAgZGF0YToge31cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxO1xuICB2YXIgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcbiAgcmV0dXJuIHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDE7XG59IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudElzU2NhbGVkID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzRWxlbWVudFNjYWxlZChvZmZzZXRQYXJlbnQpO1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnRJc1NjYWxlZCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldENvbXBvc2l0ZVJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IHZhbGlkYXRlTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL3ZhbGlkYXRlTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgdW5pcXVlQnkgZnJvbSBcIi4vdXRpbHMvdW5pcXVlQnkuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9FTEVNRU5UX0VSUk9SID0gJ1BvcHBlcjogSW52YWxpZCByZWZlcmVuY2Ugb3IgcG9wcGVyIGFyZ3VtZW50IHByb3ZpZGVkLiBUaGV5IG11c3QgYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgdmlydHVhbCBlbGVtZW50Lic7XG52YXIgSU5GSU5JVEVfTE9PUF9FUlJPUiA9ICdQb3BwZXI6IEFuIGluZmluaXRlIGxvb3AgaW4gdGhlIG1vZGlmaWVycyBjeWNsZSBoYXMgYmVlbiBkZXRlY3RlZCEgVGhlIGN5Y2xlIGhhcyBiZWVuIGludGVycnVwdGVkIHRvIHByZXZlbnQgYSBicm93c2VyIGNyYXNoLic7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7IC8vIFZhbGlkYXRlIHRoZSBwcm92aWRlZCBtb2RpZmllcnMgc28gdGhhdCB0aGUgY29uc3VtZXIgd2lsbCBnZXQgd2FybmVkXG4gICAgICAgIC8vIGlmIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGlzIGludmFsaWQgZm9yIGFueSByZWFzb25cblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgdmFyIG1vZGlmaWVycyA9IHVuaXF1ZUJ5KFtdLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycyksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICAgICAgICBpZiAoZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5vcHRpb25zLnBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICAgICAgICAgIHZhciBmbGlwTW9kaWZpZXIgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZjIubmFtZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdmbGlwJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWZsaXBNb2RpZmllcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImF1dG9cIiBwbGFjZW1lbnRzIHJlcXVpcmUgdGhlIFwiZmxpcFwiIG1vZGlmaWVyIGJlJywgJ3ByZXNlbnQgYW5kIGVuYWJsZWQgdG8gd29yay4nXS5qb2luKCcgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocG9wcGVyKSxcbiAgICAgICAgICAgICAgbWFyZ2luVG9wID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luVG9wLFxuICAgICAgICAgICAgICBtYXJnaW5SaWdodCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblJpZ2h0LFxuICAgICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b20sXG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5MZWZ0OyAvLyBXZSBubyBsb25nZXIgdGFrZSBpbnRvIGFjY291bnQgYG1hcmdpbnNgIG9uIHRoZSBwb3BwZXIsIGFuZCBpdCBjYW5cbiAgICAgICAgICAvLyBjYXVzZSBidWdzIHdpdGggcG9zaXRpb25pbmcsIHNvIHdlJ2xsIHdhcm4gdGhlIGNvbnN1bWVyXG5cblxuICAgICAgICAgIGlmIChbbWFyZ2luVG9wLCBtYXJnaW5SaWdodCwgbWFyZ2luQm90dG9tLCBtYXJnaW5MZWZ0XS5zb21lKGZ1bmN0aW9uIChtYXJnaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hcmdpbik7XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihbJ1BvcHBlcjogQ1NTIFwibWFyZ2luXCIgc3R5bGVzIGNhbm5vdCBiZSB1c2VkIHRvIGFwcGx5IHBhZGRpbmcnLCAnYmV0d2VlbiB0aGUgcG9wcGVyIGFuZCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgb3IgYm91bmRhcnkuJywgJ1RvIHJlcGxpY2F0ZSBtYXJnaW4sIHVzZSB0aGUgYG9mZnNldGAgbW9kaWZpZXIsIGFzIHdlbGwgYXMnLCAndGhlIGBwYWRkaW5nYCBvcHRpb24gaW4gdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIGFuZCBgZmxpcGAnLCAnbW9kaWZpZXJzLiddLmpvaW4oJyAnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICAvLyBTeW5jIHVwZGF0ZSDigJMgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4gVGhpc1xuICAgICAgLy8gaXMgdXNlZnVsIGZvciBsb3cgZnJlcXVlbmN5IHVwZGF0ZXMgd2hlcmUgc3luYyBiZWhhdmlvciBzaW1wbGlmaWVzIHRoZVxuICAgICAgLy8gbG9naWMuXG4gICAgICAvLyBGb3IgaGlnaCBmcmVxdWVuY3kgdXBkYXRlcyAoZS5nLiBgcmVzaXplYCBhbmQgYHNjcm9sbGAgZXZlbnRzKSwgYWx3YXlzXG4gICAgICAvLyBwcmVmZXIgdGhlIGFzeW5jIFBvcHBlciN1cGRhdGUgbWV0aG9kXG4gICAgICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfc3RhdGUkZWxlbWVudHMgPSBzdGF0ZS5lbGVtZW50cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IF9zdGF0ZSRlbGVtZW50cy5yZWZlcmVuY2UsXG4gICAgICAgICAgICBwb3BwZXIgPSBfc3RhdGUkZWxlbWVudHMucG9wcGVyOyAvLyBEb24ndCBwcm9jZWVkIGlmIGByZWZlcmVuY2VgIG9yIGBwb3BwZXJgIGFyZSBub3QgdmFsaWQgZWxlbWVudHNcbiAgICAgICAgLy8gYW55bW9yZVxuXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX19kZWJ1Z19sb29wc19fID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBfX2RlYnVnX2xvb3BzX18gKz0gMTtcblxuICAgICAgICAgICAgaWYgKF9fZGVidWdfbG9vcHNfXyA+IDEwMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKElORklOSVRFX0xPT1BfRVJST1IpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAgLy8gdXBkYXRlIGN5Y2xlIHJ1bnMuIFRoZXkgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdXBkYXRlXG4gICAgLy8gY3ljbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBtb2RpZmllciBhZGRzIHNvbWUgcGVyc2lzdGVudCBkYXRhIHRoYXRcbiAgICAvLyBvdGhlciBtb2RpZmllcnMgbmVlZCB0byB1c2UsIGJ1dCB0aGUgbW9kaWZpZXIgaXMgcnVuIGFmdGVyIHRoZSBkZXBlbmRlbnRcbiAgICAvLyBvbmUuXG5cbiAgICBmdW5jdGlvbiBydW5Nb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZjMubmFtZSxcbiAgICAgICAgICAgIF9yZWYzJG9wdGlvbnMgPSBfcmVmMy5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYzJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZjMkb3B0aW9ucyxcbiAgICAgICAgICAgIGVmZmVjdCA9IF9yZWYzLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyogZ2xvYmFsIE1hcDpyZWFkb25seSwgU2V0OnJlYWRvbmx5LCBBcnJheUJ1ZmZlcjpyZWFkb25seSAqL1xuXG52YXIgaGFzRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICEhQXJyYXlCdWZmZXIuaXNWaWV3O1xuXG4vLyBOb3RlOiBXZSAqKmRvbid0KiogbmVlZCBgZW52SGFzQmlnSW50NjRBcnJheWAgaW4gZmRlIGVzNi9pbmRleC5qc1xuXG5mdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWwgZXM2L2luZGV4LmpzIDMuMS4xXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTVEFSVDogTW9kaWZpY2F0aW9uczpcbiAgICAvLyAxLiBFeHRyYSBgaGFzPFR5cGU+ICYmYCBoZWxwZXJzIGluIGluaXRpYWwgY29uZGl0aW9uIGFsbG93IGVzNiBjb2RlXG4gICAgLy8gICAgdG8gY28tZXhpc3Qgd2l0aCBlczUuXG4gICAgLy8gMi4gUmVwbGFjZSBgZm9yIG9mYCB3aXRoIGVzNSBjb21wbGlhbnQgaXRlcmF0aW9uIHVzaW5nIGBmb3JgLlxuICAgIC8vICAgIEJhc2ljYWxseSwgdGFrZTpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgLi4uIGFuZCBjb252ZXJ0IHRvOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBpdCA9IGEuZW50cmllcygpO1xuICAgIC8vICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAqKk5vdGUqKjogYGlgIGFjY2VzcyBzd2l0Y2hlcyB0byBgaS52YWx1ZWAuXG4gICAgdmFyIGl0O1xuICAgIGlmIChoYXNNYXAgJiYgKGEgaW5zdGFuY2VvZiBNYXApICYmIChiIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghZXF1YWwoaS52YWx1ZVsxXSwgYi5nZXQoaS52YWx1ZVswXSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2V0ICYmIChhIGluc3RhbmNlb2YgU2V0KSAmJiAoYiBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBFTkQ6IE1vZGlmaWNhdGlvbnNcblxuICAgIGlmIChoYXNBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRU5EOiBmYXN0LWRlZXAtZXF1YWxcblxuICAgIC8vIFNUQVJUOiByZWFjdC1mYXN0LWNvbXBhcmVcbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIERPTSBlbGVtZW50c1xuICAgIGlmIChoYXNFbGVtZW50VHlwZSAmJiBhIGluc3RhbmNlb2YgRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBSZWFjdC9QcmVhY3RcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICgoa2V5c1tpXSA9PT0gJ19vd25lcicgfHwga2V5c1tpXSA9PT0gJ19fdicgfHwga2V5c1tpXSA9PT0gJ19fbycpICYmIGEuJCR0eXBlb2YpIHtcbiAgICAgICAgLy8gUmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUmVhY3QgZWxlbWVudHMnIF9vd25lclxuICAgICAgICAvLyBQcmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUHJlYWN0IGVsZW1lbnRzJyBfX3YgYW5kIF9fb1xuICAgICAgICAvLyAgICBfX3YgPSAkX29yaWdpbmFsIC8gJF92bm9kZVxuICAgICAgICAvLyAgICBfX28gPSAkX293bmVyXG4gICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgY29udGFpbiBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCBhcmUgbm90IG5lZWRlZCB3aGVuXG4gICAgICAgIC8vIGNvbXBhcmluZyB0aGUgYWN0dWFsIGVsZW1lbnRzIChhbmQgbm90IHRoZWlyIG93bmVycylcbiAgICAgICAgLy8gLiQkdHlwZW9mIGFuZCAuX3N0b3JlIG9uIGp1c3QgcmVhc29uYWJsZSBtYXJrZXJzIG9mIGVsZW1lbnRzXG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgYXMgdXN1YWxcbiAgICAgIGlmICghZXF1YWwoYVtrZXlzW2ldXSwgYltrZXlzW2ldXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRU5EOiByZWFjdC1mYXN0LWNvbXBhcmVcblxuICAgIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWxcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG59XG4vLyBlbmQgZmFzdC1kZWVwLWVxdWFsXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVxdWFsKGEsIGIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoKGVycm9yLm1lc3NhZ2UgfHwgJycpLm1hdGNoKC9zdGFja3xyZWN1cnNpb24vaSkpKSB7XG4gICAgICAvLyB3YXJuIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGRvbid0IGNyYXNoXG4gICAgICAvLyBicm93c2VycyBnaXZlIHRoaXMgZGlmZmVyZW50IGVycm9ycyBuYW1lIGFuZCBtZXNzYWdlczpcbiAgICAgIC8vIGNocm9tZS9zYWZhcmk6IFwiUmFuZ2VFcnJvclwiLCBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCJcbiAgICAgIC8vIGZpcmVmb3g6IFwiSW50ZXJuYWxFcnJvclwiLCB0b28gbXVjaCByZWN1cnNpb25cIlxuICAgICAgLy8gZWRnZTogXCJFcnJvclwiLCBcIk91dCBvZiBzdGFjayBzcGFjZVwiXG4gICAgICBjb25zb2xlLndhcm4oJ3JlYWN0LWZhc3QtY29tcGFyZSBjYW5ub3QgaGFuZGxlIGNpcmN1bGFyIHJlZnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gc29tZSBvdGhlciBlcnJvci4gd2Ugc2hvdWxkIGRlZmluaXRlbHkga25vdyBhYm91dCB0aGVzZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGRlZmF1bHRDcmVhdGVQb3BwZXIgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdyZWFjdC1mYXN0LWNvbXBhcmUnO1xuaW1wb3J0IHsgZnJvbUVudHJpZXMsIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuL3V0aWxzJztcbnZhciBFTVBUWV9NT0RJRklFUlMgPSBbXTtcbmV4cG9ydCB2YXIgdXNlUG9wcGVyID0gZnVuY3Rpb24gdXNlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBwcmV2T3B0aW9ucyA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgb25GaXJzdFVwZGF0ZTogb3B0aW9ucy5vbkZpcnN0VXBkYXRlLFxuICAgIHBsYWNlbWVudDogb3B0aW9ucy5wbGFjZW1lbnQgfHwgJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3kgfHwgJ2Fic29sdXRlJyxcbiAgICBtb2RpZmllcnM6IG9wdGlvbnMubW9kaWZpZXJzIHx8IEVNUFRZX01PRElGSUVSU1xuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3BwZXI6IHtcbiAgICAgICAgcG9zaXRpb246IG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgdG9wOiAnMCdcbiAgICAgIH0sXG4gICAgICBhcnJvdzoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgICAgfVxuICAgIH0sXG4gICAgYXR0cmlidXRlczoge31cbiAgfSksXG4gICAgICBzdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciB1cGRhdGVTdGF0ZU1vZGlmaWVyID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICd1cGRhdGVTdGF0ZScsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGhhc2U6ICd3cml0ZScsXG4gICAgICBmbjogZnVuY3Rpb24gZm4oX3JlZikge1xuICAgICAgICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cyk7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBzdHlsZXM6IGZyb21FbnRyaWVzKGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtlbGVtZW50LCBzdGF0ZS5zdHlsZXNbZWxlbWVudF0gfHwge31dO1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBmcm9tRW50cmllcyhlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudCwgc3RhdGUuYXR0cmlidXRlc1tlbGVtZW50XV07XG4gICAgICAgICAgfSkpXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIHBvcHBlck9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3T3B0aW9ucyA9IHtcbiAgICAgIG9uRmlyc3RVcGRhdGU6IG9wdGlvbnNXaXRoRGVmYXVsdHMub25GaXJzdFVwZGF0ZSxcbiAgICAgIHBsYWNlbWVudDogb3B0aW9uc1dpdGhEZWZhdWx0cy5wbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneTogb3B0aW9uc1dpdGhEZWZhdWx0cy5zdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogW10uY29uY2F0KG9wdGlvbnNXaXRoRGVmYXVsdHMubW9kaWZpZXJzLCBbdXBkYXRlU3RhdGVNb2RpZmllciwge1xuICAgICAgICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfV0pXG4gICAgfTtcblxuICAgIGlmIChpc0VxdWFsKHByZXZPcHRpb25zLmN1cnJlbnQsIG5ld09wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gcHJldk9wdGlvbnMuY3VycmVudCB8fCBuZXdPcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2T3B0aW9ucy5jdXJyZW50ID0gbmV3T3B0aW9ucztcbiAgICAgIHJldHVybiBuZXdPcHRpb25zO1xuICAgIH1cbiAgfSwgW29wdGlvbnNXaXRoRGVmYXVsdHMub25GaXJzdFVwZGF0ZSwgb3B0aW9uc1dpdGhEZWZhdWx0cy5wbGFjZW1lbnQsIG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksIG9wdGlvbnNXaXRoRGVmYXVsdHMubW9kaWZpZXJzLCB1cGRhdGVTdGF0ZU1vZGlmaWVyXSk7XG4gIHZhciBwb3BwZXJJbnN0YW5jZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCkge1xuICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5zZXRPcHRpb25zKHBvcHBlck9wdGlvbnMpO1xuICAgIH1cbiAgfSwgW3BvcHBlck9wdGlvbnNdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlZmVyZW5jZUVsZW1lbnQgPT0gbnVsbCB8fCBwb3BwZXJFbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlUG9wcGVyID0gb3B0aW9ucy5jcmVhdGVQb3BwZXIgfHwgZGVmYXVsdENyZWF0ZVBvcHBlcjtcbiAgICB2YXIgcG9wcGVySW5zdGFuY2UgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgcG9wcGVyT3B0aW9ucyk7XG4gICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA9IHBvcHBlckluc3RhbmNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBwb3BwZXJJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICB9LCBbcmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgb3B0aW9ucy5jcmVhdGVQb3BwZXJdKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc3RhdGUgOiBudWxsLFxuICAgIHN0eWxlczogc3RhdGUuc3R5bGVzLFxuICAgIGF0dHJpYnV0ZXM6IHN0YXRlLmF0dHJpYnV0ZXMsXG4gICAgdXBkYXRlOiBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID8gcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC51cGRhdGUgOiBudWxsLFxuICAgIGZvcmNlVXBkYXRlOiBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID8gcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5mb3JjZVVwZGF0ZSA6IG51bGxcbiAgfTtcbn07IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKiFcbiogdGFiYmFibGUgNS4yLjFcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC90YWJiYWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFXG4qL1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9ycyA9IFsnaW5wdXQnLCAnc2VsZWN0JywgJ3RleHRhcmVhJywgJ2FbaHJlZl0nLCAnYnV0dG9uJywgJ1t0YWJpbmRleF0nLCAnYXVkaW9bY29udHJvbHNdJywgJ3ZpZGVvW2NvbnRyb2xzXScsICdbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKScsICdkZXRhaWxzPnN1bW1hcnk6Zmlyc3Qtb2YtdHlwZScsICdkZXRhaWxzJ107XG52YXIgY2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuam9pbignLCcpO1xudmFyIG1hdGNoZXMgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoKSB7fSA6IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xuXG52YXIgZ2V0Q2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldENhbmRpZGF0ZXMoZWwsIGluY2x1ZGVDb250YWluZXIsIGZpbHRlcikge1xuICB2YXIgY2FuZGlkYXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbC5xdWVyeVNlbGVjdG9yQWxsKGNhbmRpZGF0ZVNlbGVjdG9yKSk7XG5cbiAgaWYgKGluY2x1ZGVDb250YWluZXIgJiYgbWF0Y2hlcy5jYWxsKGVsLCBjYW5kaWRhdGVTZWxlY3RvcikpIHtcbiAgICBjYW5kaWRhdGVzLnVuc2hpZnQoZWwpO1xuICB9XG5cbiAgY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXMuZmlsdGVyKGZpbHRlcik7XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxudmFyIGlzQ29udGVudEVkaXRhYmxlID0gZnVuY3Rpb24gaXNDb250ZW50RWRpdGFibGUobm9kZSkge1xuICByZXR1cm4gbm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJztcbn07XG5cbnZhciBnZXRUYWJpbmRleCA9IGZ1bmN0aW9uIGdldFRhYmluZGV4KG5vZGUpIHtcbiAgdmFyIHRhYmluZGV4QXR0ciA9IHBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCk7XG5cbiAgaWYgKCFpc05hTih0YWJpbmRleEF0dHIpKSB7XG4gICAgcmV0dXJuIHRhYmluZGV4QXR0cjtcbiAgfSAvLyBCcm93c2VycyBkbyBub3QgcmV0dXJuIGB0YWJJbmRleGAgY29ycmVjdGx5IGZvciBjb250ZW50RWRpdGFibGUgbm9kZXM7XG4gIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuXG5cbiAgaWYgKGlzQ29udGVudEVkaXRhYmxlKG5vZGUpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gLy8gaW4gQ2hyb21lLCA8ZGV0YWlscy8+LCA8YXVkaW8gY29udHJvbHMvPiBhbmQgPHZpZGVvIGNvbnRyb2xzLz4gZWxlbWVudHMgZ2V0IGEgZGVmYXVsdFxuICAvLyAgYHRhYkluZGV4YCBvZiAtMSB3aGVuIHRoZSAndGFiaW5kZXgnIGF0dHJpYnV0ZSBpc24ndCBzcGVjaWZpZWQgaW4gdGhlIERPTSxcbiAgLy8gIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAvLyAgYHRhYkluZGV4YCBvZiAwOyBzaW5jZSBDaHJvbWUgc3RpbGwgcHV0cyB0aG9zZSBlbGVtZW50cyBpbiB0aGUgcmVndWxhciB0YWJcbiAgLy8gIG9yZGVyLCBjb25zaWRlciB0aGVpciB0YWIgaW5kZXggdG8gYmUgMC5cblxuXG4gIGlmICgobm9kZS5ub2RlTmFtZSA9PT0gJ0FVRElPJyB8fCBub2RlLm5vZGVOYW1lID09PSAnVklERU8nIHx8IG5vZGUubm9kZU5hbWUgPT09ICdERVRBSUxTJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBub2RlLnRhYkluZGV4O1xufTtcblxudmFyIHNvcnRPcmRlcmVkVGFiYmFibGVzID0gZnVuY3Rpb24gc29ydE9yZGVyZWRUYWJiYWJsZXMoYSwgYikge1xuICByZXR1cm4gYS50YWJJbmRleCA9PT0gYi50YWJJbmRleCA/IGEuZG9jdW1lbnRPcmRlciAtIGIuZG9jdW1lbnRPcmRlciA6IGEudGFiSW5kZXggLSBiLnRhYkluZGV4O1xufTtcblxudmFyIGlzSW5wdXQgPSBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0lOUFVUJztcbn07XG5cbnZhciBpc0hpZGRlbklucHV0ID0gZnVuY3Rpb24gaXNIaWRkZW5JbnB1dChub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ2hpZGRlbic7XG59O1xuXG52YXIgaXNEZXRhaWxzV2l0aFN1bW1hcnkgPSBmdW5jdGlvbiBpc0RldGFpbHNXaXRoU3VtbWFyeShub2RlKSB7XG4gIHZhciByID0gbm9kZS50YWdOYW1lID09PSAnREVUQUlMUycgJiYgQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KG5vZGUuY2hpbGRyZW4pLnNvbWUoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLnRhZ05hbWUgPT09ICdTVU1NQVJZJztcbiAgfSk7XG4gIHJldHVybiByO1xufTtcblxudmFyIGdldENoZWNrZWRSYWRpbyA9IGZ1bmN0aW9uIGdldENoZWNrZWRSYWRpbyhub2RlcywgZm9ybSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vZGVzW2ldLmNoZWNrZWQgJiYgbm9kZXNbaV0uZm9ybSA9PT0gZm9ybSkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGlzVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIGlmICghbm9kZS5uYW1lKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgcmFkaW9TY29wZSA9IG5vZGUuZm9ybSB8fCBub2RlLm93bmVyRG9jdW1lbnQ7XG5cbiAgdmFyIHF1ZXJ5UmFkaW9zID0gZnVuY3Rpb24gcXVlcnlSYWRpb3MobmFtZSkge1xuICAgIHJldHVybiByYWRpb1Njb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gIH07XG5cbiAgdmFyIHJhZGlvU2V0O1xuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MuZXNjYXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyh3aW5kb3cuQ1NTLmVzY2FwZShub2RlLm5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyhub2RlLm5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvb2tzIGxpa2UgeW91IGhhdmUgYSByYWRpbyBidXR0b24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIGNvbnRhaW5pbmcgaW52YWxpZCBDU1Mgc2VsZWN0b3IgY2hhcmFjdGVycyBhbmQgbmVlZCB0aGUgQ1NTLmVzY2FwZSBwb2x5ZmlsbDogJXMnLCBlcnIubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoZWNrZWQgPSBnZXRDaGVja2VkUmFkaW8ocmFkaW9TZXQsIG5vZGUuZm9ybSk7XG4gIHJldHVybiAhY2hlY2tlZCB8fCBjaGVja2VkID09PSBub2RlO1xufTtcblxudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcblxudmFyIGlzTm9uVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc1JhZGlvKG5vZGUpICYmICFpc1RhYmJhYmxlUmFkaW8obm9kZSk7XG59O1xuXG52YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiBpc0hpZGRlbihub2RlLCBkaXNwbGF5Q2hlY2spIHtcbiAgaWYgKGdldENvbXB1dGVkU3R5bGUobm9kZSkudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBpc0RpcmVjdFN1bW1hcnkgPSBtYXRjaGVzLmNhbGwobm9kZSwgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJyk7XG4gIHZhciBub2RlVW5kZXJEZXRhaWxzID0gaXNEaXJlY3RTdW1tYXJ5ID8gbm9kZS5wYXJlbnRFbGVtZW50IDogbm9kZTtcblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGVVbmRlckRldGFpbHMsICdkZXRhaWxzOm5vdChbb3Blbl0pIConKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5Q2hlY2sgfHwgZGlzcGxheUNoZWNrID09PSAnZnVsbCcpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwbGF5Q2hlY2sgPT09ICdub24temVyby1hcmVhJykge1xuICAgIHZhciBfbm9kZSRnZXRCb3VuZGluZ0NsaWUgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICB3aWR0aCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcblxuICAgIHJldHVybiB3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDA7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBmb3JtIGZpZWxkcyAobmVzdGVkKSBpbnNpZGUgYSBkaXNhYmxlZCBmaWVsZHNldCBhcmUgbm90IGZvY3VzYWJsZS90YWJiYWJsZVxuLy8gIHVubGVzcyB0aGV5IGFyZSBpbiB0aGUgX2ZpcnN0XyA8bGVnZW5kPiBlbGVtZW50IG9mIHRoZSB0b3AtbW9zdCBkaXNhYmxlZFxuLy8gIGZpZWxkc2V0XG5cblxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKGlzSW5wdXQobm9kZSkgfHwgbm9kZS50YWdOYW1lID09PSAnU0VMRUNUJyB8fCBub2RlLnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgbm9kZS50YWdOYW1lID09PSAnQlVUVE9OJykge1xuICAgIHZhciBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuXG4gICAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChwYXJlbnROb2RlLnRhZ05hbWUgPT09ICdGSUVMRFNFVCcgJiYgcGFyZW50Tm9kZS5kaXNhYmxlZCkge1xuICAgICAgICAvLyBsb29rIGZvciB0aGUgZmlyc3QgPGxlZ2VuZD4gYXMgYW4gaW1tZWRpYXRlIGNoaWxkIG9mIHRoZSBkaXNhYmxlZFxuICAgICAgICAvLyAgPGZpZWxkc2V0PjogaWYgdGhlIG5vZGUgaXMgaW4gdGhhdCBsZWdlbmQsIGl0J2xsIGJlIGVuYWJsZWQgZXZlblxuICAgICAgICAvLyAgdGhvdWdoIHRoZSBmaWVsZHNldCBpcyBkaXNhYmxlZDsgb3RoZXJ3aXNlLCB0aGUgbm9kZSBpcyBpbiBhXG4gICAgICAgIC8vICBzZWNvbmRhcnkvc3Vic2VxdWVudCBsZWdlbmQsIG9yIHNvbWV3aGVyZSBlbHNlIHdpdGhpbiB0aGUgZmllbGRzZXRcbiAgICAgICAgLy8gIChob3dldmVyIGRlZXAgbmVzdGVkKSBhbmQgaXQnbGwgYmUgZGlzYWJsZWRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpO1xuXG4gICAgICAgICAgaWYgKGNoaWxkLnRhZ05hbWUgPT09ICdMRUdFTkQnKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAvLyB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZmlyc3QgbGVnZW5kIChpbiBkb2Mgb3JkZXIpLCBzbyBubyBtYXR0ZXJcbiAgICAgICAgICAgIC8vICB3aGVyZSBpdCBpcyBub3csIGl0J2xsIGJlIGRpc2FibGVkXG5cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHRoZSBub2RlIGlzbid0IGluIGEgbGVnZW5kLCBzbyBubyBtYXR0ZXIgd2hlcmUgaXQgaXMgbm93LCBpdCdsbCBiZSBkaXNhYmxlZFxuXG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICB9IC8vIGVsc2UsIG5vZGUncyB0YWJiYWJsZS9mb2N1c2FibGUgc3RhdGUgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSBhIGZpZWxkc2V0J3NcbiAgLy8gIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVcblxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmIChub2RlLmRpc2FibGVkIHx8IGlzSGlkZGVuSW5wdXQobm9kZSkgfHwgaXNIaWRkZW4obm9kZSwgb3B0aW9ucy5kaXNwbGF5Q2hlY2spIHx8IC8vIEZvciBhIGRldGFpbHMgZWxlbWVudCB3aXRoIGEgc3VtbWFyeSwgdGhlIHN1bW1hcnkgZWxlbWVudCBnZXRzIHRoZSBmb2N1c1xuICBpc0RldGFpbHNXaXRoU3VtbWFyeShub2RlKSB8fCBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKCFpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpIHx8IGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB8fCBnZXRUYWJpbmRleChub2RlKSA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciB0YWJiYWJsZSA9IGZ1bmN0aW9uIHRhYmJhYmxlKGVsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcmVndWxhclRhYmJhYmxlcyA9IFtdO1xuICB2YXIgb3JkZXJlZFRhYmJhYmxlcyA9IFtdO1xuICB2YXIgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoZWwsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGNhbmRpZGF0ZSwgaSkge1xuICAgIHZhciBjYW5kaWRhdGVUYWJpbmRleCA9IGdldFRhYmluZGV4KGNhbmRpZGF0ZSk7XG5cbiAgICBpZiAoY2FuZGlkYXRlVGFiaW5kZXggPT09IDApIHtcbiAgICAgIHJlZ3VsYXJUYWJiYWJsZXMucHVzaChjYW5kaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcmRlcmVkVGFiYmFibGVzLnB1c2goe1xuICAgICAgICBkb2N1bWVudE9yZGVyOiBpLFxuICAgICAgICB0YWJJbmRleDogY2FuZGlkYXRlVGFiaW5kZXgsXG4gICAgICAgIG5vZGU6IGNhbmRpZGF0ZVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRhYmJhYmxlTm9kZXMgPSBvcmRlcmVkVGFiYmFibGVzLnNvcnQoc29ydE9yZGVyZWRUYWJiYWJsZXMpLm1hcChmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiBhLm5vZGU7XG4gIH0pLmNvbmNhdChyZWd1bGFyVGFiYmFibGVzKTtcbiAgcmV0dXJuIHRhYmJhYmxlTm9kZXM7XG59O1xuXG52YXIgZm9jdXNhYmxlID0gZnVuY3Rpb24gZm9jdXNhYmxlKGVsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoZWwsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgY2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG52YXIgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuY29uY2F0KCdpZnJhbWUnKS5qb2luKCcsJyk7XG5cbnZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzRm9jdXNhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKTtcbn07XG5cbmV4cG9ydCB7IGZvY3VzYWJsZSwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIvKiFcbiogZm9jdXMtdHJhcCA2LjcuMlxuKiBAbGljZW5zZSBNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbmltcG9ydCB7IHRhYmJhYmxlLCBpc0ZvY3VzYWJsZSwgaXNUYWJiYWJsZSB9IGZyb20gJ3RhYmJhYmxlJztcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIGFjdGl2ZUZvY3VzVHJhcHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0cmFwUXVldWUgPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmF0ZVRyYXA6IGZ1bmN0aW9uIGFjdGl2YXRlVHJhcCh0cmFwKSB7XG4gICAgICBpZiAodHJhcFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGFjdGl2ZVRyYXAgPSB0cmFwUXVldWVbdHJhcFF1ZXVlLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGlmIChhY3RpdmVUcmFwICE9PSB0cmFwKSB7XG4gICAgICAgICAgYWN0aXZlVHJhcC5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFwSW5kZXggPSB0cmFwUXVldWUuaW5kZXhPZih0cmFwKTtcblxuICAgICAgaWYgKHRyYXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdHJhcFF1ZXVlLnB1c2godHJhcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBtb3ZlIHRoaXMgZXhpc3RpbmcgdHJhcCB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlXG4gICAgICAgIHRyYXBRdWV1ZS5zcGxpY2UodHJhcEluZGV4LCAxKTtcbiAgICAgICAgdHJhcFF1ZXVlLnB1c2godHJhcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWFjdGl2YXRlVHJhcDogZnVuY3Rpb24gZGVhY3RpdmF0ZVRyYXAodHJhcCkge1xuICAgICAgdmFyIHRyYXBJbmRleCA9IHRyYXBRdWV1ZS5pbmRleE9mKHRyYXApO1xuXG4gICAgICBpZiAodHJhcEluZGV4ICE9PSAtMSkge1xuICAgICAgICB0cmFwUXVldWUuc3BsaWNlKHRyYXBJbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFwUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB0cmFwUXVldWVbdHJhcFF1ZXVlLmxlbmd0aCAtIDFdLnVucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KCk7XG5cbnZhciBpc1NlbGVjdGFibGVJbnB1dCA9IGZ1bmN0aW9uIGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiB0eXBlb2Ygbm9kZS5zZWxlY3QgPT09ICdmdW5jdGlvbic7XG59O1xuXG52YXIgaXNFc2NhcGVFdmVudCA9IGZ1bmN0aW9uIGlzRXNjYXBlRXZlbnQoZSkge1xuICByZXR1cm4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJyB8fCBlLmtleUNvZGUgPT09IDI3O1xufTtcblxudmFyIGlzVGFiRXZlbnQgPSBmdW5jdGlvbiBpc1RhYkV2ZW50KGUpIHtcbiAgcmV0dXJuIGUua2V5ID09PSAnVGFiJyB8fCBlLmtleUNvZGUgPT09IDk7XG59O1xuXG52YXIgZGVsYXkgPSBmdW5jdGlvbiBkZWxheShmbikge1xuICByZXR1cm4gc2V0VGltZW91dChmbiwgMCk7XG59OyAvLyBBcnJheS5maW5kL2ZpbmRJbmRleCgpIGFyZSBub3Qgc3VwcG9ydGVkIG9uIElFOyB0aGlzIHJlcGxpY2F0ZXMgZW5vdWdoXG4vLyAgb2YgQXJyYXkuZmluZEluZGV4KCkgZm9yIG91ciBuZWVkc1xuXG5cbnZhciBmaW5kSW5kZXggPSBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyLCBmbikge1xuICB2YXIgaWR4ID0gLTE7XG4gIGFyci5ldmVyeShmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICBpZiAoZm4odmFsdWUpKSB7XG4gICAgICBpZHggPSBpO1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBicmVha1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBuZXh0XG4gIH0pO1xuICByZXR1cm4gaWR4O1xufTtcbi8qKlxuICogR2V0IGFuIG9wdGlvbidzIHZhbHVlIHdoZW4gaXQgY291bGQgYmUgYSBwbGFpbiB2YWx1ZSwgb3IgYSBoYW5kbGVyIHRoYXQgcHJvdmlkZXNcbiAqICB0aGUgdmFsdWUuXG4gKiBAcGFyYW0geyp9IHZhbHVlIE9wdGlvbidzIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHsuLi4qfSBbcGFyYW1zXSBBbnkgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBoYW5kbGVyLCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7Kn0gVGhlIGB2YWx1ZWAsIG9yIHRoZSBoYW5kbGVyJ3MgcmV0dXJuZWQgdmFsdWUuXG4gKi9cblxuXG52YXIgdmFsdWVPckhhbmRsZXIgPSBmdW5jdGlvbiB2YWx1ZU9ySGFuZGxlcih2YWx1ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGFyYW1zID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBwYXJhbXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmFwcGx5KHZvaWQgMCwgcGFyYW1zKSA6IHZhbHVlO1xufTtcblxudmFyIGdldEFjdHVhbFRhcmdldCA9IGZ1bmN0aW9uIGdldEFjdHVhbFRhcmdldChldmVudCkge1xuICAvLyBOT1RFOiBJZiB0aGUgdHJhcCBpcyBfaW5zaWRlXyBhIHNoYWRvdyBET00sIGV2ZW50LnRhcmdldCB3aWxsIGFsd2F5cyBiZSB0aGVcbiAgLy8gIHNoYWRvdyBob3N0LiBIb3dldmVyLCBldmVudC50YXJnZXQuY29tcG9zZWRQYXRoKCkgd2lsbCBiZSBhbiBhcnJheSBvZlxuICAvLyAgbm9kZXMgXCJjbGlja2VkXCIgZnJvbSBpbm5lci1tb3N0ICh0aGUgYWN0dWFsIGVsZW1lbnQgaW5zaWRlIHRoZSBzaGFkb3cpIHRvXG4gIC8vICBvdXRlci1tb3N0ICh0aGUgaG9zdCBIVE1MIGRvY3VtZW50KS4gSWYgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zZWRQYXRoKCksXG4gIC8vICB0aGVuIHVzZSBpdHMgZmlyc3QgZWxlbWVudDsgb3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gZXZlbnQudGFyZ2V0IChhbmRcbiAgLy8gIHRoaXMgb25seSB3b3JrcyBmb3IgYW4gX29wZW5fIHNoYWRvdyBET007IG90aGVyd2lzZSxcbiAgLy8gIGNvbXBvc2VkUGF0aCgpWzBdID09PSBldmVudC50YXJnZXQgYWx3YXlzKS5cbiAgcmV0dXJuIGV2ZW50LnRhcmdldC5zaGFkb3dSb290ICYmIHR5cGVvZiBldmVudC5jb21wb3NlZFBhdGggPT09ICdmdW5jdGlvbicgPyBldmVudC5jb21wb3NlZFBhdGgoKVswXSA6IGV2ZW50LnRhcmdldDtcbn07XG5cbnZhciBjcmVhdGVGb2N1c1RyYXAgPSBmdW5jdGlvbiBjcmVhdGVGb2N1c1RyYXAoZWxlbWVudHMsIHVzZXJPcHRpb25zKSB7XG4gIC8vIFNTUjogYSBsaXZlIHRyYXAgc2hvdWxkbid0IGJlIGNyZWF0ZWQgaW4gdGhpcyB0eXBlIG9mIGVudmlyb25tZW50IHNvIHRoaXNcbiAgLy8gIHNob3VsZCBiZSBzYWZlIGNvZGUgdG8gZXhlY3V0ZSBpZiB0aGUgYGRvY3VtZW50YCBvcHRpb24gaXNuJ3Qgc3BlY2lmaWVkXG4gIHZhciBkb2MgPSAodXNlck9wdGlvbnMgPT09IG51bGwgfHwgdXNlck9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVzZXJPcHRpb25zLmRvY3VtZW50KSB8fCBkb2N1bWVudDtcblxuICB2YXIgY29uZmlnID0gX29iamVjdFNwcmVhZDIoe1xuICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiB0cnVlLFxuICAgIGVzY2FwZURlYWN0aXZhdGVzOiB0cnVlLFxuICAgIGRlbGF5SW5pdGlhbEZvY3VzOiB0cnVlXG4gIH0sIHVzZXJPcHRpb25zKTtcblxuICB2YXIgc3RhdGUgPSB7XG4gICAgLy8gQHR5cGUge0FycmF5PEhUTUxFbGVtZW50Pn1cbiAgICBjb250YWluZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIG9iamVjdHMgaWRlbnRpZnlpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHRhYmJhYmxlIG5vZGVzIGluIGFsbCBjb250YWluZXJzL2dyb3VwcyBpblxuICAgIC8vICB0aGUgdHJhcFxuICAgIC8vIE5PVEU6IGl0J3MgcG9zc2libGUgdGhhdCBhIGdyb3VwIGhhcyBubyB0YWJiYWJsZSBub2RlcyBpZiBub2RlcyBnZXQgcmVtb3ZlZCB3aGlsZSB0aGUgdHJhcFxuICAgIC8vICBpcyBhY3RpdmUsIGJ1dCB0aGUgdHJhcCBzaG91bGQgbmV2ZXIgZ2V0IHRvIGEgc3RhdGUgd2hlcmUgdGhlcmUgaXNuJ3QgYXQgbGVhc3Qgb25lIGdyb3VwXG4gICAgLy8gIHdpdGggYXQgbGVhc3Qgb25lIHRhYmJhYmxlIG5vZGUgaW4gaXQgKHRoYXQgd291bGQgbGVhZCB0byBhbiBlcnJvciBjb25kaXRpb24gdGhhdCB3b3VsZFxuICAgIC8vICByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgdGhyb3duKVxuICAgIC8vIEB0eXBlIHtBcnJheTx7IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGZpcnN0VGFiYmFibGVOb2RlOiBIVE1MRWxlbWVudHxudWxsLCBsYXN0VGFiYmFibGVOb2RlOiBIVE1MRWxlbWVudHxudWxsIH0+fVxuICAgIHRhYmJhYmxlR3JvdXBzOiBbXSxcbiAgICBub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb246IG51bGwsXG4gICAgbW9zdFJlY2VudGx5Rm9jdXNlZE5vZGU6IG51bGwsXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIC8vIHRpbWVyIElEIGZvciB3aGVuIGRlbGF5SW5pdGlhbEZvY3VzIGlzIHRydWUgYW5kIGluaXRpYWwgZm9jdXMgaW4gdGhpcyB0cmFwXG4gICAgLy8gIGhhcyBiZWVuIGRlbGF5ZWQgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBkZWxheUluaXRpYWxGb2N1c1RpbWVyOiB1bmRlZmluZWRcbiAgfTtcbiAgdmFyIHRyYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0IC0tIHNvbWUgcHJpdmF0ZSBmdW5jdGlvbnMgcmVmZXJlbmNlIGl0LCBhbmQgaXRzIG1ldGhvZHMgcmVmZXJlbmNlIHByaXZhdGUgZnVuY3Rpb25zLCBzbyB3ZSBtdXN0IGRlY2xhcmUgaGVyZSBhbmQgZGVmaW5lIGxhdGVyXG5cbiAgdmFyIGdldE9wdGlvbiA9IGZ1bmN0aW9uIGdldE9wdGlvbihjb25maWdPdmVycmlkZU9wdGlvbnMsIG9wdGlvbk5hbWUsIGNvbmZpZ09wdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gY29uZmlnT3ZlcnJpZGVPcHRpb25zICYmIGNvbmZpZ092ZXJyaWRlT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gdW5kZWZpbmVkID8gY29uZmlnT3ZlcnJpZGVPcHRpb25zW29wdGlvbk5hbWVdIDogY29uZmlnW2NvbmZpZ09wdGlvbk5hbWUgfHwgb3B0aW9uTmFtZV07XG4gIH07XG5cbiAgdmFyIGNvbnRhaW5lcnNDb250YWluID0gZnVuY3Rpb24gY29udGFpbmVyc0NvbnRhaW4oZWxlbWVudCkge1xuICAgIHJldHVybiAhIShlbGVtZW50ICYmIHN0YXRlLmNvbnRhaW5lcnMuc29tZShmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIH0pKTtcbiAgfTtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5vZGUgZm9yIHRoZSBnaXZlbiBvcHRpb24sIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9wdGlvbiB0aGF0XG4gICAqICBjYW4gYmUgZWl0aGVyIGEgRE9NIG5vZGUsIGEgc3RyaW5nIHRoYXQgaXMgYSBzZWxlY3RvciB0byBnZXQgYSBub2RlLCBgZmFsc2VgXG4gICAqICAoaWYgYSBub2RlIGlzIGV4cGxpY2l0bHkgTk9UIGdpdmVuKSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW55IG9mIHRoZXNlXG4gICAqICB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWQgfCBmYWxzZSB8IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudH0gUmV0dXJuc1xuICAgKiAgYHVuZGVmaW5lZGAgaWYgdGhlIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkOyBgZmFsc2VgIGlmIHRoZSBvcHRpb25cbiAgICogIHJlc29sdmVkIHRvIGBmYWxzZWAgKG5vZGUgZXhwbGljaXRseSBub3QgZ2l2ZW4pOyBvdGhlcndpc2UsIHRoZSByZXNvbHZlZFxuICAgKiAgRE9NIG5vZGUuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3B0aW9uIGlzIHNldCwgbm90IGBmYWxzZWAsIGFuZCBpcyBub3QsIG9yIGRvZXMgbm90XG4gICAqICByZXNvbHZlIHRvIGEgbm9kZS5cbiAgICovXG5cblxuICB2YXIgZ2V0Tm9kZUZvck9wdGlvbiA9IGZ1bmN0aW9uIGdldE5vZGVGb3JPcHRpb24ob3B0aW9uTmFtZSkge1xuICAgIHZhciBvcHRpb25WYWx1ZSA9IGNvbmZpZ1tvcHRpb25OYW1lXTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcGFyYW1zID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgcGFyYW1zW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvblZhbHVlLmFwcGx5KHZvaWQgMCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvblZhbHVlKSB7XG4gICAgICBpZiAob3B0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25WYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbHVlO1xuICAgICAgfSAvLyBlbHNlLCBlbXB0eSBzdHJpbmcgKGludmFsaWQpLCBudWxsIChpbnZhbGlkKSwgMCAoaW52YWxpZClcblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgXCIuY29uY2F0KG9wdGlvbk5hbWUsIFwiYCB3YXMgc3BlY2lmaWVkIGJ1dCB3YXMgbm90IGEgbm9kZSwgb3IgZGlkIG5vdCByZXR1cm4gYSBub2RlXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IG9wdGlvblZhbHVlOyAvLyBjb3VsZCBiZSBIVE1MRWxlbWVudCwgU1ZHRWxlbWVudCwgb3Igbm9uLWVtcHR5IHN0cmluZyBhdCB0aGlzIHBvaW50XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvblZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgbm9kZSA9IGRvYy5xdWVyeVNlbGVjdG9yKG9wdGlvblZhbHVlKTsgLy8gcmVzb2x2ZSB0byBub2RlLCBvciBudWxsIGlmIGZhaWxzXG5cbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgXCIuY29uY2F0KG9wdGlvbk5hbWUsIFwiYCBhcyBzZWxlY3RvciByZWZlcnMgdG8gbm8ga25vd24gbm9kZVwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgdmFyIGdldEluaXRpYWxGb2N1c05vZGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsRm9jdXNOb2RlKCkge1xuICAgIHZhciBub2RlID0gZ2V0Tm9kZUZvck9wdGlvbignaW5pdGlhbEZvY3VzJyk7IC8vIGZhbHNlIGV4cGxpY2l0bHkgaW5kaWNhdGVzIHdlIHdhbnQgbm8gaW5pdGlhbEZvY3VzIGF0IGFsbFxuXG4gICAgaWYgKG5vZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gb3B0aW9uIG5vdCBzcGVjaWZpZWQ6IHVzZSBmYWxsYmFjayBvcHRpb25zXG4gICAgICBpZiAoY29udGFpbmVyc0NvbnRhaW4oZG9jLmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG5vZGUgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaXJzdFRhYmJhYmxlR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1swXTtcbiAgICAgICAgdmFyIGZpcnN0VGFiYmFibGVOb2RlID0gZmlyc3RUYWJiYWJsZUdyb3VwICYmIGZpcnN0VGFiYmFibGVHcm91cC5maXJzdFRhYmJhYmxlTm9kZTsgLy8gTk9URTogYGZhbGxiYWNrRm9jdXNgIG9wdGlvbiBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGBmYWxzZWAgKG5vdCBzdXBwb3J0ZWQpXG5cbiAgICAgICAgbm9kZSA9IGZpcnN0VGFiYmFibGVOb2RlIHx8IGdldE5vZGVGb3JPcHRpb24oJ2ZhbGxiYWNrRm9jdXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBmb2N1cy10cmFwIG5lZWRzIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGZvY3VzYWJsZSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgdmFyIHVwZGF0ZVRhYmJhYmxlTm9kZXMgPSBmdW5jdGlvbiB1cGRhdGVUYWJiYWJsZU5vZGVzKCkge1xuICAgIHN0YXRlLnRhYmJhYmxlR3JvdXBzID0gc3RhdGUuY29udGFpbmVycy5tYXAoZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgdmFyIHRhYmJhYmxlTm9kZXMgPSB0YWJiYWJsZShjb250YWluZXIpO1xuXG4gICAgICBpZiAodGFiYmFibGVOb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICAgICAgZmlyc3RUYWJiYWJsZU5vZGU6IHRhYmJhYmxlTm9kZXNbMF0sXG4gICAgICAgICAgbGFzdFRhYmJhYmxlTm9kZTogdGFiYmFibGVOb2Rlc1t0YWJiYWJsZU5vZGVzLmxlbmd0aCAtIDFdXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChncm91cCkge1xuICAgICAgcmV0dXJuICEhZ3JvdXA7XG4gICAgfSk7IC8vIHJlbW92ZSBncm91cHMgd2l0aCBubyB0YWJiYWJsZSBub2Rlc1xuICAgIC8vIHRocm93IGlmIG5vIGdyb3VwcyBoYXZlIHRhYmJhYmxlIG5vZGVzIGFuZCB3ZSBkb24ndCBoYXZlIGEgZmFsbGJhY2sgZm9jdXMgbm9kZSBlaXRoZXJcblxuICAgIGlmIChzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggPD0gMCAmJiAhZ2V0Tm9kZUZvck9wdGlvbignZmFsbGJhY2tGb2N1cycpIC8vIHJldHVybmluZyBmYWxzZSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9wdGlvblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3VyIGZvY3VzLXRyYXAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjb250YWluZXIgd2l0aCBhdCBsZWFzdCBvbmUgdGFiYmFibGUgbm9kZSBpbiBpdCBhdCBhbGwgdGltZXMnKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHRyeUZvY3VzID0gZnVuY3Rpb24gdHJ5Rm9jdXMobm9kZSkge1xuICAgIGlmIChub2RlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBkb2MuYWN0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZSB8fCAhbm9kZS5mb2N1cykge1xuICAgICAgdHJ5Rm9jdXMoZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6ICEhY29uZmlnLnByZXZlbnRTY3JvbGxcbiAgICB9KTtcbiAgICBzdGF0ZS5tb3N0UmVjZW50bHlGb2N1c2VkTm9kZSA9IG5vZGU7XG5cbiAgICBpZiAoaXNTZWxlY3RhYmxlSW5wdXQobm9kZSkpIHtcbiAgICAgIG5vZGUuc2VsZWN0KCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBnZXRSZXR1cm5Gb2N1c05vZGUgPSBmdW5jdGlvbiBnZXRSZXR1cm5Gb2N1c05vZGUocHJldmlvdXNBY3RpdmVFbGVtZW50KSB7XG4gICAgdmFyIG5vZGUgPSBnZXROb2RlRm9yT3B0aW9uKCdzZXRSZXR1cm5Gb2N1cycsIHByZXZpb3VzQWN0aXZlRWxlbWVudCk7XG4gICAgcmV0dXJuIG5vZGUgPyBub2RlIDogbm9kZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHByZXZpb3VzQWN0aXZlRWxlbWVudDtcbiAgfTsgLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIG9uIG1vdXNlZG93biBhbmQgdG91Y2hzdGFydCBpbnN0ZWFkIG9mIGNsaWNrXG4gIC8vIHNvIHRoYXQgaXQgcHJlY2VkZXMgdGhlIGZvY3VzIGV2ZW50LlxuXG5cbiAgdmFyIGNoZWNrUG9pbnRlckRvd24gPSBmdW5jdGlvbiBjaGVja1BvaW50ZXJEb3duKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGNvbnRhaW5lcnNDb250YWluKHRhcmdldCkpIHtcbiAgICAgIC8vIGFsbG93IHRoZSBjbGljayBzaW5jZSBpdCBvY3VycmVkIGluc2lkZSB0aGUgdHJhcFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXMsIGUpKSB7XG4gICAgICAvLyBpbW1lZGlhdGVseSBkZWFjdGl2YXRlIHRoZSB0cmFwXG4gICAgICB0cmFwLmRlYWN0aXZhdGUoe1xuICAgICAgICAvLyBpZiwgb24gZGVhY3RpdmF0aW9uLCB3ZSBzaG91bGQgcmV0dXJuIGZvY3VzIHRvIHRoZSBub2RlIG9yaWdpbmFsbHktZm9jdXNlZFxuICAgICAgICAvLyAgd2hlbiB0aGUgdHJhcCB3YXMgYWN0aXZhdGVkIChvciB0aGUgY29uZmlndXJlZCBgc2V0UmV0dXJuRm9jdXNgIG5vZGUpLFxuICAgICAgICAvLyAgdGhlbiBhc3N1bWUgaXQncyBhbHNvIE9LIHRvIHJldHVybiBmb2N1cyB0byB0aGUgb3V0c2lkZSBub2RlIHRoYXQgd2FzXG4gICAgICAgIC8vICBqdXN0IGNsaWNrZWQsIGNhdXNpbmcgZGVhY3RpdmF0aW9uLCBhcyBsb25nIGFzIHRoYXQgbm9kZSBpcyBmb2N1c2FibGU7XG4gICAgICAgIC8vICBpZiBpdCBpc24ndCBmb2N1c2FibGUsIHRoZW4gcmV0dXJuIGZvY3VzIHRvIHRoZSBvcmlnaW5hbCBub2RlIGZvY3VzZWRcbiAgICAgICAgLy8gIG9uIGFjdGl2YXRpb24gKG9yIHRoZSBjb25maWd1cmVkIGBzZXRSZXR1cm5Gb2N1c2Agbm9kZSlcbiAgICAgICAgLy8gTk9URTogYnkgc2V0dGluZyBgcmV0dXJuRm9jdXM6IGZhbHNlYCwgZGVhY3RpdmF0ZSgpIHdpbGwgZG8gbm90aGluZyxcbiAgICAgICAgLy8gIHdoaWNoIHdpbGwgcmVzdWx0IGluIHRoZSBvdXRzaWRlIGNsaWNrIHNldHRpbmcgZm9jdXMgdG8gdGhlIG5vZGVcbiAgICAgICAgLy8gIHRoYXQgd2FzIGNsaWNrZWQsIHdoZXRoZXIgaXQncyBmb2N1c2FibGUgb3Igbm90OyBieSBzZXR0aW5nXG4gICAgICAgIC8vICBgcmV0dXJuRm9jdXM6IHRydWVgLCB3ZSdsbCBhdHRlbXB0IHRvIHJlLWZvY3VzIHRoZSBub2RlIG9yaWdpbmFsbHktZm9jdXNlZFxuICAgICAgICAvLyAgb24gYWN0aXZhdGlvbiAob3IgdGhlIGNvbmZpZ3VyZWQgYHNldFJldHVybkZvY3VzYCBub2RlKVxuICAgICAgICByZXR1cm5Gb2N1czogY29uZmlnLnJldHVybkZvY3VzT25EZWFjdGl2YXRlICYmICFpc0ZvY3VzYWJsZSh0YXJnZXQpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoaXMgaXMgbmVlZGVkIGZvciBtb2JpbGUgZGV2aWNlcy5cbiAgICAvLyAoSWYgd2UnbGwgb25seSBsZXQgYGNsaWNrYCBldmVudHMgdGhyb3VnaCxcbiAgICAvLyB0aGVuIG9uIG1vYmlsZSB0aGV5IHdpbGwgYmUgYmxvY2tlZCBhbnl3YXlzIGlmIGB0b3VjaHN0YXJ0YCBpcyBibG9ja2VkLilcblxuXG4gICAgaWYgKHZhbHVlT3JIYW5kbGVyKGNvbmZpZy5hbGxvd091dHNpZGVDbGljaywgZSkpIHtcbiAgICAgIC8vIGFsbG93IHRoZSBjbGljayBvdXRzaWRlIHRoZSB0cmFwIHRvIHRha2UgcGxhY2VcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG90aGVyd2lzZSwgcHJldmVudCB0aGUgY2xpY2tcblxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9OyAvLyBJbiBjYXNlIGZvY3VzIGVzY2FwZXMgdGhlIHRyYXAgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIHB1bGwgaXQgYmFjayBpbi5cblxuXG4gIHZhciBjaGVja0ZvY3VzSW4gPSBmdW5jdGlvbiBjaGVja0ZvY3VzSW4oZSkge1xuICAgIHZhciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoZSk7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lZCA9IGNvbnRhaW5lcnNDb250YWluKHRhcmdldCk7IC8vIEluIEZpcmVmb3ggd2hlbiB5b3UgVGFiIG91dCBvZiBhbiBpZnJhbWUgdGhlIERvY3VtZW50IGlzIGJyaWVmbHkgZm9jdXNlZC5cblxuICAgIGlmICh0YXJnZXRDb250YWluZWQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGlmICh0YXJnZXRDb250YWluZWQpIHtcbiAgICAgICAgc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzY2FwZWQhIHB1bGwgaXQgYmFjayBpbiB0byB3aGVyZSBpdCBqdXN0IGxlZnRcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB0cnlGb2N1cyhzdGF0ZS5tb3N0UmVjZW50bHlGb2N1c2VkTm9kZSB8fCBnZXRJbml0aWFsRm9jdXNOb2RlKCkpO1xuICAgIH1cbiAgfTsgLy8gSGlqYWNrIFRhYiBldmVudHMgb24gdGhlIGZpcnN0IGFuZCBsYXN0IGZvY3VzYWJsZSBub2RlcyBvZiB0aGUgdHJhcCxcbiAgLy8gaW4gb3JkZXIgdG8gcHJldmVudCBmb2N1cyBmcm9tIGVzY2FwaW5nLiBJZiBpdCBlc2NhcGVzIGZvciBldmVuIGFcbiAgLy8gbW9tZW50IGl0IGNhbiBlbmQgdXAgc2Nyb2xsaW5nIHRoZSBwYWdlIGFuZCBjYXVzaW5nIGNvbmZ1c2lvbiBzbyB3ZVxuICAvLyBraW5kIG9mIG5lZWQgdG8gY2FwdHVyZSB0aGUgYWN0aW9uIGF0IHRoZSBrZXlkb3duIHBoYXNlLlxuXG5cbiAgdmFyIGNoZWNrVGFiID0gZnVuY3Rpb24gY2hlY2tUYWIoZSkge1xuICAgIHZhciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoZSk7XG4gICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgIHZhciBkZXN0aW5hdGlvbk5vZGUgPSBudWxsO1xuXG4gICAgaWYgKHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGlzIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBhIGdyb3VwXG4gICAgICAvLyBOT1RFOiB0aGUgdGFyZ2V0IG1heSBhbHNvIGJlIHRoZSBjb250YWluZXIgaXRzZWxmIGlmIGl0J3MgZm9jdXNhYmxlXG4gICAgICAvLyAgd2l0aCB0YWJJbmRleD0nLTEnIGFuZCB3YXMgZ2l2ZW4gaW5pdGlhbCBmb2N1c1xuICAgICAgdmFyIGNvbnRhaW5lckluZGV4ID0gZmluZEluZGV4KHN0YXRlLnRhYmJhYmxlR3JvdXBzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gX3JlZi5jb250YWluZXI7XG4gICAgICAgIHJldHVybiBjb250YWluZXIuY29udGFpbnModGFyZ2V0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY29udGFpbmVySW5kZXggPCAwKSB7XG4gICAgICAgIC8vIHRhcmdldCBub3QgZm91bmQgaW4gYW55IGdyb3VwOiBxdWl0ZSBwb3NzaWJsZSBmb2N1cyBoYXMgZXNjYXBlZCB0aGUgdHJhcCxcbiAgICAgICAgLy8gIHNvIGJyaW5nIGl0IGJhY2sgaW4gdG8uLi5cbiAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAvLyAuLi50aGUgbGFzdCBub2RlIGluIHRoZSBsYXN0IGdyb3VwXG4gICAgICAgICAgZGVzdGluYXRpb25Ob2RlID0gc3RhdGUudGFiYmFibGVHcm91cHNbc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIC0gMV0ubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAuLi50aGUgZmlyc3Qgbm9kZSBpbiB0aGUgZmlyc3QgZ3JvdXBcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1swXS5maXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgIC8vIFJFVkVSU0VcbiAgICAgICAgLy8gaXMgdGhlIHRhcmdldCB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBpbiBhIGdyb3VwP1xuICAgICAgICB2YXIgc3RhcnRPZkdyb3VwSW5kZXggPSBmaW5kSW5kZXgoc3RhdGUudGFiYmFibGVHcm91cHMsIGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgIHZhciBmaXJzdFRhYmJhYmxlTm9kZSA9IF9yZWYyLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICAgIHJldHVybiB0YXJnZXQgPT09IGZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc3RhcnRPZkdyb3VwSW5kZXggPCAwICYmIChzdGF0ZS50YWJiYWJsZUdyb3Vwc1tjb250YWluZXJJbmRleF0uY29udGFpbmVyID09PSB0YXJnZXQgfHwgaXNGb2N1c2FibGUodGFyZ2V0KSAmJiAhaXNUYWJiYWJsZSh0YXJnZXQpKSkge1xuICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBjYXNlIHdoZXJlIHRoZSB0YXJnZXQgaXMgZWl0aGVyIHRoZSBjb250YWluZXIgaXRzZWxmLCBvclxuICAgICAgICAgIC8vICBhIG5vbi10YWJiYWJsZSBub2RlIHRoYXQgd2FzIGdpdmVuIGZvY3VzIChpLmUuIHRhYmluZGV4IGlzIG5lZ2F0aXZlXG4gICAgICAgICAgLy8gIGFuZCB1c2VyIGNsaWNrZWQgb24gaXQgb3Igbm9kZSB3YXMgcHJvZ3JhbW1hdGljYWxseSBnaXZlbiBmb2N1cyksIGluIHdoaWNoXG4gICAgICAgICAgLy8gIGNhc2UsIHdlIHNob3VsZCBoYW5kbGUgc2hpZnQrdGFiIGFzIGlmIGZvY3VzIHdlcmUgb24gdGhlIGNvbnRhaW5lcidzXG4gICAgICAgICAgLy8gIGZpcnN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwXG4gICAgICAgICAgc3RhcnRPZkdyb3VwSW5kZXggPSBjb250YWluZXJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHNoaWZ0K3RhYiBzaG91bGQgZ28gdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBpbiB0aGVcbiAgICAgICAgICAvLyAgcHJldmlvdXMgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mXG4gICAgICAgICAgLy8gIHRoZSBMQVNUIGdyb3VwIGlmIGl0J3MgdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUIGdyb3VwKVxuICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkdyb3VwSW5kZXggPSBzdGFydE9mR3JvdXBJbmRleCA9PT0gMCA/IHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDEgOiBzdGFydE9mR3JvdXBJbmRleCAtIDE7XG4gICAgICAgICAgdmFyIGRlc3RpbmF0aW9uR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tkZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IGRlc3RpbmF0aW9uR3JvdXAubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRk9SV0FSRFxuICAgICAgICAvLyBpcyB0aGUgdGFyZ2V0IHRoZSBsYXN0IHRhYmJhYmxlIG5vZGUgaW4gYSBncm91cD9cbiAgICAgICAgdmFyIGxhc3RPZkdyb3VwSW5kZXggPSBmaW5kSW5kZXgoc3RhdGUudGFiYmFibGVHcm91cHMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgIHZhciBsYXN0VGFiYmFibGVOb2RlID0gX3JlZjMubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBsYXN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA8IDAgJiYgKHN0YXRlLnRhYmJhYmxlR3JvdXBzW2NvbnRhaW5lckluZGV4XS5jb250YWluZXIgPT09IHRhcmdldCB8fCBpc0ZvY3VzYWJsZSh0YXJnZXQpICYmICFpc1RhYmJhYmxlKHRhcmdldCkpKSB7XG4gICAgICAgICAgLy8gYW4gZXhjZXB0aW9uIGNhc2Ugd2hlcmUgdGhlIHRhcmdldCBpcyB0aGUgY29udGFpbmVyIGl0c2VsZiwgb3JcbiAgICAgICAgICAvLyAgYSBub24tdGFiYmFibGUgbm9kZSB0aGF0IHdhcyBnaXZlbiBmb2N1cyAoaS5lLiB0YWJpbmRleCBpcyBuZWdhdGl2ZVxuICAgICAgICAgIC8vICBhbmQgdXNlciBjbGlja2VkIG9uIGl0IG9yIG5vZGUgd2FzIHByb2dyYW1tYXRpY2FsbHkgZ2l2ZW4gZm9jdXMpLCBpbiB3aGljaFxuICAgICAgICAgIC8vICBjYXNlLCB3ZSBzaG91bGQgaGFuZGxlIHRhYiBhcyBpZiBmb2N1cyB3ZXJlIG9uIHRoZSBjb250YWluZXInc1xuICAgICAgICAgIC8vICBsYXN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1QgZ3JvdXBcbiAgICAgICAgICBsYXN0T2ZHcm91cEluZGV4ID0gY29udGFpbmVySW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHRhYiBzaG91bGQgZ28gdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgaW4gdGhlIG5leHRcbiAgICAgICAgICAvLyAgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1RcbiAgICAgICAgICAvLyAgZ3JvdXAgaWYgaXQncyB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwKVxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cEluZGV4ID0gbGFzdE9mR3JvdXBJbmRleCA9PT0gc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIC0gMSA/IDAgOiBsYXN0T2ZHcm91cEluZGV4ICsgMTtcblxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cCA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzW19kZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IF9kZXN0aW5hdGlvbkdyb3VwLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5PVEU6IHRoZSBmYWxsYmFja0ZvY3VzIG9wdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHJldHVybmluZyBmYWxzZSB0byBvcHQtb3V0XG4gICAgICBkZXN0aW5hdGlvbk5vZGUgPSBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlc3RpbmF0aW9uTm9kZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdHJ5Rm9jdXMoZGVzdGluYXRpb25Ob2RlKTtcbiAgICB9IC8vIGVsc2UsIGxldCB0aGUgYnJvd3NlciB0YWtlIGNhcmUgb2YgW3NoaWZ0K110YWIgYW5kIG1vdmUgdGhlIGZvY3VzXG5cbiAgfTtcblxuICB2YXIgY2hlY2tLZXkgPSBmdW5jdGlvbiBjaGVja0tleShlKSB7XG4gICAgaWYgKGlzRXNjYXBlRXZlbnQoZSkgJiYgdmFsdWVPckhhbmRsZXIoY29uZmlnLmVzY2FwZURlYWN0aXZhdGVzLCBlKSAhPT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1RhYkV2ZW50KGUpKSB7XG4gICAgICBjaGVja1RhYihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrQ2xpY2sgPSBmdW5jdGlvbiBjaGVja0NsaWNrKGUpIHtcbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSBnZXRBY3R1YWxUYXJnZXQoZSk7XG5cbiAgICBpZiAoY29udGFpbmVyc0NvbnRhaW4odGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH07IC8vXG4gIC8vIEVWRU5UIExJU1RFTkVSU1xuICAvL1xuXG5cbiAgdmFyIGFkZExpc3RlbmVycyA9IGZ1bmN0aW9uIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGxpc3RlbmluZyBmb2N1cyB0cmFwIGF0IGEgdGltZVxuXG5cbiAgICBhY3RpdmVGb2N1c1RyYXBzLmFjdGl2YXRlVHJhcCh0cmFwKTsgLy8gRGVsYXkgZW5zdXJlcyB0aGF0IHRoZSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCBjYXB0dXJlIHRoZSBldmVudFxuICAgIC8vIHRoYXQgY2F1c2VkIHRoZSBmb2N1cyB0cmFwIGFjdGl2YXRpb24uXG5cbiAgICBzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyID0gY29uZmlnLmRlbGF5SW5pdGlhbEZvY3VzID8gZGVsYXkoZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5Rm9jdXMoZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9KSA6IHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0cmFwO1xuICB9O1xuXG4gIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGNoZWNrRm9jdXNJbiwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgY2hlY2tQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tDbGljaywgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjaGVja0tleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRyYXA7XG4gIH07IC8vXG4gIC8vIFRSQVAgREVGSU5JVElPTlxuICAvL1xuXG5cbiAgdHJhcCA9IHtcbiAgICBhY3RpdmF0ZTogZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGVPcHRpb25zKSB7XG4gICAgICBpZiAoc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgb25BY3RpdmF0ZSA9IGdldE9wdGlvbihhY3RpdmF0ZU9wdGlvbnMsICdvbkFjdGl2YXRlJyk7XG4gICAgICB2YXIgb25Qb3N0QWN0aXZhdGUgPSBnZXRPcHRpb24oYWN0aXZhdGVPcHRpb25zLCAnb25Qb3N0QWN0aXZhdGUnKTtcbiAgICAgIHZhciBjaGVja0NhbkZvY3VzVHJhcCA9IGdldE9wdGlvbihhY3RpdmF0ZU9wdGlvbnMsICdjaGVja0NhbkZvY3VzVHJhcCcpO1xuXG4gICAgICBpZiAoIWNoZWNrQ2FuRm9jdXNUcmFwKSB7XG4gICAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmIChvbkFjdGl2YXRlKSB7XG4gICAgICAgIG9uQWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmlzaEFjdGl2YXRpb24gPSBmdW5jdGlvbiBmaW5pc2hBY3RpdmF0aW9uKCkge1xuICAgICAgICBpZiAoY2hlY2tDYW5Gb2N1c1RyYXApIHtcbiAgICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRMaXN0ZW5lcnMoKTtcblxuICAgICAgICBpZiAob25Qb3N0QWN0aXZhdGUpIHtcbiAgICAgICAgICBvblBvc3RBY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoY2hlY2tDYW5Gb2N1c1RyYXApIHtcbiAgICAgICAgY2hlY2tDYW5Gb2N1c1RyYXAoc3RhdGUuY29udGFpbmVycy5jb25jYXQoKSkudGhlbihmaW5pc2hBY3RpdmF0aW9uLCBmaW5pc2hBY3RpdmF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGZpbmlzaEFjdGl2YXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gZGVhY3RpdmF0ZShkZWFjdGl2YXRlT3B0aW9ucykge1xuICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyKTsgLy8gbm9vcCBpZiB1bmRlZmluZWRcblxuICAgICAgc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIGFjdGl2ZUZvY3VzVHJhcHMuZGVhY3RpdmF0ZVRyYXAodHJhcCk7XG4gICAgICB2YXIgb25EZWFjdGl2YXRlID0gZ2V0T3B0aW9uKGRlYWN0aXZhdGVPcHRpb25zLCAnb25EZWFjdGl2YXRlJyk7XG4gICAgICB2YXIgb25Qb3N0RGVhY3RpdmF0ZSA9IGdldE9wdGlvbihkZWFjdGl2YXRlT3B0aW9ucywgJ29uUG9zdERlYWN0aXZhdGUnKTtcbiAgICAgIHZhciBjaGVja0NhblJldHVybkZvY3VzID0gZ2V0T3B0aW9uKGRlYWN0aXZhdGVPcHRpb25zLCAnY2hlY2tDYW5SZXR1cm5Gb2N1cycpO1xuXG4gICAgICBpZiAob25EZWFjdGl2YXRlKSB7XG4gICAgICAgIG9uRGVhY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmV0dXJuRm9jdXMgPSBnZXRPcHRpb24oZGVhY3RpdmF0ZU9wdGlvbnMsICdyZXR1cm5Gb2N1cycsICdyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZScpO1xuXG4gICAgICB2YXIgZmluaXNoRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoRGVhY3RpdmF0aW9uKCkge1xuICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZvY3VzKSB7XG4gICAgICAgICAgICB0cnlGb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9uUG9zdERlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIG9uUG9zdERlYWN0aXZhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKHJldHVybkZvY3VzICYmIGNoZWNrQ2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSkudGhlbihmaW5pc2hEZWFjdGl2YXRpb24sIGZpbmlzaERlYWN0aXZhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmaW5pc2hEZWFjdGl2YXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgaWYgKHN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHVucGF1c2U6IGZ1bmN0aW9uIHVucGF1c2UoKSB7XG4gICAgICBpZiAoIXN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgIGFkZExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB1cGRhdGVDb250YWluZXJFbGVtZW50czogZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyRWxlbWVudHMoY29udGFpbmVyRWxlbWVudHMpIHtcbiAgICAgIHZhciBlbGVtZW50c0FzQXJyYXkgPSBbXS5jb25jYXQoY29udGFpbmVyRWxlbWVudHMpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHN0YXRlLmNvbnRhaW5lcnMgPSBlbGVtZW50c0FzQXJyYXkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBkb2MucXVlcnlTZWxlY3RvcihlbGVtZW50KSA6IGVsZW1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTsgLy8gaW5pdGlhbGl6ZSBjb250YWluZXIgZWxlbWVudHNcblxuICB0cmFwLnVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHRyYXA7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVGb2N1c1RyYXAgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvY3VzLXRyYXAuZXNtLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBSZWFjdERPTSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgUHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCdmb2N1cy10cmFwJyksXG4gICAgY3JlYXRlRm9jdXNUcmFwID0gX3JlcXVpcmUuY3JlYXRlRm9jdXNUcmFwOyAvLyBUT0RPOiBUaGVzZSBpc3N1ZXMgYXJlIHJlbGF0ZWQgdG8gb2xkZXIgUmVhY3QgZmVhdHVyZXMgd2hpY2ggd2UnbGwgbGlrZWx5IG5lZWRcbi8vICB0byBmaXggaW4gb3JkZXIgdG8gbW92ZSB0aGUgY29kZSBmb3J3YXJkIHRvIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgUmVhY3QuXG4vLyAgQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWR0aGVjbGFyay9mb2N1cy10cmFwLXJlYWN0L2lzc3Vlcy83N1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1maW5kLWRvbS1ub2RlICovXG5cblxudmFyIEZvY3VzVHJhcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRm9jdXNUcmFwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZvY3VzVHJhcCk7XG5cbiAgZnVuY3Rpb24gRm9jdXNUcmFwKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvY3VzVHJhcCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTsgLy8gV2UgbmVlZCB0byBoaWphY2sgdGhlIHJldHVybkZvY3VzT25EZWFjdGl2YXRlIG9wdGlvbixcbiAgICAvLyBiZWNhdXNlIFJlYWN0IGNhbiBtb3ZlIGZvY3VzIGludG8gdGhlIGVsZW1lbnQgYmVmb3JlIHdlIGFycml2ZWQgYXRcbiAgICAvLyB0aGlzIGxpZmVjeWNsZSBob29rIChlLmcuIHdpdGggYXV0b0ZvY3VzIGlucHV0cykuIFNvIHRoZSBjb21wb25lbnRcbiAgICAvLyBjYXB0dXJlcyB0aGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50IGluIGNvbXBvbmVudFdpbGxNb3VudCxcbiAgICAvLyB0aGVuIChvcHRpb25hbGx5KSByZXR1cm5zIGZvY3VzIHRvIGl0IGluIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuXG4gICAgX3RoaXMudGFpbG9yZWRGb2N1c1RyYXBPcHRpb25zID0ge1xuICAgICAgcmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6IGZhbHNlXG4gICAgfTsgLy8gYmVjYXVzZSBvZiB0aGUgYWJvdmUsIHdlIG1haW50YWluIG91ciBvd24gZmxhZyBmb3IgdGhpcyBvcHRpb24sIGFuZFxuICAgIC8vICBkZWZhdWx0IGl0IHRvIGB0cnVlYCBiZWNhdXNlIHRoYXQncyBmb2N1cy10cmFwJ3MgZGVmYXVsdFxuXG4gICAgX3RoaXMucmV0dXJuRm9jdXNPbkRlYWN0aXZhdGUgPSB0cnVlO1xuICAgIHZhciBmb2N1c1RyYXBPcHRpb25zID0gcHJvcHMuZm9jdXNUcmFwT3B0aW9ucztcblxuICAgIGZvciAodmFyIG9wdGlvbk5hbWUgaW4gZm9jdXNUcmFwT3B0aW9ucykge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9jdXNUcmFwT3B0aW9ucywgb3B0aW9uTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAncmV0dXJuRm9jdXNPbkRlYWN0aXZhdGUnKSB7XG4gICAgICAgIF90aGlzLnJldHVybkZvY3VzT25EZWFjdGl2YXRlID0gISFmb2N1c1RyYXBPcHRpb25zW29wdGlvbk5hbWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbk5hbWUgPT09ICdvblBvc3REZWFjdGl2YXRlJykge1xuICAgICAgICBfdGhpcy5vblBvc3REZWFjdGl2YXRlID0gZm9jdXNUcmFwT3B0aW9uc1tvcHRpb25OYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9uc1tvcHRpb25OYW1lXSA9IGZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV07XG4gICAgfSAvLyBlbGVtZW50cyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZm9jdXMgdHJhcCBvbiBtb3VudDsgaWYgYSBjaGlsZCBpcyB1c2VkXG4gICAgLy8gIGluc3RlYWQgb2YgdGhlIGBjb250YWluZXJFbGVtZW50c2AgcHJvcCwgd2UnbGwgZ2V0IHRoZSBjaGlsZCdzIHJlbGF0ZWRcbiAgICAvLyAgZWxlbWVudCB3aGVuIHRoZSB0cmFwIHJlbmRlcnMgYW5kIHRoZW4gaXMgZGVjbGFyZWQgJ21vdW50ZWQnXG5cblxuICAgIF90aGlzLmZvY3VzVHJhcEVsZW1lbnRzID0gcHJvcHMuY29udGFpbmVyRWxlbWVudHMgfHwgW107IC8vIG5vdyB3ZSByZW1lbWJlciB3aGF0IHRoZSBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50IGlzLCBub3QgcmVseWluZyBvbiBmb2N1cy10cmFwXG5cbiAgICBfdGhpcy51cGRhdGVQcmV2aW91c0VsZW1lbnQoKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY29uZmlndXJlZCBkb2N1bWVudC5cbiAgICogQHJldHVybnMge0RvY3VtZW50fHVuZGVmaW5lZH0gQ29uZmlndXJlZCBkb2N1bWVudCwgZmFsbGluZyBiYWNrIHRvIHRoZSBtYWluXG4gICAqICBkb2N1bWVudCwgaWYgaXQgZXhpc3RzLiBEdXJpbmcgU1NSLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZCBzaW5jZSB0aGVcbiAgICogIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEZvY3VzVHJhcCwgW3tcbiAgICBrZXk6IFwiZ2V0RG9jdW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgICAvLyBTU1I6IGNhcmVmdWwgdG8gY2hlY2sgaWYgYGRvY3VtZW50YCBleGlzdHMgYmVmb3JlIGFjY2Vzc2luZyBpdCBhcyBhIHZhcmlhYmxlXG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5mb2N1c1RyYXBPcHRpb25zLmRvY3VtZW50IHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuICAgIH0gLy8gVE9ETzogTmVlZCBtb3JlIHRlc3QgY292ZXJhZ2UgZm9yIHRoaXMgZnVuY3Rpb25cblxuICB9LCB7XG4gICAga2V5OiBcImdldE5vZGVGb3JPcHRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Tm9kZUZvck9wdGlvbihvcHRpb25OYW1lKSB7XG4gICAgICB2YXIgb3B0aW9uVmFsdWUgPSB0aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9uc1tvcHRpb25OYW1lXTtcblxuICAgICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vZGUgPSBvcHRpb25WYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIF90aGlzJGdldERvY3VtZW50O1xuXG4gICAgICAgIG5vZGUgPSAoX3RoaXMkZ2V0RG9jdW1lbnQgPSB0aGlzLmdldERvY3VtZW50KCkpID09PSBudWxsIHx8IF90aGlzJGdldERvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRnZXREb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvblZhbHVlKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgXCIuY29uY2F0KG9wdGlvbk5hbWUsIFwiYCByZWZlcnMgdG8gbm8ga25vd24gbm9kZVwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBub2RlID0gb3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgXCIuY29uY2F0KG9wdGlvbk5hbWUsIFwiYCBkaWQgbm90IHJldHVybiBhIG5vZGVcIikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXR1cm5Gb2N1c05vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmV0dXJuRm9jdXNOb2RlKCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldE5vZGVGb3JPcHRpb24oJ3NldFJldHVybkZvY3VzJyk7XG4gICAgICByZXR1cm4gbm9kZSA/IG5vZGUgOiB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudDtcbiAgICB9XG4gICAgLyoqIFVwZGF0ZSB0aGUgcHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnQgd2l0aCB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudC4gKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVByZXZpb3VzRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQcmV2aW91c0VsZW1lbnQoKSB7XG4gICAgICB2YXIgY3VycmVudERvY3VtZW50ID0gdGhpcy5nZXREb2N1bWVudCgpO1xuXG4gICAgICBpZiAoY3VycmVudERvY3VtZW50KSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gY3VycmVudERvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlYWN0aXZhdGVUcmFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlYWN0aXZhdGVUcmFwKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyR0YWlsb3JlZEZvY3VzVHIgPSB0aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9ucyxcbiAgICAgICAgICBjaGVja0NhblJldHVybkZvY3VzID0gX3RoaXMkdGFpbG9yZWRGb2N1c1RyLmNoZWNrQ2FuUmV0dXJuRm9jdXMsXG4gICAgICAgICAgX3RoaXMkdGFpbG9yZWRGb2N1c1RyMiA9IF90aGlzJHRhaWxvcmVkRm9jdXNUci5wcmV2ZW50U2Nyb2xsLFxuICAgICAgICAgIHByZXZlbnRTY3JvbGwgPSBfdGhpcyR0YWlsb3JlZEZvY3VzVHIyID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJHRhaWxvcmVkRm9jdXNUcjI7XG5cbiAgICAgIGlmICh0aGlzLmZvY3VzVHJhcCkge1xuICAgICAgICAvLyBOT1RFOiB3ZSBuZXZlciBsZXQgdGhlIHRyYXAgcmV0dXJuIHRoZSBmb2N1cyBzaW5jZSB3ZSBkbyB0aGF0IG91cnNlbHZlc1xuICAgICAgICB0aGlzLmZvY3VzVHJhcC5kZWFjdGl2YXRlKHtcbiAgICAgICAgICByZXR1cm5Gb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hEZWFjdGl2YXRpb24gPSBmdW5jdGlvbiBmaW5pc2hEZWFjdGl2YXRpb24oKSB7XG4gICAgICAgIHZhciByZXR1cm5Gb2N1c05vZGUgPSBfdGhpczIuZ2V0UmV0dXJuRm9jdXNOb2RlKCk7XG5cbiAgICAgICAgdmFyIGNhblJldHVybkZvY3VzID0gKHJldHVybkZvY3VzTm9kZSA9PT0gbnVsbCB8fCByZXR1cm5Gb2N1c05vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJldHVybkZvY3VzTm9kZS5mb2N1cykgJiYgX3RoaXMyLnJldHVybkZvY3VzT25EZWFjdGl2YXRlO1xuXG4gICAgICAgIGlmIChjYW5SZXR1cm5Gb2N1cykge1xuICAgICAgICAgIC8qKiBSZXR1cm5zIGZvY3VzIHRvIHRoZSBlbGVtZW50IHRoYXQgaGFkIGZvY3VzIHdoZW4gdGhlIHRyYXAgd2FzIGFjdGl2YXRlZC4gKi9cbiAgICAgICAgICByZXR1cm5Gb2N1c05vZGUuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogcHJldmVudFNjcm9sbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzMi5vblBvc3REZWFjdGl2YXRlKSB7XG4gICAgICAgICAgX3RoaXMyLm9uUG9zdERlYWN0aXZhdGUuY2FsbChudWxsKTsgLy8gZG9uJ3QgY2FsbCBpdCBpbiBjb250ZXh0IG9mIFwidGhpc1wiXG5cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGNoZWNrQ2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyh0aGlzLmdldFJldHVybkZvY3VzTm9kZSgpKS50aGVuKGZpbmlzaERlYWN0aXZhdGlvbiwgZmluaXNoRGVhY3RpdmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmlzaERlYWN0aXZhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXR1cEZvY3VzVHJhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cEZvY3VzVHJhcCgpIHtcbiAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgdmFyIGZvY3VzVHJhcEVsZW1lbnRET01Ob2RlcyA9IHRoaXMuZm9jdXNUcmFwRWxlbWVudHMubWFwKCAvLyBOT1RFOiBgZmluZERPTU5vZGUoKWAgZG9lcyBub3Qgc3VwcG9ydCBDU1Mgc2VsZWN0b3JzOyBpdCdsbCBqdXN0IHJldHVyblxuICAgICAgICAvLyAgYSBuZXcgdGV4dCBub2RlIHdpdGggdGhlIHRleHQgd3JhcHBlZCBpbiBpdCBpbnN0ZWFkIG9mIHRyZWF0aW5nIHRoZVxuICAgICAgICAvLyAgc3RyaW5nIGFzIGEgc2VsZWN0b3IgYW5kIHJlc29sdmluZyBpdCB0byBhIG5vZGUgaW4gdGhlIERPTVxuICAgICAgICBSZWFjdERPTS5maW5kRE9NTm9kZSk7XG4gICAgICAgIHZhciBub2Rlc0V4aXN0ID0gZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzLnNvbWUoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKG5vZGVzRXhpc3QpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvcHJvcC10eXBlcyAtLSBfY3JlYXRlRm9jdXNUcmFwIGlzIGFuIGludGVybmFsIHByb3BcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMucHJvcHMuX2NyZWF0ZUZvY3VzVHJhcChmb2N1c1RyYXBFbGVtZW50RE9NTm9kZXMsIHRoaXMudGFpbG9yZWRGb2N1c1RyYXBPcHRpb25zKTtcblxuICAgICAgICAgIGlmICh0aGlzLnByb3BzLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAuYWN0aXZhdGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5wcm9wcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuc2V0dXBGb2N1c1RyYXAoKTtcbiAgICAgIH0gLy8gZWxzZSwgd2FpdCBmb3IgbGF0ZXIgYWN0aXZhdGlvbiBpbiBjYXNlIHRoZSBgZm9jdXNUcmFwT3B0aW9uc2Agd2lsbCBiZSB1cGRhdGVkXG4gICAgICAvLyAgYWdhaW4gYmVmb3JlIHRoZSB0cmFwIGlzIGFjdGl2YXRlZCAoZS5nLiBpZiB3YWl0aW5nIHRvIGtub3cgd2hhdCB0aGUgZG9jdW1lbnRcbiAgICAgIC8vICBvYmplY3Qgd2lsbCBiZSwgc28gdGhlIFRyYXAgbXVzdCBiZSByZW5kZXJlZCwgYnV0IHRoZSBjb25zdW1lciBpcyB3YWl0aW5nIHRvXG4gICAgICAvLyAgYWN0aXZhdGUgdW50aWwgdGhleSBoYXZlIG9idGFpbmVkIHRoZSBkb2N1bWVudCBmcm9tIGEgcmVmKVxuICAgICAgLy8gIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC1yZWFjdC9pc3N1ZXMvNTM5XG5cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLmZvY3VzVHJhcCkge1xuICAgICAgICBpZiAocHJldlByb3BzLmNvbnRhaW5lckVsZW1lbnRzICE9PSB0aGlzLnByb3BzLmNvbnRhaW5lckVsZW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAudXBkYXRlQ29udGFpbmVyRWxlbWVudHModGhpcy5wcm9wcy5jb250YWluZXJFbGVtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFzQWN0aXZhdGVkID0gIXByZXZQcm9wcy5hY3RpdmUgJiYgdGhpcy5wcm9wcy5hY3RpdmU7XG4gICAgICAgIHZhciBoYXNEZWFjdGl2YXRlZCA9IHByZXZQcm9wcy5hY3RpdmUgJiYgIXRoaXMucHJvcHMuYWN0aXZlO1xuICAgICAgICB2YXIgaGFzUGF1c2VkID0gIXByZXZQcm9wcy5wYXVzZWQgJiYgdGhpcy5wcm9wcy5wYXVzZWQ7XG4gICAgICAgIHZhciBoYXNVbnBhdXNlZCA9IHByZXZQcm9wcy5wYXVzZWQgJiYgIXRoaXMucHJvcHMucGF1c2VkO1xuXG4gICAgICAgIGlmIChoYXNBY3RpdmF0ZWQpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZpb3VzRWxlbWVudCgpO1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmFjdGl2YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzRGVhY3RpdmF0ZWQpIHtcbiAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVUcmFwKCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyB1bi9wYXVzZSBkb2VzIG5vdGhpbmcgb24gYW4gaW5hY3RpdmUgdHJhcFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1BhdXNlZCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLnBhdXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzVW5wYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC51bnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5PVEU6IGlmIHdlJ3JlIGluIGBjb21wb25lbnREaWRVcGRhdGVgIGFuZCB3ZSBkb24ndCBoYXZlIGEgdHJhcCB5ZXQsXG4gICAgICAgIC8vICBpdCBlaXRoZXIgbWVhbnMgaXQgc2hvdWxkbid0IGJlIGFjdGl2ZSwgb3IgaXQgc2hvdWxkIGJlIGJ1dCBub25lIG9mXG4gICAgICAgIC8vICBvZiBnaXZlbiBgY29udGFpbmVyRWxlbWVudHNgIHdlcmUgcHJlc2VudCBpbiB0aGUgRE9NIHRoZSBsYXN0IHRpbWVcbiAgICAgICAgLy8gIHdlIHRyaWVkIHRvIGNyZWF0ZSB0aGUgdHJhcFxuICAgICAgICBpZiAocHJldlByb3BzLmNvbnRhaW5lckVsZW1lbnRzICE9PSB0aGlzLnByb3BzLmNvbnRhaW5lckVsZW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXBFbGVtZW50cyA9IHRoaXMucHJvcHMuY29udGFpbmVyRWxlbWVudHM7XG4gICAgICAgIH0gLy8gZG9uJ3QgY3JlYXRlIHRoZSB0cmFwIHVubGVzcyBpdCBzaG91bGQgYmUgYWN0aXZlIGluIGNhc2UgdGhlIGNvbnN1bWVyXG4gICAgICAgIC8vICBpcyBzdGlsbCB1cGRhdGluZyBgZm9jdXNUcmFwT3B0aW9uc2BcbiAgICAgICAgLy8gIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC1yZWFjdC9pc3N1ZXMvNTM5XG5cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZpb3VzRWxlbWVudCgpO1xuICAgICAgICAgIHRoaXMuc2V0dXBGb2N1c1RyYXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZVRyYXAoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgY2hpbGQgPSB0aGlzLnByb3BzLmNoaWxkcmVuID8gUmVhY3QuQ2hpbGRyZW4ub25seSh0aGlzLnByb3BzLmNoaWxkcmVuKSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGZvY3VzLXRyYXAgY2Fubm90IHVzZSBhIEZyYWdtZW50IGFzIGl0cyBjaGlsZCBjb250YWluZXIuIFRyeSByZXBsYWNpbmcgaXQgd2l0aCBhIDxkaXY+IGVsZW1lbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29tcG9zZWRSZWZDYWxsYmFjayA9IGZ1bmN0aW9uIGNvbXBvc2VkUmVmQ2FsbGJhY2soZWxlbWVudCkge1xuICAgICAgICAgIHZhciBjb250YWluZXJFbGVtZW50cyA9IF90aGlzMy5wcm9wcy5jb250YWluZXJFbGVtZW50cztcblxuICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZC5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgY2hpbGQucmVmKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5yZWYpIHtcbiAgICAgICAgICAgICAgY2hpbGQucmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy5mb2N1c1RyYXBFbGVtZW50cyA9IGNvbnRhaW5lckVsZW1lbnRzID8gY29udGFpbmVyRWxlbWVudHMgOiBbZWxlbWVudF07XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGNoaWxkV2l0aFJlZiA9IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZDYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNoaWxkV2l0aFJlZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZvY3VzVHJhcDtcbn0oUmVhY3QuQ29tcG9uZW50KTsgLy8gc3VwcG9ydCBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgd2hlcmUgYEVsZW1lbnRgIHdpbGwgbm90IGJlIGRlZmluZWRcblxuXG52YXIgRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBGdW5jdGlvbiA6IEVsZW1lbnQ7XG5Gb2N1c1RyYXAucHJvcFR5cGVzID0ge1xuICBhY3RpdmU6IFByb3BUeXBlcy5ib29sLFxuICBwYXVzZWQ6IFByb3BUeXBlcy5ib29sLFxuICBmb2N1c1RyYXBPcHRpb25zOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGRvY3VtZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG9uQWN0aXZhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uUG9zdEFjdGl2YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBjaGVja0NhbkZvY3VzVHJhcDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25EZWFjdGl2YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblBvc3REZWFjdGl2YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBjaGVja0NhblJldHVybkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpbml0aWFsRm9jdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gICAgZmFsbGJhY2tGb2N1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmluc3RhbmNlT2YoRWxlbWVudFR5cGUpLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGVzY2FwZURlYWN0aXZhdGVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBjbGlja091dHNpZGVEZWFjdGl2YXRlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgcmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6IFByb3BUeXBlcy5ib29sLFxuICAgIHNldFJldHVybkZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuaW5zdGFuY2VPZihFbGVtZW50VHlwZSksIFByb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgYWxsb3dPdXRzaWRlQ2xpY2s6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHByZXZlbnRTY3JvbGw6IFByb3BUeXBlcy5ib29sXG4gIH0pLFxuICBjb250YWluZXJFbGVtZW50czogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmluc3RhbmNlT2YoRWxlbWVudFR5cGUpKSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5lbGVtZW50LCAvLyBSZWFjdCBlbGVtZW50XG4gIFByb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSAvLyBET00gZWxlbWVudFxuICBdKSAvLyBOT1RFOiBfY3JlYXRlRm9jdXNUcmFwIGlzIGludGVybmFsLCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LCBzbyB3ZSBkb24ndFxuICAvLyAgc3BlY2lmeSBpdCBoZXJlLiBJdCdzIGV4cGVjdGVkIHRvIGJlIHNldCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgZnJvbVxuICAvLyAgcmVxdWlyZSgnZm9jdXMtdHJhcCcpLCBvciBvbmUgd2l0aCBhIGNvbXBhdGlibGUgaW50ZXJmYWNlLlxuXG59O1xuRm9jdXNUcmFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aXZlOiB0cnVlLFxuICBwYXVzZWQ6IGZhbHNlLFxuICBmb2N1c1RyYXBPcHRpb25zOiB7fSxcbiAgX2NyZWF0ZUZvY3VzVHJhcDogY3JlYXRlRm9jdXNUcmFwXG59O1xubW9kdWxlLmV4cG9ydHMgPSBGb2N1c1RyYXA7IiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuLy8gUGFyYW1ldGVyIGlzIHRoZSBib29sZWFuLCB3aXRoIGRlZmF1bHQgXCJmYWxzZVwiIHZhbHVlXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUb2dnbGUoaW5pdGlhbFN0YXRlID0gZmFsc2UpOiBbYm9vbGVhbiwgKG5leHRTdGF0ZT86IGJvb2xlYW4pID0+IHZvaWRdIHtcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xuXG4gIC8vIERlZmluZSBhbmQgbWVtb3JpemUgdG9nZ2xlciBmdW5jdGlvbiBpbiBjYXNlIHdlIHBhc3MgZG93biB0aGUgY29tb3BuZW50LFxuICAvLyBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgYm9vbGVhbiB2YWx1ZSB0byBpdCdzIG9wcG9zaXRlIHZhbHVlXG4gIGNvbnN0IHRvZ2dsZSA9IHVzZUNhbGxiYWNrKChuZXh0U3RhdGU/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKG5leHRTdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRTdGF0ZShuZXh0U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZSgoc3RhdGUpID0+ICFzdGF0ZSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgcmV0dXJuIFtzdGF0ZSwgdG9nZ2xlXTtcbn1cbiIsImltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2UsIGdsb2JhbFN0YXRlU2VydmljZSwgbG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZSwgcmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQge3N0b3JhZ2V9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgRWRpdG9yLCB7RWRpdG9yUmVmQWN0aW9uc30gZnJvbSAnLi9FZGl0b3IvRWRpdG9yJztcbmltcG9ydCAnLi4vbGVzcy9tZW1vLWVkaXRvci5sZXNzJztcbmltcG9ydCAnLi4vbGVzcy9zZWxlY3QtZGF0ZS1waWNrZXIubGVzcyc7XG5pbXBvcnQgdGFnIGZyb20gJy4uL2ljb25zL3RhZy5zdmcnO1xuaW1wb3J0IGltYWdlU3ZnIGZyb20gJy4uL2ljb25zL2ltYWdlLnN2Zyc7XG5pbXBvcnQgdGFza1N2ZyBmcm9tICcuLi9pY29ucy90YXNrLnN2Zyc7XG5pbXBvcnQgc2hvd0VkaXRvclN2ZyBmcm9tICcuLi9pY29ucy9zaG93LWVkaXRvci5zdmcnO1xuaW1wb3J0IGpvdXJuYWxTdmcgZnJvbSAnLi4vaWNvbnMvam91cm5hbC5zdmcnO1xuaW1wb3J0IHtEYXlQaWNrZXJ9IGZyb20gJ3JlYWN0LWRheS1waWNrZXInO1xuaW1wb3J0IHt1c2VQb3BwZXJ9IGZyb20gJ3JlYWN0LXBvcHBlcic7XG4vLyBpbXBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tICdAcG9wcGVyanMvY29yZSdcbi8vIGltcG9ydCB7IGZvcm1hdCwgaXNWYWxpZCwgcGFyc2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJ2ZvY3VzLXRyYXAtcmVhY3QnO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IERlZmF1bHRFZGl0b3JMb2NhdGlvbiwgRGVmYXVsdFByZWZpeCwgSW5zZXJ0RGF0ZUZvcm1hdCwgVXNlQnV0dG9uVG9TaG93RWRpdG9yLCBGb2N1c09uRWRpdG9yIH0gZnJvbSAnLi4vbWVtb3MnO1xuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xuLy8gaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2RhaWx5Tm90ZXNTZXJ2aWNlJztcbi8vIGltcG9ydCB7IFRhZ3NTdWdnZXN0IH0gZnJvbSBcIi4uL29iQ29tcG9uZW50cy9vYlRhZ1N1Z2dlc3RlclwiO1xuaW1wb3J0IHtOb3RpY2UsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge01FTU9TX1ZJRVdfVFlQRX0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcblxuY29uc3QgZ2V0Q3Vyc29yUG9zdGlvbiA9IChpbnB1dDogSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgb2Zmc2V0TGVmdDogaW5wdXRYLFxuICAgIG9mZnNldFRvcDogaW5wdXRZLFxuICAgIG9mZnNldEhlaWdodDogaW5wdXRILFxuICAgIG9mZnNldFdpZHRoOiBpbnB1dFcsXG4gICAgc2VsZWN0aW9uRW5kOiBzZWxlY3Rpb25Qb2ludCxcbiAgfSA9IGlucHV0O1xuICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICBjb25zdCBjb3B5U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBjb3B5U3R5bGUpIHtcbiAgICBkaXYuc3R5bGUuc2V0UHJvcGVydHkoaXRlbSwgY29weVN0eWxlLmdldFByb3BlcnR5VmFsdWUoaXRlbSkpO1xuICB9XG4gIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gIGRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ3ByZS13cmFwJztcblxuICAvLyB3ZSBuZWVkIGEgY2hhcmFjdGVyIHRoYXQgd2lsbCByZXBsYWNlIHdoaXRlc3BhY2Ugd2hlbiBmaWxsaW5nIG91ciBkdW1teSBlbGVtZW50IGlmIGl0J3MgYSBzaW5nbGUgbGluZSA8aW5wdXQvPlxuICBjb25zdCBzd2FwID0gJy4nO1xuICBjb25zdCBpbnB1dFZhbHVlID0gaW5wdXQudGFnTmFtZSA9PT0gJ0lOUFVUJyA/IGlucHV0LnZhbHVlLnJlcGxhY2UoLyAvZywgc3dhcCkgOiBpbnB1dC52YWx1ZTtcbiAgY29uc3QgdGV4dENvbnRlbnQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25Qb2ludCB8fCAwKTtcbiAgZGl2LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG4gIGlmIChpbnB1dC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgZGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgfVxuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIHNwYW4udGV4dENvbnRlbnQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZyhzZWxlY3Rpb25Qb2ludCB8fCAwKSB8fCAnLic7XG4gIGRpdi5hcHBlbmRDaGlsZChzcGFuKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICBjb25zdCB7b2Zmc2V0TGVmdDogc3BhblgsIG9mZnNldFRvcDogc3BhblksIG9mZnNldEhlaWdodDogc3BhbkgsIG9mZnNldFdpZHRoOiBzcGFuV30gPSBzcGFuO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gIHJldHVybiB7XG4gICAgeDogaW5wdXRYICsgc3BhblgsXG4gICAgeTogaW5wdXRZICsgc3BhblksXG4gICAgaDogaW5wdXRIICsgc3BhbkgsXG4gICAgdzogaW5wdXRXICsgc3BhblcsXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxubGV0IGlzTGlzdDogYm9vbGVhbjtcbmxldCBpc0VkaXRvciA9IGZhbHNlIGFzIGJvb2xlYW47XG5sZXQgaXNFZGl0b3JHbyA9IGZhbHNlIGFzIGJvb2xlYW47XG5sZXQgcG9zaXRpb25YOiBudW1iZXI7XG5cbmNvbnN0IE1lbW9FZGl0b3I6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge2dsb2JhbFN0YXRlfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IFtpc0xpc3RTaG93biwgdG9nZ2xlTGlzdF0gPSB1c2VUb2dnbGUoZmFsc2UpO1xuICBjb25zdCBbaXNFZGl0b3JTaG93biwgdG9nZ2xlRWRpdG9yXSA9IHVzZVRvZ2dsZShmYWxzZSk7XG4gIGNvbnN0IGVkaXRvclJlZiA9IHVzZVJlZjxFZGl0b3JSZWZBY3Rpb25zPihudWxsKTtcbiAgY29uc3QgcHJldkdsb2JhbFN0YXRlUmVmID0gdXNlUmVmKGdsb2JhbFN0YXRlKTtcbiAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZTxEYXRlPigpO1xuICBjb25zdCBbaXNQb3BwZXJPcGVuLCBzZXRJc1BvcHBlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG5cbiAgY29uc3QgcG9wcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgW3BvcHBlckVsZW1lbnQsIHNldFBvcHBlckVsZW1lbnRdID0gdXNlU3RhdGUobnVsbCk7XG4gIGxldCBwb3BwZXI7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKERlZmF1bHRQcmVmaXggPT09ICdMaXN0Jykge1xuICAgICAgaXNMaXN0ID0gZmFsc2U7XG4gICAgICB0b2dnbGVMaXN0KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMaXN0ID0gdHJ1ZTtcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKFBsYXRmb3JtLmlzTW9iaWxlID09PSB0cnVlIHx8IHdpbmRvdy5pbm5lcldpZHRoIDwgODc1KSAmJiBVc2VCdXR0b25Ub1Nob3dFZGl0b3IpIHtcbiAgICAgIHRvZ2dsZUVkaXRvcih0cnVlKTtcbiAgICB9XG4gICAgaWYoRm9jdXNPbkVkaXRvcil7XG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBVc2VCdXR0b25Ub1Nob3dFZGl0b3IgPT09IHRydWUgJiZcbiAgICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiZcbiAgICAgIFBsYXRmb3JtLmlzTW9iaWxlID09PSB0cnVlICYmXG4gICAgICB3aW5kb3cuaW5uZXJXaWR0aCA8IDg3NVxuICAgICkge1xuICAgICAgY29uc3QgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcbiAgICAgIGxldCBtZW1vc0hlaWdodDtcbiAgICAgIGxldCBsZWFmVmlldztcbiAgICAgIGlmIChsZWF2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xuICAgICAgICBsZWFmVmlldyA9IGxlYWYudmlldy5jb250YWluZXJFbDtcbiAgICAgICAgbWVtb3NIZWlnaHQgPSBsZWFmVmlldy5vZmZzZXRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWFmVmlldyA9IGRvY3VtZW50O1xuICAgICAgICBtZW1vc0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGl2VGhpcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgY29uc3QgbWVtb0VkaXRvckRpdiA9IGxlYWZWaWV3LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tZWRpdG9yLXdyYXBwZXJcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkaXZUaGlzLnNyYyA9IGAke3Nob3dFZGl0b3JTdmd9YDtcbiAgICAgIGlmIChpc0VkaXRvclNob3duKSB7XG4gICAgICAgIGRpdlRoaXMuY2xhc3NOYW1lID0gJ21lbW8tc2hvdy1lZGl0b3ItYnV0dG9uIGhpZGRlbic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbic7XG4gICAgICB9XG4gICAgICBjb25zdCBidXR0b25Ub3AgPSBtZW1vc0hlaWdodCAtIDIwMDtcbiAgICAgIGNvbnN0IGJ1dHRvbkxlZnQgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSAyNTtcbiAgICAgIGRpdlRoaXMuc3R5bGUudG9wID0gYnV0dG9uVG9wICsgJ3B4JztcbiAgICAgIGRpdlRoaXMuc3R5bGUubGVmdCA9IGJ1dHRvbkxlZnQgKyAncHgnO1xuXG4gICAgICBkaXZUaGlzLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBzY2FsZUVsZW1lbnRBbmkgPSBkaXZUaGlzLmFuaW1hdGUoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgLy8ga2V5ZnJhbWVzXG4gICAgICAgICAgICB7dHJhbnNmb3JtOiAncm90YXRlKDBkZWcpIHNjYWxlKDEpJ30sXG4gICAgICAgICAgICB7dHJhbnNmb3JtOiAncm90YXRlKDYwZGVnKSBzY2FsZSgxLjUpJ30sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIGl0ZXJhdGlvbnM6IEluZmluaXR5LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZGl2VGhpcy5jbGFzc05hbWUgPSAnbWVtby1zaG93LWVkaXRvci1idXR0b24gaGlkZGVuJztcbiAgICAgICAgICBoYW5kbGVTaG93RWRpdG9yKCk7XG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgc2NhbGVFbGVtZW50QW5pLnJldmVyc2UoKTtcbiAgICAgICAgICAvLyByb3RhdGVFbGVtZW50QW5pLnBhdXNlKCk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9O1xuICAgICAgbGVhZlZpZXcucXVlcnlTZWxlY3RvcignLmNvbnRlbnQtd3JhcHBlcicpLnByZXBlbmQoZGl2VGhpcyk7XG5cbiAgICAgIGNvbnN0IG1lbW9saXN0U2Nyb2xsID0gbGVhZlZpZXcucXVlcnlTZWxlY3RvcignLm1lbW9saXN0LXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIG1lbW9saXN0U2Nyb2xsLm9uc2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNFZGl0b3IgJiYgIWlzRWRpdG9yR28pIHtcbiAgICAgICAgICBpc0VkaXRvckdvID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgc2NhbGVFZGl0b3JFbGVtZW50QW5pID0gbWVtb0VkaXRvckRpdi5hbmltYXRlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAvLyBrZXlmcmFtZXNcbiAgICAgICAgICAgICAge3RyYW5zZm9ybTogJ3NjYWxlKDEpJywgb3BhY2l0eTogMX0sXG4gICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdzY2FsZSgwLjQpJywgb3BhY2l0eTogMH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCBzY2FsZU9uZUVsZW1lbnRBbmk6IEFuaW1hdGlvbjtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHNjYWxlT25lRWxlbWVudEFuaSA9IGRpdlRoaXMuYW5pbWF0ZShcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIC8vIGtleWZyYW1lc1xuICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdyb3RhdGUoMjBkZWcpIHNjYWxlKDEuNSknfSxcbiAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiAncm90YXRlKDBkZWcpIHNjYWxlKDEpJ30sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAsXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uczogMSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVNob3dFZGl0b3IodHJ1ZSk7XG4gICAgICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbic7XG4gICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHNjYWxlT25lRWxlbWVudEFuaS5jYW5jZWwoKTtcbiAgICAgICAgICAgIHNjYWxlRWRpdG9yRWxlbWVudEFuaS5yZXZlcnNlKCk7XG4gICAgICAgICAgfSwgNzAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgVXNlQnV0dG9uVG9TaG93RWRpdG9yID09PSBmYWxzZSAmJlxuICAgICAgRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnQm90dG9tJyAmJlxuICAgICAgUGxhdGZvcm0uaXNNb2JpbGUgPT09IHRydWUgJiZcbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIDwgODc1XG4gICAgKSB7XG4gICAgICBoYW5kbGVTaG93RWRpdG9yKGZhbHNlKTtcbiAgICAgIGlmKEZvY3VzT25FZGl0b3Ipe1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoIWlzRWRpdG9yKXtcbiAgICAgICAgaGFuZGxlU2hvd0VkaXRvcihmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZihGb2N1c09uRWRpdG9yKXtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgaWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xuICAgICAgcGxhY2VtZW50OiAncmlnaHQtZW5kJyxcbiAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWydib3R0b20nXSxcbiAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uICE9PSAnQm90dG9tJykge1xuICAgIGNvbnN0IHNlbGV0b3JQb3B1cFdpZHRoID0gMjgwO1xuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHBvc2l0aW9uWCA+IHNlbGV0b3JQb3B1cFdpZHRoICogMS4yKSB7XG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcbiAgICAgICAgcGxhY2VtZW50OiAncmlnaHQtZW5kJyxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsnbGVmdC1lbmQnXSxcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLCAvLyBieSBkZWZhdWx0LCBhbGwgdGhlIHBsYWNlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHBvc2l0aW9uWCA8IHNlbGV0b3JQb3B1cFdpZHRoICYmIHdpbmRvdy5pbm5lcldpZHRoID4gc2VsZXRvclBvcHVwV2lkdGggKiAxLjUpIHtcbiAgICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xuICAgICAgICBwbGFjZW1lbnQ6ICdsZWZ0LWVuZCcsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3JpZ2h0LWVuZCddLFxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XG4gICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ2JvdHRvbSddLFxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnQm90dG9tJykge1xuICAgIGNvbnN0IHNlbGV0b3JQb3B1cFdpZHRoID0gMjgwO1xuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHBvc2l0aW9uWCA+IHNlbGV0b3JQb3B1cFdpZHRoICogMS4yKSB7XG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcbiAgICAgICAgcGxhY2VtZW50OiAndG9wLWVuZCcsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcC1zdGFydCddLFxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0gcG9zaXRpb25YIDwgc2VsZXRvclBvcHVwV2lkdGggJiYgcG9zaXRpb25YID4gc2VsZXRvclBvcHVwV2lkdGgpIHtcbiAgICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xuICAgICAgICBwbGFjZW1lbnQ6ICd0b3Atc3RhcnQnLFxuICAgICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWyd0b3AtZW5kJ10sXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcbiAgICAgICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsndG9wJ10sXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcbiAgICAvLyAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgLy8gICBtb2RpZmllcnM6IFtcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAvLyAgICAgICBvcHRpb25zOiB7XG4gICAgLy8gICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsndG9wJ10sXG4gICAgLy8gICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxuICAgIC8vICAgICAgIH0sXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAvLyAgICAgICBvcHRpb25zOiB7XG4gICAgLy8gICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXG4gICAgLy8gICAgICAgfSxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgIF0sXG4gICAgLy8gfSk7XG4gIH1cblxuICBjb25zdCBjbG9zZVBvcHBlciA9ICgpID0+IHtcbiAgICBzZXRJc1BvcHBlck9wZW4oZmFsc2UpO1xuICAgIC8vIGJ1dHRvblJlZj8uY3VycmVudD8uZm9jdXMoKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5tYXJrTWVtb0lkKSB7XG4gICAgICBjb25zdCBlZGl0b3JDdXJyZW50VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudD8uZ2V0Q29udGVudCgpO1xuICAgICAgY29uc3QgbWVtb0xpbmtUZXh0ID0gYCR7ZWRpdG9yQ3VycmVudFZhbHVlID8gJ1xcbicgOiAnJ30ke3QoJ01BUksnKX06IFtATUVNT10oJHtnbG9iYWxTdGF0ZS5tYXJrTWVtb0lkfSlgO1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFRleHQobWVtb0xpbmtUZXh0KTtcbiAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCAmJiBnbG9iYWxTdGF0ZS5lZGl0TWVtb0lkICE9PSBwcmV2R2xvYmFsU3RhdGVSZWYuY3VycmVudC5lZGl0TWVtb0lkKSB7XG4gICAgICBjb25zdCBlZGl0TWVtbyA9IG1lbW9TZXJ2aWNlLmdldE1lbW9CeUlkKGdsb2JhbFN0YXRlLmVkaXRNZW1vSWQpO1xuICAgICAgaWYgKGVkaXRNZW1vKSB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5zZXRDb250ZW50KGVkaXRNZW1vLmNvbnRlbnQucmVwbGFjZSgvXFw8YnJcXD4vZywgJ1xcbicpID8/ICcnKTtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJldkdsb2JhbFN0YXRlUmVmLmN1cnJlbnQgPSBnbG9iYWxTdGF0ZTtcbiAgfSwgW2dsb2JhbFN0YXRlLm1hcmtNZW1vSWQsIGdsb2JhbFN0YXRlLmVkaXRNZW1vSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBuZXcgVGFnc1N1Z2dlc3QoYXBwLCBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50KTtcblxuICAgIGNvbnN0IGhhbmRsZVBhc3RlRXZlbnQgPSBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuY2xpcGJvYXJkRGF0YSAmJiBldmVudC5jbGlwYm9hcmREYXRhLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXNbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGhhbmRsZVVwbG9hZEZpbGUoZmlsZSk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0VGV4dCh1cmwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZURyb3BFdmVudCA9IGFzeW5jIChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyICYmIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGhhbmRsZVVwbG9hZEZpbGUoZmlsZSk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0VGV4dCh1cmwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrRXZlbnQgPSAoKSA9PiB7XG4gICAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50Py5lbGVtZW50LnZhbHVlID8/ICcnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93bkV2ZW50ID0gKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2UoZWRpdG9yUmVmLmN1cnJlbnQ/LmVsZW1lbnQudmFsdWUgPz8gJycpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBoYW5kbGVQYXN0ZUV2ZW50KTtcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wRXZlbnQpO1xuICAgIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja0V2ZW50KTtcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duRXZlbnQpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgaGFuZGxlUGFzdGVFdmVudCk7XG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcEV2ZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlVXBsb2FkRmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gICAgY29uc3Qge3R5cGV9ID0gZmlsZTtcblxuICAgIGlmICghdHlwZS5zdGFydHNXaXRoKCdpbWFnZScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVzb3VyY2VTZXJ2aWNlLnVwbG9hZChmaWxlKTtcbiAgICAgIGNvbnN0IHVybCA9IGAke2ltYWdlfWA7XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgbmV3IE5vdGljZShlcnJvcik7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlU2F2ZUJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChjb250ZW50ID09PSAnJykge1xuICAgICAgbmV3IE5vdGljZSgn5YaF5a655LiN6IO95Li656m65ZGAJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2VkaXRNZW1vSWR9ID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnJm5ic3A7JywgJyAnKTtcblxuICAgIHNldEVkaXRvckNvbnRlbnRDYWNoZSgnJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlZGl0TWVtb0lkKSB7XG4gICAgICAgIGNvbnN0IHByZXZNZW1vID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQoZWRpdE1lbW9JZCk7XG4gICAgICAgIGlmIChwcmV2TWVtbyAmJiBwcmV2TWVtby5jb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgY29uc3QgZWRpdGVkTWVtbyA9IGF3YWl0IG1lbW9TZXJ2aWNlLnVwZGF0ZU1lbW8ocHJldk1lbW8uaWQsIHByZXZNZW1vLmNvbnRlbnQsIGNvbnRlbnQsIHByZXZNZW1vLm1lbW9UeXBlKTtcbiAgICAgICAgICBlZGl0ZWRNZW1vLnVwZGF0ZWRBdCA9IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKERhdGUubm93KCkpO1xuICAgICAgICAgIG1lbW9TZXJ2aWNlLmVkaXRNZW1vKGVkaXRlZE1lbW8pO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRFZGl0TWVtb0lkKCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld01lbW8gPSBhd2FpdCBtZW1vU2VydmljZS5jcmVhdGVNZW1vKGNvbnRlbnQsIGlzTGlzdCk7XG4gICAgICAgIG1lbW9TZXJ2aWNlLnB1c2hNZW1vKG5ld01lbW8pO1xuICAgICAgICAvLyBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgbmV3IE5vdGljZShlcnJvci5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzZXRFZGl0b3JDb250ZW50Q2FjaGUoJycpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2FuY2VsQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xuICAgIGVkaXRvclJlZi5jdXJyZW50Py5zZXRDb250ZW50KCcnKTtcbiAgICBzZXRFZGl0b3JDb250ZW50Q2FjaGUoJycpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlQ29udGVudENoYW5nZSA9IHVzZUNhbGxiYWNrKChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGVtcERpdi5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIGlmICh0ZW1wRGl2LmlubmVyVGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250ZW50ID0gJyc7XG4gICAgfVxuICAgIHNldEVkaXRvckNvbnRlbnRDYWNoZShjb250ZW50KTtcblxuICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQuZ2V0Q29udGVudCgpO1xuICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgY29uc3QgcHJldlN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCk7XG4gICAgICBjb25zdCBuZXh0U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0KTtcblxuICAgICAgaWYgKChwcmV2U3RyaW5nLmVuZHNXaXRoKCdAJykgfHwgcHJldlN0cmluZy5lbmRzV2l0aCgn8J+ThicpKSAmJiBuZXh0U3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSkge1xuICAgICAgICB1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uKCk7XG4gICAgICAgIHNldElzUG9wcGVyT3Blbih0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoKHByZXZTdHJpbmcuZW5kc1dpdGgoJ0AnKSB8fCBwcmV2U3RyaW5nLmVuZHNXaXRoKCfwn5OGJykpICYmIG5leHRTdHJpbmcgPT09ICcnKSB7XG4gICAgICAgIHVwZGF0ZURhdGVTZWxlY3RvclBvcHVwUG9zaXRpb24oKTtcbiAgICAgICAgc2V0SXNQb3BwZXJPcGVuKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SXNQb3BwZXJPcGVuKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlRGF0ZUluc2VydFRyaWdnZXIgPSAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgY2xvc2VQb3BwZXIoKTtcbiAgICAgIGlzTGlzdCA9IHRydWU7XG4gICAgICB0b2dnbGVMaXN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQuZ2V0Q29udGVudCgpO1xuICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcbiAgICBjb25zdCBuZXh0U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0KTtcbiAgICBjb25zdCB0b2RheU1vbWVudCA9IG1vbWVudChkYXRlKTtcblxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0cmluZy5lbmRzV2l0aCgnQCcpKSB7XG4gICAgICBpZiAoSW5zZXJ0RGF0ZUZvcm1hdCA9PT0gJ0RhdGF2aWV3Jykge1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlID1cbiAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zbGljZSgwLCBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNlbGVjdGlvblN0YXJ0IC0gMSkgK1xuICAgICAgICAgICdbZHVlOjonICtcbiAgICAgICAgICB0b2RheU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKSArXG4gICAgICAgICAgJ10nICtcbiAgICAgICAgICBuZXh0U3RyaW5nO1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTcsIHNlbGVjdGlvblN0YXJ0ICsgMTcpO1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChJbnNlcnREYXRlRm9ybWF0ID09PSAnVGFza3MnKSB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUgPVxuICAgICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY3VycmVudFZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgLSAxKSArXG4gICAgICAgICAgJ/Cfk4YnICtcbiAgICAgICAgICB0b2RheU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKSArXG4gICAgICAgICAgbmV4dFN0cmluZztcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCArIDExLCBzZWxlY3Rpb25TdGFydCArIDExKTtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XG4gICAgICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHByZXZTdHJpbmcgKyB0b2RheU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKSArIG5leHRTdHJpbmc7XG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTAsIHNlbGVjdGlvblN0YXJ0ICsgMTApO1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2UoZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVN0YXR1cyA9ICgpID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTGlzdCkge1xuICAgICAgaXNMaXN0ID0gZmFsc2U7XG4gICAgICB0b2dnbGVMaXN0KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMaXN0ID0gdHJ1ZTtcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNob3dFZGl0b3IgPSAoZmxhZz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzRWRpdG9yIHx8IGZsYWcgPT09IHRydWUpIHtcbiAgICAgIGlzRWRpdG9yID0gZmFsc2U7XG4gICAgICB0b2dnbGVFZGl0b3IodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRWRpdG9yID0gdHJ1ZTtcbiAgICAgIGlzRWRpdG9yR28gPSBmYWxzZTtcbiAgICAgIHRvZ2dsZUVkaXRvcihmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRhZ1RleHRCdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQuZ2V0Q29udGVudCgpO1xuICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcbiAgICBjb25zdCBuZXh0U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0KTtcblxuICAgIGxldCBuZXh0VmFsdWUgPSBwcmV2U3RyaW5nICsgJyMgJyArIG5leHRTdHJpbmc7XG4gICAgbGV0IGN1cnNvckluZGV4ID0gcHJldlN0cmluZy5sZW5ndGggKyAxO1xuXG4gICAgaWYgKHByZXZTdHJpbmcuZW5kc1dpdGgoJyMnKSAmJiBuZXh0U3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSkge1xuICAgICAgbmV4dFZhbHVlID0gcHJldlN0cmluZy5zbGljZSgwLCBwcmV2U3RyaW5nLmxlbmd0aCAtIDEpICsgbmV4dFN0cmluZy5zbGljZSgxKTtcbiAgICAgIGN1cnNvckluZGV4ID0gcHJldlN0cmluZy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JJbmRleCwgY3Vyc29ySW5kZXgpO1xuXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgdXBkYXRlRGF0ZVNlbGVjdG9yUG9wdXBQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50IHx8ICFwb3BwZXJSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGV0b3JQb3B1cFdpZHRoID0gMjgwO1xuICAgIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIC8vIHBvc2l0aW9uWCA9IGVkaXRvcldpZHRoO1xuXG4gICAgY29uc3Qge3gsIHl9ID0gZ2V0Q3Vyc29yUG9zdGlvbihlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50KTtcbiAgICAvLyBjb25zdCBsZWZ0ID0geCArIHNlbGV0b3JQb3B1cFdpZHRoICsgMTYgPiBlZGl0b3JXaWR0aCA/IGVkaXRvcldpZHRoICsgMjAgLSBzZWxldG9yUG9wdXBXaWR0aCA6IHggKyAyO1xuICAgIGxldCBsZWZ0OiBudW1iZXI7XG4gICAgbGV0IHRvcDogbnVtYmVyO1xuICAgIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgIGxlZnQgPSB4ICsgc2VsZXRvclBvcHVwV2lkdGggKyAxNiA+IGVkaXRvcldpZHRoID8geCArIDIgOiB4ICsgMjtcbiAgICAgIHRvcCA9IHkgKyAyMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0geCA+IHNlbGV0b3JQb3B1cFdpZHRoKSB7XG4gICAgICAgIGxlZnQgPSB4ICsgc2VsZXRvclBvcHVwV2lkdGggKyAxNiA+IGVkaXRvcldpZHRoID8geCArIDIgOiB4ICsgMjtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggLSB4IDwgc2VsZXRvclBvcHVwV2lkdGgpIHtcbiAgICAgICAgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyB4ICsgMTggOiB4ICsgMTg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5jbGllbnRXaWR0aCAvIDI7XG4gICAgICB9XG4gICAgICBpZiAoRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnQm90dG9tJyAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IDg3NSkge1xuICAgICAgICB0b3AgPSB5ICsgMjA7XG4gICAgICB9IGVsc2UgaWYgKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiYgd2luZG93LmlubmVyV2lkdGggPD0gODc1KSB7XG4gICAgICAgIHRvcCA9IHkgKyAzNTtcbiAgICAgIH0gZWxzZSBpZiAoRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnVG9wJyAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA4NzUpIHtcbiAgICAgICAgdG9wID0geSArIDIwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBvc2l0aW9uWCA9IHg7XG5cbiAgICBwb3BwZXJSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgcG9wcGVyUmVmLmN1cnJlbnQuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZVVwbG9hZEZpbGVCdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0RWwpO1xuICAgIGlucHV0RWwudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dEVsLm11bHRpcGxlID0gZmFsc2U7XG4gICAgaW5wdXRFbC5hY2NlcHQgPSAnaW1hZ2UvcG5nLCBpbWFnZS9naWYsIGltYWdlL2pwZWcnO1xuICAgIGlucHV0RWwub25jaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWlucHV0RWwuZmlsZXMgfHwgaW5wdXRFbC5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXRFbC5maWxlc1swXTtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGhhbmRsZVVwbG9hZEZpbGUoZmlsZSk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRUZXh0KHVybCk7XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0RWwpO1xuICAgIH07XG4gICAgaW5wdXRFbC5jbGljaygpO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgc2hvd0VkaXRTdGF0dXMgPSBCb29sZWFuKGdsb2JhbFN0YXRlLmVkaXRNZW1vSWQpO1xuXG4gIGNvbnN0IGVkaXRvckNvbmZpZyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGNsYXNzTmFtZTogJ21lbW8tZWRpdG9yJyxcbiAgICAgIGluaXRpYWxDb250ZW50OiBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKSxcbiAgICAgIHBsYWNlaG9sZGVyOiB0KCdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nKSxcbiAgICAgIHNob3dDb25maXJtQnRuOiB0cnVlLFxuICAgICAgc2hvd0NhbmNlbEJ0bjogc2hvd0VkaXRTdGF0dXMsXG4gICAgICBzaG93VG9vbHM6IHRydWUsXG4gICAgICBvbkNvbmZpcm1CdG5DbGljazogaGFuZGxlU2F2ZUJ0bkNsaWNrLFxuICAgICAgb25DYW5jZWxCdG5DbGljazogaGFuZGxlQ2FuY2VsQnRuQ2xpY2ssXG4gICAgICBvbkNvbnRlbnRDaGFuZ2U6IGhhbmRsZUNvbnRlbnRDaGFuZ2UsXG4gICAgfSksXG4gICAgW3Nob3dFZGl0U3RhdHVzXSxcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgbWVtby1lZGl0b3Itd3JhcHBlciAke3Nob3dFZGl0U3RhdHVzID8gJ2VkaXQtaW5nJyA6ICcnfSAke2lzRWRpdG9yU2hvd24gPyAnaGlkZGVuJyA6ICcnfWB9PlxuICAgICAgPHAgY2xhc3NOYW1lPXtgdGlwLXRleHQgJHtzaG93RWRpdFN0YXR1cyA/ICcnIDogJ2hpZGRlbid9YH0+TW9kaWZ5aW5nLi4uPC9wPlxuICAgICAgPEVkaXRvclxuICAgICAgICByZWY9e2VkaXRvclJlZn1cbiAgICAgICAgey4uLmVkaXRvckNvbmZpZ31cbiAgICAgICAgdG9vbHM9e1xuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gYWRkLXRhZ1wiIHNyYz17dGFnfSBvbkNsaWNrPXtoYW5kbGVUYWdUZXh0QnRuQ2xpY2t9IC8+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gZmlsZS11cGxvYWRcIiBzcmM9e2ltYWdlU3ZnfSBvbkNsaWNrPXtoYW5kbGVVcGxvYWRGaWxlQnRuQ2xpY2t9IC8+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gbGlzdC1vci10YXNrXCJcbiAgICAgICAgICAgICAgc3JjPXtgJHshaXNMaXN0U2hvd24gPyBqb3VybmFsU3ZnIDogdGFza1N2Z31gfVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDaGFuZ2VTdGF0dXN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgey8qIDxpbWcgY2xhc3NOYW1lPXtgYWN0aW9uLWJ0biAke2lzTGlzdFNob3duID8gXCJcIiA6IFwiaGlkZGVuXCJ9YH0gc3JjPXt0YXNrU3ZnfSBvbkNsaWNrPXtoYW5kbGVDaGFuZ2VTdGF0dXN9IC8+ICovfVxuICAgICAgICAgIDwvPlxuICAgICAgICB9XG4gICAgICAvPlxuICAgICAgPGRpdiByZWY9e3BvcHBlclJlZn0gY2xhc3NOYW1lPVwiZGF0ZS1waWNrZXJcIj5cbiAgICAgICAge2lzUG9wcGVyT3BlbiAmJiAoXG4gICAgICAgICAgPEZvY3VzVHJhcFxuICAgICAgICAgICAgYWN0aXZlXG4gICAgICAgICAgICBmb2N1c1RyYXBPcHRpb25zPXt7XG4gICAgICAgICAgICAgIGluaXRpYWxGb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgICBjbGlja091dHNpZGVEZWFjdGl2YXRlczogdHJ1ZSxcbiAgICAgICAgICAgICAgb25EZWFjdGl2YXRlOiBjbG9zZVBvcHBlcixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgICAgIHN0eWxlPXtwb3BwZXIuc3R5bGVzLnBvcHBlcn1cbiAgICAgICAgICAgICAgey4uLnBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlcn1cbiAgICAgICAgICAgICAgcmVmPXtzZXRQb3BwZXJFbGVtZW50fVxuICAgICAgICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPERheVBpY2tlclxuICAgICAgICAgICAgICAgIGluaXRpYWxGb2N1cz17aXNQb3BwZXJPcGVufVxuICAgICAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxuICAgICAgICAgICAgICAgIGRlZmF1bHRNb250aD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ9e3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlcn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvRm9jdXNUcmFwPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5mdW5jdGlvbiBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0b3JhZ2UuZ2V0KFsnZWRpdG9yQ29udGVudENhY2hlJ10pLmVkaXRvckNvbnRlbnRDYWNoZSA/PyAnJztcbn1cblxuZnVuY3Rpb24gc2V0RWRpdG9yQ29udGVudENhY2hlKGNvbnRlbnQ6IHN0cmluZykge1xuICBzdG9yYWdlLnNldCh7XG4gICAgZWRpdG9yQ29udGVudENhY2hlOiBjb250ZW50LFxuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVtb0VkaXRvcjtcbiIsImltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5pbXBvcnQge0lNQUdFX1VSTF9SRUcsIExJTktfUkVHLCBNRU1PX0xJTktfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi9jb25zdHMnO1xuXG5leHBvcnQgY29uc3QgcmVsYXRpb25Db25zdHMgPSBbXG4gIHt0ZXh0OiAnQU5EJywgdmFsdWU6ICdBTkQnfSxcbiAge3RleHQ6ICdPUicsIHZhbHVlOiAnT1InfSxcbl07XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJDb25zdHMgPSB7XG4gIFRBRzoge1xuICAgIHZhbHVlOiAnVEFHJyxcbiAgICB0ZXh0OiB0KCdUQUcnKSxcbiAgICBvcGVyYXRvcnM6IFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdCgnSU5DTFVERScpLFxuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdCgnRVhDTFVERScpLFxuICAgICAgICB2YWx1ZTogJ05PVF9DT05UQUlOJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgVFlQRToge1xuICAgIHZhbHVlOiAnVFlQRScsXG4gICAgdGV4dDogdCgnVFlQRScpLFxuICAgIG9wZXJhdG9yczogW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogJ0lTJyxcbiAgICAgICAgdGV4dDogdCgnSVMnKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiAnSVNfTk9UJyxcbiAgICAgICAgdGV4dDogdCgnSVNOT1QnKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB2YWx1ZXM6IFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6ICdDT05ORUNURUQnLFxuICAgICAgICB0ZXh0OiB0KCdMSU5LRUQnKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiAnTk9UX1RBR0dFRCcsXG4gICAgICAgIHRleHQ6IHQoJ05PIFRBR1MnKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiAnTElOS0VEJyxcbiAgICAgICAgdGV4dDogdCgnSEFTIExJTktTJyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogJ0lNQUdFRCcsXG4gICAgICAgIHRleHQ6IHQoJ0hBUyBJTUFHRVMnKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgVEVYVDoge1xuICAgIHZhbHVlOiAnVEVYVCcsXG4gICAgdGV4dDogdCgnVEVYVCcpLFxuICAgIG9wZXJhdG9yczogW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxuICAgICAgICB0ZXh0OiB0KCdJTkNMVURFJyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogJ05PVF9DT05UQUlOJyxcbiAgICAgICAgdGV4dDogdCgnRVhDTFVERScpLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1lbW9TcGVjaWFsVHlwZXMgPSBmaWx0ZXJDb25zdHNbJ1RZUEUnXS52YWx1ZXM7XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2l0aE1lbW9UeXBlID0gKHR5cGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGZvciAoY29uc3QgdCBvZiBtZW1vU3BlY2lhbFR5cGVzKSB7XG4gICAgaWYgKHQudmFsdWUgPT09IHR5cGUpIHtcbiAgICAgIHJldHVybiB0LnRleHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RmlsdGVyID0gKCk6IEJhc2VGaWx0ZXIgPT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUQUcnLFxuICAgIHZhbHVlOiB7XG4gICAgICBvcGVyYXRvcjogJ0NPTlRBSU4nLFxuICAgICAgdmFsdWU6ICcnLFxuICAgIH0sXG4gICAgcmVsYXRpb246ICdBTkQnLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyA9IChtZW1vOiBNb2RlbC5NZW1vLCBmaWx0ZXJzOiBGaWx0ZXJbXSkgPT4ge1xuICBsZXQgc2hvdWxkU2hvdyA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBmIG9mIGZpbHRlcnMpIHtcbiAgICBjb25zdCB7cmVsYXRpb259ID0gZjtcbiAgICBjb25zdCByID0gY2hlY2tTaG91bGRTaG93TWVtbyhtZW1vLCBmKTtcbiAgICBpZiAocmVsYXRpb24gPT09ICdPUicpIHtcbiAgICAgIHNob3VsZFNob3cgPSBzaG91bGRTaG93IHx8IHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFNob3cgPSBzaG91bGRTaG93ICYmIHI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNob3VsZFNob3c7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tTaG91bGRTaG93TWVtbyA9IChtZW1vOiBNb2RlbC5NZW1vLCBmaWx0ZXI6IEZpbHRlcikgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICB2YWx1ZToge29wZXJhdG9yLCB2YWx1ZX0sXG4gIH0gPSBmaWx0ZXI7XG5cbiAgaWYgKHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHNob3VsZFNob3cgPSB0cnVlO1xuXG4gIGlmICh0eXBlID09PSAnVEFHJykge1xuICAgIGxldCBjb250YWluZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgPz8gW10pKSB7XG4gICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoVEFHX1JFRywgJyQxJykudHJpbSgpO1xuICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcbiAgICAgIGxldCB0ZW1wID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcbiAgICAgICAgdGVtcCArPSBpO1xuICAgICAgICB0YWdzU2V0LmFkZCh0ZW1wKTtcbiAgICAgICAgdGVtcCArPSAnLyc7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChOT1BfRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XG4gICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICBsZXQgdGVtcCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XG4gICAgICAgIHRlbXAgKz0gaTtcbiAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XG4gICAgICAgIHRlbXAgKz0gJy8nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhZ3NTZXQuaGFzKHZhbHVlKSkge1xuICAgICAgY29udGFpbmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xuICAgICAgY29udGFpbmVkID0gIWNvbnRhaW5lZDtcbiAgICB9XG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnVFlQRScpIHtcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGlmICh2YWx1ZSA9PT0gJ05PVF9UQUdHRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA9PT0gbnVsbCkge1xuICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ0xJTktFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKExJTktfUkVHKSAhPT0gbnVsbCkge1xuICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ0lNQUdFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnQ09OTkVDVEVEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goTUVNT19MSU5LX1JFRykgIT09IG51bGwpIHtcbiAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3BlcmF0b3IgPT09ICdJU19OT1QnKSB7XG4gICAgICBtYXRjaGVkID0gIW1hdGNoZWQ7XG4gICAgfVxuICAgIHNob3VsZFNob3cgPSBtYXRjaGVkO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdURVhUJykge1xuICAgIGxldCBjb250YWluZWQgPSBtZW1vLmNvbnRlbnQuaW5jbHVkZXModmFsdWUpO1xuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xuICAgICAgY29udGFpbmVkID0gIWNvbnRhaW5lZDtcbiAgICB9XG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcbiAgfVxuXG4gIHJldHVybiBzaG91bGRTaG93O1xufTtcbiIsImltcG9ydCB7dXNlQ29udGV4dH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHtsb2NhdGlvblNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7bWVtb1NwZWNpYWxUeXBlc30gZnJvbSAnLi4vaGVscGVycy9maWx0ZXInO1xuaW1wb3J0ICcuLi9sZXNzL3NlYXJjaC1iYXIubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNlYXJjaCBmcm9tICcuLi9pY29ucy9zZWFyY2guc3ZnJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcbi8vIGltcG9ydCB1c2VUb2dnbGUgZnJvbSBcIi4uL2hvb2tzL3VzZVRvZ2dsZVwiO1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxuZXhwb3J0IGxldCBzZWFyY2hCb3hJbnB1dDogSFRNTElucHV0RWxlbWVudDtcbi8vIGxldCBpc1NlYXJjaEJhciA9IGZhbHNlIGFzIGJvb2xlYW47XG5cbmNvbnN0IFNlYXJjaEJhcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgbG9jYXRpb25TdGF0ZToge1xuICAgICAgcXVlcnk6IHt0eXBlOiBtZW1vVHlwZX0sXG4gICAgfSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIC8vIGNvbnN0IFtpc1NlYXJjaEJhclNob3duLCB0b2dnbGVTZWFyY2hiYXJdID0gdXNlVG9nZ2xlKGZhbHNlKTtcblxuICBjb25zdCBoYW5kbGVNZW1vVHlwZUl0ZW1DbGljayA9ICh0eXBlOiBNZW1vU3BlY1R5cGUgfCAnJykgPT4ge1xuICAgIGNvbnN0IHt0eXBlOiBwcmV2VHlwZX0gPSBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeTtcbiAgICBpZiAodHlwZSA9PT0gcHJldlR5cGUpIHtcbiAgICAgIHR5cGUgPSAnJztcbiAgICB9XG4gICAgbG9jYXRpb25TZXJ2aWNlLnNldE1lbW9UeXBlUXVlcnkodHlwZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVGV4dFF1ZXJ5SW5wdXQgPSAoZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuICAgIGxvY2F0aW9uU2VydmljZS5zZXRUZXh0UXVlcnkodGV4dCk7XG4gIH07XG5cbiAgLy8gY29uc3QgaGFuZGxlU2VhcmNoQmFyU3RhdHVzID0gKCkgPT4ge1xuICAvLyAgIGlmKGlzU2VhcmNoQmFyKXtcbiAgLy8gICAgIGlzU2VhcmNoQmFyID0gZmFsc2U7XG4gIC8vICAgICB0b2dnbGVTZWFyY2hiYXIoZmFsc2UpO1xuICAvLyAgIH1lbHNle1xuICAvLyAgICAgaXNTZWFyY2hCYXIgPSB0cnVlO1xuICAvLyAgICAgdG9nZ2xlU2VhcmNoYmFyKHRydWUpO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHJldHVybiAoXG4gICAgLy8gPGRpdiBjbGFzc05hbWU9e2Ake2lzU2VhcmNoQmFyU2hvd24gPyBcInNlYXJjaC1iYXItY29udGFpbmVyLWxvbmdcIiA6IFwic2VhcmNoLWJhci1jb250YWluZXItc2hvcnRcIn1gfT5cbiAgICAvLyAgIDxkaXYgY2xhc3NOYW1lPXtgJHtpc1NlYXJjaEJhclNob3duID8gXCJzZWFyY2gtYmFyLWlucHV0ZXItbG9uZ1wiIDogXCJzZWFyY2gtYmFyLWlucHV0ZXItc2hvcnRcIn1gfT5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNlYXJjaC1iYXItY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlYXJjaC1iYXItaW5wdXRlclwiPlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzZWFyY2h9IC8+XG4gICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJ0ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlwiIG9uQ2hhbmdlPXtoYW5kbGVUZXh0UXVlcnlJbnB1dH0gLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJxdWlja2x5LWFjdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVpY2tseS1hY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPnt0KCdRdWljayBmaWx0ZXInKX08L3A+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWN0aW9uLWNvbnRhaW5lciB0eXBlcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNlY3Rpb24tdGV4dFwiPnt0KCdUWVBFJyl9Ojwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidmFsdWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICB7bWVtb1NwZWNpYWxUeXBlcy5tYXAoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGtleT17dC52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdHlwZS1pdGVtICR7bWVtb1R5cGUgPT09IHQudmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9YH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZW1vVHlwZUl0ZW1DbGljayh0LnZhbHVlIGFzIE1lbW9TcGVjVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgICAge3QudGV4dH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7aWR4ICsgMSA8IG1lbW9TcGVjaWFsVHlwZXMubGVuZ3RoID8gPHNwYW4gY2xhc3NOYW1lPVwic3BsaXQtdGV4dFwiPi88L3NwYW4+IDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hCYXI7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQgU2VhcmNoQmFyIGZyb20gJy4vU2VhcmNoQmFyJztcbmltcG9ydCB7Z2xvYmFsU3RhdGVTZXJ2aWNlLCBtZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XG5pbXBvcnQgJy4uL2xlc3MvbWVtb3MtaGVhZGVyLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtZW51U3ZnIGZyb20gJy4uL2ljb25zL21lbnUuc3ZnJztcblxubGV0IHByZXZSZXF1ZXN0VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IE1lbW9zSGVhZGVyOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlOiB7XG4gICAgICBxdWVyeToge2ZpbHRlcn0sXG4gICAgfSxcbiAgICBnbG9iYWxTdGF0ZToge2lzTW9iaWxlVmlld30sXG4gICAgcXVlcnlTdGF0ZToge3F1ZXJpZXN9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcblxuICBjb25zdCBbdGl0bGVUZXh0LCBzZXRUaXRsZVRleHRdID0gdXNlU3RhdGUoJ01FTU9TJyk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHF1ZXJ5U2VydmljZS5nZXRRdWVyeUJ5SWQoZmlsdGVyKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHNldFRpdGxlVGV4dChxdWVyeS50aXRsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpdGxlVGV4dCgnTUVNT1MnKTtcbiAgICB9XG4gIH0sIFtmaWx0ZXIsIHF1ZXJpZXNdKTtcblxuICBjb25zdCBoYW5kbGVNZW1vVGV4dENsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKG5vdyAtIHByZXZSZXF1ZXN0VGltZXN0YW1wID4gMTAgKiAxMDAwKSB7XG4gICAgICBwcmV2UmVxdWVzdFRpbWVzdGFtcCA9IG5vdztcbiAgICAgIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIGRvIG50aFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlU2hvd1NpZGViYXJCdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KHRydWUpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24taGVhZGVyLWNvbnRhaW5lciBtZW1vcy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIiBvbkNsaWNrPXtoYW5kbGVNZW1vVGV4dENsaWNrfT5cbiAgICAgICAgPE9ubHkgd2hlbj17aXNNb2JpbGVWaWV3fT5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImFjdGlvbi1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrfT5cbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L09ubHk+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e3RpdGxlVGV4dH08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxTZWFyY2hCYXIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1lbW9zSGVhZGVyO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufSIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0FycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZic7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MnO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkJztcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMnO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZic7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5JztcbmltcG9ydCBfdG9BcnJheSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5JztcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG52YXIgY29uc29sZUxvZ2dlciA9IHtcbiAgdHlwZTogJ2xvZ2dlcicsXG4gIGxvZzogZnVuY3Rpb24gbG9nKGFyZ3MpIHtcbiAgICB0aGlzLm91dHB1dCgnbG9nJywgYXJncyk7XG4gIH0sXG4gIHdhcm46IGZ1bmN0aW9uIHdhcm4oYXJncykge1xuICAgIHRoaXMub3V0cHV0KCd3YXJuJywgYXJncyk7XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcihhcmdzKSB7XG4gICAgdGhpcy5vdXRwdXQoJ2Vycm9yJywgYXJncyk7XG4gIH0sXG4gIG91dHB1dDogZnVuY3Rpb24gb3V0cHV0KHR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlW3R5cGVdKSBjb25zb2xlW3R5cGVdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59O1xuXG52YXIgTG9nZ2VyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMb2dnZXIoY29uY3JldGVMb2dnZXIpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9nZ2VyKTtcblxuICAgIHRoaXMuaW5pdChjb25jcmV0ZUxvZ2dlciwgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTG9nZ2VyLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoY29uY3JldGVMb2dnZXIpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHRoaXMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggfHwgJ2kxOG5leHQ6JztcbiAgICAgIHRoaXMubG9nZ2VyID0gY29uY3JldGVMb2dnZXIgfHwgY29uc29sZUxvZ2dlcjtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RGVidWdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RGVidWcoYm9vbCkge1xuICAgICAgdGhpcy5kZWJ1ZyA9IGJvb2w7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2coKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnbG9nJywgJycsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3YXJuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdhcm4oKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICd3YXJuJywgJycsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlcnJvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcnJvcigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICBhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ2Vycm9yJywgJycpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXByZWNhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVwcmVjYXRlKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnd2FybicsICdXQVJOSU5HIERFUFJFQ0FURUQ6ICcsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3J3YXJkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcndhcmQoYXJncywgbHZsLCBwcmVmaXgsIGRlYnVnT25seSkge1xuICAgICAgaWYgKGRlYnVnT25seSAmJiAhdGhpcy5kZWJ1ZykgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSBhcmdzWzBdID0gXCJcIi5jb25jYXQocHJlZml4KS5jb25jYXQodGhpcy5wcmVmaXgsIFwiIFwiKS5jb25jYXQoYXJnc1swXSk7XG4gICAgICByZXR1cm4gdGhpcy5sb2dnZXJbbHZsXShhcmdzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShtb2R1bGVOYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcih0aGlzLmxvZ2dlciwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB7XG4gICAgICAgIHByZWZpeDogXCJcIi5jb25jYXQodGhpcy5wcmVmaXgsIFwiOlwiKS5jb25jYXQobW9kdWxlTmFtZSwgXCI6XCIpXG4gICAgICB9KSwgdGhpcy5vcHRpb25zKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExvZ2dlcjtcbn0oKTtcblxudmFyIGJhc2VMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRFbWl0dGVyKTtcblxuICAgIHRoaXMub2JzZXJ2ZXJzID0ge307XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRFbWl0dGVyLCBbe1xuICAgIGtleTogXCJvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudHMsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBldmVudHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy5vYnNlcnZlcnNbZXZlbnRdID0gX3RoaXMub2JzZXJ2ZXJzW2V2ZW50XSB8fCBbXTtcblxuICAgICAgICBfdGhpcy5vYnNlcnZlcnNbZXZlbnRdLnB1c2gobGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICghdGhpcy5vYnNlcnZlcnNbZXZlbnRdKSByZXR1cm47XG5cbiAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9ic2VydmVyc1tldmVudF0gPSB0aGlzLm9ic2VydmVyc1tldmVudF0uZmlsdGVyKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgIHJldHVybiBsICE9PSBsaXN0ZW5lcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2VydmVyc1tldmVudF0pIHtcbiAgICAgICAgdmFyIGNsb25lZCA9IFtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1tldmVudF0pO1xuICAgICAgICBjbG9uZWQuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgICBvYnNlcnZlci5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJzWycqJ10pIHtcbiAgICAgICAgdmFyIF9jbG9uZWQgPSBbXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbJyonXSk7XG5cbiAgICAgICAgX2Nsb25lZC5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICAgIG9ic2VydmVyLmFwcGx5KG9ic2VydmVyLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFdmVudEVtaXR0ZXI7XG59KCk7XG5cbmZ1bmN0aW9uIGRlZmVyKCkge1xuICB2YXIgcmVzO1xuICB2YXIgcmVqO1xuICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXMgPSByZXNvbHZlO1xuICAgIHJlaiA9IHJlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlcztcbiAgcHJvbWlzZS5yZWplY3QgPSByZWo7XG4gIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gbWFrZVN0cmluZyhvYmplY3QpIHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gJyc7XG4gIHJldHVybiAnJyArIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGNvcHkoYSwgcywgdCkge1xuICBhLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICBpZiAoc1ttXSkgdFttXSA9IHNbbV07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCwgRW1wdHkpIHtcbiAgZnVuY3Rpb24gY2xlYW5LZXkoa2V5KSB7XG4gICAgcmV0dXJuIGtleSAmJiBrZXkuaW5kZXhPZignIyMjJykgPiAtMSA/IGtleS5yZXBsYWNlKC8jIyMvZywgJy4nKSA6IGtleTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbk5vdFRyYXZlcnNlRGVlcGVyKCkge1xuICAgIHJldHVybiAhb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgdmFyIHN0YWNrID0gdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnID8gW10uY29uY2F0KHBhdGgpIDogcGF0aC5zcGxpdCgnLicpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGNhbk5vdFRyYXZlcnNlRGVlcGVyKCkpIHJldHVybiB7fTtcbiAgICB2YXIga2V5ID0gY2xlYW5LZXkoc3RhY2suc2hpZnQoKSk7XG4gICAgaWYgKCFvYmplY3Rba2V5XSAmJiBFbXB0eSkgb2JqZWN0W2tleV0gPSBuZXcgRW1wdHkoKTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0ID0ge307XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbk5vdFRyYXZlcnNlRGVlcGVyKCkpIHJldHVybiB7fTtcbiAgcmV0dXJuIHtcbiAgICBvYmo6IG9iamVjdCxcbiAgICBrOiBjbGVhbktleShzdGFjay5zaGlmdCgpKVxuICB9O1xufVxuXG5mdW5jdGlvbiBzZXRQYXRoKG9iamVjdCwgcGF0aCwgbmV3VmFsdWUpIHtcbiAgdmFyIF9nZXRMYXN0T2ZQYXRoID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgsIE9iamVjdCksXG4gICAgICBvYmogPSBfZ2V0TGFzdE9mUGF0aC5vYmosXG4gICAgICBrID0gX2dldExhc3RPZlBhdGguaztcblxuICBvYmpba10gPSBuZXdWYWx1ZTtcbn1cbmZ1bmN0aW9uIHB1c2hQYXRoKG9iamVjdCwgcGF0aCwgbmV3VmFsdWUsIGNvbmNhdCkge1xuICB2YXIgX2dldExhc3RPZlBhdGgyID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgsIE9iamVjdCksXG4gICAgICBvYmogPSBfZ2V0TGFzdE9mUGF0aDIub2JqLFxuICAgICAgayA9IF9nZXRMYXN0T2ZQYXRoMi5rO1xuXG4gIG9ialtrXSA9IG9ialtrXSB8fCBbXTtcbiAgaWYgKGNvbmNhdCkgb2JqW2tdID0gb2JqW2tdLmNvbmNhdChuZXdWYWx1ZSk7XG4gIGlmICghY29uY2F0KSBvYmpba10ucHVzaChuZXdWYWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRQYXRoKG9iamVjdCwgcGF0aCkge1xuICB2YXIgX2dldExhc3RPZlBhdGgzID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgpLFxuICAgICAgb2JqID0gX2dldExhc3RPZlBhdGgzLm9iaixcbiAgICAgIGsgPSBfZ2V0TGFzdE9mUGF0aDMuaztcblxuICBpZiAoIW9iaikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9ialtrXTtcbn1cbmZ1bmN0aW9uIGdldFBhdGhXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRQYXRoKGRhdGEsIGtleSk7XG5cbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gZ2V0UGF0aChkZWZhdWx0RGF0YSwga2V5KTtcbn1cbmZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0LCBzb3VyY2UsIG92ZXJ3cml0ZSkge1xuICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuICAgIGlmIChwcm9wICE9PSAnX19wcm90b19fJyAmJiBwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICBpZiAocHJvcCBpbiB0YXJnZXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbcHJvcF0gPT09ICdzdHJpbmcnIHx8IHRhcmdldFtwcm9wXSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2Ygc291cmNlW3Byb3BdID09PSAnc3RyaW5nJyB8fCBzb3VyY2VbcHJvcF0gaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICBpZiAob3ZlcndyaXRlKSB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVlcEV4dGVuZCh0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSwgb3ZlcndyaXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiByZWdleEVzY2FwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcXlxcJFxcfF0vZywgJ1xcXFwkJicpO1xufVxudmFyIF9lbnRpdHlNYXAgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG4gICcvJzogJyYjeDJGOydcbn07XG5mdW5jdGlvbiBlc2NhcGUoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvWyY8PlwiJ1xcL10vZywgZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBfZW50aXR5TWFwW3NdO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG52YXIgaXNJRTEwID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPiAtMTtcbnZhciBjaGFycyA9IFsnICcsICcsJywgJz8nLCAnIScsICc7J107XG5mdW5jdGlvbiBsb29rc0xpa2VPYmplY3RQYXRoKGtleSwgbnNTZXBhcmF0b3IsIGtleVNlcGFyYXRvcikge1xuICBuc1NlcGFyYXRvciA9IG5zU2VwYXJhdG9yIHx8ICcnO1xuICBrZXlTZXBhcmF0b3IgPSBrZXlTZXBhcmF0b3IgfHwgJyc7XG4gIHZhciBwb3NzaWJsZUNoYXJzID0gY2hhcnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG5zU2VwYXJhdG9yLmluZGV4T2YoYykgPCAwICYmIGtleVNlcGFyYXRvci5pbmRleE9mKGMpIDwgMDtcbiAgfSk7XG4gIGlmIChwb3NzaWJsZUNoYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIHZhciByID0gbmV3IFJlZ0V4cChcIihcIi5jb25jYXQocG9zc2libGVDaGFycy5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJz8nID8gJ1xcXFw/JyA6IGM7XG4gIH0pLmpvaW4oJ3wnKSwgXCIpXCIpKTtcbiAgdmFyIG1hdGNoZWQgPSAhci50ZXN0KGtleSk7XG5cbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgdmFyIGtpID0ga2V5LmluZGV4T2Yoa2V5U2VwYXJhdG9yKTtcblxuICAgIGlmIChraSA+IDAgJiYgIXIudGVzdChrZXkuc3Vic3RyaW5nKDAsIGtpKSkpIHtcbiAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzJDEob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDEodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQxKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkMShPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIGRlZXBGaW5kKG9iaiwgcGF0aCkge1xuICB2YXIga2V5U2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnLic7XG4gIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob2JqW3BhdGhdKSByZXR1cm4gb2JqW3BhdGhdO1xuICB2YXIgcGF0aHMgPSBwYXRoLnNwbGl0KGtleVNlcGFyYXRvcik7XG4gIHZhciBjdXJyZW50ID0gb2JqO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGN1cnJlbnRbcGF0aHNbaV1dID09PSAnc3RyaW5nJyAmJiBpICsgMSA8IHBhdGhzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFtwYXRoc1tpXV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGogPSAyO1xuICAgICAgdmFyIHAgPSBwYXRocy5zbGljZShpLCBpICsgaikuam9pbihrZXlTZXBhcmF0b3IpO1xuICAgICAgdmFyIG1peCA9IGN1cnJlbnRbcF07XG5cbiAgICAgIHdoaWxlIChtaXggPT09IHVuZGVmaW5lZCAmJiBwYXRocy5sZW5ndGggPiBpICsgaikge1xuICAgICAgICBqKys7XG4gICAgICAgIHAgPSBwYXRocy5zbGljZShpLCBpICsgaikuam9pbihrZXlTZXBhcmF0b3IpO1xuICAgICAgICBtaXggPSBjdXJyZW50W3BdO1xuICAgICAgfVxuXG4gICAgICBpZiAobWl4ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChwYXRoLmVuZHNXaXRoKHApKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWl4ID09PSAnc3RyaW5nJykgcmV0dXJuIG1peDtcbiAgICAgICAgaWYgKHAgJiYgdHlwZW9mIG1peFtwXSA9PT0gJ3N0cmluZycpIHJldHVybiBtaXhbcF07XG4gICAgICB9XG5cbiAgICAgIHZhciBqb2luZWRQYXRoID0gcGF0aHMuc2xpY2UoaSArIGopLmpvaW4oa2V5U2VwYXJhdG9yKTtcbiAgICAgIGlmIChqb2luZWRQYXRoKSByZXR1cm4gZGVlcEZpbmQobWl4LCBqb2luZWRQYXRoLCBrZXlTZXBhcmF0b3IpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXRoc1tpXV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxudmFyIFJlc291cmNlU3RvcmUgPSBmdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuICBfaW5oZXJpdHMoUmVzb3VyY2VTdG9yZSwgX0V2ZW50RW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihSZXNvdXJjZVN0b3JlKTtcblxuICBmdW5jdGlvbiBSZXNvdXJjZVN0b3JlKGRhdGEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgbnM6IFsndHJhbnNsYXRpb24nXSxcbiAgICAgIGRlZmF1bHROUzogJ3RyYW5zbGF0aW9uJ1xuICAgIH07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVzb3VyY2VTdG9yZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKGlzSUUxMCkge1xuICAgICAgRXZlbnRFbWl0dGVyLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIF90aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIF90aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgaWYgKF90aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID0gJy4nO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX3RoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVzb3VyY2VTdG9yZSwgW3tcbiAgICBrZXk6IFwiYWRkTmFtZXNwYWNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGROYW1lc3BhY2VzKG5zKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5zLmluZGV4T2YobnMpIDwgMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubnMucHVzaChucyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZU5hbWVzcGFjZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlcyhucykge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5vcHRpb25zLm5zLmluZGV4T2YobnMpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVzb3VyY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzb3VyY2UobG5nLCBucywga2V5KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgICB2YXIga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICAgIHZhciBpZ25vcmVKU09OU3RydWN0dXJlID0gb3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgOiB0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZTtcbiAgICAgIHZhciBwYXRoID0gW2xuZywgbnNdO1xuICAgICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcGF0aCA9IHBhdGguY29uY2F0KGtleSk7XG4gICAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aC5jb25jYXQoa2V5U2VwYXJhdG9yID8ga2V5LnNwbGl0KGtleVNlcGFyYXRvcikgOiBrZXkpO1xuXG4gICAgICBpZiAobG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgIHBhdGggPSBsbmcuc3BsaXQoJy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IGdldFBhdGgodGhpcy5kYXRhLCBwYXRoKTtcbiAgICAgIGlmIChyZXN1bHQgfHwgIWlnbm9yZUpTT05TdHJ1Y3R1cmUgfHwgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQ7XG4gICAgICByZXR1cm4gZGVlcEZpbmQodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtsbmddICYmIHRoaXMuZGF0YVtsbmddW25zXSwga2V5LCBrZXlTZXBhcmF0b3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSZXNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSZXNvdXJjZShsbmcsIG5zLCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDoge1xuICAgICAgICBzaWxlbnQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIGtleVNlcGFyYXRvciA9IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgICBpZiAoa2V5U2VwYXJhdG9yID09PSB1bmRlZmluZWQpIGtleVNlcGFyYXRvciA9ICcuJztcbiAgICAgIHZhciBwYXRoID0gW2xuZywgbnNdO1xuICAgICAgaWYgKGtleSkgcGF0aCA9IHBhdGguY29uY2F0KGtleVNlcGFyYXRvciA/IGtleS5zcGxpdChrZXlTZXBhcmF0b3IpIDoga2V5KTtcblxuICAgICAgaWYgKGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICBwYXRoID0gbG5nLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhbHVlID0gbnM7XG4gICAgICAgIG5zID0gcGF0aFsxXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGROYW1lc3BhY2VzKG5zKTtcbiAgICAgIHNldFBhdGgodGhpcy5kYXRhLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLmVtaXQoJ2FkZGVkJywgbG5nLCBucywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFJlc291cmNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSZXNvdXJjZXMobG5nLCBucywgcmVzb3VyY2VzKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge1xuICAgICAgICBzaWxlbnQ6IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBtIGluIHJlc291cmNlcykge1xuICAgICAgICBpZiAodHlwZW9mIHJlc291cmNlc1ttXSA9PT0gJ3N0cmluZycgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShyZXNvdXJjZXNbbV0pID09PSAnW29iamVjdCBBcnJheV0nKSB0aGlzLmFkZFJlc291cmNlKGxuZywgbnMsIG0sIHJlc291cmNlc1ttXSwge1xuICAgICAgICAgIHNpbGVudDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIHJlc291cmNlcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFJlc291cmNlQnVuZGxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJlc291cmNlQnVuZGxlKGxuZywgbnMsIHJlc291cmNlcywgZGVlcCwgb3ZlcndyaXRlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDoge1xuICAgICAgICBzaWxlbnQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIHBhdGggPSBbbG5nLCBuc107XG5cbiAgICAgIGlmIChsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgcGF0aCA9IGxuZy5zcGxpdCgnLicpO1xuICAgICAgICBkZWVwID0gcmVzb3VyY2VzO1xuICAgICAgICByZXNvdXJjZXMgPSBucztcbiAgICAgICAgbnMgPSBwYXRoWzFdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZE5hbWVzcGFjZXMobnMpO1xuICAgICAgdmFyIHBhY2sgPSBnZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCkgfHwge307XG5cbiAgICAgIGlmIChkZWVwKSB7XG4gICAgICAgIGRlZXBFeHRlbmQocGFjaywgcmVzb3VyY2VzLCBvdmVyd3JpdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFjayA9IF9vYmplY3RTcHJlYWQkMShfb2JqZWN0U3ByZWFkJDEoe30sIHBhY2spLCByZXNvdXJjZXMpO1xuICAgICAgfVxuXG4gICAgICBzZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCwgcGFjayk7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLmVtaXQoJ2FkZGVkJywgbG5nLCBucywgcmVzb3VyY2VzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUmVzb3VyY2VCdW5kbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlUmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgICAgaWYgKHRoaXMuaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtsbmddW25zXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW1vdmVOYW1lc3BhY2VzKG5zKTtcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlZCcsIGxuZywgbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNSZXNvdXJjZUJ1bmRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZShsbmcsIG5zKSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXNvdXJjZUJ1bmRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSB7XG4gICAgICBpZiAoIW5zKSBucyA9IHRoaXMub3B0aW9ucy5kZWZhdWx0TlM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgPT09ICd2MScpIHJldHVybiBfb2JqZWN0U3ByZWFkJDEoX29iamVjdFNwcmVhZCQxKHt9LCB7fSksIHRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucykpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldERhdGFCeUxhbmd1YWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERhdGFCeUxhbmd1YWdlKGxuZykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtsbmddO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKGxuZykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldERhdGFCeUxhbmd1YWdlKGxuZyk7XG4gICAgICB2YXIgbiA9IGRhdGEgJiYgT2JqZWN0LmtleXMoZGF0YSkgfHwgW107XG4gICAgICByZXR1cm4gISFuLmZpbmQoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFbdl0gJiYgT2JqZWN0LmtleXMoZGF0YVt2XSkubGVuZ3RoID4gMDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVzb3VyY2VTdG9yZTtcbn0oRXZlbnRFbWl0dGVyKTtcblxudmFyIHBvc3RQcm9jZXNzb3IgPSB7XG4gIHByb2Nlc3NvcnM6IHt9LFxuICBhZGRQb3N0UHJvY2Vzc29yOiBmdW5jdGlvbiBhZGRQb3N0UHJvY2Vzc29yKG1vZHVsZSkge1xuICAgIHRoaXMucHJvY2Vzc29yc1ttb2R1bGUubmFtZV0gPSBtb2R1bGU7XG4gIH0sXG4gIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKHByb2Nlc3NvcnMsIHZhbHVlLCBrZXksIG9wdGlvbnMsIHRyYW5zbGF0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcHJvY2Vzc29ycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9jZXNzb3IpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9jZXNzb3JzW3Byb2Nlc3Nvcl0pIHZhbHVlID0gX3RoaXMucHJvY2Vzc29yc1twcm9jZXNzb3JdLnByb2Nlc3ModmFsdWUsIGtleSwgb3B0aW9ucywgdHJhbnNsYXRvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBvd25LZXlzJDIob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkJDIodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyQyKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMkMihPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyJDEoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QkMSgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG52YXIgY2hlY2tlZExvYWRlZEZvciA9IHt9O1xuXG52YXIgVHJhbnNsYXRvciA9IGZ1bmN0aW9uIChfRXZlbnRFbWl0dGVyKSB7XG4gIF9pbmhlcml0cyhUcmFuc2xhdG9yLCBfRXZlbnRFbWl0dGVyKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJDEoVHJhbnNsYXRvcik7XG5cbiAgZnVuY3Rpb24gVHJhbnNsYXRvcihzZXJ2aWNlcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2xhdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBpZiAoaXNJRTEwKSB7XG4gICAgICBFdmVudEVtaXR0ZXIuY2FsbChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgY29weShbJ3Jlc291cmNlU3RvcmUnLCAnbGFuZ3VhZ2VVdGlscycsICdwbHVyYWxSZXNvbHZlcicsICdpbnRlcnBvbGF0b3InLCAnYmFja2VuZENvbm5lY3RvcicsICdpMThuRm9ybWF0JywgJ3V0aWxzJ10sIHNlcnZpY2VzLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgX3RoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBpZiAoX3RoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX3RoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPSAnLic7XG4gICAgfVxuXG4gICAgX3RoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ3RyYW5zbGF0b3InKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVHJhbnNsYXRvciwgW3tcbiAgICBrZXk6IFwiY2hhbmdlTGFuZ3VhZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbmdlTGFuZ3VhZ2UobG5nKSB7XG4gICAgICBpZiAobG5nKSB0aGlzLmxhbmd1YWdlID0gbG5nO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJleGlzdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKGtleSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge31cbiAgICAgIH07XG5cbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmUoa2V5LCBvcHRpb25zKTtcbiAgICAgIHJldHVybiByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXMgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0cmFjdEZyb21LZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdEZyb21LZXkoa2V5LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbnNTZXBhcmF0b3IgPSBvcHRpb25zLm5zU2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zU2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO1xuICAgICAgaWYgKG5zU2VwYXJhdG9yID09PSB1bmRlZmluZWQpIG5zU2VwYXJhdG9yID0gJzonO1xuICAgICAgdmFyIGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgICB2YXIgbmFtZXNwYWNlcyA9IG9wdGlvbnMubnMgfHwgdGhpcy5vcHRpb25zLmRlZmF1bHROUyB8fCBbXTtcbiAgICAgIHZhciB3b3VsZENoZWNrRm9yTnNJbktleSA9IG5zU2VwYXJhdG9yICYmIGtleS5pbmRleE9mKG5zU2VwYXJhdG9yKSA+IC0xO1xuICAgICAgdmFyIHNlZW1zTmF0dXJhbExhbmd1YWdlID0gIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvciAmJiAhb3B0aW9ucy5rZXlTZXBhcmF0b3IgJiYgIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yICYmICFvcHRpb25zLm5zU2VwYXJhdG9yICYmICFsb29rc0xpa2VPYmplY3RQYXRoKGtleSwgbnNTZXBhcmF0b3IsIGtleVNlcGFyYXRvcik7XG5cbiAgICAgIGlmICh3b3VsZENoZWNrRm9yTnNJbktleSAmJiAhc2VlbXNOYXR1cmFsTGFuZ3VhZ2UpIHtcbiAgICAgICAgdmFyIG0gPSBrZXkubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7XG5cbiAgICAgICAgaWYgKG0gJiYgbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbmFtZXNwYWNlczogbmFtZXNwYWNlc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQobnNTZXBhcmF0b3IpO1xuICAgICAgICBpZiAobnNTZXBhcmF0b3IgIT09IGtleVNlcGFyYXRvciB8fCBuc1NlcGFyYXRvciA9PT0ga2V5U2VwYXJhdG9yICYmIHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHBhcnRzWzBdKSA+IC0xKSBuYW1lc3BhY2VzID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAga2V5ID0gcGFydHMuam9pbihrZXlTZXBhcmF0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnKSBuYW1lc3BhY2VzID0gW25hbWVzcGFjZXNdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIG5hbWVzcGFjZXM6IG5hbWVzcGFjZXNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRyYW5zbGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2xhdGUoa2V5cywgb3B0aW9ucywgbGFzdEtleSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChfdHlwZW9mKG9wdGlvbnMpICE9PSAnb2JqZWN0JyAmJiB0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICAgIGlmIChrZXlzID09PSB1bmRlZmluZWQgfHwga2V5cyA9PT0gbnVsbCkgcmV0dXJuICcnO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtleXMpKSBrZXlzID0gW1N0cmluZyhrZXlzKV07XG4gICAgICB2YXIga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcblxuICAgICAgdmFyIF90aGlzJGV4dHJhY3RGcm9tS2V5ID0gdGhpcy5leHRyYWN0RnJvbUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0sIG9wdGlvbnMpLFxuICAgICAgICAgIGtleSA9IF90aGlzJGV4dHJhY3RGcm9tS2V5LmtleSxcbiAgICAgICAgICBuYW1lc3BhY2VzID0gX3RoaXMkZXh0cmFjdEZyb21LZXkubmFtZXNwYWNlcztcblxuICAgICAgdmFyIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbbmFtZXNwYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBsbmcgPSBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlO1xuICAgICAgdmFyIGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlID0gb3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZSB8fCB0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7XG5cbiAgICAgIGlmIChsbmcgJiYgbG5nLnRvTG93ZXJDYXNlKCkgPT09ICdjaW1vZGUnKSB7XG4gICAgICAgIGlmIChhcHBlbmROYW1lc3BhY2VUb0NJTW9kZSkge1xuICAgICAgICAgIHZhciBuc1NlcGFyYXRvciA9IG9wdGlvbnMubnNTZXBhcmF0b3IgfHwgdGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO1xuICAgICAgICAgIHJldHVybiBuYW1lc3BhY2UgKyBuc1NlcGFyYXRvciArIGtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZShrZXlzLCBvcHRpb25zKTtcbiAgICAgIHZhciByZXMgPSByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXM7XG4gICAgICB2YXIgcmVzVXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLnVzZWRLZXkgfHwga2V5O1xuICAgICAgdmFyIHJlc0V4YWN0VXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLmV4YWN0VXNlZEtleSB8fCBrZXk7XG4gICAgICB2YXIgcmVzVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkocmVzKTtcbiAgICAgIHZhciBub09iamVjdCA9IFsnW29iamVjdCBOdW1iZXJdJywgJ1tvYmplY3QgRnVuY3Rpb25dJywgJ1tvYmplY3QgUmVnRXhwXSddO1xuICAgICAgdmFyIGpvaW5BcnJheXMgPSBvcHRpb25zLmpvaW5BcnJheXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuam9pbkFycmF5cyA6IHRoaXMub3B0aW9ucy5qb2luQXJyYXlzO1xuICAgICAgdmFyIGhhbmRsZUFzT2JqZWN0SW5JMThuRm9ybWF0ID0gIXRoaXMuaTE4bkZvcm1hdCB8fCB0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3Q7XG4gICAgICB2YXIgaGFuZGxlQXNPYmplY3QgPSB0eXBlb2YgcmVzICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcmVzICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIHJlcyAhPT0gJ251bWJlcic7XG5cbiAgICAgIGlmIChoYW5kbGVBc09iamVjdEluSTE4bkZvcm1hdCAmJiByZXMgJiYgaGFuZGxlQXNPYmplY3QgJiYgbm9PYmplY3QuaW5kZXhPZihyZXNUeXBlKSA8IDAgJiYgISh0eXBlb2Ygam9pbkFycmF5cyA9PT0gJ3N0cmluZycgJiYgcmVzVHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnJldHVybk9iamVjdHMgJiYgIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlciA/IHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIocmVzVXNlZEtleSwgcmVzLCBfb2JqZWN0U3ByZWFkJDIoX29iamVjdFNwcmVhZCQyKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgICAgIG5zOiBuYW1lc3BhY2VzXG4gICAgICAgICAgfSkpIDogXCJrZXkgJ1wiLmNvbmNhdChrZXksIFwiIChcIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIFwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlTZXBhcmF0b3IpIHtcbiAgICAgICAgICB2YXIgcmVzVHlwZUlzQXJyYXkgPSByZXNUeXBlID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgICAgIHZhciBjb3B5ID0gcmVzVHlwZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgIHZhciBuZXdLZXlUb1VzZSA9IHJlc1R5cGVJc0FycmF5ID8gcmVzRXhhY3RVc2VkS2V5IDogcmVzVXNlZEtleTtcblxuICAgICAgICAgIGZvciAodmFyIG0gaW4gcmVzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcywgbSkpIHtcbiAgICAgICAgICAgICAgdmFyIGRlZXBLZXkgPSBcIlwiLmNvbmNhdChuZXdLZXlUb1VzZSkuY29uY2F0KGtleVNlcGFyYXRvcikuY29uY2F0KG0pO1xuICAgICAgICAgICAgICBjb3B5W21dID0gdGhpcy50cmFuc2xhdGUoZGVlcEtleSwgX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICAgICAgICBqb2luQXJyYXlzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBuczogbmFtZXNwYWNlc1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGlmIChjb3B5W21dID09PSBkZWVwS2V5KSBjb3B5W21dID0gcmVzW21dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcyA9IGNvcHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlQXNPYmplY3RJbkkxOG5Gb3JtYXQgJiYgdHlwZW9mIGpvaW5BcnJheXMgPT09ICdzdHJpbmcnICYmIHJlc1R5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgcmVzID0gcmVzLmpvaW4oam9pbkFycmF5cyk7XG4gICAgICAgIGlmIChyZXMpIHJlcyA9IHRoaXMuZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXlzLCBvcHRpb25zLCBsYXN0S2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB1c2VkRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB2YXIgdXNlZEtleSA9IGZhbHNlO1xuICAgICAgICB2YXIgbmVlZHNQbHVyYWxIYW5kbGluZyA9IG9wdGlvbnMuY291bnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBoYXNEZWZhdWx0VmFsdWUgPSBUcmFuc2xhdG9yLmhhc0RlZmF1bHRWYWx1ZShvcHRpb25zKTtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZVN1ZmZpeCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgPyB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChsbmcsIG9wdGlvbnMuY291bnQsIG9wdGlvbnMpIDogJyc7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBvcHRpb25zW1wiZGVmYXVsdFZhbHVlXCIuY29uY2F0KGRlZmF1bHRWYWx1ZVN1ZmZpeCldIHx8IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykgJiYgaGFzRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgdXNlZERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgIHJlcyA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykpIHtcbiAgICAgICAgICB1c2VkS2V5ID0gdHJ1ZTtcbiAgICAgICAgICByZXMgPSBrZXk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5ID0gb3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgfHwgdGhpcy5vcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleTtcbiAgICAgICAgdmFyIHJlc0Zvck1pc3NpbmcgPSBtaXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgJiYgdXNlZEtleSA/IHVuZGVmaW5lZCA6IHJlcztcbiAgICAgICAgdmFyIHVwZGF0ZU1pc3NpbmcgPSBoYXNEZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlICE9PSByZXMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU1pc3Npbmc7XG5cbiAgICAgICAgaWYgKHVzZWRLZXkgfHwgdXNlZERlZmF1bHQgfHwgdXBkYXRlTWlzc2luZykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyh1cGRhdGVNaXNzaW5nID8gJ3VwZGF0ZUtleScgOiAnbWlzc2luZ0tleScsIGxuZywgbmFtZXNwYWNlLCBrZXksIHVwZGF0ZU1pc3NpbmcgPyBkZWZhdWx0VmFsdWUgOiByZXMpO1xuXG4gICAgICAgICAgaWYgKGtleVNlcGFyYXRvcikge1xuICAgICAgICAgICAgdmFyIGZrID0gdGhpcy5yZXNvbHZlKGtleSwgX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgICAgIGtleVNlcGFyYXRvcjogZmFsc2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChmayAmJiBmay5yZXMpIHRoaXMubG9nZ2VyLndhcm4oJ1NlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbG5ncyA9IFtdO1xuICAgICAgICAgIHZhciBmYWxsYmFja0xuZ3MgPSB0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvID09PSAnZmFsbGJhY2snICYmIGZhbGxiYWNrTG5ncyAmJiBmYWxsYmFja0xuZ3NbMF0pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmFsbGJhY2tMbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGxuZ3MucHVzaChmYWxsYmFja0xuZ3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8gPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBsbmdzID0gdGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG5ncy5wdXNoKG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzZW5kID0gZnVuY3Rpb24gc2VuZChsLCBrLCBzcGVjaWZpY0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRGb3JNaXNzaW5nID0gaGFzRGVmYXVsdFZhbHVlICYmIHNwZWNpZmljRGVmYXVsdFZhbHVlICE9PSByZXMgPyBzcGVjaWZpY0RlZmF1bHRWYWx1ZSA6IHJlc0Zvck1pc3Npbmc7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcikge1xuICAgICAgICAgICAgICBfdGhpczIub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcihsLCBuYW1lc3BhY2UsIGssIGRlZmF1bHRGb3JNaXNzaW5nLCB1cGRhdGVNaXNzaW5nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMyLmJhY2tlbmRDb25uZWN0b3IgJiYgX3RoaXMyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcobCwgbmFtZXNwYWNlLCBrLCBkZWZhdWx0Rm9yTWlzc2luZywgdXBkYXRlTWlzc2luZywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMi5lbWl0KCdtaXNzaW5nS2V5JywgbCwgbmFtZXNwYWNlLCBrLCByZXMpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyAmJiBuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgIGxuZ3MuZm9yRWFjaChmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMobGFuZ3VhZ2UpLmZvckVhY2goZnVuY3Rpb24gKHN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgc2VuZChbbGFuZ3VhZ2VdLCBrZXkgKyBzdWZmaXgsIG9wdGlvbnNbXCJkZWZhdWx0VmFsdWVcIi5jb25jYXQoc3VmZml4KV0gfHwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZW5kKGxuZ3MsIGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXMgPSB0aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5cywgb3B0aW9ucywgcmVzb2x2ZWQsIGxhc3RLZXkpO1xuICAgICAgICBpZiAodXNlZEtleSAmJiByZXMgPT09IGtleSAmJiB0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5KSByZXMgPSBcIlwiLmNvbmNhdChuYW1lc3BhY2UsIFwiOlwiKS5jb25jYXQoa2V5KTtcbiAgICAgICAgaWYgKCh1c2VkS2V5IHx8IHVzZWREZWZhdWx0KSAmJiB0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcikgcmVzID0gdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIocmVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0ZW5kVHJhbnNsYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXksIG9wdGlvbnMsIHJlc29sdmVkLCBsYXN0S2V5KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuaTE4bkZvcm1hdCAmJiB0aGlzLmkxOG5Gb3JtYXQucGFyc2UpIHtcbiAgICAgICAgcmVzID0gdGhpcy5pMThuRm9ybWF0LnBhcnNlKHJlcywgb3B0aW9ucywgcmVzb2x2ZWQudXNlZExuZywgcmVzb2x2ZWQudXNlZE5TLCByZXNvbHZlZC51c2VkS2V5LCB7XG4gICAgICAgICAgcmVzb2x2ZWQ6IHJlc29sdmVkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5za2lwSW50ZXJwb2xhdGlvbikge1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB0aGlzLmludGVycG9sYXRvci5pbml0KF9vYmplY3RTcHJlYWQkMihfb2JqZWN0U3ByZWFkJDIoe30sIG9wdGlvbnMpLCB7XG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pLCBvcHRpb25zLmludGVycG9sYXRpb24pXG4gICAgICAgIH0pKTtcbiAgICAgICAgdmFyIHNraXBPblZhcmlhYmxlcyA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnICYmIChvcHRpb25zLmludGVycG9sYXRpb24gJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyB8fCB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpO1xuICAgICAgICB2YXIgbmVzdEJlZjtcblxuICAgICAgICBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgdmFyIG5iID0gcmVzLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuICAgICAgICAgIG5lc3RCZWYgPSBuYiAmJiBuYi5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMucmVwbGFjZSAmJiB0eXBlb2Ygb3B0aW9ucy5yZXBsYWNlICE9PSAnc3RyaW5nJyA/IG9wdGlvbnMucmVwbGFjZSA6IG9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzKSBkYXRhID0gX29iamVjdFNwcmVhZCQyKF9vYmplY3RTcHJlYWQkMih7fSwgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyksIGRhdGEpO1xuICAgICAgICByZXMgPSB0aGlzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShyZXMsIGRhdGEsIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgICB2YXIgbmEgPSByZXMubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7XG4gICAgICAgICAgdmFyIG5lc3RBZnQgPSBuYSAmJiBuYS5sZW5ndGg7XG4gICAgICAgICAgaWYgKG5lc3RCZWYgPCBuZXN0QWZ0KSBvcHRpb25zLm5lc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm5lc3QgIT09IGZhbHNlKSByZXMgPSB0aGlzLmludGVycG9sYXRvci5uZXN0KHJlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGFzdEtleSAmJiBsYXN0S2V5WzBdID09PSBhcmdzWzBdICYmICFvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIF90aGlzMy5sb2dnZXIud2FybihcIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6IFwiLmNvbmNhdChhcmdzWzBdLCBcIiBpbiBrZXk6IFwiKS5jb25jYXQoa2V5WzBdKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfdGhpczMudHJhbnNsYXRlLmFwcGx5KF90aGlzMywgYXJncy5jb25jYXQoW2tleV0pKTtcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLmludGVycG9sYXRpb24pIHRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3N0UHJvY2VzcyA9IG9wdGlvbnMucG9zdFByb2Nlc3MgfHwgdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzO1xuICAgICAgdmFyIHBvc3RQcm9jZXNzb3JOYW1lcyA9IHR5cGVvZiBwb3N0UHJvY2VzcyA9PT0gJ3N0cmluZycgPyBbcG9zdFByb2Nlc3NdIDogcG9zdFByb2Nlc3M7XG5cbiAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCAmJiByZXMgIT09IG51bGwgJiYgcG9zdFByb2Nlc3Nvck5hbWVzICYmIHBvc3RQcm9jZXNzb3JOYW1lcy5sZW5ndGggJiYgb3B0aW9ucy5hcHBseVBvc3RQcm9jZXNzb3IgIT09IGZhbHNlKSB7XG4gICAgICAgIHJlcyA9IHBvc3RQcm9jZXNzb3IuaGFuZGxlKHBvc3RQcm9jZXNzb3JOYW1lcywgcmVzLCBrZXksIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQgPyBfb2JqZWN0U3ByZWFkJDIoe1xuICAgICAgICAgIGkxOG5SZXNvbHZlZDogcmVzb2x2ZWRcbiAgICAgICAgfSwgb3B0aW9ucykgOiBvcHRpb25zLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlKGtleXMpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgZm91bmQ7XG4gICAgICB2YXIgdXNlZEtleTtcbiAgICAgIHZhciBleGFjdFVzZWRLZXk7XG4gICAgICB2YXIgdXNlZExuZztcbiAgICAgIHZhciB1c2VkTlM7XG4gICAgICBpZiAodHlwZW9mIGtleXMgPT09ICdzdHJpbmcnKSBrZXlzID0gW2tleXNdO1xuICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIGlmIChfdGhpczQuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcblxuICAgICAgICB2YXIgZXh0cmFjdGVkID0gX3RoaXM0LmV4dHJhY3RGcm9tS2V5KGssIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBrZXkgPSBleHRyYWN0ZWQua2V5O1xuICAgICAgICB1c2VkS2V5ID0ga2V5O1xuICAgICAgICB2YXIgbmFtZXNwYWNlcyA9IGV4dHJhY3RlZC5uYW1lc3BhY2VzO1xuICAgICAgICBpZiAoX3RoaXM0Lm9wdGlvbnMuZmFsbGJhY2tOUykgbmFtZXNwYWNlcyA9IG5hbWVzcGFjZXMuY29uY2F0KF90aGlzNC5vcHRpb25zLmZhbGxiYWNrTlMpO1xuICAgICAgICB2YXIgbmVlZHNQbHVyYWxIYW5kbGluZyA9IG9wdGlvbnMuY291bnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3N0cmluZyc7XG5cbiAgICAgICAgdmFyIG5lZWRzWmVyb1N1ZmZpeExvb2t1cCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgJiYgIW9wdGlvbnMub3JkaW5hbCAmJiBvcHRpb25zLmNvdW50ID09PSAwICYmIF90aGlzNC5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCk7XG5cbiAgICAgICAgdmFyIG5lZWRzQ29udGV4dEhhbmRsaW5nID0gb3B0aW9ucy5jb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdudW1iZXInKSAmJiBvcHRpb25zLmNvbnRleHQgIT09ICcnO1xuICAgICAgICB2YXIgY29kZXMgPSBvcHRpb25zLmxuZ3MgPyBvcHRpb25zLmxuZ3MgOiBfdGhpczQubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkob3B0aW9ucy5sbmcgfHwgX3RoaXM0Lmxhbmd1YWdlLCBvcHRpb25zLmZhbGxiYWNrTG5nKTtcbiAgICAgICAgbmFtZXNwYWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChucykge1xuICAgICAgICAgIGlmIChfdGhpczQuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcbiAgICAgICAgICB1c2VkTlMgPSBucztcblxuICAgICAgICAgIGlmICghY2hlY2tlZExvYWRlZEZvcltcIlwiLmNvbmNhdChjb2Rlc1swXSwgXCItXCIpLmNvbmNhdChucyldICYmIF90aGlzNC51dGlscyAmJiBfdGhpczQudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlICYmICFfdGhpczQudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKHVzZWROUykpIHtcbiAgICAgICAgICAgIGNoZWNrZWRMb2FkZWRGb3JbXCJcIi5jb25jYXQoY29kZXNbMF0sIFwiLVwiKS5jb25jYXQobnMpXSA9IHRydWU7XG5cbiAgICAgICAgICAgIF90aGlzNC5sb2dnZXIud2FybihcImtleSBcXFwiXCIuY29uY2F0KHVzZWRLZXksIFwiXFxcIiBmb3IgbGFuZ3VhZ2VzIFxcXCJcIikuY29uY2F0KGNvZGVzLmpvaW4oJywgJyksIFwiXFxcIiB3b24ndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlIFxcXCJcIikuY29uY2F0KHVzZWROUywgXCJcXFwiIHdhcyBub3QgeWV0IGxvYWRlZFwiKSwgJ1RoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhIScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvZGVzLmZvckVhY2goZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgICAgIGlmIChfdGhpczQuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcbiAgICAgICAgICAgIHVzZWRMbmcgPSBjb2RlO1xuICAgICAgICAgICAgdmFyIGZpbmFsS2V5cyA9IFtrZXldO1xuXG4gICAgICAgICAgICBpZiAoX3RoaXM0LmkxOG5Gb3JtYXQgJiYgX3RoaXM0LmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cykge1xuICAgICAgICAgICAgICBfdGhpczQuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGZpbmFsS2V5cywga2V5LCBjb2RlLCBucywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgcGx1cmFsU3VmZml4O1xuICAgICAgICAgICAgICBpZiAobmVlZHNQbHVyYWxIYW5kbGluZykgcGx1cmFsU3VmZml4ID0gX3RoaXM0LnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChjb2RlLCBvcHRpb25zLmNvdW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgdmFyIHplcm9TdWZmaXggPSAnX3plcm8nO1xuXG4gICAgICAgICAgICAgIGlmIChuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goa2V5ICsgcGx1cmFsU3VmZml4KTtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc1plcm9TdWZmaXhMb29rdXApIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGtleSArIHplcm9TdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChuZWVkc0NvbnRleHRIYW5kbGluZykge1xuICAgICAgICAgICAgICAgIHZhciBjb250ZXh0S2V5ID0gXCJcIi5jb25jYXQoa2V5KS5jb25jYXQoX3RoaXM0Lm9wdGlvbnMuY29udGV4dFNlcGFyYXRvcikuY29uY2F0KG9wdGlvbnMuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNQbHVyYWxIYW5kbGluZykge1xuICAgICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSArIHBsdXJhbFN1ZmZpeCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1plcm9TdWZmaXhMb29rdXApIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSArIHplcm9TdWZmaXgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcG9zc2libGVLZXk7XG5cbiAgICAgICAgICAgIHdoaWxlIChwb3NzaWJsZUtleSA9IGZpbmFsS2V5cy5wb3AoKSkge1xuICAgICAgICAgICAgICBpZiAoIV90aGlzNC5pc1ZhbGlkTG9va3VwKGZvdW5kKSkge1xuICAgICAgICAgICAgICAgIGV4YWN0VXNlZEtleSA9IHBvc3NpYmxlS2V5O1xuICAgICAgICAgICAgICAgIGZvdW5kID0gX3RoaXM0LmdldFJlc291cmNlKGNvZGUsIG5zLCBwb3NzaWJsZUtleSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlczogZm91bmQsXG4gICAgICAgIHVzZWRLZXk6IHVzZWRLZXksXG4gICAgICAgIGV4YWN0VXNlZEtleTogZXhhY3RVc2VkS2V5LFxuICAgICAgICB1c2VkTG5nOiB1c2VkTG5nLFxuICAgICAgICB1c2VkTlM6IHVzZWROU1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZExvb2t1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkTG9va3VwKHJlcykge1xuICAgICAgcmV0dXJuIHJlcyAhPT0gdW5kZWZpbmVkICYmICEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsICYmIHJlcyA9PT0gbnVsbCkgJiYgISghdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nICYmIHJlcyA9PT0gJycpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZXNvdXJjZShjb2RlLCBucywga2V5KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgICBpZiAodGhpcy5pMThuRm9ybWF0ICYmIHRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSkgcmV0dXJuIHRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZShjb2RlLCBucywga2V5LCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UoY29kZSwgbnMsIGtleSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiaGFzRGVmYXVsdFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0RlZmF1bHRWYWx1ZShvcHRpb25zKSB7XG4gICAgICB2YXIgcHJlZml4ID0gJ2RlZmF1bHRWYWx1ZSc7XG5cbiAgICAgIGZvciAodmFyIG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgb3B0aW9uKSAmJiBwcmVmaXggPT09IG9wdGlvbi5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgJiYgdW5kZWZpbmVkICE9PSBvcHRpb25zW29wdGlvbl0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRyYW5zbGF0b3I7XG59KEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59XG5cbnZhciBMYW5ndWFnZVV0aWwgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExhbmd1YWdlVXRpbChvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExhbmd1YWdlVXRpbCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3VwcG9ydGVkTG5ncyA9IHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzIHx8IGZhbHNlO1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2xhbmd1YWdlVXRpbHMnKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMYW5ndWFnZVV0aWwsIFt7XG4gICAga2V5OiBcImdldFNjcmlwdFBhcnRGcm9tQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSkge1xuICAgICAgaWYgKCFjb2RlIHx8IGNvZGUuaW5kZXhPZignLScpIDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgcCA9IGNvZGUuc3BsaXQoJy0nKTtcbiAgICAgIGlmIChwLmxlbmd0aCA9PT0gMikgcmV0dXJuIG51bGw7XG4gICAgICBwLnBvcCgpO1xuICAgICAgaWYgKHBbcC5sZW5ndGggLSAxXS50b0xvd2VyQ2FzZSgpID09PSAneCcpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHAuam9pbignLScpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSkge1xuICAgICAgaWYgKCFjb2RlIHx8IGNvZGUuaW5kZXhPZignLScpIDwgMCkgcmV0dXJuIGNvZGU7XG4gICAgICB2YXIgcCA9IGNvZGUuc3BsaXQoJy0nKTtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShwWzBdKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0TGFuZ3VhZ2VDb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdExhbmd1YWdlQ29kZShjb2RlKSB7XG4gICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIGNvZGUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgICAgdmFyIHNwZWNpYWxDYXNlcyA9IFsnaGFucycsICdoYW50JywgJ2xhdG4nLCAnY3lybCcsICdjYW5zJywgJ21vbmcnLCAnYXJhYiddO1xuICAgICAgICB2YXIgcCA9IGNvZGUuc3BsaXQoJy0nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZykge1xuICAgICAgICAgIHAgPSBwLm1hcChmdW5jdGlvbiAocGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHBbMF0gPSBwWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcFsxXSA9IHBbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgICBpZiAoc3BlY2lhbENhc2VzLmluZGV4T2YocFsxXS50b0xvd2VyQ2FzZSgpKSA+IC0xKSBwWzFdID0gY2FwaXRhbGl6ZShwWzFdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgcFswXSA9IHBbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAocFsxXS5sZW5ndGggPT09IDIpIHBbMV0gPSBwWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKHBbMF0gIT09ICdzZ24nICYmIHBbMl0ubGVuZ3RoID09PSAyKSBwWzJdID0gcFsyXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGlmIChzcGVjaWFsQ2FzZXMuaW5kZXhPZihwWzFdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHBbMV0gPSBjYXBpdGFsaXplKHBbMV0udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgaWYgKHNwZWNpYWxDYXNlcy5pbmRleE9mKHBbMl0udG9Mb3dlckNhc2UoKSkgPiAtMSkgcFsyXSA9IGNhcGl0YWxpemUocFsyXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwLmpvaW4oJy0nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jbGVhbkNvZGUgfHwgdGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZyA/IGNvZGUudG9Mb3dlckNhc2UoKSA6IGNvZGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzU3VwcG9ydGVkQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZENvZGUoY29kZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkID09PSAnbGFuZ3VhZ2VPbmx5JyB8fCB0aGlzLm9wdGlvbnMubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIXRoaXMuc3VwcG9ydGVkTG5ncyB8fCAhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aCB8fCB0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZihjb2RlKSA+IC0xO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRCZXN0TWF0Y2hGcm9tQ29kZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGNvZGVzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIWNvZGVzKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBmb3VuZDtcbiAgICAgIGNvZGVzLmZvckVhY2goZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGNsZWFuZWRMbmcgPSBfdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSk7XG5cbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MgfHwgX3RoaXMuaXNTdXBwb3J0ZWRDb2RlKGNsZWFuZWRMbmcpKSBmb3VuZCA9IGNsZWFuZWRMbmc7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFmb3VuZCAmJiB0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncykge1xuICAgICAgICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm47XG5cbiAgICAgICAgICB2YXIgbG5nT25seSA9IF90aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpO1xuXG4gICAgICAgICAgaWYgKF90aGlzLmlzU3VwcG9ydGVkQ29kZShsbmdPbmx5KSkgcmV0dXJuIGZvdW5kID0gbG5nT25seTtcbiAgICAgICAgICBmb3VuZCA9IF90aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uIChzdXBwb3J0ZWRMbmcpIHtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRMbmcuaW5kZXhPZihsbmdPbmx5KSA9PT0gMCkgcmV0dXJuIHN1cHBvcnRlZExuZztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZm91bmQpIGZvdW5kID0gdGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF07XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZhbGxiYWNrQ29kZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RmFsbGJhY2tDb2RlcyhmYWxsYmFja3MsIGNvZGUpIHtcbiAgICAgIGlmICghZmFsbGJhY2tzKSByZXR1cm4gW107XG4gICAgICBpZiAodHlwZW9mIGZhbGxiYWNrcyA9PT0gJ2Z1bmN0aW9uJykgZmFsbGJhY2tzID0gZmFsbGJhY2tzKGNvZGUpO1xuICAgICAgaWYgKHR5cGVvZiBmYWxsYmFja3MgPT09ICdzdHJpbmcnKSBmYWxsYmFja3MgPSBbZmFsbGJhY2tzXTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KGZhbGxiYWNrcykgPT09ICdbb2JqZWN0IEFycmF5XScpIHJldHVybiBmYWxsYmFja3M7XG4gICAgICBpZiAoIWNvZGUpIHJldHVybiBmYWxsYmFja3NbXCJkZWZhdWx0XCJdIHx8IFtdO1xuICAgICAgdmFyIGZvdW5kID0gZmFsbGJhY2tzW2NvZGVdO1xuICAgICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSldO1xuICAgICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSldO1xuICAgICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKV07XG4gICAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1tcImRlZmF1bHRcIl07XG4gICAgICByZXR1cm4gZm91bmQgfHwgW107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvUmVzb2x2ZUhpZXJhcmNoeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1Jlc29sdmVIaWVyYXJjaHkoY29kZSwgZmFsbGJhY2tDb2RlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGZhbGxiYWNrQ29kZXMgPSB0aGlzLmdldEZhbGxiYWNrQ29kZXMoZmFsbGJhY2tDb2RlIHx8IHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyB8fCBbXSwgY29kZSk7XG4gICAgICB2YXIgY29kZXMgPSBbXTtcblxuICAgICAgdmFyIGFkZENvZGUgPSBmdW5jdGlvbiBhZGRDb2RlKGMpIHtcbiAgICAgICAgaWYgKCFjKSByZXR1cm47XG5cbiAgICAgICAgaWYgKF90aGlzMi5pc1N1cHBvcnRlZENvZGUoYykpIHtcbiAgICAgICAgICBjb2Rlcy5wdXNoKGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMi5sb2dnZXIud2FybihcInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiBcIi5jb25jYXQoYykpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIGNvZGUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkICE9PSAnbGFuZ3VhZ2VPbmx5JykgYWRkQ29kZSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKSk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2xhbmd1YWdlT25seScgJiYgdGhpcy5vcHRpb25zLmxvYWQgIT09ICdjdXJyZW50T25seScpIGFkZENvZGUodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSkpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgIT09ICdjdXJyZW50T25seScpIGFkZENvZGUodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICBhZGRDb2RlKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpKTtcbiAgICAgIH1cblxuICAgICAgZmFsbGJhY2tDb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChmYykge1xuICAgICAgICBpZiAoY29kZXMuaW5kZXhPZihmYykgPCAwKSBhZGRDb2RlKF90aGlzMi5mb3JtYXRMYW5ndWFnZUNvZGUoZmMpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvZGVzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYW5ndWFnZVV0aWw7XG59KCk7XG5cbnZhciBzZXRzID0gW3tcbiAgbG5nczogWydhY2gnLCAnYWsnLCAnYW0nLCAnYXJuJywgJ2JyJywgJ2ZpbCcsICdndW4nLCAnbG4nLCAnbWZlJywgJ21nJywgJ21pJywgJ29jJywgJ3B0JywgJ3B0LUJSJywgJ3RnJywgJ3RsJywgJ3RpJywgJ3RyJywgJ3V6JywgJ3dhJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxXG59LCB7XG4gIGxuZ3M6IFsnYWYnLCAnYW4nLCAnYXN0JywgJ2F6JywgJ2JnJywgJ2JuJywgJ2NhJywgJ2RhJywgJ2RlJywgJ2RldicsICdlbCcsICdlbicsICdlbycsICdlcycsICdldCcsICdldScsICdmaScsICdmbycsICdmdXInLCAnZnknLCAnZ2wnLCAnZ3UnLCAnaGEnLCAnaGknLCAnaHUnLCAnaHknLCAnaWEnLCAnaXQnLCAna2snLCAna24nLCAna3UnLCAnbGInLCAnbWFpJywgJ21sJywgJ21uJywgJ21yJywgJ25haCcsICduYXAnLCAnbmInLCAnbmUnLCAnbmwnLCAnbm4nLCAnbm8nLCAnbnNvJywgJ3BhJywgJ3BhcCcsICdwbXMnLCAncHMnLCAncHQtUFQnLCAncm0nLCAnc2NvJywgJ3NlJywgJ3NpJywgJ3NvJywgJ3NvbicsICdzcScsICdzdicsICdzdycsICd0YScsICd0ZScsICd0aycsICd1cicsICd5byddLFxuICBucjogWzEsIDJdLFxuICBmYzogMlxufSwge1xuICBsbmdzOiBbJ2F5JywgJ2JvJywgJ2NnZycsICdmYScsICdodCcsICdpZCcsICdqYScsICdqYm8nLCAna2EnLCAna20nLCAna28nLCAna3knLCAnbG8nLCAnbXMnLCAnc2FoJywgJ3N1JywgJ3RoJywgJ3R0JywgJ3VnJywgJ3ZpJywgJ3dvJywgJ3poJ10sXG4gIG5yOiBbMV0sXG4gIGZjOiAzXG59LCB7XG4gIGxuZ3M6IFsnYmUnLCAnYnMnLCAnY25yJywgJ2R6JywgJ2hyJywgJ3J1JywgJ3NyJywgJ3VrJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA0XG59LCB7XG4gIGxuZ3M6IFsnYXInXSxcbiAgbnI6IFswLCAxLCAyLCAzLCAxMSwgMTAwXSxcbiAgZmM6IDVcbn0sIHtcbiAgbG5nczogWydjcycsICdzayddLFxuICBucjogWzEsIDIsIDVdLFxuICBmYzogNlxufSwge1xuICBsbmdzOiBbJ2NzYicsICdwbCddLFxuICBucjogWzEsIDIsIDVdLFxuICBmYzogN1xufSwge1xuICBsbmdzOiBbJ2N5J10sXG4gIG5yOiBbMSwgMiwgMywgOF0sXG4gIGZjOiA4XG59LCB7XG4gIGxuZ3M6IFsnZnInXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDlcbn0sIHtcbiAgbG5nczogWydnYSddLFxuICBucjogWzEsIDIsIDMsIDcsIDExXSxcbiAgZmM6IDEwXG59LCB7XG4gIGxuZ3M6IFsnZ2QnXSxcbiAgbnI6IFsxLCAyLCAzLCAyMF0sXG4gIGZjOiAxMVxufSwge1xuICBsbmdzOiBbJ2lzJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxMlxufSwge1xuICBsbmdzOiBbJ2p2J10sXG4gIG5yOiBbMCwgMV0sXG4gIGZjOiAxM1xufSwge1xuICBsbmdzOiBbJ2t3J10sXG4gIG5yOiBbMSwgMiwgMywgNF0sXG4gIGZjOiAxNFxufSwge1xuICBsbmdzOiBbJ2x0J10sXG4gIG5yOiBbMSwgMiwgMTBdLFxuICBmYzogMTVcbn0sIHtcbiAgbG5nczogWydsdiddLFxuICBucjogWzEsIDIsIDBdLFxuICBmYzogMTZcbn0sIHtcbiAgbG5nczogWydtayddLFxuICBucjogWzEsIDJdLFxuICBmYzogMTdcbn0sIHtcbiAgbG5nczogWydtbmsnXSxcbiAgbnI6IFswLCAxLCAyXSxcbiAgZmM6IDE4XG59LCB7XG4gIGxuZ3M6IFsnbXQnXSxcbiAgbnI6IFsxLCAyLCAxMSwgMjBdLFxuICBmYzogMTlcbn0sIHtcbiAgbG5nczogWydvciddLFxuICBucjogWzIsIDFdLFxuICBmYzogMlxufSwge1xuICBsbmdzOiBbJ3JvJ10sXG4gIG5yOiBbMSwgMiwgMjBdLFxuICBmYzogMjBcbn0sIHtcbiAgbG5nczogWydzbCddLFxuICBucjogWzUsIDEsIDIsIDNdLFxuICBmYzogMjFcbn0sIHtcbiAgbG5nczogWydoZScsICdpdyddLFxuICBucjogWzEsIDIsIDIwLCAyMV0sXG4gIGZjOiAyMlxufV07XG52YXIgX3J1bGVzUGx1cmFsc1R5cGVzID0ge1xuICAxOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPiAxKTtcbiAgfSxcbiAgMjogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuICE9IDEpO1xuICB9LFxuICAzOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgNDogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IG4gJSAxMCA+PSAyICYmIG4gJSAxMCA8PSA0ICYmIChuICUgMTAwIDwgMTAgfHwgbiAlIDEwMCA+PSAyMCkgPyAxIDogMik7XG4gIH0sXG4gIDU6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAwID8gMCA6IG4gPT0gMSA/IDEgOiBuID09IDIgPyAyIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTAgPyAzIDogbiAlIDEwMCA+PSAxMSA/IDQgOiA1KTtcbiAgfSxcbiAgNjogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA+PSAyICYmIG4gPD0gNCA/IDEgOiAyKTtcbiAgfSxcbiAgNzogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDQgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKTtcbiAgfSxcbiAgODogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IG4gIT0gOCAmJiBuICE9IDExID8gMiA6IDMpO1xuICB9LFxuICA5OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPj0gMik7XG4gIH0sXG4gIDEwOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogbiA8IDcgPyAyIDogbiA8IDExID8gMyA6IDQpO1xuICB9LFxuICAxMTogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgfHwgbiA9PSAxMSA/IDAgOiBuID09IDIgfHwgbiA9PSAxMiA/IDEgOiBuID4gMiAmJiBuIDwgMjAgPyAyIDogMyk7XG4gIH0sXG4gIDEyOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gJSAxMCAhPSAxIHx8IG4gJSAxMDAgPT0gMTEpO1xuICB9LFxuICAxMzogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuICE9PSAwKTtcbiAgfSxcbiAgMTQ6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiBuID09IDMgPyAyIDogMyk7XG4gIH0sXG4gIDE1OiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogbiAlIDEwID49IDIgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKTtcbiAgfSxcbiAgMTY6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiBuICE9PSAwID8gMSA6IDIpO1xuICB9LFxuICAxNzogZnVuY3Rpb24gXyhuKSB7XG4gICAgcmV0dXJuIE51bWJlcihuID09IDEgfHwgbiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiAxKTtcbiAgfSxcbiAgMTg6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAwID8gMCA6IG4gPT0gMSA/IDEgOiAyKTtcbiAgfSxcbiAgMTk6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMCB8fCBuICUgMTAwID4gMSAmJiBuICUgMTAwIDwgMTEgPyAxIDogbiAlIDEwMCA+IDEwICYmIG4gJSAxMDAgPCAyMCA/IDIgOiAzKTtcbiAgfSxcbiAgMjA6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMCB8fCBuICUgMTAwID4gMCAmJiBuICUgMTAwIDwgMjAgPyAxIDogMik7XG4gIH0sXG4gIDIxOiBmdW5jdGlvbiBfKG4pIHtcbiAgICByZXR1cm4gTnVtYmVyKG4gJSAxMDAgPT0gMSA/IDEgOiBuICUgMTAwID09IDIgPyAyIDogbiAlIDEwMCA9PSAzIHx8IG4gJSAxMDAgPT0gNCA/IDMgOiAwKTtcbiAgfSxcbiAgMjI6IGZ1bmN0aW9uIF8obikge1xuICAgIHJldHVybiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiAobiA8IDAgfHwgbiA+IDEwKSAmJiBuICUgMTAgPT0gMCA/IDIgOiAzKTtcbiAgfVxufTtcbnZhciBkZXByZWNhdGVkSnNvblZlcnNpb25zID0gWyd2MScsICd2MicsICd2MyddO1xudmFyIHN1ZmZpeGVzT3JkZXIgPSB7XG4gIHplcm86IDAsXG4gIG9uZTogMSxcbiAgdHdvOiAyLFxuICBmZXc6IDMsXG4gIG1hbnk6IDQsXG4gIG90aGVyOiA1XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSdWxlcygpIHtcbiAgdmFyIHJ1bGVzID0ge307XG4gIHNldHMuZm9yRWFjaChmdW5jdGlvbiAoc2V0KSB7XG4gICAgc2V0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgcnVsZXNbbF0gPSB7XG4gICAgICAgIG51bWJlcnM6IHNldC5ucixcbiAgICAgICAgcGx1cmFsczogX3J1bGVzUGx1cmFsc1R5cGVzW3NldC5mY11cbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcnVsZXM7XG59XG5cbnZhciBQbHVyYWxSZXNvbHZlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGx1cmFsUmVzb2x2ZXIobGFuZ3VhZ2VVdGlscykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQbHVyYWxSZXNvbHZlcik7XG5cbiAgICB0aGlzLmxhbmd1YWdlVXRpbHMgPSBsYW5ndWFnZVV0aWxzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgncGx1cmFsUmVzb2x2ZXInKTtcblxuICAgIGlmICgoIXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiB8fCB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPT09ICd2NCcpICYmICh0eXBlb2YgSW50bCA9PT0gJ3VuZGVmaW5lZCcgfHwgIUludGwuUGx1cmFsUnVsZXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPSAndjMnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1lvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcyA9IGNyZWF0ZVJ1bGVzKCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGx1cmFsUmVzb2x2ZXIsIFt7XG4gICAga2V5OiBcImFkZFJ1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUnVsZShsbmcsIG9iaikge1xuICAgICAgdGhpcy5ydWxlc1tsbmddID0gb2JqO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJ1bGUoY29kZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbmV3IEludGwuUGx1cmFsUnVsZXMoY29kZSwge1xuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy5vcmRpbmFsID8gJ29yZGluYWwnIDogJ2NhcmRpbmFsJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ1bGVzW2NvZGVdIHx8IHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmVlZHNQbHVyYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVlZHNQbHVyYWwoY29kZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgICByZXR1cm4gcnVsZSAmJiBydWxlLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMubGVuZ3RoID4gMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJ1bGUgJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA+IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBsdXJhbEZvcm1zT2ZLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGx1cmFsRm9ybXNPZktleShjb2RlLCBrZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmdldFN1ZmZpeGVzKGNvZGUsIG9wdGlvbnMpLm1hcChmdW5jdGlvbiAoc3VmZml4KSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXkpLmNvbmNhdChzdWZmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN1ZmZpeGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN1ZmZpeGVzKGNvZGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBydWxlID0gdGhpcy5nZXRSdWxlKGNvZGUsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJ1bGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5zb3J0KGZ1bmN0aW9uIChwbHVyYWxDYXRlZ29yeTEsIHBsdXJhbENhdGVnb3J5Mikge1xuICAgICAgICAgIHJldHVybiBzdWZmaXhlc09yZGVyW3BsdXJhbENhdGVnb3J5MV0gLSBzdWZmaXhlc09yZGVyW3BsdXJhbENhdGVnb3J5Ml07XG4gICAgICAgIH0pLm1hcChmdW5jdGlvbiAocGx1cmFsQ2F0ZWdvcnkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoX3RoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQocGx1cmFsQ2F0ZWdvcnkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJ1bGUubnVtYmVycy5tYXAoZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gX3RoaXMuZ2V0U3VmZml4KGNvZGUsIG51bWJlciwgb3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3VmZml4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN1ZmZpeChjb2RlLCBjb3VudCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChydWxlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHJ1bGUuc2VsZWN0KGNvdW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUocnVsZSwgY291bnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiBcIi5jb25jYXQoY29kZSkpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdWZmaXhSZXRyb0NvbXBhdGlibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHJ1bGUsIGNvdW50KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGlkeCA9IHJ1bGUubm9BYnMgPyBydWxlLnBsdXJhbHMoY291bnQpIDogcnVsZS5wbHVyYWxzKE1hdGguYWJzKGNvdW50KSk7XG4gICAgICB2YXIgc3VmZml4ID0gcnVsZS5udW1iZXJzW2lkeF07XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXggJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA9PT0gMiAmJiBydWxlLm51bWJlcnNbMF0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN1ZmZpeCA9PT0gMikge1xuICAgICAgICAgIHN1ZmZpeCA9ICdwbHVyYWwnO1xuICAgICAgICB9IGVsc2UgaWYgKHN1ZmZpeCA9PT0gMSkge1xuICAgICAgICAgIHN1ZmZpeCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXR1cm5TdWZmaXggPSBmdW5jdGlvbiByZXR1cm5TdWZmaXgoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub3B0aW9ucy5wcmVwZW5kICYmIHN1ZmZpeC50b1N0cmluZygpID8gX3RoaXMyLm9wdGlvbnMucHJlcGVuZCArIHN1ZmZpeC50b1N0cmluZygpIDogc3VmZml4LnRvU3RyaW5nKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OID09PSAndjEnKSB7XG4gICAgICAgIGlmIChzdWZmaXggPT09IDEpIHJldHVybiAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBzdWZmaXggPT09ICdudW1iZXInKSByZXR1cm4gXCJfcGx1cmFsX1wiLmNvbmNhdChzdWZmaXgudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OID09PSAndjInKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4ICYmIHJ1bGUubnVtYmVycy5sZW5ndGggPT09IDIgJiYgcnVsZS5udW1iZXJzWzBdID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wcmVwZW5kICYmIGlkeC50b1N0cmluZygpID8gdGhpcy5vcHRpb25zLnByZXBlbmQgKyBpZHgudG9TdHJpbmcoKSA6IGlkeC50b1N0cmluZygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRVc2VJbnRsQXBpXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZFVzZUludGxBcGkoKSB7XG4gICAgICByZXR1cm4gIWRlcHJlY2F0ZWRKc29uVmVyc2lvbnMuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGx1cmFsUmVzb2x2ZXI7XG59KCk7XG5cbmZ1bmN0aW9uIG93bktleXMkMyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQkMyh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzJDMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyQzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG52YXIgSW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnRlcnBvbGF0b3IoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludGVycG9sYXRvcik7XG5cbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdpbnRlcnBvbGF0b3InKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmludGVycG9sYXRpb24gJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCB8fCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0KG9wdGlvbnMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEludGVycG9sYXRvciwgW3tcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgaWYgKCFvcHRpb25zLmludGVycG9sYXRpb24pIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgZXNjYXBlVmFsdWU6IHRydWVcbiAgICAgIH07XG4gICAgICB2YXIgaU9wdHMgPSBvcHRpb25zLmludGVycG9sYXRpb247XG4gICAgICB0aGlzLmVzY2FwZSA9IGlPcHRzLmVzY2FwZSAhPT0gdW5kZWZpbmVkID8gaU9wdHMuZXNjYXBlIDogZXNjYXBlO1xuICAgICAgdGhpcy5lc2NhcGVWYWx1ZSA9IGlPcHRzLmVzY2FwZVZhbHVlICE9PSB1bmRlZmluZWQgPyBpT3B0cy5lc2NhcGVWYWx1ZSA6IHRydWU7XG4gICAgICB0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUgPSBpT3B0cy51c2VSYXdWYWx1ZVRvRXNjYXBlICE9PSB1bmRlZmluZWQgPyBpT3B0cy51c2VSYXdWYWx1ZVRvRXNjYXBlIDogZmFsc2U7XG4gICAgICB0aGlzLnByZWZpeCA9IGlPcHRzLnByZWZpeCA/IHJlZ2V4RXNjYXBlKGlPcHRzLnByZWZpeCkgOiBpT3B0cy5wcmVmaXhFc2NhcGVkIHx8ICd7eyc7XG4gICAgICB0aGlzLnN1ZmZpeCA9IGlPcHRzLnN1ZmZpeCA/IHJlZ2V4RXNjYXBlKGlPcHRzLnN1ZmZpeCkgOiBpT3B0cy5zdWZmaXhFc2NhcGVkIHx8ICd9fSc7XG4gICAgICB0aGlzLmZvcm1hdFNlcGFyYXRvciA9IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA/IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA6IGlPcHRzLmZvcm1hdFNlcGFyYXRvciB8fCAnLCc7XG4gICAgICB0aGlzLnVuZXNjYXBlUHJlZml4ID0gaU9wdHMudW5lc2NhcGVTdWZmaXggPyAnJyA6IGlPcHRzLnVuZXNjYXBlUHJlZml4IHx8ICctJztcbiAgICAgIHRoaXMudW5lc2NhcGVTdWZmaXggPSB0aGlzLnVuZXNjYXBlUHJlZml4ID8gJycgOiBpT3B0cy51bmVzY2FwZVN1ZmZpeCB8fCAnJztcbiAgICAgIHRoaXMubmVzdGluZ1ByZWZpeCA9IGlPcHRzLm5lc3RpbmdQcmVmaXggPyByZWdleEVzY2FwZShpT3B0cy5uZXN0aW5nUHJlZml4KSA6IGlPcHRzLm5lc3RpbmdQcmVmaXhFc2NhcGVkIHx8IHJlZ2V4RXNjYXBlKCckdCgnKTtcbiAgICAgIHRoaXMubmVzdGluZ1N1ZmZpeCA9IGlPcHRzLm5lc3RpbmdTdWZmaXggPyByZWdleEVzY2FwZShpT3B0cy5uZXN0aW5nU3VmZml4KSA6IGlPcHRzLm5lc3RpbmdTdWZmaXhFc2NhcGVkIHx8IHJlZ2V4RXNjYXBlKCcpJyk7XG4gICAgICB0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yID0gaU9wdHMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3IgPyBpT3B0cy5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvciA6IGlPcHRzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yIHx8ICcsJztcbiAgICAgIHRoaXMubWF4UmVwbGFjZXMgPSBpT3B0cy5tYXhSZXBsYWNlcyA/IGlPcHRzLm1heFJlcGxhY2VzIDogMTAwMDtcbiAgICAgIHRoaXMuYWx3YXlzRm9ybWF0ID0gaU9wdHMuYWx3YXlzRm9ybWF0ICE9PSB1bmRlZmluZWQgPyBpT3B0cy5hbHdheXNGb3JtYXQgOiBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXRSZWdFeHAoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zKSB0aGlzLmluaXQodGhpcy5vcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRSZWdFeHBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRSZWdFeHAoKSB7XG4gICAgICB2YXIgcmVnZXhwU3RyID0gXCJcIi5jb25jYXQodGhpcy5wcmVmaXgsIFwiKC4rPylcIikuY29uY2F0KHRoaXMuc3VmZml4KTtcbiAgICAgIHRoaXMucmVnZXhwID0gbmV3IFJlZ0V4cChyZWdleHBTdHIsICdnJyk7XG4gICAgICB2YXIgcmVnZXhwVW5lc2NhcGVTdHIgPSBcIlwiLmNvbmNhdCh0aGlzLnByZWZpeCkuY29uY2F0KHRoaXMudW5lc2NhcGVQcmVmaXgsIFwiKC4rPylcIikuY29uY2F0KHRoaXMudW5lc2NhcGVTdWZmaXgpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7XG4gICAgICB0aGlzLnJlZ2V4cFVuZXNjYXBlID0gbmV3IFJlZ0V4cChyZWdleHBVbmVzY2FwZVN0ciwgJ2cnKTtcbiAgICAgIHZhciBuZXN0aW5nUmVnZXhwU3RyID0gXCJcIi5jb25jYXQodGhpcy5uZXN0aW5nUHJlZml4LCBcIiguKz8pXCIpLmNvbmNhdCh0aGlzLm5lc3RpbmdTdWZmaXgpO1xuICAgICAgdGhpcy5uZXN0aW5nUmVnZXhwID0gbmV3IFJlZ0V4cChuZXN0aW5nUmVnZXhwU3RyLCAnZycpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlcnBvbGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnBvbGF0ZShzdHIsIGRhdGEsIGxuZywgb3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG1hdGNoO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgdmFyIHJlcGxhY2VzO1xuICAgICAgdmFyIGRlZmF1bHREYXRhID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMgfHwge307XG5cbiAgICAgIGZ1bmN0aW9uIHJlZ2V4U2FmZSh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZUZvcm1hdCA9IGZ1bmN0aW9uIGhhbmRsZUZvcm1hdChrZXkpIHtcbiAgICAgICAgaWYgKGtleS5pbmRleE9mKF90aGlzLmZvcm1hdFNlcGFyYXRvcikgPCAwKSB7XG4gICAgICAgICAgdmFyIHBhdGggPSBnZXRQYXRoV2l0aERlZmF1bHRzKGRhdGEsIGRlZmF1bHREYXRhLCBrZXkpO1xuICAgICAgICAgIHJldHVybiBfdGhpcy5hbHdheXNGb3JtYXQgPyBfdGhpcy5mb3JtYXQocGF0aCwgdW5kZWZpbmVkLCBsbmcsIF9vYmplY3RTcHJlYWQkMyhfb2JqZWN0U3ByZWFkJDMoX29iamVjdFNwcmVhZCQzKHt9LCBvcHRpb25zKSwgZGF0YSksIHt9LCB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9ua2V5OiBrZXlcbiAgICAgICAgICB9KSkgOiBwYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHAgPSBrZXkuc3BsaXQoX3RoaXMuZm9ybWF0U2VwYXJhdG9yKTtcbiAgICAgICAgdmFyIGsgPSBwLnNoaWZ0KCkudHJpbSgpO1xuICAgICAgICB2YXIgZiA9IHAuam9pbihfdGhpcy5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdChnZXRQYXRoV2l0aERlZmF1bHRzKGRhdGEsIGRlZmF1bHREYXRhLCBrKSwgZiwgbG5nLCBfb2JqZWN0U3ByZWFkJDMoX29iamVjdFNwcmVhZCQzKF9vYmplY3RTcHJlYWQkMyh7fSwgb3B0aW9ucyksIGRhdGEpLCB7fSwge1xuICAgICAgICAgIGludGVycG9sYXRpb25rZXk6IGtcbiAgICAgICAgfSkpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5yZXNldFJlZ0V4cCgpO1xuICAgICAgdmFyIG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIgfHwgdGhpcy5vcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjtcbiAgICAgIHZhciBza2lwT25WYXJpYWJsZXMgPSBvcHRpb25zICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzIHx8IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztcbiAgICAgIHZhciB0b2RvcyA9IFt7XG4gICAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4cFVuZXNjYXBlLFxuICAgICAgICBzYWZlVmFsdWU6IGZ1bmN0aW9uIHNhZmVWYWx1ZSh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gcmVnZXhTYWZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgcmVnZXg6IHRoaXMucmVnZXhwLFxuICAgICAgICBzYWZlVmFsdWU6IGZ1bmN0aW9uIHNhZmVWYWx1ZSh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuZXNjYXBlVmFsdWUgPyByZWdleFNhZmUoX3RoaXMuZXNjYXBlKHZhbCkpIDogcmVnZXhTYWZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgICAgdG9kb3MuZm9yRWFjaChmdW5jdGlvbiAodG9kbykge1xuICAgICAgICByZXBsYWNlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKG1hdGNoID0gdG9kby5yZWdleC5leGVjKHN0cikpIHtcbiAgICAgICAgICB2YWx1ZSA9IGhhbmRsZUZvcm1hdChtYXRjaFsxXS50cmltKCkpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyKHN0ciwgbWF0Y2gsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB0ZW1wID09PSAnc3RyaW5nJyA/IHRlbXAgOiAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLndhcm4oXCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSBcIi5jb25jYXQobWF0Y2hbMV0sIFwiIGZvciBpbnRlcnBvbGF0aW5nIFwiKS5jb25jYXQoc3RyKSk7XG5cbiAgICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgIV90aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbWFrZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNhZmVWYWx1ZSA9IHRvZG8uc2FmZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgc2FmZVZhbHVlKTtcblxuICAgICAgICAgIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRvZG8ucmVnZXgubGFzdEluZGV4ICs9IHNhZmVWYWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB0b2RvLnJlZ2V4Lmxhc3RJbmRleCAtPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZG8ucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXBsYWNlcysrO1xuXG4gICAgICAgICAgaWYgKHJlcGxhY2VzID49IF90aGlzLm1heFJlcGxhY2VzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmVzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXN0KHN0ciwgZmMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgICB2YXIgbWF0Y2g7XG4gICAgICB2YXIgdmFsdWU7XG5cbiAgICAgIHZhciBjbG9uZWRPcHRpb25zID0gX29iamVjdFNwcmVhZCQzKHt9LCBvcHRpb25zKTtcblxuICAgICAgY2xvbmVkT3B0aW9ucy5hcHBseVBvc3RQcm9jZXNzb3IgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSBjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlSGFzT3B0aW9ucyhrZXksIGluaGVyaXRlZE9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHNlcCA9IHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7XG4gICAgICAgIGlmIChrZXkuaW5kZXhPZihzZXApIDwgMCkgcmV0dXJuIGtleTtcbiAgICAgICAgdmFyIGMgPSBrZXkuc3BsaXQobmV3IFJlZ0V4cChcIlwiLmNvbmNhdChzZXAsIFwiWyBdKntcIikpKTtcbiAgICAgICAgdmFyIG9wdGlvbnNTdHJpbmcgPSBcIntcIi5jb25jYXQoY1sxXSk7XG4gICAgICAgIGtleSA9IGNbMF07XG4gICAgICAgIG9wdGlvbnNTdHJpbmcgPSB0aGlzLmludGVycG9sYXRlKG9wdGlvbnNTdHJpbmcsIGNsb25lZE9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zU3RyaW5nID0gb3B0aW9uc1N0cmluZy5yZXBsYWNlKC8nL2csICdcIicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xvbmVkT3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9uc1N0cmluZyk7XG4gICAgICAgICAgaWYgKGluaGVyaXRlZE9wdGlvbnMpIGNsb25lZE9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkJDMoX29iamVjdFNwcmVhZCQzKHt9LCBpbmhlcml0ZWRPcHRpb25zKSwgY2xvbmVkT3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5IFwiLmNvbmNhdChrZXkpLCBlKTtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5KS5jb25jYXQoc2VwKS5jb25jYXQob3B0aW9uc1N0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChtYXRjaCA9IHRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKHN0cikpIHtcbiAgICAgICAgdmFyIGZvcm1hdHRlcnMgPSBbXTtcbiAgICAgICAgdmFyIGRvUmVkdWNlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG1hdGNoWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpICE9PSAtMSAmJiAhL3suKn0vLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgdmFyIHIgPSBtYXRjaFsxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS50cmltKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWF0Y2hbMV0gPSByLnNoaWZ0KCk7XG4gICAgICAgICAgZm9ybWF0dGVycyA9IHI7XG4gICAgICAgICAgZG9SZWR1Y2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBmYyhoYW5kbGVIYXNPcHRpb25zLmNhbGwodGhpcywgbWF0Y2hbMV0udHJpbSgpLCBjbG9uZWRPcHRpb25zKSwgY2xvbmVkT3B0aW9ucyk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiBtYXRjaFswXSA9PT0gc3RyICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHZhbHVlID0gbWFrZVN0cmluZyh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJtaXNzZWQgdG8gcmVzb2x2ZSBcIi5jb25jYXQobWF0Y2hbMV0sIFwiIGZvciBuZXN0aW5nIFwiKS5jb25jYXQoc3RyKSk7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb1JlZHVjZSkge1xuICAgICAgICAgIHZhbHVlID0gZm9ybWF0dGVycy5yZWR1Y2UoZnVuY3Rpb24gKHYsIGYpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczIuZm9ybWF0KHYsIGYsIG9wdGlvbnMubG5nLCBfb2JqZWN0U3ByZWFkJDMoX29iamVjdFNwcmVhZCQzKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbmtleTogbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSwgdmFsdWUudHJpbSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKG1hdGNoWzBdLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEludGVycG9sYXRvcjtcbn0oKTtcblxuZnVuY3Rpb24gb3duS2V5cyQ0KG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCQ0KHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMkNChPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzJDQoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIHBhcnNlRm9ybWF0U3RyKGZvcm1hdFN0cikge1xuICB2YXIgZm9ybWF0TmFtZSA9IGZvcm1hdFN0ci50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgdmFyIGZvcm1hdE9wdGlvbnMgPSB7fTtcblxuICBpZiAoZm9ybWF0U3RyLmluZGV4T2YoJygnKSA+IC0xKSB7XG4gICAgdmFyIHAgPSBmb3JtYXRTdHIuc3BsaXQoJygnKTtcbiAgICBmb3JtYXROYW1lID0gcFswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB2YXIgb3B0U3RyID0gcFsxXS5zdWJzdHJpbmcoMCwgcFsxXS5sZW5ndGggLSAxKTtcblxuICAgIGlmIChmb3JtYXROYW1lID09PSAnY3VycmVuY3knICYmIG9wdFN0ci5pbmRleE9mKCc6JykgPCAwKSB7XG4gICAgICBpZiAoIWZvcm1hdE9wdGlvbnMuY3VycmVuY3kpIGZvcm1hdE9wdGlvbnMuY3VycmVuY3kgPSBvcHRTdHIudHJpbSgpO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0TmFtZSA9PT0gJ3JlbGF0aXZldGltZScgJiYgb3B0U3RyLmluZGV4T2YoJzonKSA8IDApIHtcbiAgICAgIGlmICghZm9ybWF0T3B0aW9ucy5yYW5nZSkgZm9ybWF0T3B0aW9ucy5yYW5nZSA9IG9wdFN0ci50cmltKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcHRzID0gb3B0U3RyLnNwbGl0KCc7Jyk7XG4gICAgICBvcHRzLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICBpZiAoIW9wdCkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBfb3B0JHNwbGl0ID0gb3B0LnNwbGl0KCc6JyksXG4gICAgICAgICAgICBfb3B0JHNwbGl0MiA9IF90b0FycmF5KF9vcHQkc3BsaXQpLFxuICAgICAgICAgICAga2V5ID0gX29wdCRzcGxpdDJbMF0sXG4gICAgICAgICAgICByZXN0ID0gX29wdCRzcGxpdDIuc2xpY2UoMSk7XG5cbiAgICAgICAgdmFyIHZhbCA9IHJlc3Quam9pbignOicpO1xuICAgICAgICBpZiAodmFsLnRyaW0oKSA9PT0gJ2ZhbHNlJykgZm9ybWF0T3B0aW9uc1trZXkudHJpbSgpXSA9IGZhbHNlO1xuICAgICAgICBpZiAodmFsLnRyaW0oKSA9PT0gJ3RydWUnKSBmb3JtYXRPcHRpb25zW2tleS50cmltKCldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc05hTih2YWwudHJpbSgpKSkgZm9ybWF0T3B0aW9uc1trZXkudHJpbSgpXSA9IHBhcnNlSW50KHZhbC50cmltKCksIDEwKTtcbiAgICAgICAgaWYgKCFmb3JtYXRPcHRpb25zW2tleS50cmltKCldKSBmb3JtYXRPcHRpb25zW2tleS50cmltKCldID0gdmFsLnRyaW0oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0TmFtZTogZm9ybWF0TmFtZSxcbiAgICBmb3JtYXRPcHRpb25zOiBmb3JtYXRPcHRpb25zXG4gIH07XG59XG5cbnZhciBGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZvcm1hdHRlcigpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVyKTtcblxuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2Zvcm1hdHRlcicpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5mb3JtYXRzID0ge1xuICAgICAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsLCBsbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChsbmcsIG9wdGlvbnMpLmZvcm1hdCh2YWwpO1xuICAgICAgfSxcbiAgICAgIGN1cnJlbmN5OiBmdW5jdGlvbiBjdXJyZW5jeSh2YWwsIGxuZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxuZywgX29iamVjdFNwcmVhZCQ0KF9vYmplY3RTcHJlYWQkNCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeSdcbiAgICAgICAgfSkpLmZvcm1hdCh2YWwpO1xuICAgICAgfSxcbiAgICAgIGRhdGV0aW1lOiBmdW5jdGlvbiBkYXRldGltZSh2YWwsIGxuZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG5nLCBfb2JqZWN0U3ByZWFkJDQoe30sIG9wdGlvbnMpKS5mb3JtYXQodmFsKTtcbiAgICAgIH0sXG4gICAgICByZWxhdGl2ZXRpbWU6IGZ1bmN0aW9uIHJlbGF0aXZldGltZSh2YWwsIGxuZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KGxuZywgX29iamVjdFNwcmVhZCQ0KHt9LCBvcHRpb25zKSkuZm9ybWF0KHZhbCwgb3B0aW9ucy5yYW5nZSB8fCAnZGF5Jyk7XG4gICAgICB9LFxuICAgICAgbGlzdDogZnVuY3Rpb24gbGlzdCh2YWwsIGxuZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuTGlzdEZvcm1hdChsbmcsIF9vYmplY3RTcHJlYWQkNCh7fSwgb3B0aW9ucykpLmZvcm1hdCh2YWwpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5pbml0KG9wdGlvbnMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvcm1hdHRlciwgW3tcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KHNlcnZpY2VzKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgICBpbnRlcnBvbGF0aW9uOiB7fVxuICAgICAgfTtcbiAgICAgIHZhciBpT3B0cyA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbjtcbiAgICAgIHRoaXMuZm9ybWF0U2VwYXJhdG9yID0gaU9wdHMuZm9ybWF0U2VwYXJhdG9yID8gaU9wdHMuZm9ybWF0U2VwYXJhdG9yIDogaU9wdHMuZm9ybWF0U2VwYXJhdG9yIHx8ICcsJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChuYW1lLCBmYykge1xuICAgICAgdGhpcy5mb3JtYXRzW25hbWVdID0gZmM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXQodmFsdWUsIF9mb3JtYXQsIGxuZywgb3B0aW9ucykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGZvcm1hdHMgPSBfZm9ybWF0LnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IGZvcm1hdHMucmVkdWNlKGZ1bmN0aW9uIChtZW0sIGYpIHtcbiAgICAgICAgdmFyIF9wYXJzZUZvcm1hdFN0ciA9IHBhcnNlRm9ybWF0U3RyKGYpLFxuICAgICAgICAgICAgZm9ybWF0TmFtZSA9IF9wYXJzZUZvcm1hdFN0ci5mb3JtYXROYW1lLFxuICAgICAgICAgICAgZm9ybWF0T3B0aW9ucyA9IF9wYXJzZUZvcm1hdFN0ci5mb3JtYXRPcHRpb25zO1xuXG4gICAgICAgIGlmIChfdGhpcy5mb3JtYXRzW2Zvcm1hdE5hbWVdKSB7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IG1lbTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdmFsT3B0aW9ucyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXMgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXNbb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5XSB8fCB7fTtcbiAgICAgICAgICAgIHZhciBsID0gdmFsT3B0aW9ucy5sb2NhbGUgfHwgdmFsT3B0aW9ucy5sbmcgfHwgb3B0aW9ucy5sb2NhbGUgfHwgb3B0aW9ucy5sbmcgfHwgbG5nO1xuICAgICAgICAgICAgZm9ybWF0dGVkID0gX3RoaXMuZm9ybWF0c1tmb3JtYXROYW1lXShtZW0sIGwsIF9vYmplY3RTcHJlYWQkNChfb2JqZWN0U3ByZWFkJDQoX29iamVjdFNwcmVhZCQ0KHt9LCBmb3JtYXRPcHRpb25zKSwgb3B0aW9ucyksIHZhbE9wdGlvbnMpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgX3RoaXMubG9nZ2VyLndhcm4oZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMubG9nZ2VyLndhcm4oXCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciBcIi5jb25jYXQoZm9ybWF0TmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lbTtcbiAgICAgIH0sIHZhbHVlKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZvcm1hdHRlcjtcbn0oKTtcblxuZnVuY3Rpb24gb3duS2V5cyQ1KG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCQ1KHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMkNShPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzJDUoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDIoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDIoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiByZW1vdmUoYXJyLCB3aGF0KSB7XG4gIHZhciBmb3VuZCA9IGFyci5pbmRleE9mKHdoYXQpO1xuXG4gIHdoaWxlIChmb3VuZCAhPT0gLTEpIHtcbiAgICBhcnIuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICBmb3VuZCA9IGFyci5pbmRleE9mKHdoYXQpO1xuICB9XG59XG5cbnZhciBDb25uZWN0b3IgPSBmdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuICBfaW5oZXJpdHMoQ29ubmVjdG9yLCBfRXZlbnRFbWl0dGVyKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyJDIoQ29ubmVjdG9yKTtcblxuICBmdW5jdGlvbiBDb25uZWN0b3IoYmFja2VuZCwgc3RvcmUsIHNlcnZpY2VzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbm5lY3Rvcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKGlzSUUxMCkge1xuICAgICAgRXZlbnRFbWl0dGVyLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIF90aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIF90aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgX3RoaXMuc2VydmljZXMgPSBzZXJ2aWNlcztcbiAgICBfdGhpcy5sYW5ndWFnZVV0aWxzID0gc2VydmljZXMubGFuZ3VhZ2VVdGlscztcbiAgICBfdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBfdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnYmFja2VuZENvbm5lY3RvcicpO1xuICAgIF90aGlzLnN0YXRlID0ge307XG4gICAgX3RoaXMucXVldWUgPSBbXTtcblxuICAgIGlmIChfdGhpcy5iYWNrZW5kICYmIF90aGlzLmJhY2tlbmQuaW5pdCkge1xuICAgICAgX3RoaXMuYmFja2VuZC5pbml0KHNlcnZpY2VzLCBvcHRpb25zLmJhY2tlbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb25uZWN0b3IsIFt7XG4gICAga2V5OiBcInF1ZXVlTG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBxdWV1ZUxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciB0b0xvYWQgPSBbXTtcbiAgICAgIHZhciBwZW5kaW5nID0gW107XG4gICAgICB2YXIgdG9Mb2FkTGFuZ3VhZ2VzID0gW107XG4gICAgICB2YXIgdG9Mb2FkTmFtZXNwYWNlcyA9IFtdO1xuICAgICAgbGFuZ3VhZ2VzLmZvckVhY2goZnVuY3Rpb24gKGxuZykge1xuICAgICAgICB2YXIgaGFzQWxsTmFtZXNwYWNlcyA9IHRydWU7XG4gICAgICAgIG5hbWVzcGFjZXMuZm9yRWFjaChmdW5jdGlvbiAobnMpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IFwiXCIuY29uY2F0KGxuZywgXCJ8XCIpLmNvbmNhdChucyk7XG5cbiAgICAgICAgICBpZiAoIW9wdGlvbnMucmVsb2FkICYmIF90aGlzMi5zdG9yZS5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkge1xuICAgICAgICAgICAgX3RoaXMyLnN0YXRlW25hbWVdID0gMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKF90aGlzMi5zdGF0ZVtuYW1lXSA8IDApIDsgZWxzZSBpZiAoX3RoaXMyLnN0YXRlW25hbWVdID09PSAxKSB7XG4gICAgICAgICAgICBpZiAocGVuZGluZy5pbmRleE9mKG5hbWUpIDwgMCkgcGVuZGluZy5wdXNoKG5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuc3RhdGVbbmFtZV0gPSAxO1xuICAgICAgICAgICAgaGFzQWxsTmFtZXNwYWNlcyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcuaW5kZXhPZihuYW1lKSA8IDApIHBlbmRpbmcucHVzaChuYW1lKTtcbiAgICAgICAgICAgIGlmICh0b0xvYWQuaW5kZXhPZihuYW1lKSA8IDApIHRvTG9hZC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHRvTG9hZE5hbWVzcGFjZXMuaW5kZXhPZihucykgPCAwKSB0b0xvYWROYW1lc3BhY2VzLnB1c2gobnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzQWxsTmFtZXNwYWNlcykgdG9Mb2FkTGFuZ3VhZ2VzLnB1c2gobG5nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodG9Mb2FkLmxlbmd0aCB8fCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2goe1xuICAgICAgICAgIHBlbmRpbmc6IHBlbmRpbmcsXG4gICAgICAgICAgbG9hZGVkOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9Mb2FkOiB0b0xvYWQsXG4gICAgICAgIHBlbmRpbmc6IHBlbmRpbmcsXG4gICAgICAgIHRvTG9hZExhbmd1YWdlczogdG9Mb2FkTGFuZ3VhZ2VzLFxuICAgICAgICB0b0xvYWROYW1lc3BhY2VzOiB0b0xvYWROYW1lc3BhY2VzXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZGVkKG5hbWUsIGVyciwgZGF0YSkge1xuICAgICAgdmFyIHMgPSBuYW1lLnNwbGl0KCd8Jyk7XG4gICAgICB2YXIgbG5nID0gc1swXTtcbiAgICAgIHZhciBucyA9IHNbMV07XG4gICAgICBpZiAoZXJyKSB0aGlzLmVtaXQoJ2ZhaWxlZExvYWRpbmcnLCBsbmcsIG5zLCBlcnIpO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICB0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKGxuZywgbnMsIGRhdGEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlW25hbWVdID0gZXJyID8gLTEgOiAyO1xuICAgICAgdmFyIGxvYWRlZCA9IHt9O1xuICAgICAgdGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7XG4gICAgICAgIHB1c2hQYXRoKHEubG9hZGVkLCBbbG5nXSwgbnMpO1xuICAgICAgICByZW1vdmUocS5wZW5kaW5nLCBuYW1lKTtcbiAgICAgICAgaWYgKGVycikgcS5lcnJvcnMucHVzaChlcnIpO1xuXG4gICAgICAgIGlmIChxLnBlbmRpbmcubGVuZ3RoID09PSAwICYmICFxLmRvbmUpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhxLmxvYWRlZCkuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRbbF0pIGxvYWRlZFtsXSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAocS5sb2FkZWRbbF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHEubG9hZGVkW2xdLmZvckVhY2goZnVuY3Rpb24gKG5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlZFtsXS5pbmRleE9mKG5zKSA8IDApIGxvYWRlZFtsXS5wdXNoKG5zKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcS5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChxLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHEuY2FsbGJhY2socS5lcnJvcnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxLmNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdCgnbG9hZGVkJywgbG9hZGVkKTtcbiAgICAgIHRoaXMucXVldWUgPSB0aGlzLnF1ZXVlLmZpbHRlcihmdW5jdGlvbiAocSkge1xuICAgICAgICByZXR1cm4gIXEuZG9uZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWFkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQobG5nLCBucywgZmNOYW1lKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHRyaWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAwO1xuICAgICAgdmFyIHdhaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IDM1MDtcbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFsbmcubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2sobnVsbCwge30pO1xuICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZFtmY05hbWVdKGxuZywgbnMsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVyciAmJiBkYXRhICYmIHRyaWVkIDwgNSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMzLnJlYWQuY2FsbChfdGhpczMsIGxuZywgbnMsIGZjTmFtZSwgdHJpZWQgKyAxLCB3YWl0ICogMiwgY2FsbGJhY2spO1xuICAgICAgICAgIH0sIHdhaXQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZUxvYWRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghdGhpcy5iYWNrZW5kKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ05vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuJyk7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxhbmd1YWdlcyA9PT0gJ3N0cmluZycpIGxhbmd1YWdlcyA9IHRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobGFuZ3VhZ2VzKTtcbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycpIG5hbWVzcGFjZXMgPSBbbmFtZXNwYWNlc107XG4gICAgICB2YXIgdG9Mb2FkID0gdGhpcy5xdWV1ZUxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBvcHRpb25zLCBjYWxsYmFjayk7XG5cbiAgICAgIGlmICghdG9Mb2FkLnRvTG9hZC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0b0xvYWQucGVuZGluZy5sZW5ndGgpIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB0b0xvYWQudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgX3RoaXM0LmxvYWRPbmUobmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMucHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCB7fSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVsb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMucHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCB7XG4gICAgICAgIHJlbG9hZDogdHJ1ZVxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkT25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRPbmUobmFtZSkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgIHZhciBwcmVmaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgICAgdmFyIHMgPSBuYW1lLnNwbGl0KCd8Jyk7XG4gICAgICB2YXIgbG5nID0gc1swXTtcbiAgICAgIHZhciBucyA9IHNbMV07XG4gICAgICB0aGlzLnJlYWQobG5nLCBucywgJ3JlYWQnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBpZiAoZXJyKSBfdGhpczUubG9nZ2VyLndhcm4oXCJcIi5jb25jYXQocHJlZml4LCBcImxvYWRpbmcgbmFtZXNwYWNlIFwiKS5jb25jYXQobnMsIFwiIGZvciBsYW5ndWFnZSBcIikuY29uY2F0KGxuZywgXCIgZmFpbGVkXCIpLCBlcnIpO1xuICAgICAgICBpZiAoIWVyciAmJiBkYXRhKSBfdGhpczUubG9nZ2VyLmxvZyhcIlwiLmNvbmNhdChwcmVmaXgsIFwibG9hZGVkIG5hbWVzcGFjZSBcIikuY29uY2F0KG5zLCBcIiBmb3IgbGFuZ3VhZ2UgXCIpLmNvbmNhdChsbmcpLCBkYXRhKTtcblxuICAgICAgICBfdGhpczUubG9hZGVkKG5hbWUsIGVyciwgZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2F2ZU1pc3NpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2F2ZU1pc3NpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSwgaXNVcGRhdGUpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB7fTtcblxuICAgICAgaWYgKHRoaXMuc2VydmljZXMudXRpbHMgJiYgdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UgJiYgIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKG5hbWVzcGFjZSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImRpZCBub3Qgc2F2ZSBrZXkgXFxcIlwiLmNvbmNhdChrZXksIFwiXFxcIiBhcyB0aGUgbmFtZXNwYWNlIFxcXCJcIikuY29uY2F0KG5hbWVzcGFjZSwgXCJcXFwiIHdhcyBub3QgeWV0IGxvYWRlZFwiKSwgJ1RoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhIScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwgfHwga2V5ID09PSAnJykgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5iYWNrZW5kICYmIHRoaXMuYmFja2VuZC5jcmVhdGUpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kLmNyZWF0ZShsYW5ndWFnZXMsIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlLCBudWxsLCBfb2JqZWN0U3ByZWFkJDUoX29iamVjdFNwcmVhZCQ1KHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgICBpc1VwZGF0ZTogaXNVcGRhdGVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxhbmd1YWdlcyB8fCAhbGFuZ3VhZ2VzWzBdKSByZXR1cm47XG4gICAgICB0aGlzLnN0b3JlLmFkZFJlc291cmNlKGxhbmd1YWdlc1swXSwgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb25uZWN0b3I7XG59KEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIGdldCgpIHtcbiAgcmV0dXJuIHtcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgaW5pdEltbWVkaWF0ZTogdHJ1ZSxcbiAgICBuczogWyd0cmFuc2xhdGlvbiddLFxuICAgIGRlZmF1bHROUzogWyd0cmFuc2xhdGlvbiddLFxuICAgIGZhbGxiYWNrTG5nOiBbJ2RldiddLFxuICAgIGZhbGxiYWNrTlM6IGZhbHNlLFxuICAgIHN1cHBvcnRlZExuZ3M6IGZhbHNlLFxuICAgIG5vbkV4cGxpY2l0U3VwcG9ydGVkTG5nczogZmFsc2UsXG4gICAgbG9hZDogJ2FsbCcsXG4gICAgcHJlbG9hZDogZmFsc2UsXG4gICAgc2ltcGxpZnlQbHVyYWxTdWZmaXg6IHRydWUsXG4gICAga2V5U2VwYXJhdG9yOiAnLicsXG4gICAgbnNTZXBhcmF0b3I6ICc6JyxcbiAgICBwbHVyYWxTZXBhcmF0b3I6ICdfJyxcbiAgICBjb250ZXh0U2VwYXJhdG9yOiAnXycsXG4gICAgcGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6IGZhbHNlLFxuICAgIHNhdmVNaXNzaW5nOiBmYWxzZSxcbiAgICB1cGRhdGVNaXNzaW5nOiBmYWxzZSxcbiAgICBzYXZlTWlzc2luZ1RvOiAnZmFsbGJhY2snLFxuICAgIHNhdmVNaXNzaW5nUGx1cmFsczogdHJ1ZSxcbiAgICBtaXNzaW5nS2V5SGFuZGxlcjogZmFsc2UsXG4gICAgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyOiBmYWxzZSxcbiAgICBwb3N0UHJvY2VzczogZmFsc2UsXG4gICAgcG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ6IGZhbHNlLFxuICAgIHJldHVybk51bGw6IHRydWUsXG4gICAgcmV0dXJuRW1wdHlTdHJpbmc6IHRydWUsXG4gICAgcmV0dXJuT2JqZWN0czogZmFsc2UsXG4gICAgam9pbkFycmF5czogZmFsc2UsXG4gICAgcmV0dXJuZWRPYmplY3RIYW5kbGVyOiBmYWxzZSxcbiAgICBwYXJzZU1pc3NpbmdLZXlIYW5kbGVyOiBmYWxzZSxcbiAgICBhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6IGZhbHNlLFxuICAgIGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlOiBmYWxzZSxcbiAgICBvdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlKGFyZ3MpIHtcbiAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgIGlmIChfdHlwZW9mKGFyZ3NbMV0pID09PSAnb2JqZWN0JykgcmV0ID0gYXJnc1sxXTtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ3N0cmluZycpIHJldC5kZWZhdWx0VmFsdWUgPSBhcmdzWzFdO1xuICAgICAgaWYgKHR5cGVvZiBhcmdzWzJdID09PSAnc3RyaW5nJykgcmV0LnREZXNjcmlwdGlvbiA9IGFyZ3NbMl07XG5cbiAgICAgIGlmIChfdHlwZW9mKGFyZ3NbMl0pID09PSAnb2JqZWN0JyB8fCBfdHlwZW9mKGFyZ3NbM10pID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3NbM10gfHwgYXJnc1syXTtcbiAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgZXNjYXBlVmFsdWU6IHRydWUsXG4gICAgICBmb3JtYXQ6IGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSwgX2Zvcm1hdCwgbG5nLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBwcmVmaXg6ICd7eycsXG4gICAgICBzdWZmaXg6ICd9fScsXG4gICAgICBmb3JtYXRTZXBhcmF0b3I6ICcsJyxcbiAgICAgIHVuZXNjYXBlUHJlZml4OiAnLScsXG4gICAgICBuZXN0aW5nUHJlZml4OiAnJHQoJyxcbiAgICAgIG5lc3RpbmdTdWZmaXg6ICcpJyxcbiAgICAgIG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOiAnLCcsXG4gICAgICBtYXhSZXBsYWNlczogMTAwMCxcbiAgICAgIHNraXBPblZhcmlhYmxlczogdHJ1ZVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybU9wdGlvbnMob3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMubnMgPT09ICdzdHJpbmcnKSBvcHRpb25zLm5zID0gW29wdGlvbnMubnNdO1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZmFsbGJhY2tMbmcgPT09ICdzdHJpbmcnKSBvcHRpb25zLmZhbGxiYWNrTG5nID0gW29wdGlvbnMuZmFsbGJhY2tMbmddO1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZmFsbGJhY2tOUyA9PT0gJ3N0cmluZycpIG9wdGlvbnMuZmFsbGJhY2tOUyA9IFtvcHRpb25zLmZhbGxiYWNrTlNdO1xuXG4gIGlmIChvcHRpb25zLnN1cHBvcnRlZExuZ3MgJiYgb3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoJ2NpbW9kZScpIDwgMCkge1xuICAgIG9wdGlvbnMuc3VwcG9ydGVkTG5ncyA9IG9wdGlvbnMuc3VwcG9ydGVkTG5ncy5jb25jYXQoWydjaW1vZGUnXSk7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gb3duS2V5cyQ2KG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSB7IHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsgfSBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCQ2KHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMkNihPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzJDYoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlciQzKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDMoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0JDMoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gYmluZE1lbWJlckZ1bmN0aW9ucyhpbnN0KSB7XG4gIHZhciBtZW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3QpKTtcbiAgbWVtcy5mb3JFYWNoKGZ1bmN0aW9uIChtZW0pIHtcbiAgICBpZiAodHlwZW9mIGluc3RbbWVtXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5zdFttZW1dID0gaW5zdFttZW1dLmJpbmQoaW5zdCk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIEkxOG4gPSBmdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuICBfaW5oZXJpdHMoSTE4biwgX0V2ZW50RW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlciQzKEkxOG4pO1xuXG4gIGZ1bmN0aW9uIEkxOG4oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEkxOG4pO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTtcblxuICAgIGlmIChpc0lFMTApIHtcbiAgICAgIEV2ZW50RW1pdHRlci5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICBfdGhpcy5vcHRpb25zID0gdHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zKTtcbiAgICBfdGhpcy5zZXJ2aWNlcyA9IHt9O1xuICAgIF90aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXI7XG4gICAgX3RoaXMubW9kdWxlcyA9IHtcbiAgICAgIGV4dGVybmFsOiBbXVxuICAgIH07XG4gICAgYmluZE1lbWJlckZ1bmN0aW9ucyhfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICBpZiAoY2FsbGJhY2sgJiYgIV90aGlzLmlzSW5pdGlhbGl6ZWQgJiYgIW9wdGlvbnMuaXNDbG9uZSkge1xuICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGUpIHtcbiAgICAgICAgX3RoaXMuaW5pdChvcHRpb25zLCBjYWxsYmFjayk7XG5cbiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5pbml0KG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJMThuLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLmRlZmF1bHROUyAmJiBvcHRpb25zLm5zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBvcHRpb25zLmRlZmF1bHROUyA9IG9wdGlvbnMubnM7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ucy5pbmRleE9mKCd0cmFuc2xhdGlvbicpIDwgMCkge1xuICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdE5TID0gb3B0aW9ucy5uc1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZGVmT3B0cyA9IGdldCgpO1xuICAgICAgdGhpcy5vcHRpb25zID0gX29iamVjdFNwcmVhZCQ2KF9vYmplY3RTcHJlYWQkNihfb2JqZWN0U3ByZWFkJDYoe30sIGRlZk9wdHMpLCB0aGlzLm9wdGlvbnMpLCB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnMpKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uID0gX29iamVjdFNwcmVhZCQ2KF9vYmplY3RTcHJlYWQkNih7fSwgZGVmT3B0cy5pbnRlcnBvbGF0aW9uKSwgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubnNTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciA9IG9wdGlvbnMubnNTZXBhcmF0b3I7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNsYXNzT25EZW1hbmQoQ2xhc3NPck9iamVjdCkge1xuICAgICAgICBpZiAoIUNsYXNzT3JPYmplY3QpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIENsYXNzT3JPYmplY3QgPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgQ2xhc3NPck9iamVjdCgpO1xuICAgICAgICByZXR1cm4gQ2xhc3NPck9iamVjdDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSkge1xuICAgICAgICBpZiAodGhpcy5tb2R1bGVzLmxvZ2dlcikge1xuICAgICAgICAgIGJhc2VMb2dnZXIuaW5pdChjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5sb2dnZXIpLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VMb2dnZXIuaW5pdChudWxsLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvcm1hdHRlcjtcblxuICAgICAgICBpZiAodGhpcy5tb2R1bGVzLmZvcm1hdHRlcikge1xuICAgICAgICAgIGZvcm1hdHRlciA9IHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9ybWF0dGVyID0gRm9ybWF0dGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGx1ID0gbmV3IExhbmd1YWdlVXRpbCh0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IFJlc291cmNlU3RvcmUodGhpcy5vcHRpb25zLnJlc291cmNlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNlcnZpY2VzO1xuICAgICAgICBzLmxvZ2dlciA9IGJhc2VMb2dnZXI7XG4gICAgICAgIHMucmVzb3VyY2VTdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgICAgIHMubGFuZ3VhZ2VVdGlscyA9IGx1O1xuICAgICAgICBzLnBsdXJhbFJlc29sdmVyID0gbmV3IFBsdXJhbFJlc29sdmVyKGx1LCB7XG4gICAgICAgICAgcHJlcGVuZDogdGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixcbiAgICAgICAgICBjb21wYXRpYmlsaXR5SlNPTjogdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLFxuICAgICAgICAgIHNpbXBsaWZ5UGx1cmFsU3VmZml4OiB0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGZvcm1hdHRlciAmJiAoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCB8fCB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQgPT09IGRlZk9wdHMuaW50ZXJwb2xhdGlvbi5mb3JtYXQpKSB7XG4gICAgICAgICAgcy5mb3JtYXR0ZXIgPSBjcmVhdGVDbGFzc09uRGVtYW5kKGZvcm1hdHRlcik7XG4gICAgICAgICAgcy5mb3JtYXR0ZXIuaW5pdChzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCA9IHMuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKHMuZm9ybWF0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHMuaW50ZXJwb2xhdG9yID0gbmV3IEludGVycG9sYXRvcih0aGlzLm9wdGlvbnMpO1xuICAgICAgICBzLnV0aWxzID0ge1xuICAgICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogdGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKVxuICAgICAgICB9O1xuICAgICAgICBzLmJhY2tlbmRDb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmJhY2tlbmQpLCBzLnJlc291cmNlU3RvcmUsIHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHMuYmFja2VuZENvbm5lY3Rvci5vbignKicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5lbWl0LmFwcGx5KF90aGlzMiwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpIHtcbiAgICAgICAgICBzLmxhbmd1YWdlRGV0ZWN0b3IgPSBjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yKTtcbiAgICAgICAgICBzLmxhbmd1YWdlRGV0ZWN0b3IuaW5pdChzLCB0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSB7XG4gICAgICAgICAgcy5pMThuRm9ybWF0ID0gY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCk7XG4gICAgICAgICAgaWYgKHMuaTE4bkZvcm1hdC5pbml0KSBzLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKHRoaXMuc2VydmljZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRvci5vbignKicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5lbWl0LmFwcGx5KF90aGlzMiwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICBpZiAobS5pbml0KSBtLmluaXQoX3RoaXMyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybWF0ID0gdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0O1xuICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nICYmICF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgIXRoaXMub3B0aW9ucy5sbmcpIHtcbiAgICAgICAgdmFyIGNvZGVzID0gdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtcbiAgICAgICAgaWYgKGNvZGVzLmxlbmd0aCA+IDAgJiYgY29kZXNbMF0gIT09ICdkZXYnKSB0aGlzLm9wdGlvbnMubG5nID0gY29kZXNbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmICF0aGlzLm9wdGlvbnMubG5nKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2luaXQ6IG5vIGxhbmd1YWdlRGV0ZWN0b3IgaXMgdXNlZCBhbmQgbm8gbG5nIGlzIGRlZmluZWQnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JlQXBpID0gWydnZXRSZXNvdXJjZScsICdoYXNSZXNvdXJjZUJ1bmRsZScsICdnZXRSZXNvdXJjZUJ1bmRsZScsICdnZXREYXRhQnlMYW5ndWFnZSddO1xuICAgICAgc3RvcmVBcGkuZm9yRWFjaChmdW5jdGlvbiAoZmNOYW1lKSB7XG4gICAgICAgIF90aGlzMltmY05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpczIkc3RvcmU7XG5cbiAgICAgICAgICByZXR1cm4gKF90aGlzMiRzdG9yZSA9IF90aGlzMi5zdG9yZSlbZmNOYW1lXS5hcHBseShfdGhpczIkc3RvcmUsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHZhciBzdG9yZUFwaUNoYWluZWQgPSBbJ2FkZFJlc291cmNlJywgJ2FkZFJlc291cmNlcycsICdhZGRSZXNvdXJjZUJ1bmRsZScsICdyZW1vdmVSZXNvdXJjZUJ1bmRsZSddO1xuICAgICAgc3RvcmVBcGlDaGFpbmVkLmZvckVhY2goZnVuY3Rpb24gKGZjTmFtZSkge1xuICAgICAgICBfdGhpczJbZmNOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyJHN0b3JlMjtcblxuICAgICAgICAgIChfdGhpczIkc3RvcmUyID0gX3RoaXMyLnN0b3JlKVtmY05hbWVdLmFwcGx5KF90aGlzMiRzdG9yZTIsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICByZXR1cm4gX3RoaXMyO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuXG4gICAgICB2YXIgbG9hZCA9IGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgICAgIHZhciBmaW5pc2ggPSBmdW5jdGlvbiBmaW5pc2goZXJyLCB0KSB7XG4gICAgICAgICAgaWYgKF90aGlzMi5pc0luaXRpYWxpemVkICYmICFfdGhpczIuaW5pdGlhbGl6ZWRTdG9yZU9uY2UpIF90aGlzMi5sb2dnZXIud2FybignaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhJyk7XG4gICAgICAgICAgX3RoaXMyLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICghX3RoaXMyLm9wdGlvbnMuaXNDbG9uZSkgX3RoaXMyLmxvZ2dlci5sb2coJ2luaXRpYWxpemVkJywgX3RoaXMyLm9wdGlvbnMpO1xuXG4gICAgICAgICAgX3RoaXMyLmVtaXQoJ2luaXRpYWxpemVkJywgX3RoaXMyLm9wdGlvbnMpO1xuXG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0KTtcbiAgICAgICAgICBjYWxsYmFjayhlcnIsIHQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChfdGhpczIubGFuZ3VhZ2VzICYmIF90aGlzMi5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScgJiYgIV90aGlzMi5pc0luaXRpYWxpemVkKSByZXR1cm4gZmluaXNoKG51bGwsIF90aGlzMi50LmJpbmQoX3RoaXMyKSk7XG5cbiAgICAgICAgX3RoaXMyLmNoYW5nZUxhbmd1YWdlKF90aGlzMi5vcHRpb25zLmxuZywgZmluaXNoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzIHx8ICF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSkge1xuICAgICAgICBsb2FkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KGxvYWQsIDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRSZXNvdXJjZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZFJlc291cmNlcyhsYW5ndWFnZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbm9vcDtcbiAgICAgIHZhciB1c2VkQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHZhciB1c2VkTG5nID0gdHlwZW9mIGxhbmd1YWdlID09PSAnc3RyaW5nJyA/IGxhbmd1YWdlIDogdGhpcy5sYW5ndWFnZTtcbiAgICAgIGlmICh0eXBlb2YgbGFuZ3VhZ2UgPT09ICdmdW5jdGlvbicpIHVzZWRDYWxsYmFjayA9IGxhbmd1YWdlO1xuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZXNvdXJjZXMgfHwgdGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzKSB7XG4gICAgICAgIGlmICh1c2VkTG5nICYmIHVzZWRMbmcudG9Mb3dlckNhc2UoKSA9PT0gJ2NpbW9kZScpIHJldHVybiB1c2VkQ2FsbGJhY2soKTtcbiAgICAgICAgdmFyIHRvTG9hZCA9IFtdO1xuXG4gICAgICAgIHZhciBhcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobG5nKSB7XG4gICAgICAgICAgaWYgKCFsbmcpIHJldHVybjtcblxuICAgICAgICAgIHZhciBsbmdzID0gX3RoaXMzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGxuZyk7XG5cbiAgICAgICAgICBsbmdzLmZvckVhY2goZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIGlmICh0b0xvYWQuaW5kZXhPZihsKSA8IDApIHRvTG9hZC5wdXNoKGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdXNlZExuZykge1xuICAgICAgICAgIHZhciBmYWxsYmFja3MgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO1xuICAgICAgICAgIGZhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwZW5kKGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFwcGVuZCh1c2VkTG5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJlbG9hZCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBlbmQobCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZCh0b0xvYWQsIHRoaXMub3B0aW9ucy5ucywgdXNlZENhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVzZWRDYWxsYmFjayhudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVsb2FkUmVzb3VyY2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbG9hZFJlc291cmNlcyhsbmdzLCBucywgY2FsbGJhY2spIHtcbiAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICBpZiAoIWxuZ3MpIGxuZ3MgPSB0aGlzLmxhbmd1YWdlcztcbiAgICAgIGlmICghbnMpIG5zID0gdGhpcy5vcHRpb25zLm5zO1xuICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wO1xuICAgICAgdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZChsbmdzLCBucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZWZlcnJlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVzZShtb2R1bGUpIHtcbiAgICAgIGlmICghbW9kdWxlKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKScpO1xuICAgICAgaWYgKCFtb2R1bGUudHlwZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpJyk7XG5cbiAgICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2JhY2tlbmQnKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5iYWNrZW5kID0gbW9kdWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdsb2dnZXInIHx8IG1vZHVsZS5sb2cgJiYgbW9kdWxlLndhcm4gJiYgbW9kdWxlLmVycm9yKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5sb2dnZXIgPSBtb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2xhbmd1YWdlRGV0ZWN0b3InKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yID0gbW9kdWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdpMThuRm9ybWF0Jykge1xuICAgICAgICB0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCA9IG1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZHVsZS50eXBlID09PSAncG9zdFByb2Nlc3NvcicpIHtcbiAgICAgICAgcG9zdFByb2Nlc3Nvci5hZGRQb3N0UHJvY2Vzc29yKG1vZHVsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2Zvcm1hdHRlcicpIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLmZvcm1hdHRlciA9IG1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZHVsZS50eXBlID09PSAnM3JkUGFydHknKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKG1vZHVsZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaGFuZ2VMYW5ndWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGFuZ2VMYW5ndWFnZShsbmcsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbyA9IGxuZztcbiAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICB0aGlzLmVtaXQoJ2xhbmd1YWdlQ2hhbmdpbmcnLCBsbmcpO1xuXG4gICAgICB2YXIgc2V0TG5nUHJvcHMgPSBmdW5jdGlvbiBzZXRMbmdQcm9wcyhsKSB7XG4gICAgICAgIF90aGlzNC5sYW5ndWFnZSA9IGw7XG4gICAgICAgIF90aGlzNC5sYW5ndWFnZXMgPSBfdGhpczQuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobCk7XG4gICAgICAgIF90aGlzNC5yZXNvbHZlZExhbmd1YWdlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoWydjaW1vZGUnLCAnZGV2J10uaW5kZXhPZihsKSA+IC0xKSByZXR1cm47XG5cbiAgICAgICAgZm9yICh2YXIgbGkgPSAwOyBsaSA8IF90aGlzNC5sYW5ndWFnZXMubGVuZ3RoOyBsaSsrKSB7XG4gICAgICAgICAgdmFyIGxuZ0luTG5ncyA9IF90aGlzNC5sYW5ndWFnZXNbbGldO1xuICAgICAgICAgIGlmIChbJ2NpbW9kZScsICdkZXYnXS5pbmRleE9mKGxuZ0luTG5ncykgPiAtMSkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAoX3RoaXM0LnN0b3JlLmhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyhsbmdJbkxuZ3MpKSB7XG4gICAgICAgICAgICBfdGhpczQucmVzb2x2ZWRMYW5ndWFnZSA9IGxuZ0luTG5ncztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIGRvbmUgPSBmdW5jdGlvbiBkb25lKGVyciwgbCkge1xuICAgICAgICBpZiAobCkge1xuICAgICAgICAgIHNldExuZ1Byb3BzKGwpO1xuXG4gICAgICAgICAgX3RoaXM0LnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UobCk7XG5cbiAgICAgICAgICBfdGhpczQuaXNMYW5ndWFnZUNoYW5naW5nVG8gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBfdGhpczQuZW1pdCgnbGFuZ3VhZ2VDaGFuZ2VkJywgbCk7XG5cbiAgICAgICAgICBfdGhpczQubG9nZ2VyLmxvZygnbGFuZ3VhZ2VDaGFuZ2VkJywgbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXM0LmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC50LmFwcGx5KF90aGlzNCwgYXJndW1lbnRzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC50LmFwcGx5KF90aGlzNCwgYXJndW1lbnRzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgc2V0TG5nID0gZnVuY3Rpb24gc2V0TG5nKGxuZ3MpIHtcbiAgICAgICAgaWYgKCFsbmcgJiYgIWxuZ3MgJiYgX3RoaXM0LnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IpIGxuZ3MgPSBbXTtcbiAgICAgICAgdmFyIGwgPSB0eXBlb2YgbG5ncyA9PT0gJ3N0cmluZycgPyBsbmdzIDogX3RoaXM0LnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGxuZ3MpO1xuXG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgaWYgKCFfdGhpczQubGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHNldExuZ1Byb3BzKGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghX3RoaXM0LnRyYW5zbGF0b3IubGFuZ3VhZ2UpIF90aGlzNC50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKGwpO1xuICAgICAgICAgIGlmIChfdGhpczQuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvcikgX3RoaXM0LnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UobCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQubG9hZFJlc291cmNlcyhsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgZG9uZShlcnIsIGwpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghbG5nICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiAhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jKSB7XG4gICAgICAgIHNldExuZyh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpO1xuICAgICAgfSBlbHNlIGlmICghbG5nICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmMpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdChzZXRMbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0TG5nKGxuZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZlcnJlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Rml4ZWRUXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZpeGVkVChsbmcsIG5zLCBrZXlQcmVmaXgpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgZml4ZWRUID0gZnVuY3Rpb24gZml4ZWRUKGtleSwgb3B0cykge1xuICAgICAgICB2YXIgb3B0aW9ucztcblxuICAgICAgICBpZiAoX3R5cGVvZihvcHRzKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbjMgPiAyID8gX2xlbjMgLSAyIDogMCksIF9rZXkzID0gMjsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgICAgcmVzdFtfa2V5MyAtIDJdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb25zID0gX3RoaXM1Lm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoW2tleSwgb3B0c10uY29uY2F0KHJlc3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zID0gX29iamVjdFNwcmVhZCQ2KHt9LCBvcHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMubG5nID0gb3B0aW9ucy5sbmcgfHwgZml4ZWRULmxuZztcbiAgICAgICAgb3B0aW9ucy5sbmdzID0gb3B0aW9ucy5sbmdzIHx8IGZpeGVkVC5sbmdzO1xuICAgICAgICBvcHRpb25zLm5zID0gb3B0aW9ucy5ucyB8fCBmaXhlZFQubnM7XG4gICAgICAgIHZhciBrZXlTZXBhcmF0b3IgPSBfdGhpczUub3B0aW9ucy5rZXlTZXBhcmF0b3IgfHwgJy4nO1xuICAgICAgICB2YXIgcmVzdWx0S2V5ID0ga2V5UHJlZml4ID8gXCJcIi5jb25jYXQoa2V5UHJlZml4KS5jb25jYXQoa2V5U2VwYXJhdG9yKS5jb25jYXQoa2V5KSA6IGtleTtcbiAgICAgICAgcmV0dXJuIF90aGlzNS50KHJlc3VsdEtleSwgb3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIGxuZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZml4ZWRULmxuZyA9IGxuZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeGVkVC5sbmdzID0gbG5nO1xuICAgICAgfVxuXG4gICAgICBmaXhlZFQubnMgPSBucztcbiAgICAgIGZpeGVkVC5rZXlQcmVmaXggPSBrZXlQcmVmaXg7XG4gICAgICByZXR1cm4gZml4ZWRUO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHQoKSB7XG4gICAgICB2YXIgX3RoaXMkdHJhbnNsYXRvcjtcblxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRvciAmJiAoX3RoaXMkdHJhbnNsYXRvciA9IHRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KF90aGlzJHRyYW5zbGF0b3IsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4aXN0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGlzdHMoKSB7XG4gICAgICB2YXIgX3RoaXMkdHJhbnNsYXRvcjI7XG5cbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0b3IgJiYgKF90aGlzJHRyYW5zbGF0b3IyID0gdGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoX3RoaXMkdHJhbnNsYXRvcjIsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldERlZmF1bHROYW1lc3BhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RGVmYXVsdE5hbWVzcGFjZShucykge1xuICAgICAgdGhpcy5vcHRpb25zLmRlZmF1bHROUyA9IG5zO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNMb2FkZWROYW1lc3BhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzTG9hZGVkTmFtZXNwYWNlKG5zKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCcsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMubGFuZ3VhZ2VzIHx8ICF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eScsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbG5nID0gdGhpcy5yZXNvbHZlZExhbmd1YWdlIHx8IHRoaXMubGFuZ3VhZ2VzWzBdO1xuICAgICAgdmFyIGZhbGxiYWNrTG5nID0gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nIDogZmFsc2U7XG4gICAgICB2YXIgbGFzdExuZyA9IHRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykgcmV0dXJuIHRydWU7XG5cbiAgICAgIHZhciBsb2FkTm90UGVuZGluZyA9IGZ1bmN0aW9uIGxvYWROb3RQZW5kaW5nKGwsIG4pIHtcbiAgICAgICAgdmFyIGxvYWRTdGF0ZSA9IF90aGlzNi5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlW1wiXCIuY29uY2F0KGwsIFwifFwiKS5jb25jYXQobildO1xuXG4gICAgICAgIHJldHVybiBsb2FkU3RhdGUgPT09IC0xIHx8IGxvYWRTdGF0ZSA9PT0gMjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLnByZWNoZWNrKSB7XG4gICAgICAgIHZhciBwcmVSZXN1bHQgPSBvcHRpb25zLnByZWNoZWNrKHRoaXMsIGxvYWROb3RQZW5kaW5nKTtcbiAgICAgICAgaWYgKHByZVJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcHJlUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoIXRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChsb2FkTm90UGVuZGluZyhsbmcsIG5zKSAmJiAoIWZhbGxiYWNrTG5nIHx8IGxvYWROb3RQZW5kaW5nKGxhc3RMbmcsIG5zKSkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkTmFtZXNwYWNlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkTmFtZXNwYWNlcyhucywgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5ucykge1xuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbnMgPT09ICdzdHJpbmcnKSBucyA9IFtuc107XG4gICAgICBucy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIGlmIChfdGhpczcub3B0aW9ucy5ucy5pbmRleE9mKG4pIDwgMCkgX3RoaXM3Lm9wdGlvbnMubnMucHVzaChuKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZWZlcnJlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZExhbmd1YWdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkTGFuZ3VhZ2VzKGxuZ3MsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgICAgaWYgKHR5cGVvZiBsbmdzID09PSAnc3RyaW5nJykgbG5ncyA9IFtsbmdzXTtcbiAgICAgIHZhciBwcmVsb2FkZWQgPSB0aGlzLm9wdGlvbnMucHJlbG9hZCB8fCBbXTtcbiAgICAgIHZhciBuZXdMbmdzID0gbG5ncy5maWx0ZXIoZnVuY3Rpb24gKGxuZykge1xuICAgICAgICByZXR1cm4gcHJlbG9hZGVkLmluZGV4T2YobG5nKSA8IDA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFuZXdMbmdzLmxlbmd0aCkge1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRpb25zLnByZWxvYWQgPSBwcmVsb2FkZWQuY29uY2F0KG5ld0xuZ3MpO1xuICAgICAgdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZWZlcnJlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGlyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpcihsbmcpIHtcbiAgICAgIGlmICghbG5nKSBsbmcgPSB0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgfHwgKHRoaXMubGFuZ3VhZ2VzICYmIHRoaXMubGFuZ3VhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLmxhbmd1YWdlc1swXSA6IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgaWYgKCFsbmcpIHJldHVybiAncnRsJztcbiAgICAgIHZhciBydGxMbmdzID0gWydhcicsICdzaHUnLCAnc3FyJywgJ3NzaCcsICd4YWEnLCAneWhkJywgJ3l1ZCcsICdhYW8nLCAnYWJoJywgJ2FidicsICdhY20nLCAnYWNxJywgJ2FjdycsICdhY3gnLCAnYWN5JywgJ2FkZicsICdhZHMnLCAnYWViJywgJ2FlYycsICdhZmInLCAnYWpwJywgJ2FwYycsICdhcGQnLCAnYXJiJywgJ2FycScsICdhcnMnLCAnYXJ5JywgJ2FyeicsICdhdXonLCAnYXZsJywgJ2F5aCcsICdheWwnLCAnYXluJywgJ2F5cCcsICdiYnonLCAncGdhJywgJ2hlJywgJ2l3JywgJ3BzJywgJ3BidCcsICdwYnUnLCAncHN0JywgJ3BycCcsICdwcmQnLCAndWcnLCAndXInLCAneWRkJywgJ3lkcycsICd5aWgnLCAnamknLCAneWknLCAnaGJvJywgJ21lbicsICd4bW4nLCAnZmEnLCAnanByJywgJ3BlbycsICdwZXMnLCAncHJzJywgJ2R2JywgJ3NhbScsICdja2InXTtcbiAgICAgIHJldHVybiBydGxMbmdzLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGxuZykpID4gLTEgfHwgbG5nLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignLWFyYWInKSA+IDEgPyAncnRsJyA6ICdsdHInO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZUluc3RhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lSW5zdGFuY2UoKSB7XG4gICAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBub29wO1xuXG4gICAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IF9vYmplY3RTcHJlYWQkNihfb2JqZWN0U3ByZWFkJDYoX29iamVjdFNwcmVhZCQ2KHt9LCB0aGlzLm9wdGlvbnMpLCBvcHRpb25zKSwge1xuICAgICAgICBpc0Nsb25lOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgdmFyIGNsb25lID0gbmV3IEkxOG4obWVyZ2VkT3B0aW9ucyk7XG4gICAgICB2YXIgbWVtYmVyc1RvQ29weSA9IFsnc3RvcmUnLCAnc2VydmljZXMnLCAnbGFuZ3VhZ2UnXTtcbiAgICAgIG1lbWJlcnNUb0NvcHkuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgICAgICBjbG9uZVttXSA9IF90aGlzOFttXTtcbiAgICAgIH0pO1xuICAgICAgY2xvbmUuc2VydmljZXMgPSBfb2JqZWN0U3ByZWFkJDYoe30sIHRoaXMuc2VydmljZXMpO1xuICAgICAgY2xvbmUuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgICB9O1xuICAgICAgY2xvbmUudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKGNsb25lLnNlcnZpY2VzLCBjbG9uZS5vcHRpb25zKTtcbiAgICAgIGNsb25lLnRyYW5zbGF0b3Iub24oJyonLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40ID4gMSA/IF9sZW40IC0gMSA6IDApLCBfa2V5NCA9IDE7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgICBhcmdzW19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmUuZW1pdC5hcHBseShjbG9uZSwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZS5pbml0KG1lcmdlZE9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIGNsb25lLnRyYW5zbGF0b3Iub3B0aW9ucyA9IGNsb25lLm9wdGlvbnM7XG4gICAgICBjbG9uZS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMsXG4gICAgICAgIHJlc29sdmVkTGFuZ3VhZ2U6IHRoaXMucmVzb2x2ZWRMYW5ndWFnZVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSTE4bjtcbn0oRXZlbnRFbWl0dGVyKTtcblxuX2RlZmluZVByb3BlcnR5KEkxOG4sIFwiY3JlYXRlSW5zdGFuY2VcIiwgZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEkxOG4ob3B0aW9ucywgY2FsbGJhY2spO1xufSk7XG5cbnZhciBpbnN0YW5jZSA9IEkxOG4uY3JlYXRlSW5zdGFuY2UoKTtcbmluc3RhbmNlLmNyZWF0ZUluc3RhbmNlID0gSTE4bi5jcmVhdGVJbnN0YW5jZTtcblxudmFyIGNyZWF0ZUluc3RhbmNlID0gaW5zdGFuY2UuY3JlYXRlSW5zdGFuY2U7XG52YXIgaW5pdCA9IGluc3RhbmNlLmluaXQ7XG52YXIgbG9hZFJlc291cmNlcyA9IGluc3RhbmNlLmxvYWRSZXNvdXJjZXM7XG52YXIgcmVsb2FkUmVzb3VyY2VzID0gaW5zdGFuY2UucmVsb2FkUmVzb3VyY2VzO1xudmFyIHVzZSA9IGluc3RhbmNlLnVzZTtcbnZhciBjaGFuZ2VMYW5ndWFnZSA9IGluc3RhbmNlLmNoYW5nZUxhbmd1YWdlO1xudmFyIGdldEZpeGVkVCA9IGluc3RhbmNlLmdldEZpeGVkVDtcbnZhciB0ID0gaW5zdGFuY2UudDtcbnZhciBleGlzdHMgPSBpbnN0YW5jZS5leGlzdHM7XG52YXIgc2V0RGVmYXVsdE5hbWVzcGFjZSA9IGluc3RhbmNlLnNldERlZmF1bHROYW1lc3BhY2U7XG52YXIgaGFzTG9hZGVkTmFtZXNwYWNlID0gaW5zdGFuY2UuaGFzTG9hZGVkTmFtZXNwYWNlO1xudmFyIGxvYWROYW1lc3BhY2VzID0gaW5zdGFuY2UubG9hZE5hbWVzcGFjZXM7XG52YXIgbG9hZExhbmd1YWdlcyA9IGluc3RhbmNlLmxvYWRMYW5ndWFnZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuZXhwb3J0IHsgY2hhbmdlTGFuZ3VhZ2UsIGNyZWF0ZUluc3RhbmNlLCBleGlzdHMsIGdldEZpeGVkVCwgaGFzTG9hZGVkTmFtZXNwYWNlLCBpbml0LCBsb2FkTGFuZ3VhZ2VzLCBsb2FkTmFtZXNwYWNlcywgbG9hZFJlc291cmNlcywgcmVsb2FkUmVzb3VyY2VzLCBzZXREZWZhdWx0TmFtZXNwYWNlLCB0LCB1c2UgfTtcbiIsIi8vIGltcG9ydCB7IGdldEZpbGUgfSBmcm9tIFwiLi4vb2JDb21wb25lbnRzL29iVXBkYXRlTWVtb1wiO1xuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5cbi8qKlxuICog5a6e546w5LiA5Liq566A5piT54mI55qEIG1hcmtkb3duIOino+aekFxuICogLSDliJfooajop6PmnpDvvJtcbiAqIC0g5Luj56CB5Z2X77ybXG4gKiAtIOWKoOeyly/mlpzkvZPvvJtcbiAqIC0gVE9ETztcbiAqL1xuY29uc3QgQ09ERV9CTE9DS19SRUcgPSAvYGBgKFtcXHNcXFNdKj8pYGBgL2c7XG5jb25zdCBCT0xEX1RFWFRfUkVHID0gL1xcKlxcKiguKz8pXFwqXFwqL2c7XG5jb25zdCBFTV9URVhUX1JFRyA9IC9cXCooLis/KVxcKi9nO1xuY29uc3QgVE9ET19CTE9DS19SRUcgPSAvXFxbIFxcXSAvZztcbmNvbnN0IERPTkVfQkxPQ0tfUkVHID0gL1xcW3hcXF0gL2c7XG5jb25zdCBET1RfTElfUkVHID0gL1sqXSAvZztcbmNvbnN0IE5VTV9MSV9SRUcgPSAvKFxcZCspXFwuIC9nO1xuLy8gY29uc3QgQlJfUkVHID0gL1xcPGJyXFw+L2c7XG5cbmNvbnN0IElOVEVSTkFMX01EX1JFRyA9IC9cXFtcXFsoW15cXF1dKylcXF1cXF0vZztcbmNvbnN0IEVYUkVSTkFMX01EX1JFRyA9IC9cXFsoW15cXF1dKylcXF1cXCgoKFteXFxdXSspLm1kKVxcKS9nO1xuXG5jb25zdCBwYXJzZU1hcmtlZFRvSHRtbCA9IChtYXJrZWRTdHI6IHN0cmluZywgbWVtb2lkPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaHRtbFRleHQgPSBtYXJrZWRTdHJcbiAgICAucmVwbGFjZShDT0RFX0JMT0NLX1JFRywgXCI8cHJlIGxhbmc9Jyc+JDE8L3ByZT5cIilcbiAgICAucmVwbGFjZShET1RfTElfUkVHLCBcIjxzcGFuIGNsYXNzPSdjb3VudGVyLWJsb2NrJz7igKI8L3NwYW4+XCIpXG4gICAgLnJlcGxhY2UoTlVNX0xJX1JFRywgXCI8c3BhbiBjbGFzcz0nY291bnRlci1ibG9jayc+JDEuPC9zcGFuPlwiKVxuICAgIC5yZXBsYWNlKFRPRE9fQkxPQ0tfUkVHLCBcIjxzcGFuIGNsYXNzPSd0b2RvLWJsb2NrJyBkYXRhLXR5cGU9J3RvZG8nPuKsnDwvc3Bhbj5cIilcbiAgICAucmVwbGFjZShET05FX0JMT0NLX1JFRywgXCI8c3BhbiBjbGFzcz0ndG9kby1ibG9jaycgZGF0YS10eXBlPSdkb25lJz7inIU8L3NwYW4+XCIpXG4gICAgLnJlcGxhY2UoQk9MRF9URVhUX1JFRywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKEVNX1RFWFRfUkVHLCAnPGVtPiQxPC9lbT4nKVxuICAgIC5yZXBsYWNlKC8mbHQ7YnImZ3Q7L2csICc8L3A+PHA+JylcbiAgICAucmVwbGFjZSgvJmFtcDsvZywgJyYnKTtcblxuICBsZXQgbmV3SHRtbFRleHQgPSBodG1sVGV4dDtcblxuICBpZiAobWVtb2lkKSB7XG4gICAgaWYgKElOVEVSTkFMX01EX1JFRy50ZXN0KGh0bWxUZXh0KSkge1xuICAgICAgY29uc3QgaW50ZXJuYWxNRCA9IGh0bWxUZXh0Lm1hdGNoKElOVEVSTkFMX01EX1JFRyk7XG4gICAgICAvLyBjb25zdCBwYXRoID0gZ2V0RmlsZShtZW1vaWQpLnBhdGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsTUQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEvKGpwZWd8anBnfGdpZnxwbmd8c3ZnfGJtcHx3ZXBnKS9nLnRlc3QoaW50ZXJuYWxNRFtpXSkpIHtcbiAgICAgICAgICBjb25zdCBpbnRlcm5hbENvbnRlbnQgPSBnZXRDb250ZW50RnJvbUludGVybmFsTGluayhpbnRlcm5hbE1EW2ldKTtcbiAgICAgICAgICBpZiAoL1xcfC9nLnRlc3QoaW50ZXJuYWxDb250ZW50KSkge1xuICAgICAgICAgICAgY29uc3QgW2xpbmssIGxhYmVsXSA9IGludGVybmFsQ29udGVudC5zcGxpdCgnfCcpO1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZU1lbnQgPSByZXBsYWNlTWQobGluaywgbGFiZWwpO1xuICAgICAgICAgICAgbmV3SHRtbFRleHQgPSBodG1sVGV4dC5yZXBsYWNlKGludGVybmFsTURbaV0sIHJlcGxhY2VNZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGludGVybmFsQ29udGVudDtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gJyc7XG4gICAgICAgICAgICBjb25zdCByZXBsYWNlTWVudCA9IHJlcGxhY2VNZChsaW5rLCBsYWJlbCk7XG4gICAgICAgICAgICBuZXdIdG1sVGV4dCA9IG5ld0h0bWxUZXh0LnJlcGxhY2UoaW50ZXJuYWxNRFtpXSwgcmVwbGFjZU1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoRVhSRVJOQUxfTURfUkVHLnRlc3QoaHRtbFRleHQpKSB7XG4gICAgICBjb25zdCBleHRlcm5hbE1EID0gaHRtbFRleHQubWF0Y2goRVhSRVJOQUxfTURfUkVHKTtcbiAgICAgIC8vIGNvbnN0IHBhdGggPSBnZXRGaWxlKG1lbW9pZCkucGF0aDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZXJuYWxNRC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIS8oanBlZ3xqcGd8Z2lmfHBuZ3xzdmd8Ym1wfHdlcGcpL2cudGVzdChleHRlcm5hbE1EW2ldKSkge1xuICAgICAgICAgIGNvbnN0IGxpbmsgPSBnZXRDb250ZW50RnJvbUV4dGVybmFsTGluayhleHRlcm5hbE1EW2ldKTtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGdldExhYmVsRnJvbUV4dGVybmFsTGluayhleHRlcm5hbE1EW2ldKTtcbiAgICAgICAgICBjb25zdCByZXBsYWNlTWVudCA9IHJlcGxhY2VNZChsaW5rLCBsYWJlbCk7XG4gICAgICAgICAgbmV3SHRtbFRleHQgPSBodG1sVGV4dC5yZXBsYWNlKGV4dGVybmFsTURbaV0sIHJlcGxhY2VNZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnN0IGV4dGVybmFsTUQgPSBtYXJrZWRTdHIubWF0Y2goRVhSRVJOQUxfTURfUkVHKTtcblxuICByZXR1cm4gbmV3SHRtbFRleHQ7XG59O1xuXG5jb25zdCByZXBsYWNlTWQgPSAoaW50ZXJuYWxMaW5rOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZX0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsTGluayksICcnKTtcblxuICAvLyBsZXQgZmlsZVBhdGg7XG5cbiAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIC8vIGZpbGVQYXRoID0gZmlsZS5wYXRoO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgLy8gY29uc29sZS5sb2coYDxhIGRhdGEtaHJlZj1cIiR7aW50ZXJuYWxMaW5rfVwiIGRhdGEtdHlwZT1cImxpbmtcIiBkYXRhLWZpbGVwYXRoPVwiJHtpbnRlcm5hbExpbmt9XCIgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCI+JHtsYWJlbH08L2E+YCk7XG4gICAgICByZXR1cm4gYDxhIGRhdGEtaHJlZj1cIiR7aW50ZXJuYWxMaW5rfVwiIGRhdGEtdHlwZT1cImxpbmtcIiBkYXRhLWZpbGVwYXRoPVwiJHtpbnRlcm5hbExpbmt9XCIgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCI+JHtsYWJlbH08L2E+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiPiR7aW50ZXJuYWxMaW5rfTwvYT5gO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsYWJlbCkge1xuICAgIHJldHVybiBgPGEgZGF0YS1ocmVmPVwiJHtpbnRlcm5hbExpbmt9XCIgZGF0YS10eXBlPVwibGlua1wiIGRhdGEtZmlsZXBhdGg9XCIke2ludGVybmFsTGlua31cIiBjbGFzcz1cImludGVybmFsLWxpbmsgaXMtdW5yZXNvbHZlZFwiPiR7bGFiZWx9PC9hPmA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGluayBpcy11bnJlc29sdmVkXCI+JHtpbnRlcm5hbExpbmt9PC9hPmA7XG4gIH1cbn07XG5cbmNvbnN0IGdldENvbnRlbnRGcm9tSW50ZXJuYWxMaW5rID0gKGxpbmU6IHN0cmluZykgPT4gL1xcW1xcWyhbXlxcXV0rKVxcXVxcXS9nLmV4ZWMobGluZSk/LlsxXTtcblxuY29uc3QgZ2V0TGFiZWxGcm9tRXh0ZXJuYWxMaW5rID0gKGxpbmU6IHN0cmluZykgPT4gRVhSRVJOQUxfTURfUkVHLmV4ZWMobGluZSk/LlsxXTtcblxuY29uc3QgZ2V0Q29udGVudEZyb21FeHRlcm5hbExpbmsgPSAobGluZTogc3RyaW5nKSA9PiAvXFxbKFteXFxdXSspXFxdXFwoKChbXlxcXV0rKS5tZClcXCkvZy5leGVjKGxpbmUpPy5bM107XG5cbmNvbnN0IHBhcnNlSHRtbFRvUmF3VGV4dCA9IChodG1sU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZW1wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGVtcEVsLmNsYXNzTmFtZSA9ICdtZW1vLWNvbnRlbnQtdGV4dCc7XG4gIHRlbXBFbC5pbm5lckhUTUwgPSBodG1sU3RyO1xuICBjb25zdCB0ZXh0ID0gdGVtcEVsLmlubmVyVGV4dDtcbiAgcmV0dXJuIHRleHQ7XG59O1xuXG5jb25zdCBwYXJzZVJhd1RleHRUb0h0bWwgPSAocmF3VGV4dFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaHRtbFRleHQgPSByYXdUZXh0U3RyLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICByZXR1cm4gaHRtbFRleHQ7XG59O1xuXG5jb25zdCBlbmNvZGVIdG1sID0gKGh0bWxTdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdC50ZXh0Q29udGVudCA9IGh0bWxTdHI7XG4gIHJldHVybiB0LmlubmVySFRNTDtcbn07XG5cbmV4cG9ydCB7ZW5jb2RlSHRtbCwgcGFyc2VNYXJrZWRUb0h0bWwsIHBhcnNlSHRtbFRvUmF3VGV4dCwgcGFyc2VSYXdUZXh0VG9IdG1sfTtcbiIsImltcG9ydCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtTdG9yZX0gZnJvbSAnLi9jcmVhdGVTdG9yZSc7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gIHN0b3JlOiBTdG9yZTxhbnksIGFueT47XG4gIGNvbnRleHQ6IFJlYWN0LkNvbnRleHQ8YW55Pjtcbn1cblxuLyoqXG4gKiBUb3ktUmVkdXggUHJvdmlkZXJcbiAqIEp1c3QgZm9yIGRlYnVnIHdpdGggdGhlIGFwcCBzdG9yZVxuICovXG5jb25zdCBQcm92aWRlcjogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7Y2hpbGRyZW4sIHN0b3JlLCBjb250ZXh0OiBDb250ZXh0fSA9IHByb3BzO1xuICBjb25zdCBbYXBwU3RhdGUsIHNldEFwcFN0YXRlXSA9IHVzZVN0YXRlKHN0b3JlLmdldFN0YXRlKCkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUoKG5zKSA9PiB7XG4gICAgICBzZXRBcHBTdGF0ZShucyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIDxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXthcHBTdGF0ZX0+e2NoaWxkcmVufTwvQ29udGV4dC5Qcm92aWRlcj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm92aWRlcjtcbiIsImltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4uL2xhYnMvUHJvdmlkZXInO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge0FOSU1BVElPTl9EVVJBVElPTn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0ICcuLi9sZXNzL2RpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCwge0tleWJvYXJkRXZlbnQsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuXG5pbnRlcmZhY2UgRGlhbG9nQ29uZmlnIHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHVzZUFwcENvbnRleHQ/OiBib29sZWFuO1xuICBjbGlja1NwYWNlRGVzdHJveT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ0NvbmZpZywgRGlhbG9nUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufVxuXG5jb25zdCBCYXNlRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XG4gIGNvbnN0IHtjaGlsZHJlbiwgY2xhc3NOYW1lLCBjbGlja1NwYWNlRGVzdHJveSwgZGVzdHJveX0gPSBwcm9wcztcblxuICBjb25zdCBoYW5kbGVTcGFjZUNsaWNrZWQgPSAoKSA9PiB7XG4gICAgaWYgKGNsaWNrU3BhY2VEZXN0cm95KSB7XG4gICAgICBkZXN0cm95KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVzY0NsaWNrZWQgPSAoZTogYW55KSA9PiB7XG4gICAgY29uc3Qge2tleX0gPSBlOyBcbiAgICBpZiAoa2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgZGVzdHJveSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgZGlhbG9nLXdyYXBwZXIgJHtjbGFzc05hbWV9YH0gb25DbGljaz17aGFuZGxlU3BhY2VDbGlja2VkfSBvbktleVByZXNzPXtoYW5kbGVFc2NDbGlja2VkfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWNvbnRhaW5lclwiIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0RpYWxvZzxUIGV4dGVuZHMgRGlhbG9nUHJvcHM+KFxuICBjb25maWc6IERpYWxvZ0NvbmZpZyxcbiAgRGlhbG9nQ29tcG9uZW50OiBSZWFjdC5GQzxUPixcbiAgcHJvcHM/OiBPbWl0PFQsICdkZXN0cm95Jz4sXG4pOiBEaWFsb2dDYWxsYmFjayB7XG4gIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGVtcERpdik7XG5cbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdGVtcERpdi5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LmFkZCgnc2hvd3VwJyk7XG4gIH0sIDApO1xuXG4gIGNvbnN0IGNiczogRGlhbG9nQ2FsbGJhY2sgPSB7XG4gICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgdGVtcERpdi5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvd3VwJyk7XG4gICAgICB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkPy5jbGFzc0xpc3QuYWRkKCdzaG93b2ZmJyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGVtcERpdi5yZW1vdmUoKTtcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0ZW1wRGl2KTtcbiAgICAgIH0sIEFOSU1BVElPTl9EVVJBVElPTik7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBkaWFsb2dQcm9wcyA9IHtcbiAgICAuLi5wcm9wcyxcbiAgICBkZXN0cm95OiBjYnMuZGVzdHJveSxcbiAgfSBhcyBUO1xuXG4gIGxldCBGcmFnbWVudCA9IChcbiAgICA8QmFzZURpYWxvZyBkZXN0cm95PXtjYnMuZGVzdHJveX0gY2xpY2tTcGFjZURlc3Ryb3k9e3RydWV9IHsuLi5jb25maWd9PlxuICAgICAgPERpYWxvZ0NvbXBvbmVudCB7Li4uZGlhbG9nUHJvcHN9IC8+XG4gICAgPC9CYXNlRGlhbG9nPlxuICApO1xuXG4gIGlmIChjb25maWcudXNlQXBwQ29udGV4dCkge1xuICAgIEZyYWdtZW50ID0gKFxuICAgICAgPFByb3ZpZGVyIHN0b3JlPXthcHBTdG9yZX0gY29udGV4dD17YXBwQ29udGV4dH0+XG4gICAgICAgIHtGcmFnbWVudH1cbiAgICAgIDwvUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuXG4gIFJlYWN0RE9NLnJlbmRlcihGcmFnbWVudCwgdGVtcERpdik7XG5cbiAgcmV0dXJuIGNicztcbn1cbiIsImltcG9ydCB7dXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9wcmV2aWV3LWltYWdlLWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCBjbG9zZSBmcm9tICcuLi9pY29ucy9jbG9zZS5zdmcnO1xuaW1wb3J0IHtOb3RpY2V9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcbiAgaW1nVXJsOiBzdHJpbmc7XG4gIGZpbGVwYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBQcmV2aWV3SW1hZ2VEaWFsb2c6IFJlYWN0LkZDPFByb3BzPiA9ICh7ZGVzdHJveSwgaW1nVXJsLCBmaWxlcGF0aH06IFByb3BzKSA9PiB7XG4gIGNvbnN0IGltZ1JlZiA9IHVzZVJlZjxIVE1MSW1hZ2VFbGVtZW50PihudWxsKTtcbiAgY29uc3QgW2ltZ1dpZHRoLCBzZXRJbWdXaWR0aF0gPSB1c2VTdGF0ZTxudW1iZXI+KC0xKTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHV0aWxzLmdldEltYWdlU2l6ZShpbWdVcmwpLnRoZW4oKHt3aWR0aH0pID0+IHtcbiAgICAgIGlmICh3aWR0aCAhPT0gMCkge1xuICAgICAgICBzZXRJbWdXaWR0aCg4MCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRJbWdXaWR0aCgwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlQnRuQ2xpY2sgPSAoKSA9PiB7XG4gICAgZGVzdHJveSgpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZURlY3JlYXNlSW1hZ2VTaXplID0gKCkgPT4ge1xuICAgIGlmIChpbWdXaWR0aCA+IDMwKSB7XG4gICAgICBzZXRJbWdXaWR0aChpbWdXaWR0aCAtIDEwKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSW5jcmVhc2VJbWFnZVNpemUgPSAoKSA9PiB7XG4gICAgc2V0SW1nV2lkdGgoaW1nV2lkdGggKyAxMCk7XG4gIH07XG5cbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XG4gICAgdmFyIGJ5dGVzID0gd2luZG93LmF0b2IoYmFzZTY0KTtcbiAgICB2YXIgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWFbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW2FiXSwge3R5cGU6IHR5cGV9KTtcbiAgfTtcblxuICBjb25zdCBjb3B5SW1hZ2VUb0NsaXBib2FyZCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoKGZpbGVwYXRoID09PSBudWxsIHx8IGZpbGVwYXRoID09PSB1bmRlZmluZWQpICYmIGltZ1VybCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbXlCYXNlNjQgPSBpbWdVcmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcbiAgICAgIGNvbnN0IGJsb2JJbnB1dCA9IGNvbnZlcnRCYXNlNjRUb0Jsb2IobXlCYXNlNjQsICdpbWFnZS9wbmcnKTtcbiAgICAgIGNvbnN0IGNsaXBib2FyZEl0ZW1JbnB1dCA9IG5ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzogYmxvYklucHV0fSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB3aW5kb3cubmF2aWdhdG9yWydjbGlwYm9hcmQnXS53cml0ZShbY2xpcGJvYXJkSXRlbUlucHV0XSk7XG4gICAgICBuZXcgTm90aWNlKCdTZW5kIHRvIGNsaXBib2FyZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ1ZmZlciA9IGF3YWl0IHZhdWx0LmFkYXB0ZXIucmVhZEJpbmFyeShmaWxlcGF0aCk7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYXJyXSwge3R5cGU6ICdpbWFnZS9wbmcnfSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBpdGVtID0gbmV3IENsaXBib2FyZEl0ZW0oeydpbWFnZS9wbmcnOiBibG9ifSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB3aW5kb3cubmF2aWdhdG9yWydjbGlwYm9hcmQnXS53cml0ZShbaXRlbV0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBjbG9zZS1idG5cIiBvbkNsaWNrPXtoYW5kbGVDbG9zZUJ0bkNsaWNrfT5cbiAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17Y2xvc2V9IC8+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWctY29udGFpbmVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT17aW1nV2lkdGggPD0gMCA/ICdoaWRkZW4nIDogJyd9IHJlZj17aW1nUmVmfSB3aWR0aD17aW1nV2lkdGggKyAnJSd9IHNyYz17aW1nVXJsfSAvPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydsb2FkaW5nLXRleHQgJyArIChpbWdXaWR0aCA9PT0gLTEgPyAnJyA6ICdoaWRkZW4nKX0+e3QoJ0ltYWdlIGlzIGxvYWRpbmcuLi4nKX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2xvYWRpbmctdGV4dCAnICsgKGltZ1dpZHRoID09PSAwID8gJycgOiAnaGlkZGVuJyl9PlxuICAgICAgICAgIHt0KCfwn5ifIENhbm5vdCBsb2FkIGltYWdlLCBpbWFnZSBsaW5rIG1heWJlIGJyb2tlbicpfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY3Rpb24tYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZX0+XG4gICAgICAgICAg4p6WXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZUluY3JlYXNlSW1hZ2VTaXplfT5cbiAgICAgICAgICDinpVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2V0SW1nV2lkdGgoODApfT5cbiAgICAgICAgICDirZVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17Y29weUltYWdlVG9DbGlwYm9hcmR9PlxuICAgICAgICAgIPCfk4RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNob3dQcmV2aWV3SW1hZ2VEaWFsb2coaW1nVXJsOiBzdHJpbmcsIGZpbGVwYXRoPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChmaWxlcGF0aCkge1xuICAgIHNob3dEaWFsb2coXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3ByZXZpZXctaW1hZ2UtZGlhbG9nJyxcbiAgICAgIH0sXG4gICAgICBQcmV2aWV3SW1hZ2VEaWFsb2csXG4gICAgICB7aW1nVXJsLCBmaWxlcGF0aH0sXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBzaG93RGlhbG9nKFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdwcmV2aWV3LWltYWdlLWRpYWxvZycsXG4gICAgICB9LFxuICAgICAgUHJldmlld0ltYWdlRGlhbG9nLFxuICAgICAge2ltZ1VybH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJldmlldy1pbWFnZS1kaWFsb2dcIikuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIGNsb3NlV2luZG93QnlFc2MpO1xuICAvLyB9LCAwKTtcbn1cblxuLy8gZnVuY3Rpb24gY2xvc2VXaW5kb3coKSB7XG4vLyAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJldmlldy1pbWFnZS1kaWFsb2cgLmNsb3NlLWJ0blwiKS5jbGljaygpO1xuLy8gfVxuXG4vLyBmdW5jdGlvbiBjbG9zZVdpbmRvd0J5RXNjKGUpIHtcbi8vICAgaWYgKCFlKSBlID0gd2luZG93LmV2ZW50O1xuLy8gICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuLy8gICBpZiAoa2V5Q29kZSA9PSAnMjcnKSB7XG4vLyAgICAgY2xvc2VXaW5kb3coKTtcbi8vICAgfVxuLy8gfVxuIiwiaW1wb3J0IHNob3dQcmV2aWV3SW1hZ2VEaWFsb2cgZnJvbSAnLi9QcmV2aWV3SW1hZ2VEaWFsb2cnO1xuaW1wb3J0ICcuLi9sZXNzL2ltYWdlLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgaW1nVXJsOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgYWx0OiBzdHJpbmc7XG4gIHJlZmVycmVyUG9saWN5Pzogc3RyaW5nO1xuICBmaWxlcGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgSW1hZ2U6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcbiAgY29uc3Qge2NsYXNzTmFtZSwgaW1nVXJsLCBhbHQsIHJlZmVycmVyUG9saWN5LCBmaWxlcGF0aH0gPSBwcm9wcztcblxuICBjb25zdCBoYW5kbGVJbWFnZUNsaWNrID0gKCkgPT4ge1xuICAgIGlmIChmaWxlcGF0aCkge1xuICAgICAgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyhpbWdVcmwsIGZpbGVwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyhpbWdVcmwpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXsnaW1hZ2UtY29udGFpbmVyICcgKyBjbGFzc05hbWV9IG9uQ2xpY2s9e2hhbmRsZUltYWdlQ2xpY2t9IHJlZmVycmVyUG9saWN5PXtyZWZlcnJlclBvbGljeX0+XG4gICAgICA8aW1nIHNyYz17aW1nVXJsfSBhbHQ9e2FsdH0gZGVjb2Rpbmc9XCJhc3luY1wiIGxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlO1xuIiwiaW1wb3J0IHt1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFja30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgSU1BR0VfVVJMX1JFRyxcbiAgTUFSS0RPV05fVVJMX1JFRyxcbiAgTUFSS0RPV05fV0VCX1VSTF9SRUcsXG4gIE1FTU9fTElOS19SRUcsXG4gIFdJS0lfSU1BR0VfVVJMX1JFRyxcbn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQge3BhcnNlSHRtbFRvUmF3VGV4dH0gZnJvbSAnLi4vaGVscGVycy9tYXJrZWQnO1xuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xuaW1wb3J0ICcuLi9sZXNzL21lbW8tY2FyZC1kaWFsb2cubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQgY2xvc2UgZnJvbSAnLi4vaWNvbnMvY2xvc2Uuc3ZnJztcbmltcG9ydCBlZGl0IGZyb20gJy4uL2ljb25zL2VkaXQuc3ZnJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcblxuaW50ZXJmYWNlIExpbmtlZE1lbW8gZXh0ZW5kcyBGb3JtYXR0ZWRNZW1vIHtcbiAgZGF0ZVN0cjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHJvcHMgZXh0ZW5kcyBEaWFsb2dQcm9wcyB7XG4gIG1lbW86IE1vZGVsLk1lbW87XG59XG5cbmludGVyZmFjZSBMaW5rTWF0Y2gge1xuICBsaW5rVGV4dDogc3RyaW5nO1xuICBhbHRUZXh0OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoT2ZJbWFnZSA9ICh2YXVsdDogVmF1bHQsIGltYWdlOiBURmlsZSkgPT4ge1xuICByZXR1cm4gdmF1bHQuZ2V0UmVzb3VyY2VQYXRoKGltYWdlKTtcbn07XG5cbmNvbnN0IGRldGVjdFdpa2lJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICBwYXRoOiAnJyxcbiAgICAgIGZpbGVwYXRoOiAnJyxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZGV0ZWN0TURJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMl07XG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgIHBhdGg6ICcnLFxuICAgICAgZmlsZXBhdGg6ICcnLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW1hZ2VQYXRoID0gZ2V0UGF0aE9mSW1hZ2UodmF1bHQsIGZpbGUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBNZW1vQ2FyZERpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCBbbWVtbywgc2V0TWVtb10gPSB1c2VTdGF0ZTxGb3JtYXR0ZWRNZW1vPih7XG4gICAgLi4ucHJvcHMubWVtbyxcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzLm1lbW8uY3JlYXRlZEF0KSxcbiAgfSk7XG4gIGNvbnN0IFtsaW5rTWVtb3MsIHNldExpbmtNZW1vc10gPSB1c2VTdGF0ZTxMaW5rZWRNZW1vW10+KFtdKTtcbiAgY29uc3QgW2xpbmtlZE1lbW9zLCBzZXRMaW5rZWRNZW1vc10gPSB1c2VTdGF0ZTxMaW5rZWRNZW1vW10+KFtdKTtcblxuICBsZXQgZXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgbGV0IGludGVybmFsSW1hZ2VVcmxzID0gW107XG4gIGxldCBhbGxNYXJrZG93bkxpbms6IHN0cmluZyB8IGFueVtdID0gW107XG4gIGxldCBhbGxJbnRlcm5hbExpbmsgPSBbXSBhcyBhbnlbXTtcbiAgaWYgKElNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgbGV0IGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gICAgbGV0IGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGlmIChNQVJLRE9XTl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgICAgYWxsTWFya2Rvd25MaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fVVJMX1JFRykpO1xuICAgIH1cbiAgICBpZiAoV0lLSV9JTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgICAgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIGlmIChNQVJLRE9XTl9XRUJfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fV0VCX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKGFsbEludGVybmFsTGluay5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsSW50ZXJuYWxMaW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBvbmUgPSBhbGxJbnRlcm5hbExpbmtbaV07XG4gICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0V2lraUludGVybmFsTGluayhvbmUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbE1hcmtkb3duTGluay5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB0d28gPSBhbGxNYXJrZG93bkxpbmtbaV07XG4gICAgICAgIGlmICgvKC4qKWh0dHBbc10/KC4qKS8udGVzdCh0d28pKSB7XG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RNREludGVybmFsTGluayh0d28pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xuICAgIC8vIGV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPz8gW10pO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmZXRjaExpbmtlZE1lbW9zID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlua01lbW9zOiBMaW5rZWRNZW1vW10gPSBbXTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEFyciA9IFsuLi5tZW1vLmNvbnRlbnQubWF0Y2hBbGwoTUVNT19MSU5LX1JFRyldO1xuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoUmVzIG9mIG1hdGNoZWRBcnIpIHtcbiAgICAgICAgICBpZiAobWF0Y2hSZXMgJiYgbWF0Y2hSZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoUmVzWzJdO1xuICAgICAgICAgICAgY29uc3QgbWVtb1RlbXAgPSBtZW1vU2VydmljZS5nZXRNZW1vQnlJZChpZCk7XG4gICAgICAgICAgICBpZiAobWVtb1RlbXApIHtcbiAgICAgICAgICAgICAgbGlua01lbW9zLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLm1lbW9UZW1wLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcobWVtb1RlbXAuY3JlYXRlZEF0KSxcbiAgICAgICAgICAgICAgICBkYXRlU3RyOiB1dGlscy5nZXREYXRlU3RyaW5nKG1lbW9UZW1wLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRMaW5rTWVtb3MoWy4uLmxpbmtNZW1vc10pO1xuXG4gICAgICAgIGNvbnN0IGxpbmtlZE1lbW9zID0gYXdhaXQgbWVtb1NlcnZpY2UuZ2V0TGlua2VkTWVtb3MobWVtby5pZCk7XG4gICAgICAgIHNldExpbmtlZE1lbW9zKFxuICAgICAgICAgIGxpbmtlZE1lbW9zXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkpXG4gICAgICAgICAgICAubWFwKChtKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKG0uY3JlYXRlZEF0KSxcbiAgICAgICAgICAgICAgZGF0ZVN0cjogdXRpbHMuZ2V0RGF0ZVN0cmluZyhtLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBkbyBudGhcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZmV0Y2hMaW5rZWRNZW1vcygpO1xuICB9LCBbbWVtby5pZF0pO1xuXG4gIGNvbnN0IGhhbmRsZU1lbW9Db250ZW50Q2xpY2sgPSB1c2VDYWxsYmFjayhhc3luYyAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0RWwuY2xhc3NOYW1lID09PSAnbWVtby1saW5rLXRleHQnKSB7XG4gICAgICBjb25zdCBuZXh0TWVtb0lkID0gdGFyZ2V0RWwuZGF0YXNldD8udmFsdWU7XG4gICAgICBjb25zdCBtZW1vVGVtcCA9IG1lbW9TZXJ2aWNlLmdldE1lbW9CeUlkKG5leHRNZW1vSWQgPz8gJycpO1xuXG4gICAgICBpZiAobWVtb1RlbXApIHtcbiAgICAgICAgY29uc3QgbmV4dE1lbW8gPSB7XG4gICAgICAgICAgLi4ubWVtb1RlbXAsXG4gICAgICAgICAgY3JlYXRlZEF0U3RyOiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhtZW1vVGVtcC5jcmVhdGVkQXQpLFxuICAgICAgICB9O1xuICAgICAgICBzZXRMaW5rTWVtb3MoW10pO1xuICAgICAgICBzZXRMaW5rZWRNZW1vcyhbXSk7XG4gICAgICAgIHNldE1lbW8obmV4dE1lbW8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3IE5vdGljZSgnTUVNTyBOb3QgRm91bmQnKTtcbiAgICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LnJlbW92ZSgnbWVtby1saW5rLXRleHQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sgPSB1c2VDYWxsYmFjaygobWVtbzogRm9ybWF0dGVkTWVtbykgPT4ge1xuICAgIHNldExpbmtNZW1vcyhbXSk7XG4gICAgc2V0TGlua2VkTWVtb3MoW10pO1xuICAgIHNldE1lbW8obWVtbyk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVFZGl0TWVtb0J0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHByb3BzLmRlc3Ryb3koKTtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0RWRpdE1lbW9JZChtZW1vLmlkKTtcbiAgfSwgW21lbW8uaWRdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY2FyZC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e21lbW8uY3JlYXRlZEF0U3RyfTwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBlZGl0LWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUVkaXRNZW1vQnRuQ2xpY2t9PlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtlZGl0fSAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBjbG9zZS1idG5cIiBvbkNsaWNrPXtwcm9wcy5kZXN0cm95fT5cbiAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17Y2xvc2V9IC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiXG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVNZW1vQ29udGVudENsaWNrfVxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCl9fT48L2Rpdj5cbiAgICAgICAgICA8T25seSB3aGVuPXtleHRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICA8SW1hZ2Uga2V5PXtpZHh9IGNsYXNzTmFtZT1cIm1lbW8taW1nXCIgaW1nVXJsPXtpbWdVcmx9IGFsdD1cIlwiIHJlZmVycmVyUG9saWN5PVwibm8tcmVmZXJyZXJcIiAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvT25seT5cbiAgICAgICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXIgaW50ZXJuYWwtZW1iZWQgaW1hZ2UtZW1iZWQgaXMtbG9hZGVkXCI+XG4gICAgICAgICAgICAgIHtpbnRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgPEltYWdlXG4gICAgICAgICAgICAgICAgICBrZXk9e2lkeH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8taW1nXCJcbiAgICAgICAgICAgICAgICAgIGltZ1VybD17aW1nVXJsLnBhdGh9XG4gICAgICAgICAgICAgICAgICBhbHQ9e2ltZ1VybC5hbHRUZXh0fVxuICAgICAgICAgICAgICAgICAgZmlsZXBhdGg9e2ltZ1VybC5maWxlcGF0aH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvT25seT5cbiAgICAgICAgICB7LyogPE9ubHkgd2hlbj17aW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICB7aW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICA8SW1hZ2UgY2xhc3NOYW1lPVwibWVtby1pbWdcIiBrZXk9e2lkeH0gaW1nVXJsPXtpbWdVcmx9IC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Pbmx5PiAqL31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGF5ZXItY29udGFpbmVyXCI+PC9kaXY+XG4gICAgICAgIHtsaW5rTWVtb3MubWFwKChfLCBpZHgpID0+IHtcbiAgICAgICAgICBpZiAoaWR4IDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJhY2tncm91bmQtbGF5ZXItY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICBrZXk9e2lkeH1cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgYm90dG9tOiAoaWR4ICsgMSkgKiAtMyArICdweCcsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiAoaWR4ICsgMSkgKiA1ICsgJ3B4JyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHsoaWR4ICsgMSkgKiAxMH1weClgLFxuICAgICAgICAgICAgICAgICAgekluZGV4OiAtaWR4IC0gMSxcbiAgICAgICAgICAgICAgICB9fT48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtsaW5rTWVtb3MubGVuZ3RoID4gMCA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsaW5rZWQtbWVtb3Mtd3JhcHBlclwiPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e3QoJ0xJTktFRCcpfSB7bGlua01lbW9zLmxlbmd0aH0gTUVNTyA8L3A+XG4gICAgICAgICAge2xpbmtNZW1vcy5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhd3RleHQgPSBwYXJzZUh0bWxUb1Jhd1RleHQoZm9ybWF0TWVtb0NvbnRlbnQobS5jb250ZW50KSkucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW8tY29udGFpbmVyXCIga2V5PXttLmlkfSBvbkNsaWNrPXsoKSA9PiBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sobSl9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiPnttLmRhdGVTdHJ9IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB7cmF3dGV4dH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2xpbmtlZE1lbW9zLmxlbmd0aCA+IDAgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW9zLXdyYXBwZXJcIj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPntsaW5rZWRNZW1vcy5sZW5ndGh9IE1FTU8ge3QoJ0xJTksgVE8gVEhFJyl9IE1FTU88L3A+XG4gICAgICAgICAge2xpbmtlZE1lbW9zLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmF3dGV4dCA9IHBhcnNlSHRtbFRvUmF3VGV4dChmb3JtYXRNZW1vQ29udGVudChtLmNvbnRlbnQpKS5yZXBsYWNlQWxsKCdcXG4nLCAnICcpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsaW5rZWQtbWVtby1jb250YWluZXJcIiBrZXk9e20uaWR9IG9uQ2xpY2s9eygpID0+IGhhbmRsZUxpbmtlZE1lbW9DbGljayhtKX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e20uZGF0ZVN0cn0gPC9zcGFuPlxuICAgICAgICAgICAgICAgIHtyYXd0ZXh0fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IG51bGx9XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93TWVtb0NhcmREaWFsb2cobWVtbzogTW9kZWwuTWVtbyk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ21lbW8tY2FyZC1kaWFsb2cnLFxuICAgIH0sXG4gICAgTWVtb0NhcmREaWFsb2csXG4gICAge21lbW99LFxuICApO1xufVxuIiwiaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtyZXF1ZXN0fSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IGNhY2hlZFJlc291cmNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuY29uc3QgY29udmVydFJlc291cmNlVG9EYXRhVVJMID0gYXN5bmMgKHVybDogc3RyaW5nLCB1c2VDYWNoZSA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7dmF1bHR9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKS5hcHA7XG5cbiAgaWYgKHVzZUNhY2hlICYmIGNhY2hlZFJlc291cmNlTWFwLmhhcyh1cmwpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWNoZWRSZXNvdXJjZU1hcC5nZXQodXJsKSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgLy8gbGV0IHJlcztcblxuICBpZiAoIS8oaHR0cHxodHRwcykvZy50ZXN0KHVybCkpIHtcbiAgICBpZiAoYXdhaXQgdmF1bHQuYWRhcHRlci5leGlzdHModXJsKSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdmF1bHQuYWRhcHRlci5yZWFkQmluYXJ5KHVybCk7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Fycl0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICAgICAgLy8gdmFyIGxlbiA9IGFyci5ieXRlTGVuZ3RoO1xuICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgLy8gICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJbIGkgXSApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyByZXR1cm4gd2luZG93LmJ0b2EoIGJpbmFyeSApO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmFzZTY0VXJsID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgY2FjaGVkUmVzb3VyY2VNYXAuc2V0KHVybCwgYmFzZTY0VXJsKTtcbiAgICAgICAgICByZXNvbHZlKGJhc2U2NFVybCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICAvLyBnZXRCYXNlNjRJbWFnZSh1cmwpO1xuICAgICAgY29uc3QgZG93bmxvYWQgPSBhd2FpdCByZXF1ZXN0KHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS8qLCovKjtxPTAuOCcsXG4gICAgICAgIC8vIGhlYWRlcnM6IHtcbiAgICAgICAgLy8gICBcIkNvbnRlbnQtVHlwZVwiOiBcImltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKiwqLyo7cT0wLjhcIixcbiAgICAgICAgLy8gICBBY2NlcHQ6IFwiaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS8qLCovKjtxPTAuOFwiLFxuICAgICAgICAvLyAgIFwiUHJveHktQ29ubmVjdGlvblwiOiBcImtlZXAtYWxpdmVcIixcbiAgICAgICAgLy8gICBQcmFnbWE6IFwibm8tY2FjaGVcIixcbiAgICAgICAgLy8gICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICAvLyAgIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIG9ic2lkaWFuLzAuMTIuMTkgQ2hyb21lLzkxLjAuNDQ3Mi4xNjQgRWxlY3Ryb24vMTMuNS4yIFNhZmFyaS81MzcuMzZcIixcbiAgICAgICAgLy8gfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZG93bmxvYWQpOyAvLyBhbHdheXMgdXRmLThcbiAgICAgIGNvbnN0IGJmID0gZW5jO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtiZl0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmFzZTY0VXJsID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgY2FjaGVkUmVzb3VyY2VNYXAuc2V0KHVybCwgYmFzZTY0VXJsKTtcbiAgICAgICAgICByZXNvbHZlKGJhc2U2NFVybCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgfSk7XG4gICAgICAvLyByZXR1cm4gKChkb3dubG9hZCA9PT0gXCJOb3QgRm91bmRcIiB8fCBkb3dubG9hZCA9PT0gYHtcImVycm9yXCI6XCJOb3QgRm91bmRcIn1gKSA/IG51bGwgOiBkb3dubG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBpbiBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeScsIFVSTCwgZXJyb3IpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gY29uc3QgZ2V0QmFzZTY0SW1hZ2UgPSAoaW1nOiBhbnkpID0+IHtcblxuLy8gICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcblxuLy8gICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbi8vICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuLy8gICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuLy8gICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbi8vICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4vLyAgIHZhciBkYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKTtcblxuLy8gICBjb25zb2xlLmxvZyhkYXRhVVJMLnJlcGxhY2UoL15kYXRhOmltYWdlXFwvKHBuZ3xqcGcpO2Jhc2U2NCwvLCBcIlwiKSk7XG5cbi8vICAgcmV0dXJuIDA7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTDtcbiIsIi8vIGltcG9ydCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgZnJvbSBcIi4vY29udmVydFJlc291cmNlVG9EYXRhVVJMXCI7XG4vLyBpbXBvcnQgeyBkYWlseU5vdGVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuaW1wb3J0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCBmcm9tICcuL2NvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCc7XG5cbmNvbnN0IGdldENsb25lU3R5bGVkRWxlbWVudCA9IGFzeW5jIChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICBjb25zdCBjbG9uZWRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50LnRhZ05hbWUpO1xuICAvLyBjb25zdCB7IHZhdWx0IH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpLmFwcDtcbiAgY2xvbmVkRWxlbWVudENvbnRhaW5lci5pbm5lckhUTUwgPSBlbGVtZW50LmlubmVySFRNTDtcblxuICBjb25zdCBhcHBseVN0eWxlcyA9IGFzeW5jIChzb3VyY2VFbGVtZW50OiBIVE1MRWxlbWVudCwgY2xvbmVkRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICBpZiAoIXNvdXJjZUVsZW1lbnQgfHwgIWNsb25lZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzb3VyY2VFbGVtZW50KTtcblxuICAgIGlmIChzb3VyY2VFbGVtZW50LnRhZ05hbWUgPT09ICdJTUcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwoXG4gICAgICAgICAgc291cmNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3BhdGgnKSA/PyBzb3VyY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgnc3JjJyksXG4gICAgICAgICk7XG4gICAgICAgIChjbG9uZWRFbGVtZW50IGFzIEhUTUxJbWFnZUVsZW1lbnQpLnNyYyA9IHVybDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGRvIG50aFxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzb3VyY2VTdHlsZXMpIHtcbiAgICAgIGNsb25lZEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIHNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKGl0ZW0pLFxuICAgICAgICBzb3VyY2VTdHlsZXMuZ2V0UHJvcGVydHlQcmlvcml0eShpdGVtKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG9uZWRFbGVtZW50LmNoaWxkRWxlbWVudENvdW50OyBpKyspIHtcbiAgICAgIGF3YWl0IGFwcGx5U3R5bGVzKHNvdXJjZUVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQsIGNsb25lZEVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICBhd2FpdCBhcHBseVN0eWxlcyhlbGVtZW50LCBjbG9uZWRFbGVtZW50Q29udGFpbmVyKTtcblxuICByZXR1cm4gY2xvbmVkRWxlbWVudENvbnRhaW5lcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldENsb25lU3R5bGVkRWxlbWVudDtcbiIsIi8vIGltcG9ydCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgZnJvbSBcIi4vY29udmVydFJlc291cmNlVG9EYXRhVVJMXCI7XG5cbmNvbnN0IGdldEZvbnRzU3R5bGVFbGVtZW50ID0gYXN5bmMgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHN0eWxlU2hlZXRzID0gZWxlbWVudC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICBjb25zdCBmb250RmFtaWx5U3R5bGVzOiBDU1NTdHlsZURlY2xhcmF0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNoZWV0IG9mIHN0eWxlU2hlZXRzKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICBpZiAocnVsZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQ1NTRm9udEZhY2VSdWxlJykge1xuICAgICAgICBmb250RmFtaWx5U3R5bGVzLnB1c2goKHJ1bGUgYXMgQ1NTRm9udEZhY2VSdWxlKS5zdHlsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblxuICAvLyBmb3IgKGNvbnN0IGYgb2YgZm9udEZhbWlseVN0eWxlcykge1xuICAvLyBjb25zdCBmb250RmFtaWx5ID0gZi5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1mYW1pbHlcIik7XG4gIC8vIGNvbnN0IGZvbnRXZWlnaHQgPSBmLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXdlaWdodFwiKTtcbiAgLy8gY29uc3Qgc3JjID0gZi5nZXRQcm9wZXJ0eVZhbHVlKFwic3JjXCIpO1xuICAvLyBjb25zdCByZXNvdXJjZVVybHMgPSBzcmMuc3BsaXQoXCIsXCIpLm1hcCgocykgPT4ge1xuICAvLyAgIHJldHVybiBzLnJlcGxhY2UoL3VybFxcKFwiPyguKz8pXCI/XFwpLywgXCIkMVwiKTtcbiAgLy8gfSk7XG4gIC8vIGNvbnN0IGJhc2U2NFVybHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gZm9yIChjb25zdCB1cmwgb2YgcmVzb3VyY2VVcmxzKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIGNvbnN0IGJhc2U2NFVybCA9IGF3YWl0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCh1cmwpO1xuICAvLyAgICAgYmFzZTY0VXJscy5wdXNoKGB1cmwoXCIke2Jhc2U2NFVybH1cIilgKTtcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgLy8gZG8gbnRoXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gc3R5bGVFbGVtZW50LmlubmVySFRNTCArPSBgXG4gIC8vICAgQGZvbnQtZmFjZSB7XG4gIC8vICAgICBmb250LWZhbWlseTogXCIke2ZvbnRGYW1pbHl9XCI7XG4gIC8vICAgICBzcmM6ICR7YmFzZTY0VXJscy5qb2luKFwiLFwiKX07XG4gIC8vICAgICBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTtcbiAgLy8gICB9YDtcbiAgLy8gfVxuXG4gIHJldHVybiBzdHlsZUVsZW1lbnQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRGb250c1N0eWxlRWxlbWVudDtcbiIsIi8qKlxuICogSFRNTCB0byBJbWFnZVxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAxLiBodG1sLXRvLWltYWdlOiBodHRwczovL2dpdGh1Yi5jb20vYnVia29vL2h0bWwtdG8taW1hZ2VcbiAqIDIuIDxmb3JlaWduT2JqZWN0PjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0VsZW1lbnQvZm9yZWlnbk9iamVjdFxuICovXG5pbXBvcnQgZ2V0Q2xvbmVTdHlsZWRFbGVtZW50IGZyb20gJy4vZ2V0Q2xvbmVTdHlsZWRFbGVtZW50JztcbmltcG9ydCBnZXRGb250c1N0eWxlRWxlbWVudCBmcm9tICcuL2dldEZvbnRzU3R5bGVFbGVtZW50JztcblxudHlwZSBPcHRpb25zID0gUGFydGlhbDx7XG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBwaXhlbFJhdGlvOiBudW1iZXI7XG59PjtcblxuY29uc3QgZ2V0RWxlbWVudFNpemUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcGFyc2VJbnQod2lkdGgucmVwbGFjZSgncHgnLCAnJykpLFxuICAgIGhlaWdodDogcGFyc2VJbnQoaGVpZ2h0LnJlcGxhY2UoJ3B4JywgJycpKSxcbiAgfTtcbn07XG5cbmNvbnN0IGNvbnZlcnRTVkdUb0RhdGFVUkwgPSAoc3ZnOiBTVkdFbGVtZW50KTogc3RyaW5nID0+IHtcbiAgY29uc3QgeG1sID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzdmcpO1xuICBjb25zdCB1cmwgPSBlbmNvZGVVUklDb21wb25lbnQoeG1sKTtcbiAgcmV0dXJuIGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwke3VybH1gO1xufTtcblxuY29uc3QgZ2VuZXJhdGVTVkdFbGVtZW50ID0gKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNWR1NWR0VsZW1lbnQgPT4ge1xuICBjb25zdCB4bWxOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoeG1sTlMsICdzdmcnKTtcblxuICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHt3aWR0aH1gKTtcbiAgc3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke2hlaWdodH1gKTtcbiAgc3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuXG4gIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoeG1sTlMsICdmb3JlaWduT2JqZWN0Jyk7XG5cbiAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTtcbiAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxMDAlJyk7XG4gIGZvcmVpZ25PYmplY3Quc2V0QXR0cmlidXRlKCd4JywgJzAnKTtcbiAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGUoJ3knLCAnMCcpO1xuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICd0cnVlJyk7XG5cbiAgZm9yZWlnbk9iamVjdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgc3ZnRWxlbWVudC5hcHBlbmRDaGlsZChmb3JlaWduT2JqZWN0KTtcblxuICByZXR1cm4gc3ZnRWxlbWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1NWRyA9IGFzeW5jIChlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IE9wdGlvbnMpID0+IHtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gZ2V0RWxlbWVudFNpemUoZWxlbWVudCk7XG5cbiAgY29uc3QgY2xvbmVkRWxlbWVudCA9IGF3YWl0IGdldENsb25lU3R5bGVkRWxlbWVudChlbGVtZW50KTtcblxuICBpZiAob3B0aW9ucz8uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgY2xvbmVkRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIGNvbnN0IHN2ZyA9IGdlbmVyYXRlU1ZHRWxlbWVudCh3aWR0aCwgaGVpZ2h0LCBjbG9uZWRFbGVtZW50KTtcbiAgc3ZnLnByZXBlbmQoYXdhaXQgZ2V0Rm9udHNTdHlsZUVsZW1lbnQoZWxlbWVudCkpO1xuXG4gIGNvbnN0IHVybCA9IGNvbnZlcnRTVkdUb0RhdGFVUkwoc3ZnKTtcblxuICByZXR1cm4gdXJsO1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ2FudmFzID0gYXN5bmMgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogT3B0aW9ucyk6IFByb21pc2U8SFRNTENhbnZhc0VsZW1lbnQ+ID0+IHtcbiAgY29uc3QgdXJsID0gYXdhaXQgdG9TVkcoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgY29uc3QgaW1hZ2VFbCA9IG5ldyBJbWFnZSgpO1xuICBpbWFnZUVsLnNyYyA9IHVybDtcblxuICBjb25zdCByYXRpbyA9IG9wdGlvbnM/LnBpeGVsUmF0aW8gfHwgMTtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gZ2V0RWxlbWVudFNpemUoZWxlbWVudCk7XG5cbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbnZhcyBlcnJvcicpO1xuICB9XG5cbiAgY2FudmFzLndpZHRoID0gd2lkdGggKiByYXRpbztcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHJhdGlvO1xuXG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3dpZHRofWA7XG4gIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9YDtcblxuICBpZiAob3B0aW9ucz8uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBvcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBpbWFnZUVsLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlRWwsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICAgIHJlc29sdmUoY2FudmFzKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbmNvbnN0IHRvSW1hZ2UgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBPcHRpb25zKSA9PiB7XG4gIGNvbnN0IGNhbnZhcyA9IGF3YWl0IHRvQ2FudmFzKGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gIC8vIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gZGVhbChibG9iKSB7XG4gIC8vICAgdmFyIGNsaXBib2FyZEl0ZW0gPSBuZXcgQ2xpcGJvYXJkSXRlbSh7W2BpbWFnZS9wbmdgXTogYmxvYn0pO1xuICAvLyAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW2NsaXBib2FyZEl0ZW1dKS50aGVuKCgpID0+IHtcbiAgLy8gICAgICAgYWxlcnQoJ+WkjeWItuaIkOWKnycpO1xuICAvLyAgIH0pO1xuICAvLyB9LCk7XG4gIC8vIGNvbnNvbGUubG9nKGNhbnZhcyk7XG5cbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRvSW1hZ2U7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuLy8gaW1wb3J0IHsgdXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXNcIjtcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XG5pbXBvcnQge1xuICBBTklNQVRJT05fRFVSQVRJT04sXG4gIElNQUdFX1VSTF9SRUcsXG4gIE1BUktET1dOX1VSTF9SRUcsXG4gIE1BUktET1dOX1dFQl9VUkxfUkVHLFxuICBXSUtJX0lNQUdFX1VSTF9SRUcsXG59IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9zaGFyZS1tZW1vLWltYWdlLWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge05vdGljZSwgVEZpbGUsIFZhdWx0LCBtb21lbnQsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCB7U2hhcmVGb290ZXJFbmQsIFVzZXJOYW1lLCBTaGFyZUZvb3RlclN0YXJ0LCBBdXRvU2F2ZVdoZW5Pbk1vYmlsZX0gZnJvbSAnLi4vbWVtb3MnO1xuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XG5pbXBvcnQgc2hhcmUgZnJvbSAnLi4vaWNvbnMvc2hhcmUuc3ZnJztcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3Rlc30gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcbiAgbWVtbzogTW9kZWwuTWVtbztcbn1cblxuaW50ZXJmYWNlIExpbmtNYXRjaCB7XG4gIGxpbmtUZXh0OiBzdHJpbmc7XG4gIGFsdFRleHQ6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XG4gIHJldHVybiB2YXVsdC5nZXRSZXNvdXJjZVBhdGgoaW1hZ2UpO1xufTtcblxuY29uc3QgZGV0ZWN0V2lraUludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsxXTtcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bNV07XG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xuXG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZGV0ZWN0TURJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMl07XG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xuXG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgU2hhcmVNZW1vSW1hZ2VEaWFsb2c6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcbiAgY29uc3Qge21lbW86IHByb3BzTWVtbywgZGVzdHJveX0gPSBwcm9wcztcbiAgY29uc3Qge21lbW9zfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkubWVtb1N0YXRlO1xuICBsZXQgbWVtb3NMZW5ndGg7XG4gIGxldCBjcmVhdGVkRGF5cztcbiAgaWYgKG1lbW9zLmxlbmd0aCkge1xuICAgIG1lbW9zTGVuZ3RoID0gbWVtb3MubGVuZ3RoIC0gMTtcbiAgICBjcmVhdGVkRGF5cyA9IG1lbW9zXG4gICAgICA/IE1hdGguY2VpbCgoRGF0ZS5ub3coKSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vc1ttZW1vc0xlbmd0aF0uY3JlYXRlZEF0KSkgLyAxMDAwIC8gMzYwMCAvIDI0KVxuICAgICAgOiAwO1xuICB9XG4gIC8vIGNvbnN0IHsgdXNlcjogdXNlcmluZm8gfSA9IHVzZXJTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IG1lbW86IEZvcm1hdHRlZE1lbW8gPSB7XG4gICAgLi4ucHJvcHNNZW1vLFxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXG4gIH07XG4gIC8vIGNvbnN0IG1lbW9JbWdVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPz8gW10pO1xuICAvLyBjb25zdCBtZW1vc051bSA9IG1lbW9zLmxlbmd0aDtcblxuICBjb25zdCBmb290ZXJFbmQgPSBTaGFyZUZvb3RlckVuZC5yZXBsYWNlKCd7VXNlck5hbWV9JywgVXNlck5hbWUpO1xuICBjb25zdCBmb290ZXJTdGFydCA9IFNoYXJlRm9vdGVyU3RhcnQucmVwbGFjZSgne01lbW9zTnVtfScsIG1lbW9zLmxlbmd0aC50b1N0cmluZygpKS5yZXBsYWNlKFxuICAgICd7VXNlZERheX0nLFxuICAgIGNyZWF0ZWREYXlzLnRvU3RyaW5nKCksXG4gICk7XG5cbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIH1cbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZXh0ZXJuYWxJbWFnZVVybHMgPSBhbGxFeHRlcm5hbEltYWdlVXJscy5jb25jYXQoYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzKTtcbiAgICAvLyBleHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcbiAgfVxuXG4gIGNvbnN0IFtzaG9ydGN1dEltZ1VybCwgc2V0U2hvcnRjdXRJbWdVcmxdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbaW1nQW1vdW50LCBzZXRJbWdBbW91bnRdID0gdXNlU3RhdGUoZXh0ZXJuYWxJbWFnZVVybHMubGVuZ3RoKTtcbiAgY29uc3QgbWVtb0VsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbWdBbW91bnQgPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIW1lbW9FbFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9JbWFnZShtZW1vRWxSZWYuY3VycmVudCwge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZWFlYWVhJyxcbiAgICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiAyLFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHVybCkgPT4ge1xuICAgICAgICAgIHNldFNob3J0Y3V0SW1nVXJsKHVybCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gZG8gbnRoXG4gICAgICAgIH0pO1xuICAgIH0sIEFOSU1BVElPTl9EVVJBVElPTik7XG4gIH0sIFtpbWdBbW91bnRdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZUJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGRlc3Ryb3koKTtcbiAgfTtcblxuICBjb25zdCBjb252ZXJ0QmFzZTY0VG9CbG9iID0gKGJhc2U2NDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpID0+IHtcbiAgICB2YXIgYnl0ZXMgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xuICAgIHZhciBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICAgIHZhciBpYSA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpYVtpXSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvcHl0b0NsaXBib2FyZEJ0bkNsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gICAgY29uc3QgZGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW1vLXNob3J0Y3V0LWltZycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IG15QmFzZTY0ID0gZGl2cy5nZXRBdHRyaWJ1dGUoJ3NyYycpLnNwbGl0KCdiYXNlNjQsJylbMV07XG4gICAgY29uc3QgYmxvYklucHV0ID0gY29udmVydEJhc2U2NFRvQmxvYihteUJhc2U2NCwgJ2ltYWdlL3BuZycpO1xuICAgIGlmIChBdXRvU2F2ZVdoZW5Pbk1vYmlsZSAmJiBQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgYmxvYklucHV0LmFycmF5QnVmZmVyKCkudGhlbihhc3luYyAoYnVmZmVyKSA9PiB7XG4gICAgICAgIGxldCBhRmlsZTtcbiAgICAgICAgbGV0IG5ld0ZpbGU7XG4gICAgICAgIGNvbnN0IGV4dCA9ICdwbmcnO1xuICAgICAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0cmluZyBpbiBkYWlseU5vdGVzKSB7XG4gICAgICAgICAgaWYgKGRhaWx5Tm90ZXNbc3RyaW5nXSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgICAgICBhRmlsZSA9IGRhaWx5Tm90ZXNbc3RyaW5nXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYUZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXG4gICAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgYXdhaXQgdmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKGBQYXN0ZWQgSW1hZ2UgJHttb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9YCwgZXh0LCBhRmlsZSksXG4gICAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGNsaXBib2FyZEl0ZW1JbnB1dCA9IG5ldyBDbGlwYm9hcmRJdGVtKHsnaW1hZ2UvcG5nJzogYmxvYklucHV0fSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5uYXZpZ2F0b3JbJ2NsaXBib2FyZCddLndyaXRlKFtjbGlwYm9hcmRJdGVtSW5wdXRdKTtcbiAgICBuZXcgTm90aWNlKCdTZW5kIHRvIGNsaXBib2FyZCBzdWNjZXNzZnVsbHknKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVJbWFnZU9uTG9hZCA9IChldjogUmVhY3QuU3ludGhldGljRXZlbnQ8SFRNTEltYWdlRWxlbWVudD4pID0+IHtcbiAgICBpZiAoZXYudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgbmV3IE5vdGljZSgn5pyJ5Liq5Zu+54mH5Yqg6L295aSx6LSl5LqG8J+YnycpO1xuICAgICAgKGV2LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50KS5yZW1vdmUoKTtcbiAgICB9XG4gICAgc2V0SW1nQW1vdW50KGltZ0Ftb3VudCAtIDEpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWhlYWRlci1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCfpbA8L3NwYW4+XG4gICAgICAgICAge3QoJ1NoYXJlIE1lbW8gSW1hZ2UnKX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNvcHktYnRuXCIgb25DbGljaz17aGFuZGxlQ29weXRvQ2xpcGJvYXJkQnRuQ2xpY2t9PlxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17c2hhcmV9IC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17aGFuZGxlQ2xvc2VCdG5DbGlja30+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWNvbnRlbnQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgdGlwLXdvcmRzLWNvbnRhaW5lciAke3Nob3J0Y3V0SW1nVXJsID8gJ2ZpbmlzaCcgOiAnbG9hZGluZyd9YH0+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57c2hvcnRjdXRJbWdVcmwgPyB0KCfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnKSA6IHQoJ0ltYWdlIGlzIGdlbmVyYXRpbmcuLi4nKX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGFpbmVyXCIgcmVmPXttZW1vRWxSZWZ9PlxuICAgICAgICAgIDxPbmx5IHdoZW49e3Nob3J0Y3V0SW1nVXJsICE9PSAnJ30+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cIm1lbW8tc2hvcnRjdXQtaW1nXCIgc3JjPXtzaG9ydGN1dEltZ1VybH0gLz5cbiAgICAgICAgICA8L09ubHk+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e21lbW8uY3JlYXRlZEF0U3RyfTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCl9fT48L2Rpdj5cbiAgICAgICAgICA8T25seSB3aGVuPXtleHRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICB7ZXh0ZXJuYWxJbWFnZVVybHMubWFwKChpbWdVcmwsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCJcbiAgICAgICAgICAgICAgICAgIGRlY29kaW5nPVwiYXN5bmNcIlxuICAgICAgICAgICAgICAgICAga2V5PXtpZHh9XG4gICAgICAgICAgICAgICAgICBzcmM9e2ltZ1VybH1cbiAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeT1cIm5vLXJlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIG9uTG9hZD17aGFuZGxlSW1hZ2VPbkxvYWR9XG4gICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVJbWFnZU9uTG9hZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvT25seT5cbiAgICAgICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lciBpbnRlcm5hbC1lbWJlZCBpbWFnZS1lbWJlZCBpcy1sb2FkZWRcIj5cbiAgICAgICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICA8aW1nIGtleT17aWR4fSBjbGFzc05hbWU9XCJtZW1vLWltZ1wiIHNyYz17aW1nVXJsLnBhdGh9IGFsdD17aW1nVXJsLmFsdFRleHR9IHBhdGg9e2ltZ1VybC5maWxlUGF0aH0gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L09ubHk+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3YXRlcm1hcmstY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dCBmb290ZXItc3RhcnRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlclN0YXJ0fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0IGZvb3Rlci1lbmRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlckVuZH08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93U2hhcmVNZW1vSW1hZ2VEaWFsb2cobWVtbzogTW9kZWwuTWVtbyk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3NoYXJlLW1lbW8taW1hZ2UtZGlhbG9nJyxcbiAgICB9LFxuICAgIFNoYXJlTWVtb0ltYWdlRGlhbG9nLFxuICAgIHttZW1vfSxcbiAgKTtcbn1cbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5cbmV4cG9ydCBjb25zdCBzaG93TWVtb0luRGFpbHlOb3RlcyA9IGFzeW5jIChtZW1vSWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHthcHAsIGRhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcblxuICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQobWVtb0lkLnNsaWNlKDE0KSk7XG4gIGNvbnN0IG1lbW9EYXRlU3RyaW5nID0gbWVtb0lkLnNsaWNlKDAsIDEzKTtcbiAgY29uc3QgZGF0ZSA9IG1vbWVudChtZW1vRGF0ZVN0cmluZywgJ1lZWVlNTURESEhtbXNzJyk7XG4gIGNvbnN0IGZpbGUgPSBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5zcGxpdEFjdGl2ZUxlYWYoKTtcbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9IGVsc2Uge1xuICAgIGxldCBsZWFmID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgIGlmIChsZWFmID09PSBudWxsKSB7XG4gICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpO1xuICAgIH1cbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9XG4gIHJldHVybjtcbn07XG4iLCJpbXBvcnQge21lbW8sIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGSVJTVF9UQUdfUkVHLFxuICBJTUFHRV9VUkxfUkVHLFxuICBMSU5LX1JFRyxcbiAgTUFSS0RPV05fVVJMX1JFRyxcbiAgTUFSS0RPV05fV0VCX1VSTF9SRUcsXG4gIE1EX0xJTktfUkVHLFxuICBNRU1PX0xJTktfUkVHLFxuICBUQUdfUkVHLFxuICBXSUtJX0lNQUdFX1VSTF9SRUcsXG59IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCB7ZW5jb2RlSHRtbCwgcGFyc2VNYXJrZWRUb0h0bWwsIHBhcnNlUmF3VGV4dFRvSHRtbH0gZnJvbSAnLi4vaGVscGVycy9tYXJrZWQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9JbWFnZSc7XG5pbXBvcnQgc2hvd01lbW9DYXJkRGlhbG9nIGZyb20gJy4vTWVtb0NhcmREaWFsb2cnO1xuaW1wb3J0IHNob3dTaGFyZU1lbW9JbWFnZURpYWxvZyBmcm9tICcuL1NoYXJlTWVtb0ltYWdlRGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9tZW1vLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Tm90aWNlLCBURmlsZSwgVmF1bHR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtzaG93TWVtb0luRGFpbHlOb3Rlc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iU2hvd01lbW8nO1xuaW1wb3J0IG1vcmUgZnJvbSAnLi4vaWNvbnMvbW9yZS5zdmcnO1xuaW1wb3J0IHtVc2VCdXR0b25Ub1Nob3dFZGl0b3IsIERlZmF1bHRFZGl0b3JMb2NhdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBtZW1vOiBNb2RlbC5NZW1vO1xufVxuXG5pbnRlcmZhY2UgTGlua01hdGNoIHtcbiAgbGlua1RleHQ6IHN0cmluZztcbiAgYWx0VGV4dDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGZpbGVwYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0UGF0aE9mSW1hZ2UgPSAodmF1bHQ6IFZhdWx0LCBpbWFnZTogVEZpbGUpID0+IHtcbiAgcmV0dXJuIHZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZSk7XG59O1xuXG5jb25zdCBkZXRlY3RXaWtpSW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzFdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcbiAgY29uc3QgZmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XG4gIC8vIGNvbnNvbGUubG9nKGZpbGUucGF0aCk7XG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlcGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGg7XG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogJycsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGRldGVjdE1ESW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzJdO1xuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICBwYXRoOiAnJyxcbiAgICAgIGZpbGVwYXRoOiAnJyxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgTWVtbzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vfSA9IHByb3BzO1xuICBjb25zdCBtZW1vOiBGb3JtYXR0ZWRNZW1vID0ge1xuICAgIC4uLnByb3BzTWVtbyxcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzTWVtby5jcmVhdGVkQXQpLFxuICB9O1xuICBjb25zdCBbc2hvd0NvbmZpcm1EZWxldGVCdG4sIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG5dID0gdXNlVG9nZ2xlKGZhbHNlKTtcblxuICAvLyBjb25zdCBpbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XG5cbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIH1cbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZXh0ZXJuYWxJbWFnZVVybHMgPSBhbGxFeHRlcm5hbEltYWdlVXJscy5jb25jYXQoYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzKTtcbiAgICAvLyBleHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNob3dNZW1vU3RvcnlEaWFsb2cgPSAoKSA9PiB7XG4gICAgc2hvd01lbW9DYXJkRGlhbG9nKG1lbW8pO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1hcmtNZW1vQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKFVzZUJ1dHRvblRvU2hvd0VkaXRvciAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XG4gICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tc2hvdy1lZGl0b3ItYnV0dG9uXCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiBlbGVtLm9uY2xpY2sgPT0gJ2Z1bmN0aW9uJyAmJiBlbGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWxlbS5vbmNsaWNrLmFwcGx5KGVsZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKG1lbW8uaWQpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRNZW1vQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKFVzZUJ1dHRvblRvU2hvd0VkaXRvciAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XG4gICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tc2hvdy1lZGl0b3ItYnV0dG9uXCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiBlbGVtLm9uY2xpY2sgPT0gJ2Z1bmN0aW9uJyAmJiBlbGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWxlbS5vbmNsaWNrLmFwcGx5KGVsZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRFZGl0TWVtb0lkKG1lbW8uaWQpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNvdXJjZU1lbW9DbGljayA9ICgpID0+IHtcbiAgICBzaG93TWVtb0luRGFpbHlOb3RlcyhtZW1vLmlkKTtcbiAgfTtcblxuICAvLyBjb25zdCBoYW5kbGVDcmVhdGVOZXdOb3RlQ2xpY2sgPSAoKSA9PiB7XG4gIC8vICAgdHVybkludG9Ob3RlKG1lbW8uaWQpO1xuICAvLyB9O1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1lbW9TZXJ2aWNlLmhpZGVNZW1vQnlJZChtZW1vLmlkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgbmV3IE5vdGljZShlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdsb2JhbFN0YXRlU2VydmljZS5nZXRTdGF0ZSgpLmVkaXRNZW1vSWQgPT09IG1lbW8uaWQpIHtcbiAgICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0b2dnbGVDb25maXJtRGVsZXRlQnRuKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlciA9ICgpID0+IHtcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVHZW5NZW1vSW1hZ2VCdG5DbGljayA9ICgpID0+IHtcbiAgICBzaG93U2hhcmVNZW1vSW1hZ2VEaWFsb2cobWVtbyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWVtb0tleURvd24gPSB1c2VDYWxsYmFjaygoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICBoYW5kbGVTb3VyY2VNZW1vQ2xpY2soKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVNZW1vRG91YmxlS2V5RG93biA9IHVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChldmVudCkge1xuICAgICAgaGFuZGxlRWRpdE1lbW9DbGljaygpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZU1lbW9Db250ZW50Q2xpY2sgPSBhc3luYyAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEVsID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0RWwuY2xhc3NOYW1lID09PSAnbWVtby1saW5rLXRleHQnKSB7XG4gICAgICBjb25zdCBtZW1vSWQgPSB0YXJnZXRFbC5kYXRhc2V0Py52YWx1ZTtcbiAgICAgIGNvbnN0IG1lbW9UZW1wID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQobWVtb0lkID8/ICcnKTtcblxuICAgICAgaWYgKG1lbW9UZW1wKSB7XG4gICAgICAgIHNob3dNZW1vQ2FyZERpYWxvZyhtZW1vVGVtcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXcgTm90aWNlKCdNRU1PIE5vdCBGb3VuZCcpO1xuICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCdtZW1vLWxpbmstdGV4dCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0RWwuY2xhc3NOYW1lID09PSAndG9kby1ibG9jaycpIHtcbiAgICAgIC8vIGRvIG50aFxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YG1lbW8td3JhcHBlciAkeydtZW1vcy0nICsgbWVtby5pZH0gJHttZW1vLm1lbW9UeXBlfWB9XG4gICAgICBvbk1vdXNlTGVhdmU9e2hhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlcn1cbiAgICAgIG9uTW91c2VEb3duPXtoYW5kbGVNZW1vS2V5RG93bn1cbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZU1lbW9Eb3VibGVLZXlEb3dufT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby10b3Atd3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aW1lLXRleHRcIiBvbkNsaWNrPXtoYW5kbGVTaG93TWVtb1N0b3J5RGlhbG9nfT5cbiAgICAgICAgICB7bWVtby5jcmVhdGVkQXRTdHJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0biBtb3JlLWFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21vcmV9IC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9yZS1hY3Rpb24tYnRucy13cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dNZW1vU3RvcnlEaWFsb2d9PlxuICAgICAgICAgICAgICAgIHt0KCdSRUFEJyl9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlTWFya01lbW9DbGlja30+XG4gICAgICAgICAgICAgICAge3QoJ01BUksnKX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVHZW5NZW1vSW1hZ2VCdG5DbGlja30+XG4gICAgICAgICAgICAgICAge3QoJ1NIQVJFJyl9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlRWRpdE1lbW9DbGlja30+XG4gICAgICAgICAgICAgICAge3QoJ0VESVQnKX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVTb3VyY2VNZW1vQ2xpY2t9PlxuICAgICAgICAgICAgICAgIHt0KCdTT1VSQ0UnKX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJ0biBkZWxldGUtYnRuICR7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyAnZmluYWwtY29uZmlybScgOiAnJ31gfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZURlbGV0ZU1lbW9DbGlja30+XG4gICAgICAgICAgICAgICAge3Nob3dDb25maXJtRGVsZXRlQnRuID8gdCgnQ09ORklSTe+8gScpIDogdCgnREVMRVRFJyl9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9Db250ZW50Q2xpY2t9XG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBmb3JtYXRNZW1vQ29udGVudChtZW1vLmNvbnRlbnQsIG1lbW8uaWQpfX0+PC9kaXY+XG4gICAgICA8T25seSB3aGVuPXtleHRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtd3JhcHBlclwiPlxuICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICA8SW1hZ2UgYWx0PVwiXCIga2V5PXtpZHh9IGNsYXNzTmFtZT1cIm1lbW8taW1nXCIgaW1nVXJsPXtpbWdVcmx9IHJlZmVycmVyUG9saWN5PVwibm8tcmVmZXJyZXJcIiAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvT25seT5cbiAgICAgIDxPbmx5IHdoZW49e2ludGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxuICAgICAgICAgIHtpbnRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICA8SW1hZ2VcbiAgICAgICAgICAgICAga2V5PXtpZHh9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8taW1nXCJcbiAgICAgICAgICAgICAgaW1nVXJsPXtpbWdVcmwucGF0aH1cbiAgICAgICAgICAgICAgYWx0PXtpbWdVcmwuYWx0VGV4dH1cbiAgICAgICAgICAgICAgZmlsZXBhdGg9e2ltZ1VybC5maWxlcGF0aH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Pbmx5PlxuICAgICAgey8qIDxPbmx5IHdoZW49e2ltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtd3JhcHBlclwiPlxuICAgICAgICAgIHtpbWFnZVVybHMubWFwKChpbWdVcmwsIGlkeCkgPT4gKFxuICAgICAgICAgICAgPEltYWdlIGNsYXNzTmFtZT1cIm1lbW8taW1nXCIga2V5PXtpZHh9IGltZ1VybD17aW1nVXJsfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvT25seT4gKi99XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TWVtb0NvbnRlbnQoY29udGVudDogc3RyaW5nLCBtZW1vaWQ/OiBzdHJpbmcpIHtcbiAgY29udGVudCA9IGVuY29kZUh0bWwoY29udGVudCk7XG4gIGNvbnRlbnQgPSBwYXJzZVJhd1RleHRUb0h0bWwoY29udGVudClcbiAgICAuc3BsaXQoJzxicj4nKVxuICAgIC5tYXAoKHQpID0+IHtcbiAgICAgIHJldHVybiBgPHA+JHt0ICE9PSAnJyA/IHQgOiAnPGJyPid9PC9wPmA7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG5cbiAgY29uc3Qge3Nob3VsZFVzZU1hcmtkb3duUGFyc2VyLCBzaG91bGRIaWRlSW1hZ2VVcmx9ID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG5cbiAgaWYgKHNob3VsZFVzZU1hcmtkb3duUGFyc2VyKSB7XG4gICAgY29udGVudCA9IHBhcnNlTWFya2VkVG9IdG1sKGNvbnRlbnQsIG1lbW9pZCk7XG4gIH1cblxuICBpZiAoc2hvdWxkSGlkZUltYWdlVXJsKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShXSUtJX0lNQUdFX1VSTF9SRUcsICcnKS5yZXBsYWNlKE1BUktET1dOX1VSTF9SRUcsICcnKS5yZXBsYWNlKElNQUdFX1VSTF9SRUcsICcnKTtcbiAgfVxuXG4gIC8vIGNvbnNvbGUubG9nKGNvbnRlbnQpO1xuXG4gIC8vIOS4reiLseaWh+S5i+mXtOWKoOepuuagvFxuICAvLyBpZiAoc2hvdWxkU3BsaXRNZW1vV29yZCkge1xuICAvLyAgIGNvbnRlbnQgPSBjb250ZW50XG4gIC8vICAgICAucmVwbGFjZSgvKFtcXHU0ZTAwLVxcdTlmYTVdKShbQS1aYS16MC05Py4sO1tcXF1dKykvZywgXCIkMSAkMlwiKVxuICAvLyAgICAgLnJlcGxhY2UoLyhbQS1aYS16MC05Py4sO1tcXF1dKykoW1xcdTRlMDAtXFx1OWZhNV0pL2csIFwiJDEgJDJcIik7XG4gIC8vIH1cblxuICBjb250ZW50ID0gY29udGVudFxuICAgIC5yZXBsYWNlKFRBR19SRUcsIFwiPHNwYW4gY2xhc3M9J3RhZy1zcGFuJz4jJDE8L3NwYW4+XCIpXG4gICAgLnJlcGxhY2UoRklSU1RfVEFHX1JFRywgXCI8cD48c3BhbiBjbGFzcz0ndGFnLXNwYW4nPiMkMjwvc3Bhbj5cIilcbiAgICAucmVwbGFjZShMSU5LX1JFRywgXCIkMTxhIGNsYXNzPSdsaW5rJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub3JlZmVycmVyJyBocmVmPSckMic+JDI8L2E+XCIpXG4gICAgLnJlcGxhY2UoTURfTElOS19SRUcsIFwiPGEgY2xhc3M9J2xpbmsnIHRhcmdldD0nX2JsYW5rJyByZWw9J25vcmVmZXJyZXInIGhyZWY9JyQyJz4kMTwvYT5cIilcbiAgICAucmVwbGFjZShNRU1PX0xJTktfUkVHLCBcIjxzcGFuIGNsYXNzPSdtZW1vLWxpbmstdGV4dCcgZGF0YS12YWx1ZT0nJDInPiQxPC9zcGFuPlwiKTtcblxuICAvLyBjb25zdCBjb250ZW50TWFyayA9IGNvbnRlbnQuc3BsaXQoJycpO1xuXG4gIC8vIGlmKC8oLiopPGEoLiopL2cudGVzdChjb250ZW50KSl7XG5cbiAgLy8gfVxuICAvLyAgIGZvcihsZXQgaT0wOyBpPGNvbnRlbnQubGVuZ3RoO2krKyl7XG4gIC8vICAgICBsZXQgbWFyayA9IGZhbHNlO1xuICAvLyAgICAgbGV0IGFNYXJrID0gZmFsc2U7XG4gIC8vICAgICBpZihjb250ZW50TWFya1tpXSlcbiAgLy8gICB9XG5cbiAgY29uc3QgdGVtcERpdkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0ZW1wRGl2Q29udGFpbmVyLmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcERpdkNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGMgPSB0ZW1wRGl2Q29udGFpbmVyLmNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKGMudGFnTmFtZSA9PT0gJ1AnICYmIGMudGV4dENvbnRlbnQgPT09ICcnICYmIGMuZmlyc3RFbGVtZW50Q2hpbGQ/LnRhZ05hbWUgIT09ICdCUicpIHtcbiAgICAgIGMucmVtb3ZlKCk7XG4gICAgICBpLS07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGVtcERpdkNvbnRhaW5lci5pbm5lckhUTUw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oTWVtbyk7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0ZJUlNUX1RBR19SRUcsIElNQUdFX1VSTF9SRUcsIExJTktfUkVHLCBNRU1PX0xJTktfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcbmltcG9ydCBNZW1vIGZyb20gJy4vTWVtbyc7XG4vLyBpbXBvcnQgdG9hc3RIZWxwZXIgZnJvbSBcIi4vVG9hc3RcIjtcbmltcG9ydCAnLi4vbGVzcy9tZW1vbGlzdC5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge05vdGljZSwgUGxhdGZvcm19IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7SGlkZURvbmVUYXNrc30gZnJvbSAnLi4vbWVtb3MnO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcbi8vIGltcG9ydCB7IERlZmF1bHRFZGl0b3JMb2NhdGlvbiB9IGZyb20gJy4uL21lbW9zJztcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmV4cG9ydCBsZXQgY29weVNob3duTWVtb3M6IE1vZGVsLk1lbW9bXTtcblxuY29uc3QgTWVtb0xpc3Q6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXG4gICAgbWVtb1N0YXRlOiB7bWVtb3N9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgbGV0IHJldmVyc2VNZW1vczogTW9kZWwuTWVtb1tdO1xuICAvLyBpZihEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09IFwiQm90dG9tXCIgJiYgd2luZG93LmlubmVyV2lkdGggPCA4NzUgJiYgUGxhdGZvcm0uaXNNb2JpbGUpe1xuICAvLyAgIHJldmVyc2VNZW1vcyA9IG1lbW9zLnJldmVyc2UoKTtcbiAgLy8gfVxuICBjb25zdCBbaXNGZXRjaGluZywgc2V0RmV0Y2hTdGF0dXNdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3Qge3RhZzogdGFnUXVlcnksIGR1cmF0aW9uLCB0eXBlOiBtZW1vVHlwZSwgdGV4dDogdGV4dFF1ZXJ5LCBmaWx0ZXI6IHF1ZXJ5SWR9ID0gcXVlcnk7XG4gIC8vIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbih0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlJZCk7XG4gIGNvbnN0IHF1ZXJ5RmlsdGVyID0gcXVlcnlTZXJ2aWNlLmdldFF1ZXJ5QnlJZChxdWVyeUlkKTtcbiAgY29uc3Qgc2hvd01lbW9GaWx0ZXIgPSBCb29sZWFuKFxuICAgIHRhZ1F1ZXJ5IHx8IChkdXJhdGlvbiAmJiBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8pIHx8IG1lbW9UeXBlIHx8IHRleHRRdWVyeSB8fCBxdWVyeUZpbHRlcixcbiAgKTtcblxuICBjb25zdCBzaG93bk1lbW9zID1cbiAgICBzaG93TWVtb0ZpbHRlciB8fCBxdWVyeUZpbHRlciB8fCBIaWRlRG9uZVRhc2tzXG4gICAgICA/IG1lbW9zLmZpbHRlcigobWVtbykgPT4ge1xuICAgICAgICAgIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChtZW1vLm1lbW9UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChIaWRlRG9uZVRhc2tzICYmIG1lbW8ubWVtb1R5cGUgPT09ICdUQVNLLURPTkUnKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocXVlcnlGaWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBKU09OLnBhcnNlKHF1ZXJ5RmlsdGVyLnF1ZXJ5c3RyaW5nKSBhcyBGaWx0ZXJbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMobWVtbywgZmlsdGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhZ1F1ZXJ5KSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgPz8gW10pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHQucmVwbGFjZShUQUdfUkVHLCAnJDEnKS50cmltKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGxldCB0ZW1wID0gJyc7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcbiAgICAgICAgICAgICAgICB0YWdzU2V0LmFkZCh0ZW1wKTtcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE5PUF9GSVJTVF9UQUdfUkVHKSA/PyBbXSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKE5PUF9GSVJTVF9UQUdfUkVHLCAnJDEnKS50cmltKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgIGxldCB0ZW1wID0gJyc7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcbiAgICAgICAgICAgICAgICB0YWdzU2V0LmFkZCh0ZW1wKTtcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKEZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoRklSU1RfVEFHX1JFRywgJyQyJykudHJpbSgpO1xuICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRhZy5zcGxpdCgnLycpO1xuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0ZW1wICs9IGk7XG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XG4gICAgICAgICAgICAgICAgdGVtcCArPSAnLyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGFnc1NldC5oYXModGFnUXVlcnkpKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZHVyYXRpb24gJiZcbiAgICAgICAgICAgIGR1cmF0aW9uLmZyb20gPCBkdXJhdGlvbi50byAmJlxuICAgICAgICAgICAgKHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPCBkdXJhdGlvbi5mcm9tIHx8XG4gICAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPiBkdXJhdGlvbi50bylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1lbW9UeXBlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1lbW9UeXBlID09PSAnTk9UX1RBR0dFRCcgJiZcbiAgICAgICAgICAgICAgKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSAhPT0gbnVsbCB8fCBtZW1vLmNvbnRlbnQubWF0Y2goTk9QX0ZJUlNUX1RBR19SRUcpICE9PSBudWxsKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdMSU5LRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChMSU5LX1JFRykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vVHlwZSA9PT0gJ0lNQUdFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ZXh0UXVlcnkgJiYgIW1lbW8uY29udGVudC5pbmNsdWRlcyh0ZXh0UXVlcnkpKSB7XG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHNob3VsZFNob3c7XG4gICAgICAgIH0pXG4gICAgICA6IG1lbW9zO1xuXG4gIGNvcHlTaG93bk1lbW9zID0gc2hvd25NZW1vcztcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG1lbW9TZXJ2aWNlXG4gICAgICAuZmV0Y2hBbGxNZW1vcygpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldEZldGNoU3RhdHVzKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBuZXcgTm90aWNlKCfwn5itIEZldGNoIEVycm9yJyk7XG4gICAgICB9KTtcbiAgICBkYWlseU5vdGVzU2VydmljZVxuICAgICAgLmdldE15QWxsRGFpbHlOb3RlcygpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldEZldGNoU3RhdHVzKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBuZXcgTm90aWNlKCfwn5itIEZldGNoIERhaWx5Tm90ZXMgRXJyb3InKTtcbiAgICAgIH0pO1xuICAgIGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdyYXBwZXJFbGVtZW50LmN1cnJlbnQ/LnNjcm9sbFRvKHt0b3A6IDB9KTtcbiAgfSwgW3F1ZXJ5XSk7XG5cbiAgY29uc3QgaGFuZGxlTWVtb0xpc3RDbGljayA9IHVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHt3b3Jrc3BhY2V9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldEVsLnRhZ05hbWUgPT09ICdTUEFOJyAmJiB0YXJnZXRFbC5jbGFzc05hbWUgPT09ICd0YWctc3BhbicpIHtcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSB0YXJnZXRFbC5pbm5lclRleHQuc2xpY2UoMSk7XG4gICAgICBjb25zdCBjdXJyVGFnUXVlcnkgPSBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS50YWc7XG4gICAgICBpZiAoY3VyclRhZ1F1ZXJ5ID09PSB0YWdOYW1lKSB7XG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRUYWdRdWVyeSgnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkodGFnTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0YXJnZXRFbC50YWdOYW1lID09PSAnQScgJiYgdGFyZ2V0RWwuY2xhc3NOYW1lID09PSAnaW50ZXJuYWwtbGluaycpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZXBhdGgnKTtcbiAgICAgIGlmIChQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgICB3b3Jrc3BhY2Uub3BlbkxpbmtUZXh0KHNvdXJjZVBhdGgsIHNvdXJjZVBhdGgsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtzcGFjZS5vcGVuTGlua1RleHQoc291cmNlUGF0aCwgc291cmNlUGF0aCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2BtZW1vbGlzdC13cmFwcGVyICR7aXNGZXRjaGluZyA/ICcnIDogJ2NvbXBsZXRlZCd9YH1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9MaXN0Q2xpY2t9XG4gICAgICByZWY9e3dyYXBwZXJFbGVtZW50fVxuICAgID5cbiAgICAgIHtzaG93bk1lbW9zLm1hcCgobWVtbykgPT4gKFxuICAgICAgICA8TWVtbyBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH0gbWVtbz17bWVtb30gLz5cbiAgICAgICkpfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwic3RhdHVzLXRleHRcIj5cbiAgICAgICAgICB7aXNGZXRjaGluZ1xuICAgICAgICAgICAgPyB0KCdGZXRjaGluZyBkYXRhLi4uJylcbiAgICAgICAgICAgIDogc2hvd25NZW1vcy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gdCgnTm9vb29wIScpXG4gICAgICAgICAgICA6IHNob3dNZW1vRmlsdGVyXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHQoJ0FsbCBEYXRhIGlzIExvYWRlZCDwn46JJyl9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVtb0xpc3Q7XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2dldERhaWx5Tm90ZVNldHRpbmdzfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0FkZEJsYW5rTGluZVdoZW5EYXRlLCBTaG93RGF0ZSwgU2hvd1RpbWV9IGZyb20gJy4uL21lbW9zJztcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRNZW1vc0J5RGF0ZSA9IChtZW1vczogTW9kZWwuTWVtb1tdKSA9PiB7XHJcbiAgY29uc3QgZGF0YUFyciA9IFtdIGFzIGFueVtdO1xyXG4gIG1lbW9zLm1hcCgobWFwSXRlbSkgPT4ge1xyXG4gICAgaWYgKGRhdGFBcnIubGVuZ3RoID09IDApIHtcclxuICAgICAgZGF0YUFyci5wdXNoKHtkYXRlOiBtb21lbnQobWFwSXRlbS5jcmVhdGVkQXQsICdZWVlZL01NL0REIEhIOm1tOnNzJykuZm9ybWF0KCdZWVlZLU1NLUREJyksIGhhdmU6IFttYXBJdGVtXX0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmVzID0gZGF0YUFyci5zb21lKChpdGVtKSA9PiB7XHJcbiAgICAgICAgLy/liKTmlq3nm7jlkIzml6XmnJ/vvIzmnInlsLHmt7vliqDliLDlvZPliY3poblcclxuICAgICAgICBpZiAoaXRlbS5kYXRlID09IG1vbWVudChtYXBJdGVtLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQnKSkge1xyXG4gICAgICAgICAgaXRlbS5oYXZlLnB1c2gobWFwSXRlbSk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgIC8v5aaC5p6c5rKh5om+55u45ZCM5pel5pyf5re75Yqg5LiA5Liq5paw5a+56LGhXHJcbiAgICAgICAgZGF0YUFyci5wdXNoKHtkYXRlOiBtb21lbnQobWFwSXRlbS5jcmVhdGVkQXQsICdZWVlZL01NL0REIEhIOm1tOnNzJykuZm9ybWF0KCdZWVlZLU1NLUREJyksIGhhdmU6IFttYXBJdGVtXX0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkYXRhQXJyO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRyYW5zZmVyTWVtb3NJbnRvVGV4dCA9IChkYWlseU1lbW9zOiBBcnJheTxhbnk+KTogc3RyaW5nID0+IHtcclxuICBsZXQgb3V0cHV0VGV4dCA9ICcnIGFzIHN0cmluZztcclxuICBsZXQgZGF0YUFyciA9IFtdIGFzIGFueVtdO1xyXG4gIGxldCBpbmRlbnQgPSAnJyBhcyBzdHJpbmc7XHJcbiAgY29uc3Qge2Zvcm1hdH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xyXG4gIGRhaWx5TWVtb3MubWFwKChtYXBJdGVtKSA9PiB7XHJcbiAgICBkYXRhQXJyID0gbWFwSXRlbS5oYXZlO1xyXG4gICAgaWYgKFNob3dEYXRlKSB7XHJcbiAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgJy0gW1snICsgbW9tZW50KG1hcEl0ZW0uZGF0ZSwgJ1lZWVktTU0tREQnKS5mb3JtYXQoZm9ybWF0KSArICddXVxcbic7XHJcbiAgICAgIGluZGVudCA9ICcgICAgJztcclxuICAgIH1cclxuICAgIGlmIChTaG93VGltZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aW1lID0gbW9tZW50KGRhdGFBcnJbaV0uY3JlYXRlZEF0LCAnWVlZWS9NTS9ERCBISDptbTpzcycpLmZvcm1hdCgnSEg6bW0nKTtcclxuICAgICAgICBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ0pPVVJOQUwnKSB7XHJcbiAgICAgICAgICBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSAnICsgdGltZSArICcgJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycpIHtcclxuICAgICAgICAgICAgaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2VBbGwoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsgXSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyB0aW1lICsgJyAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stRE9ORScpIHtcclxuICAgICAgICAgICAgaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFt4XSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gW3hdICcgKyB0aW1lICsgJyAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhc2tNYXJrID0gZGF0YUFycltpXS5tZW1vVHlwZS5tYXRjaCgvVEFTSy0oLiopPy9nKVsxXTtcclxuICAgICAgICAgICAgaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsnICsgdGFza01hcmsgKyAnXSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWycgKyB0YXNrTWFyayArICddICcgKyB0aW1lICsgJyAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vIGNvbnN0IHRpbWUgPSBtb21lbnQoZGF0YUFycltpXS5jcmVhdGVkQXQsICdZWVlZL01NL0REIEhIOm1tOnNzJykuZm9ybWF0KCdISDptbScpO1xyXG4gICAgICAgIGlmIChkYXRhQXJyW2ldLm1lbW9UeXBlID09PSAnSk9VUk5BTCcpIHtcclxuICAgICAgICAgIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycpIHtcclxuICAgICAgICAgICAgaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2VBbGwoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsgXSAnICsgZm9ybWF0ZWRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbIF0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFBcnJbaV0ubWVtb1R5cGUgPT09ICdUQVNLLURPTkUnKSB7XHJcbiAgICAgICAgICAgIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbeF0gJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gW3hdICcgKyBkYXRhQXJyW2ldLmNvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdGFza01hcmsgPSBkYXRhQXJyW2ldLm1lbW9UeXBlLm1hdGNoKC9UQVNLLSguKik/L2cpWzFdO1xyXG4gICAgICAgICAgICBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWycgKyB0YXNrTWFyayArICddICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsnICsgdGFza01hcmsgKyAnXSAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChTaG93RGF0ZSAmJiBBZGRCbGFua0xpbmVXaGVuRGF0ZSkge1xyXG4gICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArICdcXG4nO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gb3V0cHV0VGV4dDtcclxufTtcclxuIiwiaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge2xvY2F0aW9uU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQge2dldFRleHRXaXRoTWVtb1R5cGV9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcbmltcG9ydCAnLi4vbGVzcy9tZW1vLWZpbHRlci5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaTE4bmV4dCBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgY29weSBmcm9tICcuLi9pY29ucy9jb3B5LnN2Zyc7XG5pbXBvcnQge2NvcHlTaG93bk1lbW9zfSBmcm9tICcuL01lbW9MaXN0JztcbmltcG9ydCB7Z2V0TWVtb3NCeURhdGUsIHRyYW5zZmVyTWVtb3NJbnRvVGV4dH0gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iQ29weU1lbW9zJztcblxuaW50ZXJmYWNlIEZpbHRlclByb3BzIHt9XG5cbmNvbnN0IE1lbW9GaWx0ZXI6IFJlYWN0LkZDPEZpbHRlclByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuXG4gIGNvbnN0IHt0YWc6IHRhZ1F1ZXJ5LCBkdXJhdGlvbiwgdHlwZTogbWVtb1R5cGUsIHRleHQ6IHRleHRRdWVyeSwgZmlsdGVyfSA9IHF1ZXJ5O1xuXG4gIGNvbnN0IHF1ZXJ5RmlsdGVyID0gcXVlcnlTZXJ2aWNlLmdldFF1ZXJ5QnlJZChmaWx0ZXIpO1xuICBjb25zdCBzaG93RmlsdGVyID0gQm9vbGVhbihcbiAgICB0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQ29weUNsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb3B5U2hvd25NZW1vcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZW1vc0J5RGF0ZSA9IGdldE1lbW9zQnlEYXRlKGNvcHlTaG93bk1lbW9zKTtcbiAgICAgIGNvbnN0IHF1ZXJ5RGFpbHlNZW1vcyA9IHRyYW5zZmVyTWVtb3NJbnRvVGV4dChtZW1vc0J5RGF0ZSk7XG4gICAgICBhd2FpdCB1dGlscy5jb3B5VGV4dFRvQ2xpcGJvYXJkKHF1ZXJ5RGFpbHlNZW1vcyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2BmaWx0ZXItcXVlcnktY29udGFpbmVyICR7c2hvd0ZpbHRlciA/ICcnIDogJ2hpZGRlbid9YH0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlci1xdWVyeVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPkZJTFRFUjogPC9zcGFuPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAocXVlcnlGaWx0ZXIgPyAnJyA6ICdoaWRkZW4nKX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflJY8L3NwYW4+IHtxdWVyeUZpbHRlcj8udGl0bGV9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAodGFnUXVlcnkgPyAnJyA6ICdoaWRkZW4nKX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkoJycpO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn4+377iPPC9zcGFuPiB7dGFnUXVlcnl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAobWVtb1R5cGUgPyAnJyA6ICdoaWRkZW4nKX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb1R5cGVRdWVyeSgnJyk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCfk6Y8L3NwYW4+IHtnZXRUZXh0V2l0aE1lbW9UeXBlKG1lbW9UeXBlIGFzIE1lbW9TcGVjVHlwZSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvID8gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbHRlci1pdGVtLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeSgwLCAwKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+8J+Xk++4jzwvc3Bhbj4ge3V0aWxzLmdldERhdGVTdHJpbmcoZHVyYXRpb24uZnJvbSl9IHtpMThuZXh0LnQoJ3RvJyl9eycgJ31cbiAgICAgICAgICAgIHttb21lbnQoZHVyYXRpb24udG8sICd4JykuYWRkKDEsICdkYXlzJykuZm9ybWF0KCdZWVlZL01NL0REJyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAodGV4dFF1ZXJ5ID8gJycgOiAnaGlkZGVuJyl9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRleHRRdWVyeSgnJyk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflI08L3NwYW4+IHt0ZXh0UXVlcnl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvcHktbWVtb1wiPlxuICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjb3B5fSBvbkNsaWNrPXtoYW5kbGVDb3B5Q2xpY2t9IC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1lbW9GaWx0ZXI7XG4iLCJpbXBvcnQgTWVtb0VkaXRvciBmcm9tICcuLi9jb21wb25lbnRzL01lbW9FZGl0b3InO1xuaW1wb3J0IE1lbW9zSGVhZGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWVtb3NIZWFkZXInO1xuaW1wb3J0IE1lbW9GaWx0ZXIgZnJvbSAnLi4vY29tcG9uZW50cy9NZW1vRmlsdGVyJztcbmltcG9ydCBNZW1vTGlzdCBmcm9tICcuLi9jb21wb25lbnRzL01lbW9MaXN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge0RlZmF1bHRFZGl0b3JMb2NhdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xuXG5mdW5jdGlvbiBNZW1vcygpIHtcbiAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlICYmIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPE1lbW9zSGVhZGVyIC8+XG4gICAgICAgIDxNZW1vRmlsdGVyIC8+XG4gICAgICAgIDxNZW1vTGlzdCAvPlxuICAgICAgICA8TWVtb0VkaXRvciAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPE1lbW9zSGVhZGVyIC8+XG4gICAgICAgIDxNZW1vRWRpdG9yIC8+XG4gICAgICAgIDxNZW1vRmlsdGVyIC8+XG4gICAgICAgIDxNZW1vTGlzdCAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZW1vcztcbiIsImltcG9ydCB7dXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gdXNlTG9hZGluZyhpbml0aWFsU3RhdGUgPSB0cnVlKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoe2lzTG9hZGluZzogaW5pdGlhbFN0YXRlLCBpc0ZhaWxlZDogZmFsc2UsIGlzU3VjY2VlZDogZmFsc2V9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNldExvYWRpbmc6ICgpID0+IHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgICAgaXNGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBpc1N1Y2NlZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZXRGaW5pc2g6ICgpID0+IHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWNjZWVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZXRFcnJvcjogKCkgPT4ge1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgaXNGYWlsZWQ6IHRydWUsXG4gICAgICAgIGlzU3VjY2VlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VMb2FkaW5nO1xuIiwiaW1wb3J0IHtJTUFHRV9VUkxfUkVHLCBNQVJLRE9XTl9VUkxfUkVHLCBNQVJLRE9XTl9XRUJfVVJMX1JFRywgV0lLSV9JTUFHRV9VUkxfUkVHfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQgdXNlVG9nZ2xlIGZyb20gJy4uL2hvb2tzL3VzZVRvZ2dsZSc7XG5pbXBvcnQge21lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9JbWFnZSc7XG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xuaW1wb3J0ICcuLi9sZXNzL21lbW8ubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQgbW9yZSBmcm9tICcuLi9pY29ucy9tb3JlLnN2Zyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG1lbW86IE1vZGVsLk1lbW87XG4gIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9uOiAobWVtb0lkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBMaW5rTWF0Y2gge1xuICBsaW5rVGV4dDogc3RyaW5nO1xuICBhbHRUZXh0OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoT2ZJbWFnZSA9ICh2YXVsdDogVmF1bHQsIGltYWdlOiBURmlsZSkgPT4ge1xuICByZXR1cm4gdmF1bHQuZ2V0UmVzb3VyY2VQYXRoKGltYWdlKTtcbn07XG5cbmNvbnN0IGRldGVjdFdpa2lJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICBwYXRoOiAnJyxcbiAgICAgIGZpbGVwYXRoOiAnJyxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZGV0ZWN0TURJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMl07XG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgIHBhdGg6ICcnLFxuICAgICAgZmlsZXBhdGg6ICcnLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW1hZ2VQYXRoID0gZ2V0UGF0aE9mSW1hZ2UodmF1bHQsIGZpbGUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBEZWxldGVkTWVtbzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICAvLyBjb25zdCB7IGFwcCB9ICA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xuXG4gIGNvbnN0IHttZW1vOiBwcm9wc01lbW8sIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9ufSA9IHByb3BzO1xuICBjb25zdCBtZW1vOiBGb3JtYXR0ZWRNZW1vID0ge1xuICAgIC4uLnByb3BzTWVtbyxcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzTWVtby5jcmVhdGVkQXQpLFxuICAgIGRlbGV0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmRlbGV0ZWRBdCA/PyBEYXRlLm5vdygpKSxcbiAgfTtcbiAgY29uc3QgW3Nob3dDb25maXJtRGVsZXRlQnRuLCB0b2dnbGVDb25maXJtRGVsZXRlQnRuXSA9IHVzZVRvZ2dsZShmYWxzZSk7XG4gIC8vIGNvbnN0IGltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIH1cbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZXh0ZXJuYWxJbWFnZVVybHMgPSBhbGxFeHRlcm5hbEltYWdlVXJscy5jb25jYXQoYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzKTtcbiAgICAvLyBleHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1lbW9TZXJ2aWNlLmRlbGV0ZU1lbW9CeUlkKG1lbW8uaWQpO1xuICAgICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgbmV3IE5vdGljZShlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdG9nZ2xlQ29uZmlybURlbGV0ZUJ0bigpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZXN0b3JlTWVtb0NsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtZW1vU2VydmljZS5yZXN0b3JlTWVtb0J5SWQobWVtby5pZCk7XG4gICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcbiAgICAgIG5ldyBOb3RpY2UoJ1JFU1RPUkUgU1VDQ0VFRCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlciA9ICgpID0+IHtcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgbWVtby13cmFwcGVyICR7J21lbW9zLScgKyBtZW1vLmlkfWB9IG9uTW91c2VMZWF2ZT17aGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby10b3Atd3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aW1lLXRleHRcIj57dCgnREVMRVRFIEFUJyl9IHttZW1vLmRlbGV0ZWRBdFN0cn08L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gbW9yZS1hY3Rpb24tYnRuXCI+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXttb3JlfSAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb3JlLWFjdGlvbi1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gcmVzdG9yZS1idG5cIiBvbkNsaWNrPXtoYW5kbGVSZXN0b3JlTWVtb0NsaWNrfT5cbiAgICAgICAgICAgICAgICB7dCgnUkVTVE9SRScpfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgYnRuIGRlbGV0ZS1idG4gJHtzaG93Q29uZmlybURlbGV0ZUJ0biA/ICdmaW5hbC1jb25maXJtJyA6ICcnfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlTWVtb0NsaWNrfT5cbiAgICAgICAgICAgICAgICB7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyB0KCdDT05GSVJN77yBJykgOiB0KCdERUxFVEUnKX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCl9fT48L2Rpdj5cbiAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XG4gICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgIDxJbWFnZSBhbHQ9XCJcIiBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Pbmx5PlxuICAgICAgPE9ubHkgd2hlbj17aW50ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXIgaW50ZXJuYWwtZW1iZWQgaW1hZ2UtZW1iZWQgaXMtbG9hZGVkXCI+XG4gICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgIDxJbWFnZVxuICAgICAgICAgICAgICBrZXk9e2lkeH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxuICAgICAgICAgICAgICBpbWdVcmw9e2ltZ1VybC5wYXRofVxuICAgICAgICAgICAgICBhbHQ9e2ltZ1VybC5hbHRUZXh0fVxuICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L09ubHk+XG4gICAgICB7LyogPE9ubHkgd2hlbj17aW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XG4gICAgICAgICAge2ltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICA8SW1hZ2UgY2xhc3NOYW1lPVwibWVtby1pbWdcIiBrZXk9e2lkeH0gaW1nVXJsPXtpbWdVcmx9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Pbmx5PiAqL31cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERlbGV0ZWRNZW1vO1xuIiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0lNQUdFX1VSTF9SRUcsIExJTktfUkVHLCBNRU1PX0xJTktfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCBEZWxldGVkTWVtbyBmcm9tICcuLi9jb21wb25lbnRzL0RlbGV0ZWRNZW1vJztcbmltcG9ydCBNZW1vRmlsdGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWVtb0ZpbHRlcic7XG5pbXBvcnQgJy4uL2xlc3MvbWVtby10cmFzaC5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWVudVN2ZyBmcm9tICcuLi9pY29ucy9tZW51LnN2Zyc7XG5pbXBvcnQge05vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxuY29uc3QgTWVtb1RyYXNoOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlOiB7cXVlcnl9LFxuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IGxvYWRpbmdTdGF0ZSA9IHVzZUxvYWRpbmcoKTtcbiAgY29uc3QgW2RlbGV0ZWRNZW1vcywgc2V0RGVsZXRlZE1lbW9zXSA9IHVzZVN0YXRlPE1vZGVsLk1lbW9bXT4oW10pO1xuXG4gIGNvbnN0IHt0YWc6IHRhZ1F1ZXJ5LCBkdXJhdGlvbiwgdHlwZTogbWVtb1R5cGUsIHRleHQ6IHRleHRRdWVyeSwgZmlsdGVyOiBxdWVyeUlkfSA9IHF1ZXJ5O1xuICBjb25zdCBxdWVyeUZpbHRlciA9IHF1ZXJ5U2VydmljZS5nZXRRdWVyeUJ5SWQocXVlcnlJZCk7XG4gIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbihcbiAgICB0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXG4gICk7XG5cbiAgY29uc3Qgc2hvd25NZW1vcyA9XG4gICAgc2hvd01lbW9GaWx0ZXIgfHwgcXVlcnlGaWx0ZXJcbiAgICAgID8gZGVsZXRlZE1lbW9zLmZpbHRlcigobWVtbykgPT4ge1xuICAgICAgICAgIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChxdWVyeUZpbHRlcikge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IEpTT04ucGFyc2UocXVlcnlGaWx0ZXIucXVlcnlzdHJpbmcpIGFzIEZpbHRlcltdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyhtZW1vLCBmaWx0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFnUXVlcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKTtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xuICAgICAgICAgICAgICAgIHRlbXAgKz0gJy8nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTk9QX0ZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKTtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xuICAgICAgICAgICAgICAgIHRlbXAgKz0gJy8nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRhZ3NTZXQuaGFzKHRhZ1F1ZXJ5KSkge1xuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGR1cmF0aW9uICYmXG4gICAgICAgICAgICBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8gJiZcbiAgICAgICAgICAgICh1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpIDwgZHVyYXRpb24uZnJvbSB8fFxuICAgICAgICAgICAgICB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpID4gZHVyYXRpb24udG8pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZW1vVHlwZSkge1xuICAgICAgICAgICAgaWYgKG1lbW9UeXBlID09PSAnTk9UX1RBR0dFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKFRBR19SRUcpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdMSU5LRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChMSU5LX1JFRykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vVHlwZSA9PT0gJ0lNQUdFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ZXh0UXVlcnkgJiYgIW1lbW8uY29udGVudC5pbmNsdWRlcyh0ZXh0UXVlcnkpKSB7XG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHNob3VsZFNob3c7XG4gICAgICAgIH0pXG4gICAgICA6IGRlbGV0ZWRNZW1vcztcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKTtcbiAgICBtZW1vU2VydmljZVxuICAgICAgLmZldGNoRGVsZXRlZE1lbW9zKClcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICBzZXREZWxldGVkTWVtb3MocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbmV3IE5vdGljZSgnRmFpbGVkIHRvIGZldGNoIGRlbGV0ZWQgbWVtb3M6ICcsIGVycm9yKTtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGxvYWRpbmdTdGF0ZS5zZXRGaW5pc2goKTtcbiAgICAgIH0pO1xuICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbiA9IHVzZUNhbGxiYWNrKChtZW1vSWQ6IHN0cmluZykgPT4ge1xuICAgIHNldERlbGV0ZWRNZW1vcygoZGVsZXRlZE1lbW9zKSA9PiBkZWxldGVkTWVtb3MuZmlsdGVyKChtZW1vKSA9PiBtZW1vLmlkICE9PSBtZW1vSWQpKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldFNob3dTaWRlcmJhckluTW9iaWxlVmlldyh0cnVlKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRyYXNoLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgIDxPbmx5IHdoZW49e2lzTW9iaWxlVmlld30+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImFjdGlvbi1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrfT5cbiAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17bWVudVN2Z30gYWx0PVwibWVudVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L09ubHk+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dCgnUmVjeWNsZSBiaW4nKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8TWVtb0ZpbHRlciAvPlxuICAgICAge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGlwLXRleHQtY29udGFpbmVyXCI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnRmV0Y2hpbmcgZGF0YS4uLicpfTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogZGVsZXRlZE1lbW9zLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXAtdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCdIZXJlIGlzIE5vIFpldHRlbHMuJyl9PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVsZXRlZC1tZW1vcy1jb250YWluZXJcIj5cbiAgICAgICAgICB7c2hvd25NZW1vcy5tYXAoKG1lbW8pID0+IChcbiAgICAgICAgICAgIDxEZWxldGVkTWVtb1xuICAgICAgICAgICAgICBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH1cbiAgICAgICAgICAgICAgbWVtbz17bWVtb31cbiAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlZE1lbW9BY3Rpb249e2hhbmRsZURlbGV0ZWRNZW1vQWN0aW9ufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVtb1RyYXNoO1xuIiwiaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7cGFyc2VIdG1sVG9SYXdUZXh0fSBmcm9tICcuLi9oZWxwZXJzL21hcmtlZCc7XG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xuaW1wb3J0ICcuLi9sZXNzL3ByZWZlcmVuY2VzLXNlY3Rpb24ubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNoZWNrYm94QWN0aXZlIGZyb20gJy4uL2ljb25zL2NoZWNrYm94LWFjdGl2ZS5zdmcnO1xuaW1wb3J0IGNoZWNrYm94IGZyb20gJy4uL2ljb25zL2NoZWNrYm94LnN2Zyc7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBQcmVmZXJlbmNlc1NlY3Rpb246IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge2dsb2JhbFN0YXRlfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZSwgc2hvdWxkSGlkZUltYWdlVXJsLCBzaG91bGRTcGxpdE1lbW9Xb3JkLCBzaG91bGRVc2VNYXJrZG93blBhcnNlcn0gPSBnbG9iYWxTdGF0ZTtcblxuICBjb25zdCBkZW1vTWVtb0NvbnRlbnQgPVxuICAgICfwn5GLIOS9oOWlveWRgO+9nuasoui/juS9v+eUqG1lbW9zIVxcbiog4pyoICoq5byA5rqQ6aG555uuKirvvJtcXG4qIPCfmIsg57K+576O5LiU57uG6IqC55qE6KeG6KeJ5qC35byP77ybXFxuKiDwn5ORIOS9k+mqjOS8mOiJr+eahOS6pOS6kumAu+i+ke+8myc7XG5cbiAgY29uc3QgaGFuZGxlT3BlblRpbnlVbmRvQ2hhbmdlZCA9ICgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0QXBwU2V0dGluZyh7XG4gICAgICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogIXVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkU3BsaXRNZW1vV29yZDogIXNob3VsZFNwbGl0TWVtb1dvcmQsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkID0gKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRBcHBTZXR0aW5nKHtcbiAgICAgIHNob3VsZEhpZGVJbWFnZVVybDogIXNob3VsZEhpZGVJbWFnZVVybCxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVVc2VNYXJrZG93blBhcnNlckNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6ICFzaG91bGRVc2VNYXJrZG93blBhcnNlcixcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVFeHBvcnRCdG5DbGljayA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmb3JtYXRlZE1lbW9zID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKS5tZW1vcy5tYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KGZvcm1hdGVkTWVtb3MpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChqc29uU3RyKSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2RhdGEuanNvbicpO1xuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8vIGNvbnN0IGhhbmRsZUZvcm1hdE1lbW9zQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gIC8vICAgY29uc3QgbWVtb3MgPSBtZW1vU2VydmljZS5nZXRTdGF0ZSgpLm1lbW9zO1xuICAvLyAgIGZvciAoY29uc3QgbSBvZiBtZW1vcykge1xuICAvLyAgICAgbWVtb1NlcnZpY2UudXBkYXRlTWVtbyhtLmlkLCBwYXJzZUh0bWxUb1Jhd1RleHQobS5jb250ZW50KSk7XG4gIC8vICAgfVxuICAvLyB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1jb250YWluZXIgcHJlZmVyZW5jZXMtc2VjdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPk1lbW8g5pi+56S655u45YWzPC9wPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZGVtby1jb250ZW50LWNvbnRhaW5lciBtZW1vLWNvbnRlbnQtdGV4dFwiXG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KGRlbW9NZW1vQ29udGVudCl9fT48L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImZvcm0tbGFiZWwgY2hlY2tib3gtZm9ybS1sYWJlbFwiIG9uQ2xpY2s9e2hhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWR9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+5Lit6Iux5paH5YaF5a656Ieq5Yqo6Ze06ZqUPC9zcGFuPlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3Nob3VsZFNwbGl0TWVtb1dvcmQgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlVXNlTWFya2Rvd25QYXJzZXJDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumDqOWIhiBtYXJrZG93biDmoLzlvI/op6PmnpA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17c2hvdWxkVXNlTWFya2Rvd25QYXJzZXIgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumakOiXj+WbvueJh+mTvuaOpeWcsOWdgDwvc3Bhbj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzaG91bGRIaWRlSW1hZ2VVcmwgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIHByZWZlcmVuY2VzLXNlY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj7nvJbovpHlmag8L3A+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJmb3JtLWxhYmVsIGNoZWNrYm94LWZvcm0tbGFiZWxcIiBvbkNsaWNrPXtoYW5kbGVPcGVuVGlueVVuZG9DaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgICAg5ZCv55SoeycgJ31cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYm9vamFjay90aW55LXVuZG9cIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICB0aW55LXVuZG9cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17dXNlVGlueVVuZG9IaXN0b3J5Q2FjaGUgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIGhpZGRlblwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+5YW25LuWPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBleHBvcnQtYnRuXCIgb25DbGljaz17aGFuZGxlRXhwb3J0QnRuQ2xpY2t9PlxuICAgICAgICAgICAg5a+85Ye65pWw5o2uKEpTT04pXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgey8qIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGZvcm1hdC1idG5cIiBvbkNsaWNrPXtoYW5kbGVGb3JtYXRNZW1vc0J0bkNsaWNrfT5cbiAgICAgICAgICAgIOagvOW8j+WMluaVsOaNrlxuICAgICAgICAgIDwvYnV0dG9uPiAqL31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByZWZlcmVuY2VzU2VjdGlvbjtcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgUHJlZmVyZW5jZXNTZWN0aW9uIGZyb20gJy4uL2NvbXBvbmVudHMvUHJlZmVyZW5jZXNTZWN0aW9uJztcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9zZXR0aW5nLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtZW51U3ZnIGZyb20gJy4uL2ljb25zL21lbnUuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFNldHRpbmc6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicHJlZmVyZW5jZS13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24taGVhZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8T25seSB3aGVuPXtpc01vYmlsZVZpZXd9PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlU2hvd1NpZGViYXJCdG5DbGlja30+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Pbmx5PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+6LSm5Y+35LiO6K6+572uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgPFByZWZlcmVuY2VzU2VjdGlvbiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZXR0aW5nO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNZW1vcyBmcm9tICcuLi9wYWdlcy9NZW1vcyc7XG5pbXBvcnQgTWVtb1RyYXNoIGZyb20gJy4uL3BhZ2VzL01lbW9UcmFzaCc7XG5pbXBvcnQgU2V0dGluZyBmcm9tICcuLi9wYWdlcy9TZXR0aW5nJztcblxuY29uc3QgaG9tZVJvdXRlciA9IHtcbiAgJy9yZWN5Y2xlJzogPE1lbW9UcmFzaCAvPixcbiAgJy9zZXR0aW5nJzogPFNldHRpbmcgLz4sXG4gICcqJzogPE1lbW9zIC8+LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgaG9tZVJvdXRlcjtcbiIsIi8vIGltcG9ydCBhcHBSb3V0ZXIgZnJvbSBcIi4vYXBwUm91dGVyXCI7XG5pbXBvcnQgaG9tZVJvdXRlciBmcm9tICcuL2hvbWVSb3V0ZXInO1xuXG4vLyBqdXN0IGxpa2UgUmVhY3QtUm91dGVyXG5pbnRlcmZhY2UgUm91dGVyIHtcbiAgW2tleTogc3RyaW5nXTogSlNYLkVsZW1lbnQgfCBudWxsO1xuICAnKic6IEpTWC5FbGVtZW50IHwgbnVsbDtcbn1cblxuY29uc3Qgcm91dGVyU3dpdGNoID0gKHJvdXRlcjogUm91dGVyKSA9PiB7XG4gIHJldHVybiAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdXRlcikpIHtcbiAgICAgIGlmIChrZXkgPT09IHBhdGhuYW1lKSB7XG4gICAgICAgIHJldHVybiByb3V0ZXJba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlclsnKiddO1xuICB9O1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGFwcFJvdXRlclN3aXRjaCA9IHJvdXRlclN3aXRjaChhcHBSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGhvbWVSb3V0ZXJTd2l0Y2ggPSByb3V0ZXJTd2l0Y2goaG9tZVJvdXRlcik7XG4iLCJpbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9hYm91dC1zaXRlLWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xvc2UgZnJvbSAnLi4vaWNvbnMvY2xvc2Uuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge31cblxuY29uc3QgQWJvdXRTaXRlRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAoe2Rlc3Ryb3l9OiBQcm9wcykgPT4ge1xuICBjb25zdCBoYW5kbGVDbG9zZUJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn6SgPC9zcGFuPkFib3V0IDxiPk9ic2lkaWFuLU1lbW9zPC9iPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNsb3NlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUNsb3NlQnRuQ2xpY2t9PlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgSGksIEkgYW0gUXVvcmFmaW5kKEJvbmluYWxsKSwgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgcHJvamVjdCwgcGxlYXNlIHN1cHBvcnQgbXkgd29yayBhbmQgZW50aHVzaWFzbSBieVxuICAgICAgICBidXlpbmcgbWUgYSBjb2ZmZWUgb24gPGEgaHJlZj1cImh0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vYm9uaW5hbGxcIj5odHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2JvbmluYWxsPC9hPlxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly93d3cuYnV5bWVhY29mZmVlLmNvbS9ib25pbmFsbFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz17YGh0dHBzOi8vaW1nLmJ1eW1lYWNvZmZlZS5jb20vYnV0dG9uLWFwaS8/dGV4dD1CdXkgbWUgYSBjb2ZmZWUmZW1vamk9JnNsdWc9Ym9uaW5hbGwmYnV0dG9uX2NvbG91cj02NDk1RUQmZm9udF9jb2xvdXI9ZmZmZmZmJmZvbnRfZmFtaWx5PUxhdG8mb3V0bGluZV9jb2xvdXI9MDAwMDAwJmNvZmZlZV9jb2xvdXI9RkZERDAwYH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDln7rkuo4gPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0bWVtb3MvbWVtb3NcIj5tZW1vczwvYT4g5byA5rqQ6aG555uu5omA5p6E5bu655qE6aG555uu44CCIE5PVEU6IEJhc2VkIG9ueycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2p1c3RtZW1vcy9tZW1vc1wiPm1lbW9zPC9hPiBwcm9qZWN0IHRvIGJ1aWxkLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDwn4+XIFRoaXMgcHJvamVjdCBpcyB3b3JraW5nIGluIHByb2dyZXNzLCA8YnIgLz4gYW5kIHZlcnkgcGxlYXN1cmUgdG8gd2VsY29tZSB5b3VyeycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL1F1b3JhZmluZC9vYnNpZGlhbi1tZW1vcy9pc3N1ZXNcIj5pc3N1ZXM8L2E+IGFuZHsnICd9XG4gICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9RdW9yYWZpbmQvb2JzaWRpYW4tbWVtb3MvcHVsbHNcIj5QdWxsIFJlcXVlc3Q8L2E+LlxuICAgICAgICA8L3A+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgIExhc3QgdXBkYXRlZCBvbiA8c3BhbiBjbGFzc05hbWU9XCJwcmUtdGV4dFwiPjIwMjIvMDEvMDQgMjI6NTU6MTU8L3NwYW4+IPCfjolcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93QWJvdXRTaXRlRGlhbG9nKCk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2Fib3V0LXNpdGUtZGlhbG9nJyxcbiAgICB9LFxuICAgIEFib3V0U2l0ZURpYWxvZyxcbiAgKTtcbn1cbiIsImltcG9ydCB7dXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgc2hvd0Fib3V0U2l0ZURpYWxvZyBmcm9tICcuL0Fib3V0U2l0ZURpYWxvZyc7XG5pbXBvcnQgJy4uL2xlc3MvbWVudS1idG5zLXBvcHVwLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIHNob3duU3RhdHVzOiBib29sZWFuO1xuICBzZXRTaG93blN0YXR1czogKHN0YXR1czogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuY29uc3QgTWVudUJ0bnNQb3B1cDogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7c2hvd25TdGF0dXMsIHNldFNob3duU3RhdHVzfSA9IHByb3BzO1xuICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG5cbiAgY29uc3QgcG9wdXBFbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2hvd25TdGF0dXMpIHtcbiAgICAgIGNvbnN0IGhhbmRsZUNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXBvcHVwRWxSZWYuY3VycmVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2hvd25TdGF0dXMoZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZSwge1xuICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2hvd25TdGF0dXNdKTtcblxuICBjb25zdCBoYW5kbGVNeUFjY291bnRCdG5DbGljayA9ICgpID0+IHtcbiAgICBhcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoJ29ic2lkaWFuLW1lbW9zJyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWVtb3NUcmFzaEJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGxvY2F0aW9uU2VydmljZS5wdXNoSGlzdG9yeSgnL3JlY3ljbGUnKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVBYm91dEJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIHNob3dBYm91dFNpdGVEaWFsb2coKTtcbiAgfTtcblxuICAvLyBjb25zdCBoYW5kbGVTaWduT3V0QnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gIC8vICAgYXdhaXQgdXNlclNlcnZpY2UuZG9TaWduT3V0KCk7XG4gIC8vIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YG1lbnUtYnRucy1wb3B1cCAke3Nob3duU3RhdHVzID8gJycgOiAnaGlkZGVuJ31gfSByZWY9e3BvcHVwRWxSZWZ9PlxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZU15QWNjb3VudEJ0bkNsaWNrfT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfkaQ8L3NwYW4+IHt0KCdTZXR0aW5ncycpfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlTWVtb3NUcmFzaEJ0bkNsaWNrfT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfl5HvuI88L3NwYW4+IHt0KCdSZWN5Y2xlIGJpbicpfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlQWJvdXRCdG5DbGlja30+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb25cIj7wn6SgPC9zcGFuPiB7dCgnQWJvdXQgTWUnKX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgey8qIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGFjdGlvbi1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaWduT3V0QnRuQ2xpY2t9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uXCI+8J+Rizwvc3Bhbj4g6YCA5Ye6XG4gICAgICA8L2J1dHRvbj4gKi99XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNZW51QnRuc1BvcHVwO1xuIiwiaW1wb3J0IHtJTUFHRV9VUkxfUkVHLCBNQVJLRE9XTl9VUkxfUkVHLCBNQVJLRE9XTl9XRUJfVVJMX1JFRywgV0lLSV9JTUFHRV9VUkxfUkVHfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xuaW1wb3J0ICcuLi9sZXNzL2RhaWx5LW1lbW8ubGVzcyc7XG5pbXBvcnQgUmVhY3QsIHt1c2VDb250ZXh0LCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7VEZpbGUsIFZhdWx0LCBBcHB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuLy8gaW1wb3J0IGFwcENvbnRleHQgZnJvbSBcIi4uL3N0b3Jlcy9hcHBDb250ZXh0XCI7XG4vLyBpbXBvcnQgYXBwU3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9hcHBTdG9yZVwiO1xuLy8gaW1wb3J0IHsgZGFpbHlOb3Rlc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXNcIjtcblxuaW50ZXJmYWNlIERhaWx5TWVtbyBleHRlbmRzIEZvcm1hdHRlZE1lbW8ge1xuICB0aW1lU3RyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG1lbW86IE1vZGVsLk1lbW87XG59XG5cbmludGVyZmFjZSBMaW5rTWF0Y2gge1xuICBsaW5rVGV4dDogc3RyaW5nO1xuICBhbHRUZXh0OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgZmlsZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoT2ZJbWFnZSA9ICh2YXVsdDogVmF1bHQsIGltYWdlOiBURmlsZSkgPT4ge1xuICByZXR1cm4gdmF1bHQuZ2V0UmVzb3VyY2VQYXRoKGltYWdlKTtcbn07XG5cbmNvbnN0IGRldGVjdFdpa2lJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZywgYXBwOiBBcHApOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzFdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgIHBhdGg6ICcnLFxuICAgICAgZmlsZVBhdGg6ICcnLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW1hZ2VQYXRoID0gZ2V0UGF0aE9mSW1hZ2UoYXBwLnZhdWx0LCBmaWxlKTtcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcbiAgICAgICAgYWx0VGV4dDogJycsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nLCBhcHA6IEFwcCk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICAvLyBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsdmF1bHQgfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzJdO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZShhcHAudmF1bHQsIGZpbGUpO1xuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IERhaWx5TWVtbzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICAvLyBjb25zdCBwbHVnaW4gPSBNZW1vc1BsdWdpbjtcbiAgY29uc3Qge2FwcH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZTtcbiAgY29uc3Qge21lbW86IHByb3BzTWVtb30gPSBwcm9wcztcbiAgY29uc3QgbWVtbzogRGFpbHlNZW1vID0ge1xuICAgIC4uLnByb3BzTWVtbyxcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzTWVtby5jcmVhdGVkQXQpLFxuICAgIHRpbWVTdHI6IHV0aWxzLmdldFRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXG4gIH07XG4gIGxldCBleHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICBsZXQgaW50ZXJuYWxJbWFnZVVybHMgPSBbXTtcbiAgbGV0IGFsbE1hcmtkb3duTGluazogc3RyaW5nIHwgYW55W10gPSBbXTtcbiAgbGV0IGFsbEludGVybmFsTGluayA9IFtdIGFzIGFueVtdO1xuICBpZiAoSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICBsZXQgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBsZXQgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gICAgaWYgKE1BUktET1dOX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxNYXJrZG93bkxpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChXSUtJX0lNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgLy8gY29uc3QgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XG4gICAgaWYgKE1BUktET1dOX1dFQl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgICAgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9XRUJfVVJMX1JFRykpO1xuICAgIH1cbiAgICBpZiAoYWxsSW50ZXJuYWxMaW5rLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxJbnRlcm5hbExpbmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG9uZSA9IGFsbEludGVybmFsTGlua1tpXTtcbiAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RXaWtpSW50ZXJuYWxMaW5rKG9uZSwgYXBwKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvLCBhcHApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xuICAgIC8vIGV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPz8gW10pO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImRhaWx5LW1lbW8td3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aW1lLXdyYXBwZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57bWVtby50aW1lU3RyfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby1jb250ZW50LXRleHRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogZm9ybWF0TWVtb0NvbnRlbnQobWVtby5jb250ZW50KX19PjwvZGl2PlxuICAgICAgICA8T25seSB3aGVuPXtleHRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgIDxpbWcga2V5PXtpZHh9IHNyYz17aW1nVXJsfSByZWZlcnJlclBvbGljeT1cIm5vLXJlZmVycmVyXCIgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L09ubHk+XG4gICAgICAgIDxPbmx5IHdoZW49e2ludGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lciBpbnRlcm5hbC1lbWJlZCBpbWFnZS1lbWJlZCBpcy1sb2FkZWRcIj5cbiAgICAgICAgICAgIHtpbnRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgIDxpbWcga2V5PXtpZHh9IHNyYz17aW1nVXJsLnBhdGh9IGFsdD17aW1nVXJsLmFsdFRleHR9IHBhdGg9e2ltZ1VybC5maWxlUGF0aH0gLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L09ubHk+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhaWx5TWVtbztcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi8uLi9oZWxwZXJzL2NvbnN0cyc7XG5pbXBvcnQgJy4uLy4uL2xlc3MvY29tbW9uL2RhdGUtcGlja2VyLmxlc3MnO1xuaW1wb3J0IGFycm93TGVmdCBmcm9tICcuLi8uLi9pY29ucy9hcnJvdy1sZWZ0LnN2Zyc7XG5pbXBvcnQgYXJyb3dSaWdodCBmcm9tICcuLi8uLi9pY29ucy9hcnJvdy1yaWdodC5zdmcnO1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBkYXRlc3RhbXA6IERhdGVTdGFtcDtcbiAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlOiAoZGF0YXN0YW1wOiBEYXRlU3RhbXApID0+IHZvaWQ7XG59XG5cbmNvbnN0IERhdGVQaWNrZXI6IFJlYWN0LkZDPERhdGVQaWNrZXJQcm9wcz4gPSAocHJvcHM6IERhdGVQaWNrZXJQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBkYXRlc3RhbXAsIGhhbmRsZURhdGVTdGFtcENoYW5nZX0gPSBwcm9wcztcbiAgY29uc3QgW2N1cnJlbnREYXRlU3RhbXAsIHNldEN1cnJlbnREYXRlU3RhbXBdID0gdXNlU3RhdGU8RGF0ZVN0YW1wPihnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuICB9LCBbZGF0ZXN0YW1wXSk7XG5cbiAgY29uc3QgZmlyc3REYXRlID0gbmV3IERhdGUoY3VycmVudERhdGVTdGFtcCk7XG4gIGNvbnN0IGZpcnN0RGF0ZURheSA9IGZpcnN0RGF0ZS5nZXREYXkoKSA9PT0gMCA/IDcgOiBmaXJzdERhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRheUxpc3QgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdERhdGVEYXk7IGkrKykge1xuICAgIGRheUxpc3QucHVzaCh7XG4gICAgICBkYXRlOiAwLFxuICAgICAgZGF0ZXN0YW1wOiBmaXJzdERhdGUuZ2V0VGltZSgpIC0gREFJTFlfVElNRVNUQU1QICogKDcgLSBpKSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBkYXlBbW91bnQgPSBnZXRNb250aERheUFtb3VudChjdXJyZW50RGF0ZVN0YW1wKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGF5QW1vdW50OyBpKyspIHtcbiAgICBkYXlMaXN0LnB1c2goe1xuICAgICAgZGF0ZTogaSxcbiAgICAgIGRhdGVzdGFtcDogZmlyc3REYXRlLmdldFRpbWUoKSArIERBSUxZX1RJTUVTVEFNUCAqIChpIC0gMSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVEYXRlSXRlbUNsaWNrID0gKGRhdGVzdGFtcDogRGF0ZVN0YW1wKSA9PiB7XG4gICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlKGRhdGVzdGFtcCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayA9IChpOiAtMSB8IDEpID0+IHtcbiAgICBjb25zdCB5ZWFyID0gZmlyc3REYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBmaXJzdERhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgbGV0IG5leHREYXRlU3RhbXAgPSAwO1xuICAgIGlmIChtb250aCA9PT0gMSAmJiBpID09PSAtMSkge1xuICAgICAgbmV4dERhdGVTdGFtcCA9IG5ldyBEYXRlKGAke3llYXIgLSAxfS8xMi8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09IDEyICYmIGkgPT09IDEpIHtcbiAgICAgIG5leHREYXRlU3RhbXAgPSBuZXcgRGF0ZShgJHt5ZWFyICsgMX0vMS8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0RGF0ZVN0YW1wID0gbmV3IERhdGUoYCR7eWVhcn0vJHttb250aCArIGl9LzFgKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIHNldEN1cnJlbnREYXRlU3RhbXAoZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcChuZXh0RGF0ZVN0YW1wKSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YGRhdGUtcGlja2VyLXdyYXBwZXIgJHtjbGFzc05hbWV9YH0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dFwiIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNoYW5nZU1vbnRoQnRuQ2xpY2soLTEpfT5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd0xlZnR9IC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj5cbiAgICAgICAgICB7Zmlyc3REYXRlLmdldEZ1bGxZZWFyKCl9IOW5tCB7Zmlyc3REYXRlLmdldE1vbnRoKCkgKyAxfSDmnIhcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dFwiIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNoYW5nZU1vbnRoQnRuQ2xpY2soMSl9PlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLXBpY2tlci1kYXktY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGF0ZS1waWNrZXItZGF5LWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5LiAPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5LqMPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5LiJPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5ZubPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5LqUPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5YWtPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+5ZGo5pelPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7ZGF5TGlzdC5tYXAoKGQpID0+IHtcbiAgICAgICAgICBpZiAoZC5kYXRlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8c3BhbiBrZXk9e2QuZGF0ZXN0YW1wfSBjbGFzc05hbWU9XCJkYXktaXRlbSBudWxsXCI+XG4gICAgICAgICAgICAgICAgeycnfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGtleT17ZC5kYXRlc3RhbXB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGF5LWl0ZW0gJHtkLmRhdGVzdGFtcCA9PT0gZGF0ZXN0YW1wID8gJ2N1cnJlbnQnIDogJyd9YH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEYXRlSXRlbUNsaWNrKGQuZGF0ZXN0YW1wKX0+XG4gICAgICAgICAgICAgICAge2QuZGF0ZX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5mdW5jdGlvbiBnZXRNb250aERheUFtb3VudChkYXRlc3RhbXA6IERhdGVTdGFtcCk6IG51bWJlciB7XG4gIGNvbnN0IGRhdGVUZW1wID0gbmV3IERhdGUoZGF0ZXN0YW1wKTtcbiAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShgJHtkYXRlVGVtcC5nZXRGdWxsWWVhcigpfS8ke2RhdGVUZW1wLmdldE1vbnRoKCkgKyAxfS8xYCk7XG4gIGNvbnN0IG5leHRNb250aERhdGUgPVxuICAgIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgPT09IDExXG4gICAgICA/IG5ldyBEYXRlKGAke2N1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCkgKyAxfS8xLzFgKVxuICAgICAgOiBuZXcgRGF0ZShgJHtjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpfS8ke2N1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAyfS8xYCk7XG5cbiAgcmV0dXJuIChuZXh0TW9udGhEYXRlLmdldFRpbWUoKSAtIGN1cnJlbnREYXRlLmdldFRpbWUoKSkgLyBEQUlMWV9USU1FU1RBTVA7XG59XG5cbmZ1bmN0aW9uIGdldE1vbnRoRmlyc3REYXlEYXRlU3RhbXAodGltZXN0YW1wOiBUaW1lU3RhbXApOiBEYXRlU3RhbXAge1xuICBjb25zdCBkYXRlVGVtcCA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XG4gIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoYCR7ZGF0ZVRlbXAuZ2V0RnVsbFllYXIoKX0vJHtkYXRlVGVtcC5nZXRNb250aCgpICsgMX0vMWApO1xuICByZXR1cm4gY3VycmVudERhdGUuZ2V0VGltZSgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyO1xuIiwiaW1wb3J0IHt1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7bWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XG5pbXBvcnQgdXNlVG9nZ2xlIGZyb20gJy4uL2hvb2tzL3VzZVRvZ2dsZSc7XG5pbXBvcnQgdXNlTG9hZGluZyBmcm9tICcuLi9ob29rcy91c2VMb2FkaW5nJztcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCBzaG93UHJldmlld0ltYWdlRGlhbG9nIGZyb20gJy4vUHJldmlld0ltYWdlRGlhbG9nJztcbmltcG9ydCBEYWlseU1lbW8gZnJvbSAnLi9EYWlseU1lbW8nO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9jb21tb24vRGF0ZVBpY2tlcic7XG5pbXBvcnQgJy4uL2xlc3MvZGFpbHktbWVtby1kaWFyeS1kaWFsb2cubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XG5pbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcbmltcG9ydCBhcnJvd1JpZ2h0IGZyb20gJy4uL2ljb25zL2Fycm93LXJpZ2h0LnN2Zyc7XG5pbXBvcnQgc2hhcmUgZnJvbSAnLi4vaWNvbnMvc2hhcmUuc3ZnJztcbmltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHsgQXV0b1NhdmVXaGVuT25Nb2JpbGUgfSBmcm9tICcuLi9tZW1vcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSwgVEZpbGUsIG1vbWVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGdldEFsbERhaWx5Tm90ZXMgfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcbiAgY3VycmVudERhdGVTdGFtcDogRGF0ZVN0YW1wO1xufVxuXG5jb25zdCBEYWlseU1lbW9EaWFyeURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCBsb2FkaW5nU3RhdGUgPSB1c2VMb2FkaW5nKCk7XG4gIGNvbnN0IFttZW1vcywgc2V0TWVtb3NdID0gdXNlU3RhdGU8TW9kZWwuTWVtb1tdPihbXSk7XG4gIGNvbnN0IFtjdXJyZW50RGF0ZVN0YW1wLCBzZXRDdXJyZW50RGF0ZVN0YW1wXSA9IHVzZVN0YXRlKFxuICAgIHV0aWxzLmdldERhdGVTdGFtcEJ5RGF0ZSh1dGlscy5nZXREYXRlU3RyaW5nKHByb3BzLmN1cnJlbnREYXRlU3RhbXApKSxcbiAgKTtcbiAgY29uc3QgW3Nob3dEYXRlUGlja2VyLCB0b2dnbGVTaG93RGF0ZVBpY2tlcl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xuICBjb25zdCBtZW1vc0VsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZVN0YW1wKTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNldERhaWx5TWVtb3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYWlseU1lbW9zID0gbWVtb1NlcnZpY2VcbiAgICAgICAgLmdldFN0YXRlKClcbiAgICAgICAgLm1lbW9zLmZpbHRlcihcbiAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkgPj0gY3VycmVudERhdGVTdGFtcCAmJlxuICAgICAgICAgICAgdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSA8IGN1cnJlbnREYXRlU3RhbXAgKyBEQUlMWV9USU1FU1RBTVAsXG4gICAgICAgIClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpKTtcbiAgICAgIHNldE1lbW9zKGRhaWx5TWVtb3MpO1xuICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xuICAgIH07XG5cbiAgICBzZXREYWlseU1lbW9zKCk7XG4gIH0sIFtjdXJyZW50RGF0ZVN0YW1wXSk7XG5cbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XG4gICAgdmFyIGJ5dGVzID0gd2luZG93LmF0b2IoYmFzZTY0KTtcbiAgICB2YXIgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWFbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJsb2IoW2FiXSwge3R5cGU6IHR5cGV9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTaGFyZUJ0bkNsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgIHRvZ2dsZVNob3dEYXRlUGlja2VyKGZhbHNlKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFtZW1vc0VsUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b0ltYWdlKG1lbW9zRWxSZWYuY3VycmVudCwge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiAyLFxuICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHVybCkgPT4ge1xuICAgICAgICAgIGlmIChBdXRvU2F2ZVdoZW5Pbk1vYmlsZSAmJiBQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgICAgICAgY29uc3QgbXlCYXNlNjQgPSB1cmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JJbnB1dCA9IGNvbnZlcnRCYXNlNjRUb0Jsb2IobXlCYXNlNjQsICdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIGJsb2JJbnB1dC5hcnJheUJ1ZmZlcigpLnRoZW4oYXN5bmMgKGJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICBsZXQgYUZpbGU7XG4gICAgICAgICAgICAgIGxldCBuZXdGaWxlO1xuICAgICAgICAgICAgICBjb25zdCBleHQgPSAncG5nJztcbiAgICAgICAgICAgICAgY29uc3QgZGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXMoKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBzdHJpbmcgaW4gZGFpbHlOb3Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChkYWlseU5vdGVzW3N0cmluZ10gaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgICAgYUZpbGUgPSBkYWlseU5vdGVzW3N0cmluZ107XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGFGaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlQmluYXJ5KFxuICAgICAgICAgICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhcbiAgICAgICAgICAgICAgICAgICAgYFBhc3RlZCBJbWFnZSAke21vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKX1gLFxuICAgICAgICAgICAgICAgICAgICBleHQsXG4gICAgICAgICAgICAgICAgICAgIGFGaWxlLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyh1cmwpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIGRvIG50aFxuICAgICAgICB9KTtcbiAgICB9LCAwKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVEYXRhUGlja2VyQ2hhbmdlID0gKGRhdGVzdGFtcDogRGF0ZVN0YW1wKTogdm9pZCA9PiB7XG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChkYXRlc3RhbXApO1xuICAgIHRvZ2dsZVNob3dEYXRlUGlja2VyKGZhbHNlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+e3QoJ0RhaWx5IE1lbW9zJyl9PC9wPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gc2V0Q3VycmVudERhdGVTdGFtcChjdXJyZW50RGF0ZVN0YW1wIC0gREFJTFlfVElNRVNUQU1QKX0+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93TGVmdH0gLz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gc2V0Q3VycmVudERhdGVTdGFtcChjdXJyZW50RGF0ZVN0YW1wICsgREFJTFlfVElNRVNUQU1QKX0+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dCBzaGFyZS1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaGFyZUJ0bkNsaWNrfT5cbiAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17c2hhcmV9IC8+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dFwiIG9uQ2xpY2s9eygpID0+IHByb3BzLmRlc3Ryb3koKX0+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctY29udGVudC1jb250YWluZXJcIiByZWY9e21lbW9zRWxSZWZ9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtY2FyZC1jb250YWluZXJcIiBvbkNsaWNrPXsoKSA9PiB0b2dnbGVTaG93RGF0ZVBpY2tlcigpfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInllYXItdGV4dFwiPntjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGF0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9udGgtdGV4dFwiPntpMThuZXh0LnQoJ21vbnRocycsIHtyZXR1cm5PYmplY3RzOiB0cnVlfSlbY3VycmVudERhdGUuZ2V0TW9udGgoKV19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtdGV4dFwiPntjdXJyZW50RGF0ZS5nZXREYXRlKCl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRheS10ZXh0XCI+e2kxOG5leHQudCgnd2Vla0RheXMnLCB7cmV0dXJuT2JqZWN0czogdHJ1ZX0pW2N1cnJlbnREYXRlLmdldERheSgpXX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgICAgY2xhc3NOYW1lPXtgZGF0ZS1waWNrZXIgJHtzaG93RGF0ZVBpY2tlciA/ICcnIDogJ2hpZGRlbid9YH1cbiAgICAgICAgICBkYXRlc3RhbXA9e2N1cnJlbnREYXRlU3RhbXB9XG4gICAgICAgICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlPXtoYW5kbGVEYXRhUGlja2VyQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICB7bG9hZGluZ1N0YXRlLmlzTG9hZGluZyA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e3QoJ0xvYWRpbmcuLi4nKX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBtZW1vcy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCdOb29vb3AhJyl9PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGFpbHltZW1vcy13cmFwcGVyXCI+XG4gICAgICAgICAgICB7bWVtb3MubWFwKChtZW1vKSA9PiAoXG4gICAgICAgICAgICAgIDxEYWlseU1lbW8ga2V5PXtgJHttZW1vLmlkfS0ke21lbW8udXBkYXRlZEF0fWB9IG1lbW89e21lbW99IC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hvd0RhaWx5TWVtb0RpYXJ5RGlhbG9nKGRhdGVzdGFtcDogRGF0ZVN0YW1wID0gRGF0ZS5ub3coKSk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RhaWx5LW1lbW8tZGlhcnktZGlhbG9nJyxcbiAgICB9LFxuICAgIERhaWx5TWVtb0RpYXJ5RGlhbG9nLFxuICAgIHtjdXJyZW50RGF0ZVN0YW1wOiBkYXRlc3RhbXB9LFxuICApO1xufVxuIiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQgTWVudUJ0bnNQb3B1cCBmcm9tICcuL01lbnVCdG5zUG9wdXAnO1xuaW1wb3J0IHNob3dEYWlseU1lbW9EaWFyeURpYWxvZyBmcm9tICcuL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy91c2VyLWJhbm5lci5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1VzZXJOYW1lfSBmcm9tICcuLi9tZW1vcyc7XG5pbXBvcnQgbW9yZSBmcm9tICcuLi9pY29ucy9tb3JlLnN2Zyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBVc2VyQmFubmVyOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBtZW1vU3RhdGU6IHttZW1vcywgdGFnc30sXG4gICAgdXNlclN0YXRlOiB7dXNlcn0sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuICBjb25zdCB1c2VybmFtZSA9IHVzZXIgPyB1c2VyLnVzZXJuYW1lIDogVXNlck5hbWU7XG4gIGxldCBtZW1vc0xlbmd0aDtcbiAgbGV0IGNyZWF0ZWREYXlzO1xuICBpZiAobWVtb3MubGVuZ3RoKSB7XG4gICAgbWVtb3NMZW5ndGggPSBtZW1vcy5sZW5ndGggLSAxO1xuICAgIGNyZWF0ZWREYXlzID0gbWVtb3NcbiAgICAgID8gTWF0aC5jZWlsKChEYXRlLm5vdygpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKG1lbW9zW21lbW9zTGVuZ3RoXS5jcmVhdGVkQXQpKSAvIDEwMDAgLyAzNjAwIC8gMjQpICsgMVxuICAgICAgOiAwO1xuICB9XG4gIC8vIGNvbnN0IGZpcnN0TWVtbyA9IG1lbW9zW10gYXMgTW9kZWwuTWVtbztcblxuICBjb25zdCBbc2hvdWxkU2hvd1BvcHVwQnRucywgc2V0U2hvdWxkU2hvd1BvcHVwQnRuc10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgaGFuZGxlVXNlcm5hbWVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBsb2NhdGlvblNlcnZpY2UucHVzaEhpc3RvcnkoJy8nKTtcbiAgICBsb2NhdGlvblNlcnZpY2UuY2xlYXJRdWVyeSgpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlUG9wdXBCdG5DbGljayA9ICgpID0+IHtcbiAgICBjb25zdCBzaWRlYmFyRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVtb3Mtc2lkZWJhci13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcG9wdXBFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWJ0bnMtcG9wdXAnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBwb3B1cEVsLnN0eWxlLnRvcCA9IDcwIC0gc2lkZWJhckVsLnNjcm9sbFRvcCArICdweCc7XG4gICAgc2V0U2hvdWxkU2hvd1BvcHVwQnRucyh0cnVlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1iYW5uZXItY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJpbmZvLWhlYWRlci1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidXNlcm5hbWUtdGV4dFwiIG9uQ2xpY2s9e2hhbmRsZVVzZXJuYW1lQ2xpY2t9PlxuICAgICAgICAgIHt1c2VybmFtZX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIG1lbnUtcG9wdXAtYnRuXCIgb25DbGljaz17aGFuZGxlUG9wdXBCdG5DbGlja30+XG4gICAgICAgICAgPGltZyBzcmM9e21vcmV9IGNsYXNzTmFtZT1cImljb24taW1nXCIgLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8TWVudUJ0bnNQb3B1cCBzaG93blN0YXR1cz17c2hvdWxkU2hvd1BvcHVwQnRuc30gc2V0U2hvd25TdGF0dXM9e3NldFNob3VsZFNob3dQb3B1cEJ0bnN9IC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgbWVtb3MtdGV4dFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFtb3VudC10ZXh0XCI+e21lbW9zLmxlbmd0aH08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHlwZS10ZXh0XCI+TUVNTzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgdGFncy10ZXh0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYW1vdW50LXRleHRcIj57dGFncy5sZW5ndGh9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInR5cGUtdGV4dFwiPnt0KCdUQUcnKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0YXR1cy10ZXh0IGR1cmF0aW9uLXRleHRcIiBvbkNsaWNrPXsoKSA9PiBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coKX0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYW1vdW50LXRleHRcIj57Y3JlYXRlZERheXN9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInR5cGUtdGV4dFwiPnt0KCdEQVknKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBVc2VyQmFubmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7bWVtbywgdXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vLi4vaG9va3MvdXNlVG9nZ2xlJztcbmltcG9ydCAnLi4vLi4vbGVzcy9jb21tb24vc2VsZWN0b3IubGVzcyc7XG4vLyBpbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcbmltcG9ydCBhcnJvd1JpZ2h0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LXJpZ2h0LnN2Zyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBUVk9iamVjdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXRhU291cmNlOiBUVk9iamVjdFtdO1xuICBoYW5kbGVWYWx1ZUNoYW5nZWQ/OiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuY29uc3QgbnVsbEl0ZW0gPSB7XG4gIHRleHQ6IHQoJ1NFTEVDVCcpLFxuICB2YWx1ZTogJycsXG59O1xuXG5jb25zdCBTZWxlY3RvcjogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBkYXRhU291cmNlLCBoYW5kbGVWYWx1ZUNoYW5nZWQsIHZhbHVlfSA9IHByb3BzO1xuICBjb25zdCBbc2hvd1NlbGVjdG9yLCB0b2dnbGVTZWxlY3RvclN0YXR1c10gPSB1c2VUb2dnbGUoZmFsc2UpO1xuXG4gIGNvbnN0IHNlbGV0b3JFbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG5cbiAgbGV0IGN1cnJlbnRJdGVtID0gbnVsbEl0ZW07XG4gIGZvciAoY29uc3QgZCBvZiBkYXRhU291cmNlKSB7XG4gICAgaWYgKGQudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICBjdXJyZW50SXRlbSA9IGQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG93U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGhhbmRsZUNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXNlbGV0b3JFbFJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgICB0b2dnbGVTZWxlY3RvclN0YXR1cyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja091dHNpZGUsIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3Nob3dTZWxlY3Rvcl0pO1xuXG4gIGNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChpdGVtOiBUVk9iamVjdCkgPT4ge1xuICAgIGlmIChoYW5kbGVWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZChpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgdG9nZ2xlU2VsZWN0b3JTdGF0dXMoZmFsc2UpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdG9nZ2xlU2VsZWN0b3JTdGF0dXMoKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtgc2VsZWN0b3Itd3JhcHBlciAke2NsYXNzTmFtZSA/PyAnJ31gfSByZWY9e3NlbGV0b3JFbFJlZn0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YGN1cnJlbnQtdmFsdWUtY29udGFpbmVyICR7c2hvd1NlbGVjdG9yID8gJ2FjdGl2ZScgOiAnJ31gfSBvbkNsaWNrPXtoYW5kbGVDdXJyZW50VmFsdWVDbGlja30+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInZhbHVlLXRleHRcIj57Y3VycmVudEl0ZW0udGV4dH08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFycm93LXRleHRcIj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd1JpZ2h0fSAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9e2BpdGVtcy13cmFwcGVyICR7c2hvd1NlbGVjdG9yID8gJycgOiAnaGlkZGVuJ31gfT5cbiAgICAgICAge2RhdGFTb3VyY2UubWFwKChkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaXRlbS1jb250YWluZXIgJHtkLnZhbHVlID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ31gfVxuICAgICAgICAgICAgICBrZXk9e2QudmFsdWV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVJdGVtQ2xpY2soZCk7XG4gICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICB7ZC50ZXh0fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oU2VsZWN0b3IpO1xuIiwiaW1wb3J0IHttZW1vLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHttZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQge2NoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycywgZmlsdGVyQ29uc3RzLCBnZXREZWZhdWx0RmlsdGVyLCByZWxhdGlvbkNvbnN0c30gZnJvbSAnLi4vaGVscGVycy9maWx0ZXInO1xuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XG5pbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCBTZWxlY3RvciBmcm9tICcuL2NvbW1vbi9TZWxlY3Rvcic7XG5pbXBvcnQgJy4uL2xlc3MvY3JlYXRlLXF1ZXJ5LWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge05vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcbiAgcXVlcnlJZD86IHN0cmluZztcbn1cblxuY29uc3QgQ3JlYXRlUXVlcnlEaWFsb2c6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcbiAgY29uc3Qge2Rlc3Ryb3ksIHF1ZXJ5SWR9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3RpdGxlLCBzZXRUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW2ZpbHRlcnMsIHNldEZpbHRlcnNdID0gdXNlU3RhdGU8RmlsdGVyW10+KFtdKTtcbiAgY29uc3QgcmVxdWVzdFN0YXRlID0gdXNlTG9hZGluZyhmYWxzZSk7XG5cbiAgY29uc3Qgc2hvd25NZW1vTGVuZ3RoID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKS5tZW1vcy5maWx0ZXIoKG1lbW8pID0+IHtcbiAgICByZXR1cm4gY2hlY2tTaG91bGRTaG93TWVtb1dpdGhGaWx0ZXJzKG1lbW8sIGZpbHRlcnMpO1xuICB9KS5sZW5ndGg7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBxdWVyeVRlbXAgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKHF1ZXJ5SWQgPz8gJycpO1xuICAgIGlmIChxdWVyeVRlbXApIHtcbiAgICAgIHNldFRpdGxlKHF1ZXJ5VGVtcC50aXRsZSk7XG4gICAgICBjb25zdCB0ZW1wID0gSlNPTi5wYXJzZShxdWVyeVRlbXAucXVlcnlzdHJpbmcpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGVtcCkpIHtcbiAgICAgICAgc2V0RmlsdGVycyh0ZW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtxdWVyeUlkXSk7XG5cbiAgY29uc3QgaGFuZGxlVGl0bGVJbnB1dENoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZSBhcyBzdHJpbmc7XG4gICAgc2V0VGl0bGUodGV4dCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2F2ZUJ0bkNsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIG5ldyBOb3RpY2UoJ1RJVExFIENBTk5PVCBCRSBOVUxM77yBJyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV3IE5vdGljZSgnRklMVEVSIENBTk5PVCBCRSBOVUxM77yBJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChxdWVyeUlkKSB7XG4gICAgICAgIGNvbnN0IGVkaXRlZFF1ZXJ5ID0gYXdhaXQgcXVlcnlTZXJ2aWNlLnVwZGF0ZVF1ZXJ5KHF1ZXJ5SWQsIHRpdGxlLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XG4gICAgICAgIHF1ZXJ5U2VydmljZS5lZGl0UXVlcnkoZWRpdGVkUXVlcnkpO1xuICAgICAgICBxdWVyeVNlcnZpY2UuZ2V0TXlBbGxRdWVyaWVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGF3YWl0IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSh0aXRsZSwgSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgICAgICBxdWVyeVNlcnZpY2UucHVzaFF1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmdldE15QWxsUXVlcmllcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVBZGRGaWx0ZXJCZW5DbGljayA9ICgpID0+IHtcbiAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0RmlsdGVyID0gZmlsdGVyc1tmaWx0ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3RGaWx0ZXIudmFsdWUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIG5ldyBOb3RpY2UoJ+WFiOWujOWWhOS4iuS4gOS4qui/h+a7pOWZqOWQpycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0RmlsdGVycyhbLi4uZmlsdGVycywgZ2V0RGVmYXVsdEZpbHRlcigpXSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRmlsdGVyQ2hhbmdlID0gdXNlQ2FsbGJhY2soKGluZGV4OiBudW1iZXIsIGZpbHRlcjogRmlsdGVyKSA9PiB7XG4gICAgc2V0RmlsdGVycygoZmlsdGVycykgPT4ge1xuICAgICAgY29uc3QgdGVtcCA9IFsuLi5maWx0ZXJzXTtcbiAgICAgIHRlbXBbaW5kZXhdID0gZmlsdGVyO1xuICAgICAgcmV0dXJuIHRlbXA7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVGaWx0ZXJSZW1vdmUgPSB1c2VDYWxsYmFjaygoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHNldEZpbHRlcnMoKGZpbHRlcnMpID0+IHtcbiAgICAgIGNvbnN0IHRlbXAgPSBmaWx0ZXJzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgcmV0dXJuIHRlbXA7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn5SWPC9zcGFuPlxuICAgICAgICAgIHtxdWVyeUlkID8gdCgnRURJVCBRVUVSWScpIDogdCgnQ1JFQVRFIFFVRVJZJyl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17ZGVzdHJveX0+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17Y2xvc2V9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250ZW50LWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taXRlbS1jb250YWluZXIgaW5wdXQtZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdUSVRMRScpfTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwidGl0bGUtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPXt0aXRsZX0gb25DaGFuZ2U9e2hhbmRsZVRpdGxlSW5wdXRDaGFuZ2V9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taXRlbS1jb250YWluZXIgZmlsdGVyLWZvcm0tY29udGFpbmVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dCgnRklMVEVSJyl9PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVycy13cmFwcGVyXCI+XG4gICAgICAgICAgICB7ZmlsdGVycy5tYXAoKGYsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPE1lbW9GaWx0ZXJJbnB1dGVyXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgZmlsdGVyPXtmfVxuICAgICAgICAgICAgICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlPXtoYW5kbGVGaWx0ZXJDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICBoYW5kbGVGaWx0ZXJSZW1vdmU9e2hhbmRsZUZpbHRlclJlbW92ZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyZWF0ZS1maWx0ZXItYnRuXCIgb25DbGljaz17aGFuZGxlQWRkRmlsdGVyQmVuQ2xpY2t9PlxuICAgICAgICAgICAgICB7dCgnQUREIEZJTFRFUiBURVJNUycpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1mb290ZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2B0aXAtdGV4dCAke2ZpbHRlcnMubGVuZ3RoID09PSAwICYmICdoaWRkZW4nfWB9PlxuICAgICAgICAgICAge3QoJ01BVENIJyl9IE1lbW8gPHN0cm9uZz57c2hvd25NZW1vTGVuZ3RofTwvc3Ryb25nPiB7dCgnVElNRVMnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2BidG4gc2F2ZS1idG4gJHtyZXF1ZXN0U3RhdGUuaXNMb2FkaW5nID8gJ3JlcXVlc3RpbmcnIDogJyd9YH0gb25DbGljaz17aGFuZGxlU2F2ZUJ0bkNsaWNrfT5cbiAgICAgICAgICAgIFNBVkVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBNZW1vRmlsdGVySW5wdXRlclByb3BzIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgZmlsdGVyOiBGaWx0ZXI7XG4gIGhhbmRsZUZpbHRlckNoYW5nZTogKGluZGV4OiBudW1iZXIsIGZpbHRlcjogRmlsdGVyKSA9PiB2b2lkO1xuICBoYW5kbGVGaWx0ZXJSZW1vdmU6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG5jb25zdCBGaWx0ZXJJbnB1dGVyOiBSZWFjdC5GQzxNZW1vRmlsdGVySW5wdXRlclByb3BzPiA9IChwcm9wczogTWVtb0ZpbHRlcklucHV0ZXJQcm9wcykgPT4ge1xuICBjb25zdCB7aW5kZXgsIGZpbHRlciwgaGFuZGxlRmlsdGVyQ2hhbmdlLCBoYW5kbGVGaWx0ZXJSZW1vdmV9ID0gcHJvcHM7XG4gIGNvbnN0IHt0eXBlfSA9IGZpbHRlcjtcbiAgY29uc3QgW2lucHV0RWxlbWVudHMsIHNldElucHV0RWxlbWVudHNdID0gdXNlU3RhdGU8SlNYLkVsZW1lbnQ+KDw+PC8+KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBvcGVyYXRvckVsZW1lbnQgPSA8PjwvPjtcbiAgICBpZiAoT2JqZWN0LmtleXMoZmlsdGVyQ29uc3RzKS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgb3BlcmF0b3JFbGVtZW50ID0gKFxuICAgICAgICA8U2VsZWN0b3JcbiAgICAgICAgICBjbGFzc05hbWU9XCJvcGVyYXRvci1zZWxlY3RvclwiXG4gICAgICAgICAgZGF0YVNvdXJjZT17T2JqZWN0LnZhbHVlcyhmaWx0ZXJDb25zdHNbdHlwZSBhcyBGaWx0ZXJUeXBlXS5vcGVyYXRvcnMpfVxuICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUub3BlcmF0b3J9XG4gICAgICAgICAgaGFuZGxlVmFsdWVDaGFuZ2VkPXtoYW5kbGVPcGVyYXRvckNoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlRWxlbWVudCA9IDw+PC8+O1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnVFlQRSc6IHtcbiAgICAgICAgdmFsdWVFbGVtZW50ID0gKFxuICAgICAgICAgIDxTZWxlY3RvclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidmFsdWUtc2VsZWN0b3JcIlxuICAgICAgICAgICAgZGF0YVNvdXJjZT17ZmlsdGVyQ29uc3RzWydUWVBFJ10udmFsdWVzfVxuICAgICAgICAgICAgdmFsdWU9e2ZpbHRlci52YWx1ZS52YWx1ZX1cbiAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdUQUcnOiB7XG4gICAgICAgIHZhbHVlRWxlbWVudCA9IChcbiAgICAgICAgICA8U2VsZWN0b3JcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInZhbHVlLXNlbGVjdG9yXCJcbiAgICAgICAgICAgIGRhdGFTb3VyY2U9e21lbW9TZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXRTdGF0ZSgpXG4gICAgICAgICAgICAgIC50YWdzLnNvcnQoKVxuICAgICAgICAgICAgICAubWFwKCh0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt0ZXh0OiB0LCB2YWx1ZTogdH07XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgdmFsdWU9e2ZpbHRlci52YWx1ZS52YWx1ZX1cbiAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVmFsdWVDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdURVhUJzoge1xuICAgICAgICB2YWx1ZUVsZW1lbnQgPSAoXG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ2YWx1ZS1pbnB1dGVyXCJcbiAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUudmFsdWV9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJbnB1dEVsZW1lbnRzKFxuICAgICAgPD5cbiAgICAgICAge29wZXJhdG9yRWxlbWVudH1cbiAgICAgICAge3ZhbHVlRWxlbWVudH1cbiAgICAgIDwvPixcbiAgICApO1xuICB9LCBbdHlwZSwgZmlsdGVyXSk7XG5cbiAgY29uc3QgaGFuZGxlUmVsYXRpb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKFsnQU5EJywgJ09SJ10uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShpbmRleCwge1xuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICByZWxhdGlvbjogdmFsdWUgYXMgTWVtb0ZpbHRlclJhbGF0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWx0ZXJdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVR5cGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZpbHRlci50eXBlICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25zdCBvcHMgPSBPYmplY3QudmFsdWVzKGZpbHRlckNvbnN0c1t2YWx1ZSBhcyBGaWx0ZXJUeXBlXS5vcGVyYXRvcnMpO1xuICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgICAgdHlwZTogdmFsdWUgYXMgRmlsdGVyVHlwZSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgb3BlcmF0b3I6IG9wc1swXS52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWx0ZXJdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZU9wZXJhdG9yQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShpbmRleCwge1xuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgLi4uZmlsdGVyLnZhbHVlLFxuICAgICAgICAgIG9wZXJhdG9yOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2ZpbHRlcl0sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlVmFsdWVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlKGluZGV4LCB7XG4gICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAuLi5maWx0ZXIudmFsdWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFtmaWx0ZXJdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGhhbmRsZUZpbHRlclJlbW92ZShpbmRleCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tZmlsdGVyLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgIHtpbmRleCA+IDAgPyAoXG4gICAgICAgIDxTZWxlY3RvclxuICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aW9uLXNlbGVjdG9yXCJcbiAgICAgICAgICBkYXRhU291cmNlPXtyZWxhdGlvbkNvbnN0c31cbiAgICAgICAgICB2YWx1ZT17ZmlsdGVyLnJlbGF0aW9ufVxuICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlUmVsYXRpb25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxTZWxlY3RvclxuICAgICAgICBjbGFzc05hbWU9XCJ0eXBlLXNlbGVjdG9yXCJcbiAgICAgICAgZGF0YVNvdXJjZT17T2JqZWN0LnZhbHVlcyhmaWx0ZXJDb25zdHMpfVxuICAgICAgICB2YWx1ZT17ZmlsdGVyLnR5cGV9XG4gICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVHlwZUNoYW5nZX1cbiAgICAgIC8+XG5cbiAgICAgIHtpbnB1dEVsZW1lbnRzfVxuICAgICAgPGltZyBjbGFzc05hbWU9XCJyZW1vdmUtYnRuXCIgc3JjPXtjbG9zZX0gb25DbGljaz17aGFuZGxlUmVtb3ZlQnRuQ2xpY2t9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5jb25zdCBNZW1vRmlsdGVySW5wdXRlcjogUmVhY3QuRkM8TWVtb0ZpbHRlcklucHV0ZXJQcm9wcz4gPSBtZW1vKEZpbHRlcklucHV0ZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93Q3JlYXRlUXVlcnlEaWFsb2cocXVlcnlJZD86IHN0cmluZyk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2NyZWF0ZS1xdWVyeS1kaWFsb2cnLFxuICAgIH0sXG4gICAgQ3JlYXRlUXVlcnlEaWFsb2csXG4gICAge3F1ZXJ5SWR9LFxuICApO1xufVxuIiwiaW1wb3J0IHt1c2VDb250ZXh0LCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcbmltcG9ydCB1c2VMb2FkaW5nIGZyb20gJy4uL2hvb2tzL3VzZUxvYWRpbmcnO1xuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHtsb2NhdGlvblNlcnZpY2UsIHF1ZXJ5U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHNob3dDcmVhdGVRdWVyeURpYWxvZyBmcm9tICcuL0NyZWF0ZVF1ZXJ5RGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9xdWVyeS1saXN0Lmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcbmltcG9ydCBtb3JlV2hpdGUgZnJvbSAnLi4vaWNvbnMvbW9yZS13aGl0ZS5zdmcnO1xuaW1wb3J0IHtOb3RpY2V9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFF1ZXJ5TGlzdDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgcXVlcnlTdGF0ZToge3F1ZXJpZXN9LFxuICAgIGxvY2F0aW9uU3RhdGU6IHtcbiAgICAgIHF1ZXJ5OiB7ZmlsdGVyfSxcbiAgICB9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgY29uc3QgbG9hZGluZ1N0YXRlID0gdXNlTG9hZGluZygpO1xuICBjb25zdCBzb3J0ZWRRdWVyaWVzID0gcXVlcmllc1xuICAgIC5zb3J0KChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIucGlubmVkQXQgPz8gMCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5waW5uZWRBdCA/PyAwKSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBxdWVyeVNlcnZpY2VcbiAgICAgIC5nZXRNeUFsbFF1ZXJpZXMoKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gZG8gbnRoXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBsb2FkaW5nU3RhdGUuc2V0RmluaXNoKCk7XG4gICAgICB9KTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJxdWVyaWVzLXdyYXBwZXJcIj5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dCgnUVVFUlknKX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9eygpID0+IHNob3dDcmVhdGVRdWVyeURpYWxvZygpfT5cbiAgICAgICAgICArXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICAgIDxPbmx5IHdoZW49e2xvYWRpbmdTdGF0ZS5pc1N1Y2NlZWQgJiYgc29ydGVkUXVlcmllcy5sZW5ndGggPT09IDB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyZWF0ZS1xdWVyeS1idG4tY29udGFpbmVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKCl9PlxuICAgICAgICAgICAge3QoJ0NSRUFURSBGSUxURVInKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Pbmx5PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJxdWVyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICB7c29ydGVkUXVlcmllcy5tYXAoKHEpID0+IHtcbiAgICAgICAgICByZXR1cm4gPFF1ZXJ5SXRlbUNvbnRhaW5lciBrZXk9e3EuaWR9IHF1ZXJ5PXtxfSBpc0FjdGl2ZT17cS5pZCA9PT0gZmlsdGVyfSAvPjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBRdWVyeUl0ZW1Db250YWluZXJQcm9wcyB7XG4gIHF1ZXJ5OiBNb2RlbC5RdWVyeTtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG59XG5cbmNvbnN0IFF1ZXJ5SXRlbUNvbnRhaW5lcjogUmVhY3QuRkM8UXVlcnlJdGVtQ29udGFpbmVyUHJvcHM+ID0gKHByb3BzOiBRdWVyeUl0ZW1Db250YWluZXJQcm9wcykgPT4ge1xuICBjb25zdCB7cXVlcnksIGlzQWN0aXZlfSA9IHByb3BzO1xuICBjb25zdCBbc2hvd0FjdGlvbkJ0bnMsIHRvZ2dsZVNob3dBY3Rpb25CdG5zXSA9IHVzZVRvZ2dsZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93Q29uZmlybURlbGV0ZUJ0biwgdG9nZ2xlQ29uZmlybURlbGV0ZUJ0bl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xuXG4gIGNvbnN0IGhhbmRsZVF1ZXJ5Q2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmICghW1wiL1wiLCBcIi9yZWN5Y2xlXCJdLmluY2x1ZGVzKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnBhdGhuYW1lKSkge1xuICAgICAgLy8gICBsb2NhdGlvblNlcnZpY2Uuc2V0UGF0aG5hbWUoXCIvXCIpO1xuICAgICAgLy8gfVxuICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldE1lbW9GaWx0ZXIocXVlcnkuaWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTaG93QWN0aW9uQnRuQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0b2dnbGVTaG93QWN0aW9uQnRucygpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUFjdGlvbkJ0bkNvbnRhaW5lck1vdXNlTGVhdmUgPSAoKSA9PiB7XG4gICAgdG9nZ2xlU2hvd0FjdGlvbkJ0bnMoZmFsc2UpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jIChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBxdWVyeVNlcnZpY2UuZGVsZXRlUXVlcnkocXVlcnkuaWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBuZXcgTm90aWNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0b2dnbGVDb25maXJtRGVsZXRlQnRuKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRRdWVyeUJ0bkNsaWNrID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKHF1ZXJ5LmlkKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrID0gYXN5bmMgKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHF1ZXJ5LnBpbm5lZEF0KSB7XG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS51bnBpblF1ZXJ5KHF1ZXJ5LmlkKTtcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmVkaXRRdWVyeSh7XG4gICAgICAgICAgLi4ucXVlcnksXG4gICAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS5waW5RdWVyeShxdWVyeS5pZCk7XG4gICAgICAgIHF1ZXJ5U2VydmljZS5lZGl0UXVlcnkoe1xuICAgICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICAgIHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGRvIG50aFxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVEZWxldGVCdG5Nb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgcXVlcnktaXRlbS1jb250YWluZXIgJHtpc0FjdGl2ZSA/ICdhY3RpdmUnIDogJyd9YH0gb25DbGljaz17aGFuZGxlUXVlcnlDbGlja30+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVlcnktdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj4jPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInF1ZXJ5LXRleHRcIj57cXVlcnkudGl0bGV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gdG9nZ2xlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dBY3Rpb25CdG5DbGlja30+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtpc0FjdGl2ZSA/IG1vcmVXaGl0ZSA6IG1vcmV9IC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YGFjdGlvbi1idG5zLXdyYXBwZXIgJHtzaG93QWN0aW9uQnRucyA/ICcnIDogJ2hpZGRlbid9YH1cbiAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17aGFuZGxlQWN0aW9uQnRuQ29udGFpbmVyTW91c2VMZWF2ZX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFjdGlvbi1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrfT5cbiAgICAgICAgICAgICAgICB7cXVlcnkucGlubmVkQXQgPyB0KCdVTlBJTicpIDogdCgnUElOJyl9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlRWRpdFF1ZXJ5QnRuQ2xpY2t9PlxuICAgICAgICAgICAgICAgIHt0KCdFRElUJyl9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BidG4gZGVsZXRlLWJ0biAke3Nob3dDb25maXJtRGVsZXRlQnRuID8gJ2ZpbmFsLWNvbmZpcm0nIDogJyd9YH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVEZWxldGVNZW1vQ2xpY2t9XG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVEZWxldGVCdG5Nb3VzZUxlYXZlfT5cbiAgICAgICAgICAgICAgICB7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyB0KCdDT05GSVJN77yBJykgOiB0KCdERUxFVEUnKX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWVyeUxpc3Q7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0ICcuLi9sZXNzL3RhZy1saXN0Lmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcnJvd1JpZ2h0IGZyb20gJy4uL2ljb25zL2Fycm93LXJpZ2h0LnN2Zyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XG5cbmludGVyZmFjZSBUYWcge1xuICBrZXk6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBzdWJUYWdzOiBUYWdbXTtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFRhZ0xpc3Q6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtcbiAgICAgIHF1ZXJ5OiB7dGFnOiB0YWdRdWVyeX0sXG4gICAgfSxcbiAgICBtZW1vU3RhdGU6IHt0YWdzOiB0YWdzVGV4dCwgbWVtb3N9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgY29uc3QgW3RhZ3MsIHNldFRhZ3NdID0gdXNlU3RhdGU8VGFnW10+KFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG1lbW9TZXJ2aWNlLnVwZGF0ZVRhZ3NTdGF0ZSgpO1xuICB9LCBbbWVtb3NdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSBBcnJheS5mcm9tKHRhZ3NUZXh0KS5zb3J0KCk7XG4gICAgY29uc3Qgcm9vdDogS1ZPYmplY3Q8YW55PiA9IHtcbiAgICAgIHN1YlRhZ3M6IFtdLFxuICAgIH07XG4gICAgZm9yIChjb25zdCB0YWcgb2Ygc29ydGVkVGFncykge1xuICAgICAgY29uc3Qgc3VidGFncyA9IHRhZy5zcGxpdCgnLycpO1xuICAgICAgbGV0IHRlbXBPYmogPSByb290O1xuICAgICAgbGV0IHRhZ1RleHQgPSAnJztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VidGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBzdWJ0YWdzW2ldO1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgIHRhZ1RleHQgKz0ga2V5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhZ1RleHQgKz0gJy8nICsga2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9iaiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRlbXBPYmouc3ViVGFncykge1xuICAgICAgICAgIGlmICh0LnRleHQgPT09IHRhZ1RleHQpIHtcbiAgICAgICAgICAgIG9iaiA9IHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHRleHQ6IHRhZ1RleHQsXG4gICAgICAgICAgICBzdWJUYWdzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRlbXBPYmouc3ViVGFncy5wdXNoKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICB0ZW1wT2JqID0gb2JqO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRUYWdzKHJvb3Quc3ViVGFncyBhcyBUYWdbXSk7XG4gIH0sIFt0YWdzVGV4dF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ0YWdzLXdyYXBwZXJcIj5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj57dCgnRnJlcXVlbnRseSBVc2VkIFRhZ3MnKX08L3A+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRhZ3MtY29udGFpbmVyXCI+XG4gICAgICAgIHt0YWdzLm1hcCgodCwgaWR4KSA9PiAoXG4gICAgICAgICAgPFRhZ0l0ZW1Db250YWluZXIga2V5PXt0LnRleHQgKyAnLScgKyBpZHh9IHRhZz17dH0gdGFnUXVlcnk9e3RhZ1F1ZXJ5fSAvPlxuICAgICAgICApKX1cbiAgICAgICAgPE9ubHkgd2hlbj17dGFncy5sZW5ndGggPCA1ICYmIG1lbW9TZXJ2aWNlLmluaXRpYWxpemVkfT5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0YWctdGlwLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgSW5wdXQ8c3BhbiBjbGFzc05hbWU9XCJjb2RlLXRleHRcIj4jVGFnIDwvc3Bhbj50byBjcmVhdGUgdGFnLi4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L09ubHk+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBUYWdJdGVtQ29udGFpbmVyUHJvcHMge1xuICB0YWc6IFRhZztcbiAgdGFnUXVlcnk6IHN0cmluZztcbn1cblxuY29uc3QgVGFnSXRlbUNvbnRhaW5lcjogUmVhY3QuRkM8VGFnSXRlbUNvbnRhaW5lclByb3BzPiA9IChwcm9wczogVGFnSXRlbUNvbnRhaW5lclByb3BzKSA9PiB7XG4gIGNvbnN0IHt0YWcsIHRhZ1F1ZXJ5fSA9IHByb3BzO1xuICBjb25zdCBpc0FjdGl2ZSA9IHRhZ1F1ZXJ5ID09PSB0YWcudGV4dDtcbiAgY29uc3QgaGFzU3ViVGFncyA9IHRhZy5zdWJUYWdzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IFtzaG93U3ViVGFncywgdG9nZ2xlU3ViVGFnc10gPSB1c2VUb2dnbGUoZmFsc2UpO1xuXG4gIGNvbnN0IGhhbmRsZVRhZ0NsaWNrID0gKCkgPT4ge1xuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRhZ1F1ZXJ5KCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbHMuY29weVRleHRUb0NsaXBib2FyZChgIyR7dGFnLnRleHR9IGApO1xuICAgICAgaWYgKCFbJy8nLCAnL3JlY3ljbGUnXS5pbmNsdWRlcyhsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5wYXRobmFtZSkpIHtcbiAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFBhdGhuYW1lKCcvJyk7XG4gICAgICB9XG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkodGFnLnRleHQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUb2dnbGVCdG5DbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRvZ2dsZVN1YlRhZ3MoKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHRhZy1pdGVtLWNvbnRhaW5lciAke2lzQWN0aXZlID8gJ2FjdGl2ZScgOiAnJ31gfSBvbkNsaWNrPXtoYW5kbGVUYWdDbGlja30+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFnLXRleHQtY29udGFpbmVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+Izwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0YWctdGV4dFwiPnt0YWcua2V5fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICB7aGFzU3ViVGFncyA/IChcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YGFjdGlvbi1idG4gdG9nZ2xlLWJ0biAke3Nob3dTdWJUYWdzID8gJ3Nob3duJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZVRvZ2dsZUJ0bkNsaWNrfT5cbiAgICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17YXJyb3dSaWdodH0gLz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAge2hhc1N1YlRhZ3MgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgc3VidGFncy1jb250YWluZXIgJHtzaG93U3ViVGFncyA/ICcnIDogJ2hpZGRlbid9YH0+XG4gICAgICAgICAge3RhZy5zdWJUYWdzLm1hcCgoc3QsIGlkeCkgPT4gKFxuICAgICAgICAgICAgPFRhZ0l0ZW1Db250YWluZXIga2V5PXtzdC50ZXh0ICsgJy0nICsgaWR4fSB0YWc9e3N0fSB0YWdRdWVyeT17dGFnUXVlcnl9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IG51bGx9XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYWdMaXN0O1xuIiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0RBSUxZX1RJTUVTVEFNUH0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0ICcuLi9sZXNzL3VzYWdlLWhlYXQtbWFwLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgaTE4bmV4dCBmcm9tICdpMThuZXh0JztcblxuY29uc3QgdGFibGVDb25maWcgPSB7XG4gIHdpZHRoOiAxMixcbiAgaGVpZ2h0OiA3LFxufTtcblxuY29uc3QgZ2V0SW5pdGlhbFVzYWdlU3RhdCA9ICh1c2VkRGF5c0Ftb3VudDogbnVtYmVyLCBiZWdpbkRheVRpbWVzdGFtcDogbnVtYmVyKTogRGFpbHlVc2FnZVN0YXRbXSA9PiB7XG4gIGNvbnN0IGluaXRpYWxVc2FnZVN0YXQ6IERhaWx5VXNhZ2VTdGF0W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdXNlZERheXNBbW91bnQ7IGkrKykge1xuICAgIGluaXRpYWxVc2FnZVN0YXQucHVzaCh7XG4gICAgICB0aW1lc3RhbXA6IHBhcnNlSW50KG1vbWVudChiZWdpbkRheVRpbWVzdGFtcCkuYWRkKGksICdkYXlzJykuZm9ybWF0KCd4JykpLFxuICAgICAgY291bnQ6IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGluaXRpYWxVc2FnZVN0YXQ7XG59O1xuXG5pbnRlcmZhY2UgRGFpbHlVc2FnZVN0YXQge1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFVzYWdlSGVhdE1hcDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xuICBjb25zdCB0b2RheVRpbWVTdGFtcCA9IHV0aWxzLmdldERhdGVTdGFtcEJ5RGF0ZShtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSk7XG4gIGNvbnN0IHRvZGF5RGF5ID0gbmV3IERhdGUodG9kYXlUaW1lU3RhbXApLmdldERheSgpIHx8IDc7XG4gIGNvbnN0IG51bGxDZWxsID0gbmV3IEFycmF5KDcgLSB0b2RheURheSkuZmlsbCgwKTtcbiAgY29uc3QgdXNlZERheXNBbW91bnQgPSAodGFibGVDb25maWcud2lkdGggLSAxKSAqIHRhYmxlQ29uZmlnLmhlaWdodCArIHRvZGF5RGF5O1xuICBjb25zdCBiZWdpbkRheVRpbWVzdGFtcCA9IHV0aWxzLmdldERhdGVTdGFtcEJ5RGF0ZSh0b2RheVRpbWVTdGFtcCAtIHVzZWREYXlzQW1vdW50ICogREFJTFlfVElNRVNUQU1QKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QodXNlZERheXNBbW91bnQsICdkYXlzJykuZW5kT2YoJ2RheScpO1xuXG4gIGNvbnN0IHtcbiAgICBtZW1vU3RhdGU6IHttZW1vc30sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuICBjb25zdCBbYWxsU3RhdCwgc2V0QWxsU3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdFtdPihnZXRJbml0aWFsVXNhZ2VTdGF0KHVzZWREYXlzQW1vdW50LCBiZWdpbkRheVRpbWVzdGFtcCkpO1xuICBjb25zdCBbcG9wdXBTdGF0LCBzZXRQb3B1cFN0YXRdID0gdXNlU3RhdGU8RGFpbHlVc2FnZVN0YXQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2N1cnJlbnRTdGF0LCBzZXRDdXJyZW50U3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBjb250YWluZXJFbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHBvcHVwUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5ld1N0YXQ6IERhaWx5VXNhZ2VTdGF0W10gPSBnZXRJbml0aWFsVXNhZ2VTdGF0KHVzZWREYXlzQW1vdW50LCBiZWdpbkRheVRpbWVzdGFtcCk7XG4gICAgZm9yIChjb25zdCBtIG9mIG1lbW9zKSB7XG4gICAgICBjb25zdCBjcmVhdGlvbkRhdGUgPSBtb21lbnQobS5jcmVhdGVkQXQucmVwbGFjZUFsbCgnLycsICctJykpO1xuICAgICAgY29uc3QgaW5kZXggPSBjcmVhdGlvbkRhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJyk7XG4gICAgICAvLyBjb25zdCBpbmRleCA9ICh1dGlscy5nZXREYXRlU3RhbXBCeURhdGUobS5jcmVhdGVkQXQpIC0gYmVnaW5EYXlUaW1lc3RhbXApIC8gKDEwMDAgKiAzNjAwICogMjQpIC0gMTtcbiAgICAgIC8vIGlmKGluZGV4ICE9IG5ld1N0YXQubGVuZ3RoKSB7IH1cbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbmV3U3RhdC5sZW5ndGgpIHtcbiAgICAgICAgbmV3U3RhdFtpbmRleF0uY291bnQgKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0QWxsU3RhdChbLi4ubmV3U3RhdF0pO1xuICB9LCBbbWVtb3NdKTtcblxuICBjb25zdCBoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VFbnRlciA9IHVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuTW91c2VFdmVudCwgaXRlbTogRGFpbHlVc2FnZVN0YXQpID0+IHtcbiAgICBzZXRQb3B1cFN0YXQoaXRlbSk7XG4gICAgaWYgKCFwb3B1cFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2lzTW9iaWxlVmlld30gPSBnbG9iYWxTdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB0YXJnZXRFbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBzaWRlYmFyRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVtb3Mtc2lkZWJhci13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgcG9wdXBSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gdGFyZ2V0RWwub2Zmc2V0TGVmdCAtIChjb250YWluZXJFbFJlZi5jdXJyZW50Py5vZmZzZXRMZWZ0ID8/IDApICsgJ3B4JztcbiAgICBsZXQgdG9wVmFsdWUgPSB0YXJnZXRFbC5vZmZzZXRUb3A7XG4gICAgaWYgKCFpc01vYmlsZVZpZXcpIHtcbiAgICAgIHRvcFZhbHVlIC09IHNpZGViYXJFbC5zY3JvbGxUb3A7XG4gICAgfVxuICAgIHBvcHVwUmVmLmN1cnJlbnQuc3R5bGUudG9wID0gdG9wVmFsdWUgKyAncHgnO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlVXNhZ2VTdGF0SXRlbU1vdXNlTGVhdmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0UG9wdXBTdGF0KG51bGwpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlVXNhZ2VTdGF0SXRlbUNsaWNrID0gdXNlQ2FsbGJhY2soKGl0ZW06IERhaWx5VXNhZ2VTdGF0KSA9PiB7XG4gICAgaWYgKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tID09PSBpdGVtLnRpbWVzdGFtcCkge1xuICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KDAsIDApO1xuICAgICAgc2V0Q3VycmVudFN0YXQobnVsbCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmNvdW50ID4gMCkge1xuICAgICAgaWYgKCFbJy8nLCAnL3JlY3ljbGUnXS5pbmNsdWRlcyhsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5wYXRobmFtZSkpIHtcbiAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFBhdGhuYW1lKCcvJyk7XG4gICAgICB9XG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0RnJvbUFuZFRvUXVlcnkoXG4gICAgICAgIGl0ZW0udGltZXN0YW1wLFxuICAgICAgICB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoXG4gICAgICAgICAgbW9tZW50KGl0ZW0udGltZXN0YW1wICsgREFJTFlfVElNRVNUQU1QKVxuICAgICAgICAgICAgLnN1YnRyYWN0KDEsICdkYXlzJylcbiAgICAgICAgICAgIC5lbmRPZignZGF5JylcbiAgICAgICAgICAgIC5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBzZXRDdXJyZW50U3RhdChpdGVtKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhZ2UtaGVhdC1tYXAtd3JhcHBlclwiIHJlZj17Y29udGFpbmVyRWxSZWZ9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXktdGlwLXRleHQtY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e2kxOG5leHQudCgnd2Vla0RheXNTaG9ydCcsIHtyZXR1cm5PYmplY3RzOiB0cnVlfSlbMF19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj57aTE4bmV4dC50KCd3ZWVrRGF5c1Nob3J0Jywge3JldHVybk9iamVjdHM6IHRydWV9KVsyXX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPntpMThuZXh0LnQoJ3dlZWtEYXlzU2hvcnQnLCB7cmV0dXJuT2JqZWN0czogdHJ1ZX0pWzRdfTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e2kxOG5leHQudCgnd2Vla0RheXNTaG9ydCcsIHtyZXR1cm5PYmplY3RzOiB0cnVlfSlbNl19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBwb3B1cCAqL31cbiAgICAgIDxkaXYgcmVmPXtwb3B1cFJlZn0gY2xhc3NOYW1lPXsndXNhZ2UtZGV0YWlsLWNvbnRhaW5lciBwb3AtdXAgJyArIChwb3B1cFN0YXQgPyAnJyA6ICdoaWRkZW4nKX0+XG4gICAgICAgIHtwb3B1cFN0YXQ/LmNvdW50fSBtZW1vcyBvbnsnICd9XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRhdGUtdGV4dFwiPntuZXcgRGF0ZShwb3B1cFN0YXQ/LnRpbWVzdGFtcCBhcyBudW1iZXIpLnRvRGF0ZVN0cmluZygpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYWdlLWhlYXQtbWFwXCI+XG4gICAgICAgIHthbGxTdGF0Lm1hcCgodiwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gdi5jb3VudDtcbiAgICAgICAgICBjb25zdCBjb2xvckxldmVsID1cbiAgICAgICAgICAgIGNvdW50IDw9IDBcbiAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICA6IGNvdW50IDw9IDFcbiAgICAgICAgICAgICAgPyAnc3RhdC1kYXktTDEtYmcnXG4gICAgICAgICAgICAgIDogY291bnQgPD0gMlxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMi1iZydcbiAgICAgICAgICAgICAgOiBjb3VudCA8PSA0XG4gICAgICAgICAgICAgID8gJ3N0YXQtZGF5LUwzLWJnJ1xuICAgICAgICAgICAgICA6ICdzdGF0LWRheS1MNC1iZyc7XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgc3RhdC1jb250YWluZXIgJHtjb2xvckxldmVsfSAke2N1cnJlbnRTdGF0ID09PSB2ID8gJ2N1cnJlbnQnIDogJyd9ICR7XG4gICAgICAgICAgICAgICAgdG9kYXlUaW1lU3RhbXAgPT09IHYudGltZXN0YW1wID8gJ3RvZGF5JyA6ICcnXG4gICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgIG9uTW91c2VFbnRlcj17KGUpID0+IGhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUVudGVyKGUsIHYpfVxuICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9e2hhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUxlYXZlfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVVc2FnZVN0YXRJdGVtQ2xpY2sodil9XG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgICB7bnVsbENlbGwubWFwKCh2LCBpKSA9PiAoXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdC1jb250YWluZXIgbnVsbFwiIGtleT17aX0+PC9zcGFuPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VIZWF0TWFwO1xuIiwiaW1wb3J0IHt1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHtTSE9XX1NJREVSQkFSX01PQklMRV9DTEFTU05BTUV9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCB7Z2xvYmFsU3RhdGVTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgVXNlckJhbm5lciBmcm9tICcuL1VzZXJCYW5uZXInO1xuaW1wb3J0IFF1ZXJ5TGlzdCBmcm9tICcuL1F1ZXJ5TGlzdCc7XG5pbXBvcnQgVGFnTGlzdCBmcm9tICcuL1RhZ0xpc3QnO1xuaW1wb3J0IFVzYWdlSGVhdE1hcCBmcm9tICcuL1VzYWdlSGVhdE1hcCc7XG5pbXBvcnQgJy4uL2xlc3Mvc2lkZXJiYXIubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxuY29uc3QgU2lkZWJhcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgbG9jYXRpb25TdGF0ZSxcbiAgICBnbG9iYWxTdGF0ZToge2lzTW9iaWxlVmlldywgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3fSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IHdyYXBwZXJFbFJlZiA9IHVzZVJlZjxIVE1MRWxlbWVudD4obnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlT2ZXcmFwcGVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgc2lkZXJiYXJTaG93biA9IGdsb2JhbFN0YXRlU2VydmljZS5nZXRTdGF0ZSgpLnNob3dTaWRlcmJhckluTW9iaWxlVmlldztcblxuICAgICAgaWYgKCFzaWRlcmJhclNob3duKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZU9mV3JhcHBlciwge1xuICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghd3JhcHBlckVsUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICBpZiAod3JhcHBlckVsUmVmLmN1cnJlbnQ/LnBhcmVudE5vZGU/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICAgIGlmIChzaWRlcmJhclNob3duKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldFNob3dTaWRlcmJhckluTW9iaWxlVmlldyhmYWxzZSk7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2xpY2tPdXRzaWRlT2ZXcmFwcGVyLCB7XG4gICAgICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldFNob3dTaWRlcmJhckluTW9iaWxlVmlldyhmYWxzZSk7XG4gIH0sIFtsb2NhdGlvblN0YXRlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFNIT1dfU0lERVJCQVJfTU9CSUxFX0NMQVNTTkFNRSk7XG4gICAgfVxuICB9LCBbc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNNb2JpbGVWaWV3ICYmIHNob3dTaWRlcmJhckluTW9iaWxlVmlldykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2xpY2tPdXRzaWRlT2ZXcmFwcGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtpc01vYmlsZVZpZXcsIHNob3dTaWRlcmJhckluTW9iaWxlVmlld10pO1xuXG4gIHJldHVybiAoXG4gICAgPGFzaWRlIGNsYXNzTmFtZT1cIm1lbW9zLXNpZGViYXItd3JhcHBlclwiIHJlZj17d3JhcHBlckVsUmVmfT5cbiAgICAgIDxVc2VyQmFubmVyIC8+XG4gICAgICA8VXNhZ2VIZWF0TWFwIC8+XG4gICAgICA8UXVlcnlMaXN0IC8+XG4gICAgICA8VGFnTGlzdCAvPlxuICAgIDwvYXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaWRlYmFyO1xuIiwiaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG4vLyBpbXBvcnQgeyBsb2NhdGlvblNlcnZpY2UsIHVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzXCI7XG5pbXBvcnQge2hvbWVSb3V0ZXJTd2l0Y2h9IGZyb20gJy4uL3JvdXRlcnMnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IFNpZGViYXIgZnJvbSAnLi4vY29tcG9uZW50cy9TaWRlYmFyJztcbmltcG9ydCB1c2VMb2FkaW5nIGZyb20gJy4uL2hvb2tzL3VzZUxvYWRpbmcnO1xuaW1wb3J0ICcuLi9sZXNzL2hvbWUubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBIb21lKCkge1xuICBjb25zdCB7XG4gICAgbG9jYXRpb25TdGF0ZToge3BhdGhuYW1lfSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIC8vIGNvbnN0IHsgYXBwIH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpO1xuICBjb25zdCBsb2FkaW5nU3RhdGUgPSB1c2VMb2FkaW5nKCk7XG4gIC8vIGNvbnN0IHJlZnJlc2ggPSB1c2VSZWZyZXNoKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBjb25zdCB7IHVzZXIgfSA9IHVzZXJTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgLy8gaWYgKCF1c2VyKSB7XG4gICAgLy8gICB1c2VyU2VydmljZVxuICAgIC8vICAgICAuZG9TaWduSW4oKVxuICAgIC8vICAgICAuY2F0Y2goKCkgPT4ge1xuICAgIC8vICAgICAgIC8vIGRvIG50aFxuICAgIC8vICAgICB9KVxuICAgIC8vICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgLy8gICAgICAgLy8gaWYgKHVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xuICAgIC8vICAgICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xuICAgIC8vICAgICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gICBsb2NhdGlvblNlcnZpY2UucmVwbGFjZUhpc3RvcnkoXCIvc2lnbmluXCIpO1xuICAgIC8vICAgICAgIC8vIH1cbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICBsb2FkaW5nU3RhdGUuc2V0RmluaXNoKCk7XG5cbiAgICAvLyB9XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7Lyoge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyBudWxsIDogKCAqL31cbiAgICAgIDxzZWN0aW9uIGlkPVwicGFnZS13cmFwcGVyXCI+XG4gICAgICAgIDxTaWRlYmFyIC8+XG4gICAgICAgIDxtYWluIGNsYXNzTmFtZT1cImNvbnRlbnQtd3JhcHBlclwiPntob21lUm91dGVyU3dpdGNoKHBhdGhuYW1lKX08L21haW4+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgICB7LyogKX0gKi99XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvbWU7XG4iLCIoKCkgPT4ge1xuICBpZiAoIVN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCkge1xuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uIChzdHI6IGFueSwgbmV3U3RyOiBhbnkpIHtcbiAgICAgIC8vIElmIGEgcmVnZXggcGF0dGVyblxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpLnRvTG93ZXJDYXNlKCkgPT09ICdbb2JqZWN0IHJlZ2V4cF0nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uoc3RyLCBuZXdTdHIpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhIHN0cmluZ1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKHN0ciwgJ2cnKSwgbmV3U3RyKTtcbiAgICB9O1xuICB9XG59KSgpO1xuXG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiaW1wb3J0IHt1c2VDb250ZXh0LCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIb21lIGZyb20gJy4vcGFnZXMvSG9tZSc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQgJy4vbGVzcy9hcHAubGVzcyc7XG5pbXBvcnQgUHJvdmlkZXIgZnJvbSAnLi9sYWJzL1Byb3ZpZGVyJztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCAnLi9oZWxwZXJzL3BvbHlmaWxsJztcbmltcG9ydCAnLi9sZXNzL2dsb2JhbC5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIFN0cmljdEFwcCgpIHtcbiAgcmV0dXJuIChcbiAgICA8UHJvdmlkZXIgc3RvcmU9e2FwcFN0b3JlfSBjb250ZXh0PXthcHBDb250ZXh0fT5cbiAgICAgIDxBcHAgLz5cbiAgICA8L1Byb3ZpZGVyPlxuICApO1xufVxuXG5mdW5jdGlvbiBBcHAoKSB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlOiB7cGF0aG5hbWV9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVdpbmRvd1Jlc2l6ZSA9ICgpID0+IHtcbiAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRJc01vYmlsZVZpZXcoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8PSA4NzUpO1xuICAgIH07XG5cbiAgICBoYW5kbGVXaW5kb3dSZXNpemUoKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVXaW5kb3dSZXNpemUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVXaW5kb3dSZXNpemUpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8SG9tZSAvPlxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTdHJpY3RBcHA7XG4iLCJpbXBvcnQge1dvcmtzcGFjZUxlYWYsIEl0ZW1WaWV3LCBIb3ZlclBvcG92ZXIsIFRGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge01FTU9TX1ZJRVdfVFlQRX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgQXBwIGZyb20gJy4vQXBwJztcbmltcG9ydCB0eXBlIE1lbW9zUGx1Z2luIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4vc2VydmljZXMnO1xuaW1wb3J0IHtnZXREYXRlRnJvbUZpbGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBNZW1vcyBleHRlbmRzIEl0ZW1WaWV3IHtcbiAgcGx1Z2luOiBNZW1vc1BsdWdpbjtcbiAgaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsO1xuICBwcml2YXRlIG1lbW9zQ29tcG9uZW50OiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBNZW1vc1BsdWdpbikge1xuICAgIHN1cGVyKGxlYWYpO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG4gICAgLy8gdGhpcy5wbHVnaW4uc2V0dGluZ3MgPSBudWxsO1xuICAgIC8vIFx0cGx1Z2luLnNldHRpbmdzLnN1YnNjcmliZSgodmFsOmFueSkgPT4ge1xuICAgIC8vIFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MgPSB2YWw7XG5cbiAgICAvLyBcdC8vIFJlZnJlc2ggdGhlIGNhbGVuZGFyIGlmIHNldHRpbmdzIGNoYW5nZVxuICAgIC8vIFx0aWYgKHRoaXMubWVtb3NDb21wb25lbnQpIHtcbiAgICAvLyBcdFx0dXNlUmVmcmVzaCgpO1xuICAgIC8vIFx0fVxuICAgIC8vIFx0fSk7XG4gIH1cblxuICBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBpbnRlcmFjdGl2ZTogRWl0aGVyIHRoZSBhY3RpdmUgd29ya3NwYWNlIG9yIHRoZSBsb2NhbCBncmFwaFxuICAgIHJldHVybiAnTWVtb3MnO1xuICB9XG5cbiAgZ2V0SWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnTWVtb3MnO1xuICB9XG5cbiAgZ2V0Vmlld1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTUVNT1NfVklFV19UWVBFO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1lbW9zU2V0dGluZ3NVcGRhdGUoKTogdm9pZCB7XG4gICAgbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xuICAgIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25GaWxlRGVsZXRlZChmaWxlOiBURmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChnZXREYXRlRnJvbUZpbGUoZmlsZSwgJ2RheScpKSB7XG4gICAgICBhd2FpdCBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcbiAgICAgIG1lbW9TZXJ2aWNlLmNsZWFyTWVtb3MoKTtcbiAgICAgIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG9uRmlsZU1vZGlmaWVkKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShmaWxlLCAnZGF5Jyk7XG5cbiAgICBpZiAoZGF0ZSAmJiB0aGlzLm1lbW9zQ29tcG9uZW50KSB7XG4gICAgICAvLyBtZW1vU2VydmljZS5jbGVhck1lbW9zKCk7XG4gICAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbGVDcmVhdGVkKGZpbGU6IFRGaWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSAmJiB0aGlzLm1lbW9zQ29tcG9uZW50KSB7XG4gICAgICBpZiAoZ2V0RGF0ZUZyb21GaWxlKGZpbGUsICdkYXknKSkge1xuICAgICAgICBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcbiAgICAgICAgLy8gbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xuICAgICAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMub25NZW1vc1NldHRpbmdzVXBkYXRlID0gdGhpcy5vbk1lbW9zU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRmlsZUNyZWF0ZWQgPSB0aGlzLm9uRmlsZUNyZWF0ZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRmlsZURlbGV0ZWQgPSB0aGlzLm9uRmlsZURlbGV0ZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRmlsZU1vZGlmaWVkID0gdGhpcy5vbkZpbGVNb2RpZmllZC5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5wbHVnaW4uYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lbW9zQ29tcG9uZW50KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGxlYXZlcyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcbiAgICAgICAgaWYgKCEobGVhdmVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XG4gICAgICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xuICAgICAgICBsZXQgc2lkZWJhcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYWdlOiBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcubWVtb3Mtc2lkZWJhci13cmFwcGVyJykpIHtcbiAgICAgICAgICBzaWRlYmFyID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZW1vcy1zaWRlYmFyLXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaWRlYmFyID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZW1vcy1zaWRlYmFyLXdyYXBwZXItZGlzcGxheScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNvbnRlbnQtd3JhcHBlcicpKSB7XG4gICAgICAgICAgcGFnZSA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFnZSA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyLXBhZGRpbmctZml4JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc3QgcGFnZSA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChzaWRlICE9PSB1bmRlZmluZWQgJiYgKHNpZGUgPT09ICdsZWZ0JyB8fCBzaWRlID09PSAncmlnaHQnKSkge1xuICAgICAgICAgIGlmICghc2lkZWJhcj8uY2xhc3NOYW1lLmNvbnRhaW5zKCdtZW1vcy1zaWRlYmFyLXdyYXBwZXItZGlzcGxheScpICYmIHBhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2lkZWJhci5jbGFzc05hbWUgPSAnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknO1xuICAgICAgICAgICAgcGFnZS5jbGFzc05hbWUgPSAnY29udGVudC13cmFwcGVyLXBhZGRpbmctZml4JztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNpZGViYXI/LmNsYXNzTGlzdC5jb250YWlucygnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknKSAmJiBwYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNpZGViYXIuY2xhc3NOYW1lID0gJ21lbW9zLXNpZGViYXItd3JhcHBlcic7XG4gICAgICAgICAgICBwYWdlLmNsYXNzTmFtZSA9ICdjb250ZW50LXdyYXBwZXInO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAoPGFueT50aGlzLmFwcC53b3Jrc3BhY2UpLm9uKCdvYnNpZGlhbi1tZW1vczpzZXR0aW5ncy11cGRhdGVkJywgdGhpcy5vbk1lbW9zU2V0dGluZ3NVcGRhdGUpLFxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2NyZWF0ZScsIHRoaXMub25GaWxlQ3JlYXRlZCkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5vbkZpbGVEZWxldGVkKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdtb2RpZnknLCB0aGlzLm9uRmlsZU1vZGlmaWVkKSk7XG5cbiAgICBkYWlseU5vdGVzU2VydmljZS5nZXRBcHAodGhpcy5hcHApO1xuICAgIEluc2VydEFmdGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5zZXJ0QWZ0ZXI7XG4gICAgVXNlck5hbWUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyTmFtZTtcbiAgICBQcm9jZXNzRW50cmllc0JlbG93ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuUHJvY2Vzc0VudHJpZXNCZWxvdztcbiAgICBTYXZlTWVtb0J1dHRvbkxhYmVsID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbDtcbiAgICBEZWZhdWx0UHJlZml4ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdFByZWZpeDtcbiAgICBJbnNlcnREYXRlRm9ybWF0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5zZXJ0RGF0ZUZvcm1hdDtcbiAgICBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0RWRpdG9yTG9jYXRpb247XG4gICAgVXNlQnV0dG9uVG9TaG93RWRpdG9yID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlQnV0dG9uVG9TaG93RWRpdG9yO1xuICAgIEZvY3VzT25FZGl0b3IgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yO1xuICAgIE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3M7XG4gICAgSGlkZURvbmVUYXNrcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkhpZGVEb25lVGFza3M7XG4gICAgU2hhcmVGb290ZXJTdGFydCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyU3RhcnQ7XG4gICAgU2hhcmVGb290ZXJFbmQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlckVuZDtcbiAgICBPcGVuTWVtb3NBdXRvbWF0aWNhbGx5ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuT3Blbk1lbW9zQXV0b21hdGljYWxseTtcbiAgICAvLyBFZGl0b3JNYXhIZWlnaHQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5FZGl0b3JNYXhIZWlnaHQ7XG4gICAgU2hvd1RpbWUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93VGltZTtcbiAgICBTaG93RGF0ZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dEYXRlO1xuICAgIEFkZEJsYW5rTGluZVdoZW5EYXRlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuQWRkQmxhbmtMaW5lV2hlbkRhdGU7XG4gICAgQXV0b1NhdmVXaGVuT25Nb2JpbGUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZTtcblxuICAgIHRoaXMubWVtb3NDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KEFwcCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIFJlYWN0RE9NLnJlbmRlcih0aGlzLm1lbW9zQ29tcG9uZW50LCAodGhpcyBhcyBhbnkpLmNvbnRlbnRFbCk7XG4gIH1cblxuICBhc3luYyBvbkNsb3NlKCkge1xuICAgIC8vIE5vdGhpbmcgdG8gY2xlYW4gdXAuXG4gIH1cbn1cblxuZXhwb3J0IGxldCBJbnNlcnRBZnRlcjogc3RyaW5nO1xuZXhwb3J0IGxldCBVc2VyTmFtZTogc3RyaW5nO1xuZXhwb3J0IGxldCBQcm9jZXNzRW50cmllc0JlbG93OiBzdHJpbmc7XG5leHBvcnQgbGV0IFNhdmVNZW1vQnV0dG9uTGFiZWw6IHN0cmluZztcbmV4cG9ydCBsZXQgRGVmYXVsdFByZWZpeDogc3RyaW5nO1xuZXhwb3J0IGxldCBJbnNlcnREYXRlRm9ybWF0OiBzdHJpbmc7XG5leHBvcnQgbGV0IERlZmF1bHRFZGl0b3JMb2NhdGlvbjogc3RyaW5nO1xuZXhwb3J0IGxldCBVc2VCdXR0b25Ub1Nob3dFZGl0b3I6IGJvb2xlYW47XG5leHBvcnQgbGV0IEZvY3VzT25FZGl0b3I6IGJvb2xlYW47XG5leHBvcnQgbGV0IE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zOiBib29sZWFuO1xuZXhwb3J0IGxldCBIaWRlRG9uZVRhc2tzOiBib29sZWFuO1xuZXhwb3J0IGxldCBTaGFyZUZvb3RlclN0YXJ0OiBzdHJpbmc7XG5leHBvcnQgbGV0IFNoYXJlRm9vdGVyRW5kOiBzdHJpbmc7XG5leHBvcnQgbGV0IE9wZW5NZW1vc0F1dG9tYXRpY2FsbHk6IGJvb2xlYW47XG4vLyBleHBvcnQgbGV0IEVkaXRvck1heEhlaWdodDogc3RyaW5nO1xuZXhwb3J0IGxldCBTaG93VGltZTogYm9vbGVhbjtcbmV4cG9ydCBsZXQgU2hvd0RhdGU6IGJvb2xlYW47XG5leHBvcnQgbGV0IEFkZEJsYW5rTGluZVdoZW5EYXRlOiBib29sZWFuO1xuZXhwb3J0IGxldCBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogYm9vbGVhbjtcbiIsImltcG9ydCB7YWRkSWNvbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5jb25zdCBpY29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTWVtb3M6IGA8c3ZnIHQ9XCIxNjQxMzQ4NTA3MzM5XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCIyMTIwXCIgd2lkdGg9XCIxMDBcIiBoZWlnaHQ9XCIxMDBcIj48cGF0aCBkPVwiTTEyNi42OTI2NTMgNDc4LjA5OTYzOWwtOTAuNzU3MjgxIDBjLTE5LjAxOTQwOCAwLTM0LjQzNzMzNiAxNS40MjM5MjMtMzQuNDM3MzM2IDM0LjQxNzM1NiAwIDE4Ljk5MjQzNCAxNS40MTY5MjkgMzQuNDc3Mjk3IDM0LjQzNzMzNiAzNC40NzcyOTdsOTAuNzU3MjgxIDBjMTkuMDEzNDE0IDAgMzQuNDIzMzUtMTUuNDg0ODYzIDM0LjQyMzM1LTM0LjQ3NzI5N0MxNjEuMTE2MDAzIDQ5My41MjM1NjEgMTQ1LjcwNjA2NyA0NzguMDk5NjM5IDEyNi42OTI2NTMgNDc4LjA5OTYzOXpNMjQ0LjY2MjMzMyAyNDMuNTI2OTQzYzEzLjc0MjU2Ni0xMy4xMTAxODQgMTQuMzEwMDExLTM0Ljk0ODgzNiAxLjE4NTg0MS00OC43MDYzODhsLTYyLjY0NDc2Mi02NS42Njg4MDZjLTEzLjEyODE2Ny0xMy43NjI1NDctMzQuOTc0ODExLTE0LjIyOTA5MS00OC43MTczNzctMS4xMTg5MDZzLTE0LjI2MTA1OSAzNC45MTE4NzItMS4xMzI4OTMgNDguNjc0NDE5bDYyLjY0NDc2MiA2NS42Njg4MDZDMjA5LjEyMzA3NCAyNTYuMTMyNjIgMjMwLjkxOTc2NyAyNTYuNjM3MTI3IDI0NC42NjIzMzMgMjQzLjUyNjk0M3pNNTQzLjA2NjYzMSA5NTcuNDIyMDgzbC02MC42MDM3NTcgMGMtMTguNjU0NzY0IDAtMzMuNzk0OTY0IDE1LjE0NzE5My0zMy43OTQ5NjQgMzMuODYyODk4IDAgMTguNjYxNzU3IDE1LjE0MDIgMzIuNzE1MDIgMzMuNzk0OTY0IDMyLjcxNTAybDYwLjYwMzc1NyAwYzE4LjY1NDc2NCAwIDMzLjc5NDk2NC0xNC4wNTMyNjIgMzMuNzk0OTY0LTMyLjcxNTAyQzU3Ni44NjE1OTUgOTcyLjU2ODI3NyA1NjEuNzIxMzk1IDk1Ny40MjIwODMgNTQzLjA2NjYzMSA5NTcuNDIyMDgzek05ODguMDc2NjE3IDQ3OS4wNTA3MDlsLTkwLjc1NzI4MSAwYy0xOS4wMTk0MDggMC0zNC40MzczMzYgMTUuNDIzOTIzLTM0LjQzNzMzNiAzNC40MTczNTZzMTUuNDE2OTI5IDM0LjQ3NzI5NyAzNC40MzczMzYgMzQuNDc3Mjk3bDkwLjc1NzI4MSAwYzE5LjAxMzQxNCAwIDM0LjQyMzM1LTE1LjQ4NDg2MyAzNC40MjMzNS0zNC40NzcyOTdTMTAwNy4wOTAwMyA0NzkuMDUwNzA5IDk4OC4wNzY2MTcgNDc5LjA1MDcwOXpNNTEyLjI2ODczNyAxOTIuNzY1NTY0Yy0xNzIuNzM3MTQzIDAtMzEyLjc1NTI3IDE1MC4wNzkyOTItMzEyLjc1NTI3IDMyMi43NDY1MDMgMCAxMjUuNjMwMTkyIDc0LjA4MDU4MyAyMzMuOTU3Mjk4IDE4MC45MzYxMjggMjgzLjcwMzY2OWwwIDg0LjUxODM4YzAgMTYuNzYyNjE0IDE1LjQxMDkzNSAzMS4zNTQzNSAzNC40MjMzNSAzMS4zNTQzNSAwLjU5ODQxNSAwIDEuMTkzODMzLTAuMDE0OTg1IDEuNzg1MjU1LTAuMDQyOTU4IDAuNjE4Mzk1IDAuMDI2OTc0IDEuMjM5Nzg4IDAuMDQyOTU4IDEuODY3MTc1IDAuMDQyOTU4bDE4Ny40Nzk3MzEgMGM1LjkwNTIyNyAwIDExLjQ1NTgwMi0xLjIyMDgwNyAxNi4yODgwNzgtMy40Nzc2MDEgMTIuMjMxMDQ0LTQuNjU3NDQ3IDIwLjc5NTY3MS0xNS4zODM5NjIgMjAuNzk1NjcxLTI3Ljg3NTc1bDAtODQuMDUyODM1YzEwNy4zOTEwMjEtNDkuNTM0NTc4IDE4MS45MzUxNTEtMTU4LjE0NzQwNSAxODEuOTM1MTUxLTI4NC4xNjgyMTRDODI1LjAyNDAwNyAzNDIuODQzODU3IDY4NC45OTc4ODggMTkyLjc2NTU2NCA1MTIuMjY4NzM3IDE5Mi43NjU1NjR6TTU3NC44NjM1NDggNzQyLjcxMzk2OGwwIDgwLjE3MDYzYzAgMy4xNTk5MTEtMC4yMjE3ODMgNS45NzYxNTgtMC42NDIzNzIgOC40OTY2OTRsMCAxOS4wOTIzMzYtMTI0LjkxMDg5NSAwIDAtMTcuNzE3NjhjLTAuNDIzNTg2LTIuODU2MjA4LTAuNjQyMzcyLTYuMTIzMDE1LTAuNjQyMzcyLTkuODcwMzUxbDAtODAuNDQzMzYzYy05OS4yMDQwMjQtMjcuNzUzODctMTcxLjk3MDg5Mi0xMTguODIxODQ3LTE3MS45NzA4OTItMjI2LjkzMDE2NyAwLTEzMC4wOTQ4MjcgMTA1LjQ2ODktMjQ1LjUwNzAwNyAyMzUuNTcxNzE5LTI0NS41MDcwMDdzMjM1LjU2MzcyNyAxMTUuNDEyMTggMjM1LjU2MzcyNyAyNDUuNTA3MDA3Qzc0Ny44MzI0NjUgNjIzLjk4NDAzMSA2NzQuNTc4MDc0IDcxNS4yOTM3NzIgNTc0Ljg2MzU0OCA3NDIuNzEzOTY4ek04OTUuNDA3MjA0IDEyOS4zMjg1NzZjLTEzLjQyOTg3Mi0xMy40Mjk4NzItMzUuMjMzNTU4LTEzLjQzOTg2Mi00OC42Nzc0MTYgMC4wMDQ5OTVsLTY0LjE3NDI2NyA2NC4xNzUyNjZjLTEzLjQ0ODg1MyAxMy40NDg4NTMtMTMuNDQzODU4IDM1LjI1NzUzNC0wLjAxMzk4NiA0OC42ODc0MDYgMTMuNDI5ODcyIDEzLjQyOTg3MiAzNS4yODE1MTEgMTMuNDc3ODI1IDQ4LjczMDM2NCAwLjAyODk3Mmw2NC4xNzUyNjYtNjQuMTc1MjY2QzkwOC44ODkwMjUgMTY0LjYwNTA5MiA5MDguODM3MDc2IDE0Mi43NTg0NDggODk1LjQwNzIwNCAxMjkuMzI4NTc2ek01MTEuNzk2MTk5IDE1OS42MTc5NjdjMTguOTkyNDM0IDAgMzQuNDE3MzU2LTE1LjQxMDkzNSAzNC40MTczNTYtMzQuNDIzMzVsMC05MC43NTcyODFjMC0xOS4wMTk0MDgtMTUuNDIzOTIzLTM0LjQzNzMzNi0zNC40MTczNTYtMzQuNDM3MzM2LTE4Ljk5MjQzNCAwLTM0LjQ3NzI5NyAxNS40MTY5MjktMzQuNDc3Mjk3IDM0LjQzNzMzNmwwIDkwLjc1NzI4MUM0NzcuMzE3OTAzIDE0NC4yMDgwMzEgNDkyLjgwMjc2NiAxNTkuNjE3OTY3IDUxMS43OTYxOTkgMTU5LjYxNzk2N3pcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgcC1pZD1cIjIxMjFcIj48L3BhdGg+PC9zdmc+YCxcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRJY29ucygpIHtcbiAgT2JqZWN0LmtleXMoaWNvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGFkZEljb24oa2V5LCBpY29uc1trZXldKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge0FwcCwgRHJvcGRvd25Db21wb25lbnQsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmd9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIE1lbW9zUGx1Z2luIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IG1lbW9TZXJ2aWNlIGZyb20gJy4vc2VydmljZXMvbWVtb1NlcnZpY2UnO1xuaW1wb3J0IHt0fSBmcm9tICcuL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9zU2V0dGluZ3Mge1xuICBTdGFydERhdGU6IHN0cmluZztcbiAgSW5zZXJ0QWZ0ZXI6IHN0cmluZztcbiAgVXNlck5hbWU6IHN0cmluZztcbiAgUHJvY2Vzc0VudHJpZXNCZWxvdzogc3RyaW5nO1xuICBMYW5ndWFnZTogc3RyaW5nO1xuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiBzdHJpbmc7XG4gIFNoYXJlRm9vdGVyU3RhcnQ6IHN0cmluZztcbiAgU2hhcmVGb290ZXJFbmQ6IHN0cmluZztcbiAgRGVmYXVsdFByZWZpeDogc3RyaW5nO1xuICBJbnNlcnREYXRlRm9ybWF0OiBzdHJpbmc7XG4gIERlZmF1bHRFZGl0b3JMb2NhdGlvbjogc3RyaW5nO1xuICBVc2VCdXR0b25Ub1Nob3dFZGl0b3I6IGJvb2xlYW47XG4gIEZvY3VzT25FZGl0b3I6IGJvb2xlYW47XG4gIE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zOiBib29sZWFuO1xuICBIaWRlRG9uZVRhc2tzOiBib29sZWFuO1xuICBPcGVuTWVtb3NBdXRvbWF0aWNhbGx5OiBib29sZWFuO1xuICAvLyBFZGl0b3JNYXhIZWlnaHQ6IHN0cmluZztcbiAgU2hvd1RpbWU6IGJvb2xlYW47XG4gIFNob3dEYXRlOiBib29sZWFuO1xuICBBZGRCbGFua0xpbmVXaGVuRGF0ZTogYm9vbGVhbjtcbiAgQXV0b1NhdmVXaGVuT25Nb2JpbGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNZW1vc1NldHRpbmdzID0ge1xuICBTdGFydERhdGU6ICdTdW5kYXknLFxuICBJbnNlcnRBZnRlcjogJyMgSm91cm5hbCcsXG4gIFVzZXJOYW1lOiAnTUVNTyDwn5iJJyxcbiAgUHJvY2Vzc0VudHJpZXNCZWxvdzogJycsXG4gIExhbmd1YWdlOiAnZW4nLFxuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiAnTk9URUlUJyxcbiAgU2hhcmVGb290ZXJTdGFydDogJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheScsXG4gIFNoYXJlRm9vdGVyRW5kOiAn4pyN77iPIGJ5IHtVc2VyTmFtZX0nLFxuICBEZWZhdWx0UHJlZml4OiAnTGlzdCcsXG4gIEluc2VydERhdGVGb3JtYXQ6ICdUYXNrcycsXG4gIERlZmF1bHRFZGl0b3JMb2NhdGlvbjogJ1RvcCcsXG4gIFVzZUJ1dHRvblRvU2hvd0VkaXRvcjogZmFsc2UsXG4gIEZvY3VzT25FZGl0b3I6IHRydWUsXG4gIE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zOiB0cnVlLFxuICBIaWRlRG9uZVRhc2tzOiBmYWxzZSxcbiAgT3Blbk1lbW9zQXV0b21hdGljYWxseTogZmFsc2UsXG4gIC8vIEVkaXRvck1heEhlaWdodDogJzI1MCcsXG4gIFNob3dUaW1lOiB0cnVlLFxuICBTaG93RGF0ZTogdHJ1ZSxcbiAgQWRkQmxhbmtMaW5lV2hlbkRhdGU6IGZhbHNlLFxuICBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogZmFsc2UsXG59O1xuXG5leHBvcnQgY2xhc3MgTWVtb3NTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHBsdWdpbjogTWVtb3NQbHVnaW47XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIHByaXZhdGUgYXBwbHlEZWJvdW5jZVRpbWVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IE1lbW9zUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgYXBwbHlTZXR0aW5nc1VwZGF0ZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5hcHBseURlYm91bmNlVGltZXIpO1xuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGx1Z2luO1xuICAgIHRoaXMuYXBwbHlEZWJvdW5jZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgIH0sIDEwMCk7XG4gICAgbWVtb1NlcnZpY2UudXBkYXRlVGFnc1N0YXRlKCk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBhc3luYyBoaWRlKCkge31cblxuICBhc3luYyBkaXNwbGF5KCkge1xuICAgIGF3YWl0IHRoaXMucGx1Z2luLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogdCgnQmFzaWMgT3B0aW9ucycpfSk7XG4gICAgLy8gY29udGFpbmVyRWwuY3JlYXRlRGl2KFwiXCIsIChlbCkgPT4ge1xuICAgIC8vICAgZWwuaW5uZXJIVE1MID0gXCJCYXNpYyBPcHRpb25zXCI7XG4gICAgLy8gfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ1VzZXIgbmFtZSBpbiBNZW1vcycpKVxuICAgICAgLnNldERlc2ModChcIlNldCB5b3VyIHVzZXIgbmFtZSBoZXJlLiAnTWVtb3Mg8J+YjycgQnkgZGVmYXVsdFwiKSlcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICB0ZXh0XG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuVXNlck5hbWUpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJOYW1lKVxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJOYW1lID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ0luc2VydCBhZnRlciBoZWFkaW5nJykpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgdCgnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nKSxcbiAgICAgIClcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICB0ZXh0XG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuSW5zZXJ0QWZ0ZXIpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydEFmdGVyKVxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydEFmdGVyID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ1Byb2Nlc3MgTWVtb3MgYmVsb3cnKSlcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICB0KFxuICAgICAgICAgICdPbmx5IGVudHJpZXMgYmVsb3cgdGhpcyBzdHJpbmcvc2VjdGlvbiBpbiB5b3VyIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkLiBJZiBpdCBkb2VzIG5vdCBleGlzdCBubyBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZCBmb3IgdGhhdCBmaWxlLicsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlByb2Nlc3NFbnRyaWVzQmVsb3cpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlByb2Nlc3NFbnRyaWVzQmVsb3cpXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuUHJvY2Vzc0VudHJpZXNCZWxvdyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJykpXG4gICAgICAuc2V0RGVzYyh0KFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiKSlcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICB0ZXh0XG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuU2F2ZU1lbW9CdXR0b25MYWJlbClcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbClcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TYXZlTWVtb0J1dHRvbkxhYmVsID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnKSlcbiAgICAgIC5zZXREZXNjKHQoJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MuIEZvY3VzIGJ5IGRlZmF1bHQuJykpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodCgnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnKSlcbiAgICAgIC5zZXREZXNjKHQoJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zLiBPcGVuIGJ5IGRlZmF1bHQuJykpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3MgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnKSlcbiAgICAgIC5zZXREZXNjKHQoJ1doZW4gZW5hYmxlIHRoaXMsIE1lbW9zIHdpbGwgb3BlbiB3aGVuIE9ic2lkaWFuIG9wZW5zLiBGYWxzZSBieSBkZWZhdWx0LicpKVxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuT3Blbk1lbW9zQXV0b21hdGljYWxseSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuT3Blbk1lbW9zQXV0b21hdGljYWxseSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnKSlcbiAgICAgIC5zZXREZXNjKHQoJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nKSlcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkhpZGVEb25lVGFza3MpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkhpZGVEb25lVGFza3MgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogdCgnQWR2YW5jZWQgT3B0aW9ucycpfSk7XG5cbiAgICAvLyBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAvLyAgIC5zZXROYW1lKCdTZXQgVGhlIE1heC1IZWlnaHQgZm9yIEVkaXRvcicpXG4gICAgLy8gICAuc2V0RGVzYyhcIlNldCB0aGUgbWF4IGhlaWdodCBmb3IgZWRpdG9yIGluIE1lbW9zLiAnMjUwJyBCeSBkZWZhdWx0XCIpXG4gICAgLy8gICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAvLyAgICAgdGV4dFxuICAgIC8vICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLkVkaXRvck1heEhlaWdodClcbiAgICAvLyAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRWRpdG9yTWF4SGVpZ2h0KVxuICAgIC8vICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAvLyAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkVkaXRvck1heEhlaWdodCA9IHZhbHVlO1xuICAgIC8vICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgLy8gICAgICAgfSksXG4gICAgLy8gICApO1xuXG4gICAgbGV0IGRyb3Bkb3duOiBEcm9wZG93bkNvbXBvbmVudDtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodCgnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnKSlcbiAgICAgIC5zZXREZXNjKHQoXCJUcmFuc2xhdGVzIHRoZSBkYXRlIFVJIGxhbmd1YWdlLiBPbmx5ICdlbicgYW5kICd6aCcgYXJlIGF2YWlsYWJsZS5cIikpXG4gICAgICAuYWRkRHJvcGRvd24oYXN5bmMgKGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XG4gICAgICAgIGRyb3Bkb3duID0gZDtcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCd6aCcsICfkuK3mlocnKTtcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdlbicsICdFbmdsaXNoJyk7XG4gICAgICAgIGRyb3Bkb3duLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkxhbmd1YWdlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5MYW5ndWFnZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdEZWZhdWx0IHByZWZpeCcpKVxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBwcmVmaXggd2hlbiBjcmVhdGUgbWVtbywgJ0xpc3QnIGJ5IGRlZmF1bHQuXCIpKVxuICAgICAgLmFkZERyb3Bkb3duKGFzeW5jIChkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xuICAgICAgICBkcm9wZG93biA9IGQ7XG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignTGlzdCcsIHQoJ0xpc3QnKSk7XG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignVGFzaycsIHQoJ1Rhc2snKSk7XG4gICAgICAgIGRyb3Bkb3duLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXgpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXggPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnKSlcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgdGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgd2hlbiBpbnNlcnQgZGF0ZSBieSBALCAnVGFza3MnIGJ5IGRlZmF1bHQuXCIpKVxuICAgICAgLmFkZERyb3Bkb3duKGFzeW5jIChkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xuICAgICAgICBkcm9wZG93biA9IGQ7XG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignVGFza3MnLCAnVGFza3MnKTtcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdEYXRhdmlldycsICdEYXRhdmlldycpO1xuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnREYXRlRm9ybWF0KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnREYXRlRm9ybWF0ID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZScpKVxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gTW9iaWxlLCAnVG9wJyBieSBkZWZhdWx0LlwiKSlcbiAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcbiAgICAgICAgZHJvcGRvd24gPSBkO1xuICAgICAgICBkcm9wZG93bi5hZGRPcHRpb24oJ1RvcCcsIHQoJ1RvcCcpKTtcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdCb3R0b20nLCB0KCdCb3R0b20nKSk7XG4gICAgICAgIGRyb3Bkb3duLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRFZGl0b3JMb2NhdGlvbikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdEVkaXRvckxvY2F0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJykpXG4gICAgICAuc2V0RGVzYyh0KCdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nKSlcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZUJ1dHRvblRvU2hvd0VkaXRvcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlQnV0dG9uVG9TaG93RWRpdG9yID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodCgnU2hvdyBUaW1lIFdoZW4gQ29weSBSZXN1bHRzJykpXG4gICAgICAuc2V0RGVzYyh0KCdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nKSlcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93VGltZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ1Nob3cgRGF0ZSBXaGVuIENvcHkgUmVzdWx0cycpKVxuICAgICAgLnNldERlc2ModCgnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJykpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93RGF0ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuU2hvd0RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdBZGQgQmxhbmsgTGluZSBCZXR3ZWVuIERpZmZlcmVudCBEYXRlJykpXG4gICAgICAuc2V0RGVzYyh0KCdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0LicpKVxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQWRkQmxhbmtMaW5lV2hlbkRhdGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkFkZEJsYW5rTGluZVdoZW5EYXRlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gxJywge3RleHQ6IHQoJ1NoYXJlIE9wdGlvbnMnKX0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnKSlcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICB0KFxuICAgICAgICAgIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCIsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlNoYXJlRm9vdGVyU3RhcnQpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyU3RhcnQpXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuU2hhcmVGb290ZXJTdGFydCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KCdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgRW5kJykpXG4gICAgICAuc2V0RGVzYyh0KFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiKSlcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICB0ZXh0XG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuU2hhcmVGb290ZXJFbmQpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kKVxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJykpXG4gICAgICAuc2V0RGVzYyh0KCdTYXZlIGltYWdlIHRvIGZvbGRlciBmb3IgbW9iaWxlLiBGYWxzZSBieSBEZWZhdWx0JykpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b1NhdmVXaGVuT25Nb2JpbGUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogdCgnU2F5IFRoYW5rIFlvdScpfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoJ0RvbmF0ZScpKVxuICAgICAgLnNldERlc2ModCgnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50OicpKVxuICAgICAgLy8gLnNldENsYXNzKFwiQVQtZXh0cmFcIilcbiAgICAgIC5hZGRCdXR0b24oKGJ0KSA9PiB7XG4gICAgICAgIGJ0LmJ1dHRvbkVsLm91dGVySFRNTCA9IGA8YSBocmVmPVwiaHR0cHM6Ly93d3cuYnV5bWVhY29mZmVlLmNvbS9ib25pbmFsbFwiPjxpbWcgc3JjPVwiaHR0cHM6Ly9pbWcuYnV5bWVhY29mZmVlLmNvbS9idXR0b24tYXBpLz90ZXh0PUJ1eSBtZSBhIGNvZmZlZSZlbW9qaT0mc2x1Zz1ib25pbmFsbCZidXR0b25fY29sb3VyPTY0OTVFRCZmb250X2NvbG91cj1mZmZmZmYmZm9udF9mYW1pbHk9SW50ZXImb3V0bGluZV9jb2xvdXI9MDAwMDAwJmNvZmZlZV9jb2xvdXI9RkZERDAwXCI+PC9hPmA7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OU19aSCA9IHtcbiAgd2VsY29tZTogJ+asoui/juS9v+eUqCBNZW1vcyAnLFxuICByaWJib25JY29uVGl0bGU6ICdNZW1vcycsXG4gIG1vbnRoczogWyfkuIDmnIgnLCAn5LqM5pyIJywgJ+S4ieaciCcsICflm5vmnIgnLCAn5LqU5pyIJywgJ+WFreaciCcsICfkuIPmnIgnLCAn5YWr5pyIJywgJ+S5neaciCcsICfljYHmnIgnLCAn5Y2B5LiA5pyIJywgJ+WNgeS6jOaciCddLFxuICB3ZWVrRGF5czogWyflkajml6UnLCAn5ZGo5LiAJywgJ+WRqOS6jCcsICflkajkuIknLCAn5ZGo5ZubJywgJ+WRqOS6lCcsICflkajlha0nXSxcbiAgd2Vla0RheXNTaG9ydDogWyflkajml6UnLCAn5ZGo5LiAJywgJ+WRqOS6jCcsICflkajkuIknLCAn5ZGo5ZubJywgJ+WRqOS6lCcsICflkajlha0nXSxcbiAgdG86ICfoh7MnLFxufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTlNfRU4gPSB7XG4gIHdlbGNvbWU6ICdXZWxjb21lIHRvIHRoZSBNZW1vcycsXG4gIHJpYmJvbkljb25UaXRsZTogJ01lbW9zJyxcbiAgbW9udGhzOiBbXG4gICAgJ0phbnVhcnknLFxuICAgICdGZWJydWFyeScsXG4gICAgJ01hcmNoJyxcbiAgICAnQXByaWwnLFxuICAgICdNYXknLFxuICAgICdKdW5lJyxcbiAgICAnSnVseScsXG4gICAgJ0F1Z3VzdCcsXG4gICAgJ1NlcHRlbWJlcicsXG4gICAgJ09jdG9iZXInLFxuICAgICdOb3ZlbWJlcicsXG4gICAgJ0RlY2VtYmVyJyxcbiAgXSxcbiAgd2Vla0RheXM6IFsnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheScsICdTdW5kYXknXSxcbiAgd2Vla0RheXNTaG9ydDogWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXSxcbiAgdG86ICd0bycsXG59O1xuIiwiaW1wb3J0IHtQbHVnaW4sIE5vdGljZSwgRmlsZVZpZXcsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge01lbW9zLCBGb2N1c09uRWRpdG9yLCBPcGVuRGFpbHlNZW1vc1dpdGhNZW1vc30gZnJvbSAnLi9tZW1vcyc7XG5pbXBvcnQge01FTU9TX1ZJRVdfVFlQRX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGFkZEljb25zIGZyb20gJy4vb2JDb21wb25lbnRzL2N1c3RvbUljb25zJztcbmltcG9ydCAnLi9oZWxwZXJzL3BvbHlmaWxsJztcbmltcG9ydCAnLi9sZXNzL2dsb2JhbC5sZXNzJztcbmltcG9ydCB7TWVtb3NTZXR0aW5nVGFiLCBERUZBVUxUX1NFVFRJTkdTLCBNZW1vc1NldHRpbmdzfSBmcm9tICcuL3NldHRpbmcnO1xuaW1wb3J0IHthcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuLy8gaW1wb3J0IHsgZWRpdG9ySW5wdXQgfSBmcm9tIFwiLi9jb21wb25lbnRzL0VkaXRvci9FZGl0b3JcIjtcbmltcG9ydCBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2cgZnJvbSAnLi9jb21wb25lbnRzL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcbmltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHtUUkFOU0xBVElPTlNfWkh9IGZyb20gJy4vdHJhbnNsYXRpb25zL3poL3RyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1RSQU5TTEFUSU9OU19FTn0gZnJvbSAnLi90cmFuc2xhdGlvbnMvZW4vdHJhbnNsYXRpb25zJztcbi8vIGltcG9ydCB7IGdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzXCI7XG5cbi8vIGRlY2xhcmUgbW9kdWxlIFwib2JzaWRpYW5cIiB7XG4vLyAgIGludGVyZmFjZSBBcHAge1xuLy8gICAgICAgaXNNb2JpbGU6IGJvb2xlYW47XG4vLyAgIH1cbi8vIH1cblxuLy8gY29uc3QgbW9ua2V5UGF0Y2hDb25zb2xlID0gKHBsdWdpbjogUGx1Z2luKSA9PiB7XG5cbi8vICAgaWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xuLy8gICAgICAgcmV0dXJuO1xuLy8gICB9XG5cbi8vICAgY29uc3QgbG9nRmlsZSA9IGAke3BsdWdpbi5tYW5pZmVzdC5kaXJ9L2xvZ3MudHh0YDtcbi8vICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcbi8vICAgY29uc3QgbG9nTWVzc2FnZXMgPSAocHJlZml4OiBzdHJpbmcpID0+ICguLi5tZXNzYWdlczogdW5rbm93bltdKSA9PiB7XG4vLyAgICAgICBsb2dzLnB1c2goYFxcblske3ByZWZpeH1dYCk7XG4vLyAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbi8vICAgICAgICAgICBsb2dzLnB1c2goU3RyaW5nKG1lc3NhZ2UpKTtcbi8vICAgICAgIH1cbi8vICAgICAgIHBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci53cml0ZShsb2dGaWxlLCBsb2dzLmpvaW4oXCIgXCIpKTtcbi8vICAgfTtcblxuLy8gICBjb25zb2xlLmRlYnVnID0gbG9nTWVzc2FnZXMoXCJkZWJ1Z1wiKTtcbi8vICAgY29uc29sZS5lcnJvciA9IGxvZ01lc3NhZ2VzKFwiZXJyb3JcIik7XG4vLyAgIGNvbnNvbGUuaW5mbyA9IGxvZ01lc3NhZ2VzKFwiaW5mb1wiKTtcbi8vICAgY29uc29sZS5sb2cgPSBsb2dNZXNzYWdlcyhcImxvZ1wiKTtcbi8vICAgY29uc29sZS53YXJuID0gbG9nTWVzc2FnZXMoXCJ3YXJuXCIpO1xuLy8gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVtb3NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwdWJsaWMgc2V0dGluZ3M6IE1lbW9zU2V0dGluZ3M7XG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZygnb2JzaWRpYW4tbWVtb3MgbG9hZGluZy4uLicpO1xuICAgIC8vIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgYXdhaXQgdGhpcy5pbml0TG9jYWxpemF0aW9uKCk7XG5cbiAgICAvLyBtb25rZXlQYXRjaENvbnNvbGUodGhpcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlldyhNRU1PU19WSUVXX1RZUEUsIChsZWFmKSA9PiBuZXcgTWVtb3MobGVhZiwgdGhpcykpO1xuXG4gICAgLy8gdGhpcy5yZWdpc3RlclZpZXcoXG4gICAgLy8gICBNRU1PU19WSUVXX1RZUEUsXG4gICAgLy8gICAobGVhZjogV29ya3NwYWNlTGVhZikgPT4gKHRoaXMudmlldyA9IG5ldyBNZW1vcyhsZWFmLCB0aGlzLmFwcC5wbHVnaW4pKVxuICAgIC8vICk7XG5cbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IE1lbW9zU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgYWRkSWNvbnMoKTtcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oJ01lbW9zJywgaTE4bmV4dC50KCdyaWJib25JY29uVGl0bGUnKSwgKCkgPT4ge1xuICAgICAgbmV3IE5vdGljZSgnT3BlbiBNZW1vcyBTdWNjZXNzZnVsbHknKTtcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XG4gICAgICBuZXcgTm90aWNlKCdDaGVjayBpZiB5b3Ugb3BlbmVkIERhaWx5IE5vdGVzIFBsdWdpbicpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogJ29wZW4tbWVtb3MnLFxuICAgICAgbmFtZTogJ09wZW4gTWVtb3MnLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMub3Blbk1lbW9zKCksXG4gICAgICBob3RrZXlzOiBbXSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogJ2ZvY3VzLW9uLW1lbW9zLWVkaXRvcicsXG4gICAgICBuYW1lOiAnRm9jdXMgT24gTWVtb3MgRWRpdG9yJyxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmZvY3VzT25FZGl0b3IoKSxcbiAgICAgIGhvdGtleXM6IFtdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnc2hvdy1kYWlseS1tZW1vJyxcbiAgICAgIG5hbWU6ICdTaG93IERhaWx5IE1lbW8nLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMub3BlbkRhaWx5TWVtbygpLFxuICAgICAgaG90a2V5czogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6ICdub3RlLWl0JyxcbiAgICAgIG5hbWU6ICdOb3RlIEl0JyxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLm5vdGVJdCgpLFxuICAgICAgaG90a2V5czogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6ICdmb2N1cy1vbi1zZWFyY2gtYmFyJyxcbiAgICAgIG5hbWU6ICdTZWFyY2ggSXQnLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMuc2VhcmNoSXQoKSxcbiAgICAgIGhvdGtleXM6IFtdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnY2hhbmdlLXN0YXR1cycsXG4gICAgICBuYW1lOiAnQ2hhbmdlIFN0YXR1cyBCZXR3ZWVuIFRhc2sgT3IgTGlzdCcsXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5jaGFuZ2VTdGF0dXMoKSxcbiAgICAgIGhvdGtleXM6IFtdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkodGhpcy5vbkxheW91dFJlYWR5LmJpbmQodGhpcykpO1xuICAgIGNvbnNvbGUubG9nKGkxOG5leHQudCgnd2VsY29tZScpKTtcbiAgICBjb25zb2xlLmxvZygnb2JzaWRpYW4tbWVtb3MgbG9hZGVkJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gIH1cblxuICBvbnVubG9hZCgpIHtcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2UuZGV0YWNoTGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XG4gICAgbmV3IE5vdGljZSgnQ2xvc2UgTWVtb3MgU3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICBhc3luYyBvbkxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxlYXZlcyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLkZvY3VzT25FZGl0b3IpIHtcbiAgICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcbiAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuTWVtb3MoKTtcbiAgfVxuXG4gIGFzeW5jIG9wZW5EYWlseU1lbW8oKSB7XG4gICAgY29uc3Qgd29ya3NwYWNlTGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xuICAgIGlmIChPcGVuRGFpbHlNZW1vc1dpdGhNZW1vcyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHdvcmtzcGFjZUxlYXZlcyAhPT0gdW5kZWZpbmVkICYmIHdvcmtzcGFjZUxlYXZlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5vcGVuTWVtb3MoKTtcbiAgICAgICAgc2hvd0RhaWx5TWVtb0RpYXJ5RGlhbG9nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0RhaWx5TWVtb0RpYXJ5RGlhbG9nKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3Blbk1lbW9zKCkge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZTtcbiAgICB3b3Jrc3BhY2UuZGV0YWNoTGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XG4gICAgY29uc3QgbGVhZiA9IHdvcmtzcGFjZS5nZXRMZWFmKFxuICAgICAgIVBsYXRmb3JtLmlzTW9iaWxlICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXcgaW5zdGFuY2VvZiBGaWxlVmlldyxcbiAgICApO1xuICAgIGF3YWl0IGxlYWYuc2V0Vmlld1N0YXRlKHt0eXBlOiBNRU1PU19WSUVXX1RZUEV9KTtcbiAgICB3b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcbiAgICBpZiAoRm9jdXNPbkVkaXRvcikge1xuICAgICAgaWYgKGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWFyY2hJdCgpIHtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2U7XG4gICAgY29uc3QgbGVhdmVzID0gd29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xuICAgIGlmIChsZWF2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcbiAgICAgIHdvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYpO1xuICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtYmFyLWlucHV0ZXIgLnRleHQtaW5wdXQnKS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzT25FZGl0b3IoKSB7XG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy5hcHAud29ya3NwYWNlO1xuICAgIGNvbnN0IGxlYXZlcyA9IHdvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XG4gICAgICB3b3Jrc3BhY2Uuc2V0QWN0aXZlTGVhZihsZWFmKTtcbiAgICAgIGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XG4gICAgfVxuICB9XG5cbiAgbm90ZUl0KCkge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZTtcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1lbW8tZWRpdG9yIC5jb25maXJtLWJ0bicpLmNsaWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3RhdHVzKCkge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZTtcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmxpc3Qtb3ItdGFzaycpLmNsaWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdExvY2FsaXphdGlvbigpIHtcbiAgICBpMThuZXh0LmluaXQoe1xuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGVuOiB7XG4gICAgICAgICAgdHJhbnNsYXRpb246IFRSQU5TTEFUSU9OU19FTixcbiAgICAgICAgfSxcbiAgICAgICAgemg6IHtcbiAgICAgICAgICB0cmFuc2xhdGlvbjogVFJBTlNMQVRJT05TX1pILFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2UodGhpcy5zZXR0aW5ncy5MYW5ndWFnZSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwibiIsInAiLCJxIiwiciIsInQiLCJCIiwiRCIsIkYiLCJFIiwiRyIsIkgiLCJJIiwiTSIsImVzY2FwZSIsIk4iLCJPIiwieSIsIlIiLCJUIiwiUCIsIlMiLCJfcmVhY3RfMTdfMF8yX3JlYWN0TW9kdWxlIiwiX3NjaGVkdWxlcl8wXzIwXzJfc2NoZWR1bGVyTW9kdWxlIiwibSIsInJlcXVpcmUkJDEiLCJyZXF1aXJlJCQyIiwiamEiLCJkYSIsImRlIiwiaWQiLCJoaSIsIl9yZWFjdERvbV8xN18wXzJfcmVhY3REb21Nb2R1bGUiLCJkZWZhdWx0U3RhdGUiLCJtb21lbnQiLCJ1dGlscyIsIm1haW4iLCJEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIiwiZ2V0QWxsRGFpbHlOb3RlcyIsImdsb2JhbFN0b3JlLmRlZmF1bHRTdGF0ZSIsImxvY2F0aW9uU3RvcmUuZGVmYXVsdFN0YXRlIiwibWVtb1N0b3JlLmRlZmF1bHRTdGF0ZSIsInVzZXJTdG9yZS5kZWZhdWx0U3RhdGUiLCJxdWVyeVN0b3JlLmRlZmF1bHRTdGF0ZSIsImRhaWx5Tm90ZXNTdG9yZS5kZWZhdWx0U3RhdGUiLCJnbG9iYWxTdG9yZS5yZWR1Y2VyIiwibG9jYXRpb25TdG9yZS5yZWR1Y2VyIiwibWVtb1N0b3JlLnJlZHVjZXIiLCJ1c2VyU3RvcmUucmVkdWNlciIsInF1ZXJ5U3RvcmUucmVkdWNlciIsImRhaWx5Tm90ZXNTdG9yZS5yZWR1Y2VyIiwiY3JlYXRlQ29udGV4dCIsImdldERhaWx5Tm90ZSIsImdldEFsbExpbmVzRnJvbUZpbGUiLCJnZXREYWlseU5vdGVTZXR0aW5ncyIsIlRGaWxlIiwiZ2V0SURGcm9tTGluZSIsImdldFBpbm5lZERhdGVGcm9tTGluZSIsIm5vcm1hbGl6ZVBhdGgiLCJOb3RpY2UiLCJnZXREYXRlRnJvbUZpbGUiLCJjcmVhdGVEYWlseU5vdGUiLCJleHRyYWN0Q29udGVudGZyb21UZXh0IiwiYXBpIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImpzeFJ1bnRpbWVNb2R1bGUiLCJqc3hSdW50aW1lLmpzeCIsImpzeFJ1bnRpbWUuanN4cyIsImpzeFJ1bnRpbWUuRnJhZ21lbnQiLCJPbmx5V2hlbiIsInByb3BzIiwiY2hpbGRyZW4iLCJ3aGVuIiwiT25seSIsImdsb2JhbCIsIl9kZWZpbmVQcm9wZXJ0eSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3R5cGVvZiIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfZ2V0UHJvdG90eXBlT2YiLCJfc2V0UHJvdG90eXBlT2YiLCJfaXRlcmFibGVUb0FycmF5IiwiX2NsYXNzQ2FsbENoZWNrIiwiX2luaGVyaXRzIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfY3JlYXRlQ2xhc3MiLCJSZWFjdCIsIlJlYWN0RE9NIiwiX29iamVjdFNwcmVhZCIsIkN1c3RvbUV2ZW50IiwibG9jYWxlIiwiVEl0ZW0iLCJlbnRpdHkiLCJuYW1lIiwiY2hhciIsImZpbGUiLCJMb2FkaW5nIiwiZGF0YSIsImFjdHVhbFRva2VuIiwiRWRpdG9yIiwiZm9yd2FyZFJlZiIsInJlZiIsImdsb2JhbFN0YXRlIiwidXNlVGlueVVuZG9IaXN0b3J5Q2FjaGUiLCJ1c2VDb250ZXh0IiwiYXBwQ29udGV4dCIsImNsYXNzTmFtZSIsImluaXRpYWxDb250ZW50IiwicGxhY2Vob2xkZXIiLCJzaG93Q29uZmlybUJ0biIsInNob3dDYW5jZWxCdG4iLCJvbkNvbmZpcm1CdG5DbGljayIsImhhbmRsZUNvbmZpcm1CdG5DbGlja0NhbGxiYWNrIiwib25DYW5jZWxCdG5DbGljayIsImhhbmRsZUNhbmNlbEJ0bkNsaWNrQ2FsbGJhY2siLCJvbkNvbnRlbnRDaGFuZ2UiLCJoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2siLCJlZGl0b3JSZWYiLCJ1c2VSZWYiLCJ0aW55VW5kb1JlZiIsInJlZnJlc2giLCJ1c2VSZWZyZXNoIiwiY3VycmVudCIsInZhbHVlIiwidGlueVVuZG9BY3Rpb25zQ2FjaGUiLCJ0aW55VW5kb0luZGV4Q2FjaGUiLCJzdG9yYWdlIiwiZ2V0IiwiVGlueVVuZG8iLCJpbnRlcnZhbCIsImluaXRpYWxBY3Rpb25zIiwiaW5pdGlhbEluZGV4Iiwic3Vic2NyaWJlIiwiYWN0aW9ucyIsImluZGV4Iiwic2V0IiwiZGVzdHJveSIsInJlbW92ZSIsInN0eWxlIiwiaGVpZ2h0Iiwic2Nyb2xsSGVpZ2h0IiwiZWxlbWVudCIsImZvY3VzIiwiRm9jdXNPbkVkaXRvciIsImluc2VydFRleHQiLCJyYXdUZXh0IiwicHJldlZhbHVlIiwic2xpY2UiLCJzZWxlY3Rpb25TdGFydCIsInNldENvbnRlbnQiLCJ0ZXh0IiwiZ2V0Q29udGVudCIsImhhbmRsZUluc2VydFRyaWdnZXIiLCJldmVudCIsImZpbGVNYW5hZ2VyIiwiYXBwU3RvcmUiLCJnZXRTdGF0ZSIsImRhaWx5Tm90ZXNTdGF0ZSIsImFwcCIsImN1cnJlbnRUcmlnZ2VyIiwicmVtb3ZlQ2hhck51bSIsInVuZGVmaW5lZCIsImxlbmd0aCIsImJlaGluZENoYXJOdW0iLCJpIiwidGVzdCIsIml0ZW0iLCJmaWxlUGF0aCIsImdlbmVyYXRlTWFya2Rvd25MaW5rIiwicGF0aCIsImNvbnRhaW5zIiwiZXh0ZW5zaW9uIiwiaGFuZGxlRWRpdG9ySW5wdXQiLCJoYW5kbGVFZGl0b3JLZXlEb3duIiwic3RvcFByb3BhZ2F0aW9uIiwiY29kZSIsIm1ldGFLZXkiLCJjdHJsS2V5IiwiaGFuZGxlQ29tbW9uQ29uZmlybUJ0bkNsaWNrIiwiZ2V0RWRpdG9yQ29udGVudENhY2hlIiwicmVzZXRTdGF0ZSIsImhhbmRsZUNvbW1vbkNhbmNlbEJ0bkNsaWNrIiwiZWRpdG9yQ29udGVudENhY2hlIiwiZ2V0RWRpdG9yQ29udGVudCIsInJ0YSIsInRleHRhcmVhIiwibWluSGVpZ2h0IiwibWluV2lkdGgiLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJkYXRhUHJvdmlkZXIiLCJ0b2tlbiIsInVzZWRUYWdzIiwibWFwIiwiY29tcG9uZW50IiwiYWZ0ZXJXaGl0ZXNwYWNlIiwib3V0cHV0IiwiZ2V0U3VnZ2VzdGlvbnMiLCJ0b29scyIsIlNhdmVNZW1vQnV0dG9uTGFiZWwiLCJ1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IiwidXNlTGF5b3V0RWZmZWN0IiwidXNlRWZmZWN0IiwiZmluZEluZGV4IiwiTUlMTElTRUNPTkRTX0lOX0RBWSIsIk1JTExJU0VDT05EU19JTl9XRUVLIiwiZm9ybWF0RGlzdGFuY2UiLCJmb3JtYXRMb25nIiwiZm9ybWF0UmVsYXRpdmUiLCJsb2NhbGl6ZSIsIm1hdGNoIiwiZm9ybWF0dGVycyIsImxpZ2h0Rm9ybWF0dGVycyIsImRlZmF1bHRMb2NhbGUiLCJsb25nRm9ybWF0dGVycyIsInNldERhdGVNb250aCIsImlzRm9jdXNhYmxlIiwiUmVhY3QudXNlTGF5b3V0RWZmZWN0IiwiUmVhY3QudXNlRWZmZWN0IiwiZWZmZWN0IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm1pbiIsIm1heCIsIm1hdGhNYXgiLCJtYXRoTWluIiwiaGFzaCIsImFsbFBsYWNlbWVudHMiLCJwbGFjZW1lbnRzIiwicG9wcGVyT2Zmc2V0cyIsImNvbXB1dGVTdHlsZXMiLCJhcHBseVN0eWxlcyIsIm9mZnNldCIsImZsaXAiLCJwcmV2ZW50T3ZlcmZsb3ciLCJhcnJvdyIsImhpZGUiLCJSZWFjdC51c2VSZWYiLCJSZWFjdC51c2VTdGF0ZSIsIlJlYWN0LnVzZU1lbW8iLCJpc0VxdWFsIiwiY3JlYXRlUG9wcGVyIiwiZGVmYXVsdENyZWF0ZVBvcHBlciIsIlJlYWN0UHJvcFR5cGVzU2VjcmV0IiwiX3Byb3BUeXBlc18xNV84XzFfcHJvcFR5cGVzTW9kdWxlIiwib3duS2V5cyIsImNyZWF0ZUZvY3VzVHJhcCIsIm9iaiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwidGFyZ2V0IiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5Iiwia2V5IiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwibyIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiRGVyaXZlZCIsImhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiU3VwZXIiLCJyZXN1bHQiLCJOZXdUYXJnZXQiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiYXJndW1lbnRzIiwiYXBwbHkiLCJzZWxmIiwiY2FsbCIsIlJlZmVyZW5jZUVycm9yIiwic2hhbSIsIlByb3h5IiwiQm9vbGVhbiIsInZhbHVlT2YiLCJlIiwiZ2V0UHJvdG90eXBlT2YiLCJyZXF1aXJlIiwiUHJvcFR5cGVzIiwiX3JlcXVpcmUiLCJGb2N1c1RyYXAiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwiX3RoaXMiLCJ0YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnMiLCJyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSIsImZvY3VzVHJhcE9wdGlvbnMiLCJvcHRpb25OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJvblBvc3REZWFjdGl2YXRlIiwiZm9jdXNUcmFwRWxlbWVudHMiLCJjb250YWluZXJFbGVtZW50cyIsInVwZGF0ZVByZXZpb3VzRWxlbWVudCIsImRvY3VtZW50Iiwib3B0aW9uVmFsdWUiLCJub2RlIiwiX3RoaXMkZ2V0RG9jdW1lbnQiLCJnZXREb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJFcnJvciIsImNvbmNhdCIsImdldE5vZGVGb3JPcHRpb24iLCJwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQiLCJjdXJyZW50RG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiX3RoaXMyIiwiX3RoaXMkdGFpbG9yZWRGb2N1c1RyIiwiY2hlY2tDYW5SZXR1cm5Gb2N1cyIsIl90aGlzJHRhaWxvcmVkRm9jdXNUcjIiLCJwcmV2ZW50U2Nyb2xsIiwiZm9jdXNUcmFwIiwiZGVhY3RpdmF0ZSIsInJldHVybkZvY3VzIiwiZmluaXNoRGVhY3RpdmF0aW9uIiwicmV0dXJuRm9jdXNOb2RlIiwiZ2V0UmV0dXJuRm9jdXNOb2RlIiwiY2FuUmV0dXJuRm9jdXMiLCJ0aGVuIiwiZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzIiwiZmluZERPTU5vZGUiLCJub2Rlc0V4aXN0Iiwic29tZSIsIl9jcmVhdGVGb2N1c1RyYXAiLCJhY3RpdmUiLCJhY3RpdmF0ZSIsInBhdXNlZCIsInBhdXNlIiwic2V0dXBGb2N1c1RyYXAiLCJwcmV2UHJvcHMiLCJ1cGRhdGVDb250YWluZXJFbGVtZW50cyIsImhhc0FjdGl2YXRlZCIsImhhc0RlYWN0aXZhdGVkIiwiaGFzUGF1c2VkIiwiaGFzVW5wYXVzZWQiLCJkZWFjdGl2YXRlVHJhcCIsInVucGF1c2UiLCJfdGhpczMiLCJjaGlsZCIsIkNoaWxkcmVuIiwib25seSIsInR5cGUiLCJGcmFnbWVudCIsImNvbXBvc2VkUmVmQ2FsbGJhY2siLCJjaGlsZFdpdGhSZWYiLCJjbG9uZUVsZW1lbnQiLCJDb21wb25lbnQiLCJFbGVtZW50VHlwZSIsIkVsZW1lbnQiLCJGdW5jdGlvbiIsInByb3BUeXBlcyIsImJvb2wiLCJzaGFwZSIsIm9iamVjdCIsIm9uQWN0aXZhdGUiLCJmdW5jIiwib25Qb3N0QWN0aXZhdGUiLCJjaGVja0NhbkZvY3VzVHJhcCIsIm9uRGVhY3RpdmF0ZSIsImluaXRpYWxGb2N1cyIsIm9uZU9mVHlwZSIsImluc3RhbmNlT2YiLCJzdHJpbmciLCJmYWxsYmFja0ZvY3VzIiwiZXNjYXBlRGVhY3RpdmF0ZXMiLCJjbGlja091dHNpZGVEZWFjdGl2YXRlcyIsInNldFJldHVybkZvY3VzIiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJhcnJheU9mIiwiZGVmYXVsdFByb3BzIiwibW9kdWxlIiwiZ2V0Q3Vyc29yUG9zdGlvbiIsImlucHV0Iiwib2Zmc2V0TGVmdCIsImlucHV0WCIsIm9mZnNldFRvcCIsImlucHV0WSIsIm9mZnNldEhlaWdodCIsImlucHV0SCIsIm9mZnNldFdpZHRoIiwiaW5wdXRXIiwic2VsZWN0aW9uRW5kIiwic2VsZWN0aW9uUG9pbnQiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiY29weVN0eWxlIiwid2luZG93Iiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicG9zaXRpb24iLCJ2aXNpYmlsaXR5Iiwid2hpdGVTcGFjZSIsInN3YXAiLCJpbnB1dFZhbHVlIiwidGFnTmFtZSIsInJlcGxhY2UiLCJ0ZXh0Q29udGVudCIsInN1YnN0cmluZyIsInNwYW4iLCJhcHBlbmRDaGlsZCIsImJvZHkiLCJzcGFuWCIsInNwYW5ZIiwic3BhbkgiLCJzcGFuVyIsInJlbW92ZUNoaWxkIiwieCIsImgiLCJ3IiwiaXNMaXN0IiwiaXNFZGl0b3IiLCJpc0VkaXRvckdvIiwicG9zaXRpb25YIiwiTWVtb0VkaXRvciIsImlzTGlzdFNob3duIiwidG9nZ2xlTGlzdCIsInVzZVRvZ2dsZSIsImlzRWRpdG9yU2hvd24iLCJ0b2dnbGVFZGl0b3IiLCJwcmV2R2xvYmFsU3RhdGVSZWYiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiaXNQb3BwZXJPcGVuIiwic2V0SXNQb3BwZXJPcGVuIiwiZGFpbHlOb3Rlc1NlcnZpY2UiLCJwb3BwZXJSZWYiLCJwb3BwZXJFbGVtZW50Iiwic2V0UG9wcGVyRWxlbWVudCIsInBvcHBlciIsIkRlZmF1bHRQcmVmaXgiLCJpc01vYmlsZSIsImlubmVyV2lkdGgiLCJVc2VCdXR0b25Ub1Nob3dFZGl0b3IiLCJEZWZhdWx0RWRpdG9yTG9jYXRpb24iLCJQbGF0Zm9ybSIsImxlYXZlcyIsIndvcmtzcGFjZSIsImdldExlYXZlc09mVHlwZSIsIk1FTU9TX1ZJRVdfVFlQRSIsIm1lbW9zSGVpZ2h0IiwibGVhZlZpZXciLCJsZWFmIiwidmlldyIsImNvbnRhaW5lckVsIiwiaW5uZXJIZWlnaHQiLCJkaXZUaGlzIiwibWVtb0VkaXRvckRpdiIsInNyYyIsInNob3dFZGl0b3JTdmciLCJidXR0b25Ub3AiLCJidXR0b25MZWZ0IiwidG9wIiwibGVmdCIsIm9uY2xpY2siLCJzY2FsZUVsZW1lbnRBbmkiLCJhbmltYXRlIiwidHJhbnNmb3JtIiwiZHVyYXRpb24iLCJpdGVyYXRpb25zIiwiSW5maW5pdHkiLCJyZXZlcnNlIiwicHJlcGVuZCIsIm1lbW9saXN0U2Nyb2xsIiwib25zY3JvbGwiLCJzY2FsZUVkaXRvckVsZW1lbnRBbmkiLCJvcGFjaXR5Iiwic2NhbGVPbmVFbGVtZW50QW5pIiwiY2FuY2VsIiwidXNlUG9wcGVyIiwicGxhY2VtZW50IiwibW9kaWZpZXJzIiwib3B0aW9ucyIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsInJvb3RCb3VuZGFyeSIsInNlbGV0b3JQb3B1cFdpZHRoIiwiY2xvc2VQb3BwZXIiLCJtYXJrTWVtb0lkIiwiZWRpdG9yQ3VycmVudFZhbHVlIiwibWVtb0xpbmtUZXh0Iiwic2V0TWFya01lbW9JZCIsImVkaXRNZW1vSWQiLCJlZGl0TWVtbyIsIm1lbW9TZXJ2aWNlIiwiZ2V0TWVtb0J5SWQiLCJjb250ZW50IiwiaGFuZGxlUGFzdGVFdmVudCIsImNsaXBib2FyZERhdGEiLCJmaWxlcyIsInByZXZlbnREZWZhdWx0IiwidXJsIiwiaGFuZGxlVXBsb2FkRmlsZSIsImhhbmRsZURyb3BFdmVudCIsImRhdGFUcmFuc2ZlciIsImhhbmRsZUNsaWNrRXZlbnQiLCJoYW5kbGVLZXlEb3duRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInN0YXJ0c1dpdGgiLCJpbWFnZSIsInJlc291cmNlU2VydmljZSIsInVwbG9hZCIsImVycm9yIiwiaGFuZGxlU2F2ZUJ0bkNsaWNrIiwiZ2xvYmFsU3RhdGVTZXJ2aWNlIiwicmVwbGFjZUFsbCIsInByZXZNZW1vIiwiZWRpdGVkTWVtbyIsInVwZGF0ZU1lbW8iLCJtZW1vVHlwZSIsInVwZGF0ZWRBdCIsImdldERhdGVUaW1lU3RyaW5nIiwiRGF0ZSIsIm5vdyIsInNldEVkaXRNZW1vSWQiLCJuZXdNZW1vIiwiY3JlYXRlTWVtbyIsInB1c2hNZW1vIiwiY2xlYXJRdWVyeSIsIm1lc3NhZ2UiLCJoYW5kbGVDYW5jZWxCdG5DbGljayIsImhhbmRsZUNvbnRlbnRDaGFuZ2UiLCJ0ZW1wRGl2IiwiaW5uZXJIVE1MIiwiaW5uZXJUZXh0IiwidHJpbSIsImN1cnJlbnRWYWx1ZSIsInByZXZTdHJpbmciLCJuZXh0U3RyaW5nIiwiZW5kc1dpdGgiLCJoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlciIsImRhdGUiLCJ0b2RheU1vbWVudCIsIkluc2VydERhdGVGb3JtYXQiLCJmb3JtYXQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImhhbmRsZUNoYW5nZVN0YXR1cyIsImhhbmRsZVNob3dFZGl0b3IiLCJmbGFnIiwiaGFuZGxlVGFnVGV4dEJ0bkNsaWNrIiwibmV4dFZhbHVlIiwiY3Vyc29ySW5kZXgiLCJ1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uIiwiZWRpdG9yV2lkdGgiLCJjbGllbnRXaWR0aCIsImhhbmRsZVVwbG9hZEZpbGVCdG5DbGljayIsImlucHV0RWwiLCJtdWx0aXBsZSIsImFjY2VwdCIsIm9uY2hhbmdlIiwiY2xpY2siLCJzaG93RWRpdFN0YXR1cyIsImVkaXRvckNvbmZpZyIsInVzZU1lbW8iLCJzaG93VG9vbHMiLCJ0YWciLCJpbWFnZVN2ZyIsImpvdXJuYWxTdmciLCJ0YXNrU3ZnIiwic3R5bGVzIiwiYXR0cmlidXRlcyIsIlNlYXJjaEJhciIsImxvY2F0aW9uU3RhdGUiLCJxdWVyeSIsImhhbmRsZU1lbW9UeXBlSXRlbUNsaWNrIiwicHJldlR5cGUiLCJsb2NhdGlvblNlcnZpY2UiLCJzZXRNZW1vVHlwZVF1ZXJ5IiwiaGFuZGxlVGV4dFF1ZXJ5SW5wdXQiLCJjdXJyZW50VGFyZ2V0Iiwic2V0VGV4dFF1ZXJ5Iiwic2VhcmNoIiwibWVtb1NwZWNpYWxUeXBlcyIsImlkeCIsInByZXZSZXF1ZXN0VGltZXN0YW1wIiwiTWVtb3NIZWFkZXIiLCJmaWx0ZXIiLCJpc01vYmlsZVZpZXciLCJxdWVyeVN0YXRlIiwicXVlcmllcyIsInRpdGxlVGV4dCIsInNldFRpdGxlVGV4dCIsInF1ZXJ5U2VydmljZSIsImdldFF1ZXJ5QnlJZCIsInRpdGxlIiwiaGFuZGxlTWVtb1RleHRDbGljayIsImZldGNoQWxsTWVtb3MiLCJjYXRjaCIsImhhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2siLCJzZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXciLCJtZW51U3ZnIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiYXJyYXlMaWtlVG9BcnJheSIsImFycmF5V2l0aEhvbGVzIiwiaXRlcmFibGVUb0FycmF5IiwidW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJub25JdGVyYWJsZVJlc3QiLCJjb3B5IiwiUHJvdmlkZXIiLCJzdG9yZSIsImNvbnRleHQiLCJDb250ZXh0IiwiYXBwU3RhdGUiLCJzZXRBcHBTdGF0ZSIsInVuc3Vic2NyaWJlIiwibnMiLCJCYXNlRGlhbG9nIiwiY2xpY2tTcGFjZURlc3Ryb3kiLCJoYW5kbGVTcGFjZUNsaWNrZWQiLCJoYW5kbGVFc2NDbGlja2VkIiwiY29uZmlnIiwiRGlhbG9nQ29tcG9uZW50IiwiYXBwZW5kIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbGFzc0xpc3QiLCJhZGQiLCJjYnMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiQU5JTUFUSU9OX0RVUkFUSU9OIiwiZGlhbG9nUHJvcHMiLCJ1c2VBcHBDb250ZXh0IiwicmVuZGVyIiwiUHJldmlld0ltYWdlRGlhbG9nIiwiaW1nVXJsIiwiZmlsZXBhdGgiLCJpbWdSZWYiLCJpbWdXaWR0aCIsInNldEltZ1dpZHRoIiwidmF1bHQiLCJnZXRJbWFnZVNpemUiLCJ3aWR0aCIsImhhbmRsZUNsb3NlQnRuQ2xpY2siLCJoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZSIsImhhbmRsZUluY3JlYXNlSW1hZ2VTaXplIiwiY29udmVydEJhc2U2NFRvQmxvYiIsImJhc2U2NCIsImJ5dGVzIiwiYXRvYiIsImFiIiwiQXJyYXlCdWZmZXIiLCJpYSIsIlVpbnQ4QXJyYXkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImNvcHlJbWFnZVRvQ2xpcGJvYXJkIiwibXlCYXNlNjQiLCJzcGxpdCIsImJsb2JJbnB1dCIsImNsaXBib2FyZEl0ZW1JbnB1dCIsIkNsaXBib2FyZEl0ZW0iLCJuYXZpZ2F0b3IiLCJ3cml0ZSIsImJ1ZmZlciIsImFkYXB0ZXIiLCJyZWFkQmluYXJ5IiwiYXJyIiwiYmxvYiIsImNsb3NlIiwiSW1hZ2UiLCJhbHQiLCJyZWZlcnJlclBvbGljeSIsImhhbmRsZUltYWdlQ2xpY2siLCJnZXRQYXRoT2ZJbWFnZSIsImdldFJlc291cmNlUGF0aCIsImRldGVjdFdpa2lJbnRlcm5hbExpbmsiLCJsaW5lVGV4dCIsIm1ldGFkYXRhQ2FjaGUiLCJpbnRlcm5hbEZpbGVOYW1lIiwiV0lLSV9JTUFHRV9VUkxfUkVHIiwiZXhlYyIsImludGVybmFsQWx0TmFtZSIsImdldEZpcnN0TGlua3BhdGhEZXN0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwibGlua1RleHQiLCJhbHRUZXh0IiwiaW1hZ2VQYXRoIiwiZGV0ZWN0TURJbnRlcm5hbExpbmsiLCJNQVJLRE9XTl9VUkxfUkVHIiwiTWVtb0NhcmREaWFsb2ciLCJtZW1vIiwic2V0TWVtbyIsImNyZWF0ZWRBdFN0ciIsImNyZWF0ZWRBdCIsImxpbmtNZW1vcyIsInNldExpbmtNZW1vcyIsImxpbmtlZE1lbW9zIiwic2V0TGlua2VkTWVtb3MiLCJleHRlcm5hbEltYWdlVXJscyIsImludGVybmFsSW1hZ2VVcmxzIiwiYWxsTWFya2Rvd25MaW5rIiwiYWxsSW50ZXJuYWxMaW5rIiwiSU1BR0VfVVJMX1JFRyIsImFsbEV4dGVybmFsSW1hZ2VVcmxzIiwiYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzIiwiQXJyYXkiLCJmcm9tIiwiTUFSS0RPV05fV0VCX1VSTF9SRUciLCJvbmUiLCJwdXNoIiwidHdvIiwiZmV0Y2hMaW5rZWRNZW1vcyIsIm1hdGNoZWRBcnIiLCJtYXRjaEFsbCIsIk1FTU9fTElOS19SRUciLCJtYXRjaFJlcyIsIm1lbW9UZW1wIiwiZGF0ZVN0ciIsImdldERhdGVTdHJpbmciLCJnZXRMaW5rZWRNZW1vcyIsInNvcnQiLCJhIiwiYiIsImdldFRpbWVTdGFtcEJ5RGF0ZSIsImhhbmRsZU1lbW9Db250ZW50Q2xpY2siLCJ0YXJnZXRFbCIsIm5leHRNZW1vSWQiLCJkYXRhc2V0IiwibmV4dE1lbW8iLCJoYW5kbGVMaW5rZWRNZW1vQ2xpY2siLCJoYW5kbGVFZGl0TWVtb0J0bkNsaWNrIiwiZWRpdCIsIl9faHRtbCIsImZvcm1hdE1lbW9Db250ZW50IiwiXyIsImJvdHRvbSIsInpJbmRleCIsInJhd3RleHQiLCJwYXJzZUh0bWxUb1Jhd1RleHQiLCJyZXF1ZXN0IiwiU2hhcmVNZW1vSW1hZ2VEaWFsb2ciLCJwcm9wc01lbW8iLCJtZW1vcyIsIm1lbW9TdGF0ZSIsIm1lbW9zTGVuZ3RoIiwiY3JlYXRlZERheXMiLCJNYXRoIiwiY2VpbCIsImZvb3RlckVuZCIsIlNoYXJlRm9vdGVyRW5kIiwiVXNlck5hbWUiLCJmb290ZXJTdGFydCIsIlNoYXJlRm9vdGVyU3RhcnQiLCJ0b1N0cmluZyIsInNob3J0Y3V0SW1nVXJsIiwic2V0U2hvcnRjdXRJbWdVcmwiLCJpbWdBbW91bnQiLCJzZXRJbWdBbW91bnQiLCJtZW1vRWxSZWYiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwaXhlbFJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImhhbmRsZUNvcHl0b0NsaXBib2FyZEJ0bkNsaWNrIiwiZGl2cyIsImdldEF0dHJpYnV0ZSIsIkF1dG9TYXZlV2hlbk9uTW9iaWxlIiwiYXJyYXlCdWZmZXIiLCJhRmlsZSIsImV4dCIsImRhaWx5Tm90ZXMiLCJjcmVhdGVCaW5hcnkiLCJnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMiLCJoYW5kbGVJbWFnZU9uTG9hZCIsImV2Iiwic2hhcmUiLCJNZW1vIiwic2hvd0NvbmZpcm1EZWxldGVCdG4iLCJ0b2dnbGVDb25maXJtRGVsZXRlQnRuIiwiaGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZyIsImhhbmRsZU1hcmtNZW1vQ2xpY2siLCJlbGVtIiwiaGFuZGxlRWRpdE1lbW9DbGljayIsImhhbmRsZVNvdXJjZU1lbW9DbGljayIsImhhbmRsZURlbGV0ZU1lbW9DbGljayIsImhpZGVNZW1vQnlJZCIsImhhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlciIsImhhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrIiwiaGFuZGxlTWVtb0tleURvd24iLCJoYW5kbGVNZW1vRG91YmxlS2V5RG93biIsIm1lbW9JZCIsIm1vcmUiLCJtZW1vaWQiLCJlbmNvZGVIdG1sIiwicGFyc2VSYXdUZXh0VG9IdG1sIiwiam9pbiIsInNob3VsZFVzZU1hcmtkb3duUGFyc2VyIiwic2hvdWxkSGlkZUltYWdlVXJsIiwicGFyc2VNYXJrZWRUb0h0bWwiLCJUQUdfUkVHIiwiRklSU1RfVEFHX1JFRyIsIkxJTktfUkVHIiwiTURfTElOS19SRUciLCJ0ZW1wRGl2Q29udGFpbmVyIiwiYyIsImNvcHlTaG93bk1lbW9zIiwiTWVtb0xpc3QiLCJpc0ZldGNoaW5nIiwic2V0RmV0Y2hTdGF0dXMiLCJ3cmFwcGVyRWxlbWVudCIsInRhZ1F1ZXJ5IiwidGV4dFF1ZXJ5IiwicXVlcnlJZCIsInF1ZXJ5RmlsdGVyIiwic2hvd01lbW9GaWx0ZXIiLCJ0byIsInNob3duTWVtb3MiLCJIaWRlRG9uZVRhc2tzIiwic2hvdWxkU2hvdyIsImZpbHRlcnMiLCJKU09OIiwicGFyc2UiLCJxdWVyeXN0cmluZyIsImlzQXJyYXkiLCJjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMiLCJ0YWdzU2V0IiwiU2V0IiwiaXRlbXMiLCJ0ZW1wIiwiTk9QX0ZJUlNUX1RBR19SRUciLCJoYXMiLCJpbmNsdWRlcyIsImdldE15QWxsRGFpbHlOb3RlcyIsInNjcm9sbFRvIiwiaGFuZGxlTWVtb0xpc3RDbGljayIsImN1cnJUYWdRdWVyeSIsInNldFRhZ1F1ZXJ5Iiwic291cmNlUGF0aCIsIm9wZW5MaW5rVGV4dCIsIk1lbW9GaWx0ZXIiLCJzaG93RmlsdGVyIiwiaGFuZGxlQ29weUNsaWNrIiwibWVtb3NCeURhdGUiLCJnZXRNZW1vc0J5RGF0ZSIsInF1ZXJ5RGFpbHlNZW1vcyIsInRyYW5zZmVyTWVtb3NJbnRvVGV4dCIsImNvcHlUZXh0VG9DbGlwYm9hcmQiLCJzZXRNZW1vRmlsdGVyIiwiZ2V0VGV4dFdpdGhNZW1vVHlwZSIsInNldEZyb21BbmRUb1F1ZXJ5IiwiaTE4bmV4dCIsIkRlbGV0ZWRNZW1vIiwiaGFuZGxlRGVsZXRlZE1lbW9BY3Rpb24iLCJkZWxldGVkQXRTdHIiLCJkZWxldGVkQXQiLCJkZWxldGVNZW1vQnlJZCIsImhhbmRsZVJlc3RvcmVNZW1vQ2xpY2siLCJyZXN0b3JlTWVtb0J5SWQiLCJNZW1vVHJhc2giLCJsb2FkaW5nU3RhdGUiLCJ1c2VMb2FkaW5nIiwiZGVsZXRlZE1lbW9zIiwic2V0RGVsZXRlZE1lbW9zIiwiZmV0Y2hEZWxldGVkTWVtb3MiLCJmaW5hbGx5Iiwic2V0RmluaXNoIiwiaXNMb2FkaW5nIiwiUHJlZmVyZW5jZXNTZWN0aW9uIiwic2hvdWxkU3BsaXRNZW1vV29yZCIsImRlbW9NZW1vQ29udGVudCIsImhhbmRsZU9wZW5UaW55VW5kb0NoYW5nZWQiLCJzZXRBcHBTZXR0aW5nIiwiaGFuZGxlU3BsaXRXb3Jkc1ZhbHVlQ2hhbmdlZCIsImhhbmRsZUhpZGVJbWFnZVVybFZhbHVlQ2hhbmdlZCIsImhhbmRsZVVzZU1hcmtkb3duUGFyc2VyQ2hhbmdlZCIsImhhbmRsZUV4cG9ydEJ0bkNsaWNrIiwiZm9ybWF0ZWRNZW1vcyIsImpzb25TdHIiLCJzdHJpbmdpZnkiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkaXNwbGF5IiwiY2hlY2tib3hBY3RpdmUiLCJjaGVja2JveCIsIlNldHRpbmciLCJob21lUm91dGVyIiwiTWVtb3MiLCJBYm91dFNpdGVEaWFsb2ciLCJNZW51QnRuc1BvcHVwIiwic2hvd25TdGF0dXMiLCJzZXRTaG93blN0YXR1cyIsInBvcHVwRWxSZWYiLCJoYW5kbGVDbGlja091dHNpZGUiLCJjYXB0dXJlIiwib25jZSIsImhhbmRsZU15QWNjb3VudEJ0bkNsaWNrIiwic2V0dGluZyIsIm9wZW4iLCJvcGVuVGFiQnlJZCIsImhhbmRsZU1lbW9zVHJhc2hCdG5DbGljayIsInB1c2hIaXN0b3J5IiwiaGFuZGxlQWJvdXRCdG5DbGljayIsIkRhaWx5TWVtbyIsInRpbWVTdHIiLCJnZXRUaW1lU3RyaW5nIiwiRGF0ZVBpY2tlciIsImRhdGVzdGFtcCIsImhhbmRsZURhdGVTdGFtcENoYW5nZSIsImN1cnJlbnREYXRlU3RhbXAiLCJzZXRDdXJyZW50RGF0ZVN0YW1wIiwiZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcCIsImZpcnN0RGF0ZSIsImZpcnN0RGF0ZURheSIsImdldERheSIsImRheUxpc3QiLCJnZXRUaW1lIiwiREFJTFlfVElNRVNUQU1QIiwiZGF5QW1vdW50IiwiZ2V0TW9udGhEYXlBbW91bnQiLCJoYW5kbGVEYXRlSXRlbUNsaWNrIiwiaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayIsInllYXIiLCJnZXRGdWxsWWVhciIsIm1vbnRoIiwiZ2V0TW9udGgiLCJuZXh0RGF0ZVN0YW1wIiwiYXJyb3dMZWZ0IiwiYXJyb3dSaWdodCIsImQiLCJkYXRlVGVtcCIsImN1cnJlbnREYXRlIiwibmV4dE1vbnRoRGF0ZSIsInRpbWVzdGFtcCIsIkRhaWx5TWVtb0RpYXJ5RGlhbG9nIiwic2V0TWVtb3MiLCJnZXREYXRlU3RhbXBCeURhdGUiLCJzaG93RGF0ZVBpY2tlciIsInRvZ2dsZVNob3dEYXRlUGlja2VyIiwibWVtb3NFbFJlZiIsInNldERhaWx5TWVtb3MiLCJkYWlseU1lbW9zIiwiaGFuZGxlU2hhcmVCdG5DbGljayIsImhhbmRsZURhdGFQaWNrZXJDaGFuZ2UiLCJyZXR1cm5PYmplY3RzIiwiZ2V0RGF0ZSIsIlVzZXJCYW5uZXIiLCJ0YWdzIiwidXNlclN0YXRlIiwidXNlciIsInVzZXJuYW1lIiwic2hvdWxkU2hvd1BvcHVwQnRucyIsInNldFNob3VsZFNob3dQb3B1cEJ0bnMiLCJoYW5kbGVVc2VybmFtZUNsaWNrIiwiaGFuZGxlUG9wdXBCdG5DbGljayIsInNpZGViYXJFbCIsInBvcHVwRWwiLCJzY3JvbGxUb3AiLCJzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2ciLCJudWxsSXRlbSIsIlNlbGVjdG9yIiwiZGF0YVNvdXJjZSIsImhhbmRsZVZhbHVlQ2hhbmdlZCIsInNob3dTZWxlY3RvciIsInRvZ2dsZVNlbGVjdG9yU3RhdHVzIiwic2VsZXRvckVsUmVmIiwiY3VycmVudEl0ZW0iLCJoYW5kbGVJdGVtQ2xpY2siLCJoYW5kbGVDdXJyZW50VmFsdWVDbGljayIsIkNyZWF0ZVF1ZXJ5RGlhbG9nIiwic2V0VGl0bGUiLCJzZXRGaWx0ZXJzIiwicmVxdWVzdFN0YXRlIiwic2hvd25NZW1vTGVuZ3RoIiwicXVlcnlUZW1wIiwiaGFuZGxlVGl0bGVJbnB1dENoYW5nZSIsImVkaXRlZFF1ZXJ5IiwidXBkYXRlUXVlcnkiLCJlZGl0UXVlcnkiLCJnZXRNeUFsbFF1ZXJpZXMiLCJjcmVhdGVRdWVyeSIsInB1c2hRdWVyeSIsImhhbmRsZUFkZEZpbHRlckJlbkNsaWNrIiwibGFzdEZpbHRlciIsImdldERlZmF1bHRGaWx0ZXIiLCJoYW5kbGVGaWx0ZXJDaGFuZ2UiLCJoYW5kbGVGaWx0ZXJSZW1vdmUiLCJmIiwiRmlsdGVySW5wdXRlciIsImlucHV0RWxlbWVudHMiLCJzZXRJbnB1dEVsZW1lbnRzIiwib3BlcmF0b3JFbGVtZW50Iiwia2V5cyIsImZpbHRlckNvbnN0cyIsInZhbHVlcyIsIm9wZXJhdG9ycyIsIm9wZXJhdG9yIiwiaGFuZGxlT3BlcmF0b3JDaGFuZ2UiLCJ2YWx1ZUVsZW1lbnQiLCJoYW5kbGVWYWx1ZUNoYW5nZSIsImhhbmRsZVJlbGF0aW9uQ2hhbmdlIiwicmVsYXRpb24iLCJoYW5kbGVUeXBlQ2hhbmdlIiwib3BzIiwiaGFuZGxlUmVtb3ZlQnRuQ2xpY2siLCJyZWxhdGlvbkNvbnN0cyIsIk1lbW9GaWx0ZXJJbnB1dGVyIiwiUXVlcnlMaXN0Iiwic29ydGVkUXVlcmllcyIsInBpbm5lZEF0Iiwic2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nIiwiaXNTdWNjZWVkIiwiUXVlcnlJdGVtQ29udGFpbmVyIiwiaXNBY3RpdmUiLCJzaG93QWN0aW9uQnRucyIsInRvZ2dsZVNob3dBY3Rpb25CdG5zIiwiaGFuZGxlUXVlcnlDbGljayIsImhhbmRsZVNob3dBY3Rpb25CdG5DbGljayIsImhhbmRsZUFjdGlvbkJ0bkNvbnRhaW5lck1vdXNlTGVhdmUiLCJkZWxldGVRdWVyeSIsImhhbmRsZUVkaXRRdWVyeUJ0bkNsaWNrIiwiaGFuZGxlUGluUXVlcnlCdG5DbGljayIsInVucGluUXVlcnkiLCJwaW5RdWVyeSIsImhhbmRsZURlbGV0ZUJ0bk1vdXNlTGVhdmUiLCJtb3JlV2hpdGUiLCJUYWdMaXN0IiwidGFnc1RleHQiLCJzZXRUYWdzIiwidXBkYXRlVGFnc1N0YXRlIiwic29ydGVkVGFncyIsInJvb3QiLCJzdWJUYWdzIiwic3VidGFncyIsInRlbXBPYmoiLCJ0YWdUZXh0IiwiaW5pdGlhbGl6ZWQiLCJUYWdJdGVtQ29udGFpbmVyIiwiaGFzU3ViVGFncyIsInNob3dTdWJUYWdzIiwidG9nZ2xlU3ViVGFncyIsImhhbmRsZVRhZ0NsaWNrIiwicGF0aG5hbWUiLCJzZXRQYXRobmFtZSIsImhhbmRsZVRvZ2dsZUJ0bkNsaWNrIiwic3QiLCJ0YWJsZUNvbmZpZyIsImdldEluaXRpYWxVc2FnZVN0YXQiLCJ1c2VkRGF5c0Ftb3VudCIsImJlZ2luRGF5VGltZXN0YW1wIiwiaW5pdGlhbFVzYWdlU3RhdCIsInBhcnNlSW50IiwiY291bnQiLCJVc2FnZUhlYXRNYXAiLCJ0b2RheVRpbWVTdGFtcCIsInRvZGF5RGF5IiwibnVsbENlbGwiLCJmaWxsIiwic3RhcnREYXRlIiwic3VidHJhY3QiLCJlbmRPZiIsImFsbFN0YXQiLCJzZXRBbGxTdGF0IiwicG9wdXBTdGF0Iiwic2V0UG9wdXBTdGF0IiwiY3VycmVudFN0YXQiLCJzZXRDdXJyZW50U3RhdCIsImNvbnRhaW5lckVsUmVmIiwicG9wdXBSZWYiLCJuZXdTdGF0IiwiY3JlYXRpb25EYXRlIiwiZGlmZiIsImhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUVudGVyIiwidG9wVmFsdWUiLCJoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VMZWF2ZSIsImhhbmRsZVVzYWdlU3RhdEl0ZW1DbGljayIsInRvRGF0ZVN0cmluZyIsInYiLCJjb2xvckxldmVsIiwiU2lkZWJhciIsInNob3dTaWRlcmJhckluTW9iaWxlVmlldyIsIndyYXBwZXJFbFJlZiIsImhhbmRsZUNsaWNrT3V0c2lkZU9mV3JhcHBlciIsInNpZGVyYmFyU2hvd24iLCJwYXJlbnROb2RlIiwiU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FIiwiaG9tZVJvdXRlclN3aXRjaCIsImhhbmRsZVdpbmRvd1Jlc2l6ZSIsInNldElzTW9iaWxlVmlldyIsIkl0ZW1WaWV3IiwiQXBwIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlBsdWdpbiIsImFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQiLCJGaWxlVmlldyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBYSxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1EvQixJQUFJLHdCQUF3QixPQUFPO0FBQ25DLElBQUksaUJBQWlCLE9BQU8sVUFBVTtBQUN0QyxJQUFJLG1CQUFtQixPQUFPLFVBQVU7QUFFeEMsa0JBQWtCLEtBQUs7QUFDdEIsTUFBSSxRQUFRLFFBQVEsUUFBUSxRQUFXO0FBQ3RDLFVBQU0sSUFBSSxVQUFVO0FBQUE7QUFHckIsU0FBTyxPQUFPO0FBQUE7QUFHZiwyQkFBMkI7QUFDMUIsTUFBSTtBQUNILFFBQUksQ0FBQyxPQUFPLFFBQVE7QUFDbkIsYUFBTztBQUFBO0FBTVIsUUFBSSxRQUFRLElBQUksT0FBTztBQUN2QixVQUFNLEtBQUs7QUFDWCxRQUFJLE9BQU8sb0JBQW9CLE9BQU8sT0FBTyxLQUFLO0FBQ2pELGFBQU87QUFBQTtBQUlSLFFBQUksUUFBUTtBQUNaLGFBQVMsSUFBSSxHQUFHLElB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STtBQUFBLEdBQ0g7QUFBQSxFQUNELE1BQU0sQ0FBQztBQUFBLEVBQ1AsSUFBSSxDQUFDLEdBQUc7QUFBQSxFQUNSLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUM7QUFBQSxFQUNQLElBQUksQ0FBQyxHQUFHO0FBQUEsRUFDUixJQUFJO0FBQUEsR0FDSDtBQUFBLEVBQ0QsTUFBTSxDQUFDO0FBQUEsRUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUc7QUFBQSxFQUNkLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUM7QUFBQSxFQUNQLElBQUksQ0FBQyxHQUFHLEdBQUc7QUFBQSxFQUNYLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUM7QUFBQSxFQUNQLElBQUksQ0FBQyxHQUFHLEdBQUc7QUFBQSxFQUNYLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUM7QUFBQSxFQUNQLElBQUksQ0FBQyxHQUFHO0FBQUEsRUFDUixJQUFJO0FBQUEsR0FDSDtBQUFBLEVBQ0QsTUFBTSxDQUFDO0FBQUEsRUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDWCxJQUFJO0FBQUEsR0FDSDtBQUFBLEVBQ0QsTUFBTSxDQUFDO0FBQUEsRUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUk7QUFBQSxFQUNmLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUM7QUFBQSxFQUNQLElBQUksQ0FBQyxHQUFHO0FBQUEsRUFDUixJQUFJO0FBQUEsR0FDSDtBQUFBLEVBQ0QsTUFBTSxDQUFDO0FBQUEsRUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDWCxJQUFJO0FBQUEsR0FDSDtBQUFBLEVBQ0QsTUFBTSxDQUFDO0FBQUEsRUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUc7QUFBQSxFQUNkLElBQUk7QUFBQSxHQUNIO0FBQUEsRUFDRCxNQUFNLENBQUMsTUFBTTtBQUFBLEVBQ2IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJO0FBQUEsRUFD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
|