20623 lines
2.3 MiB
20623 lines
2.3 MiB
// @bun
|
|
var __create = Object.create;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __toESM = (mod, isNodeMode, target) => {
|
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
for (let key of __getOwnPropNames(mod))
|
|
if (!__hasOwnProp.call(to, key))
|
|
__defProp(to, key, {
|
|
get: () => mod[key],
|
|
enumerable: true
|
|
});
|
|
return to;
|
|
};
|
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
var __require = import.meta.require;
|
|
|
|
// ../eve/node_modules/safe-buffer/index.js
|
|
var require_safe_buffer = __commonJS((exports, module) => {
|
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
var buffer = __require("buffer");
|
|
var Buffer2 = buffer.Buffer;
|
|
function copyProps(src, dst) {
|
|
for (var key in src) {
|
|
dst[key] = src[key];
|
|
}
|
|
}
|
|
if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
|
|
module.exports = buffer;
|
|
} else {
|
|
copyProps(buffer, exports);
|
|
exports.Buffer = SafeBuffer;
|
|
}
|
|
function SafeBuffer(arg, encodingOrOffset, length) {
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
}
|
|
SafeBuffer.prototype = Object.create(Buffer2.prototype);
|
|
copyProps(Buffer2, SafeBuffer);
|
|
SafeBuffer.from = function(arg, encodingOrOffset, length) {
|
|
if (typeof arg === "number") {
|
|
throw new TypeError("Argument must not be a number");
|
|
}
|
|
return Buffer2(arg, encodingOrOffset, length);
|
|
};
|
|
SafeBuffer.alloc = function(size, fill, encoding) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
var buf = Buffer2(size);
|
|
if (fill !== undefined) {
|
|
if (typeof encoding === "string") {
|
|
buf.fill(fill, encoding);
|
|
} else {
|
|
buf.fill(fill);
|
|
}
|
|
} else {
|
|
buf.fill(0);
|
|
}
|
|
return buf;
|
|
};
|
|
SafeBuffer.allocUnsafe = function(size) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
return Buffer2(size);
|
|
};
|
|
SafeBuffer.allocUnsafeSlow = function(size) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError("Argument must be a number");
|
|
}
|
|
return buffer.SlowBuffer(size);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/data-stream.js
|
|
var require_data_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var Stream = __require("stream");
|
|
var util = __require("util");
|
|
function DataStream(data) {
|
|
this.buffer = null;
|
|
this.writable = true;
|
|
this.readable = true;
|
|
if (!data) {
|
|
this.buffer = Buffer2.alloc(0);
|
|
return this;
|
|
}
|
|
if (typeof data.pipe === "function") {
|
|
this.buffer = Buffer2.alloc(0);
|
|
data.pipe(this);
|
|
return this;
|
|
}
|
|
if (data.length || typeof data === "object") {
|
|
this.buffer = data;
|
|
this.writable = false;
|
|
process.nextTick(function() {
|
|
this.emit("end", data);
|
|
this.readable = false;
|
|
this.emit("close");
|
|
}.bind(this));
|
|
return this;
|
|
}
|
|
throw new TypeError("Unexpected data type (" + typeof data + ")");
|
|
}
|
|
util.inherits(DataStream, Stream);
|
|
DataStream.prototype.write = function write(data) {
|
|
this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
|
|
this.emit("data", data);
|
|
};
|
|
DataStream.prototype.end = function end(data) {
|
|
if (data)
|
|
this.write(data);
|
|
this.emit("end", data);
|
|
this.emit("close");
|
|
this.writable = false;
|
|
this.readable = false;
|
|
};
|
|
module.exports = DataStream;
|
|
});
|
|
|
|
// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
|
|
var require_param_bytes_for_alg = __commonJS((exports, module) => {
|
|
function getParamSize(keySize) {
|
|
var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
|
|
return result;
|
|
}
|
|
var paramBytesForAlg = {
|
|
ES256: getParamSize(256),
|
|
ES384: getParamSize(384),
|
|
ES512: getParamSize(521)
|
|
};
|
|
function getParamBytesForAlg(alg) {
|
|
var paramBytes = paramBytesForAlg[alg];
|
|
if (paramBytes) {
|
|
return paramBytes;
|
|
}
|
|
throw new Error('Unknown algorithm "' + alg + '"');
|
|
}
|
|
module.exports = getParamBytesForAlg;
|
|
});
|
|
|
|
// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
|
|
var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var getParamBytesForAlg = require_param_bytes_for_alg();
|
|
var MAX_OCTET = 128;
|
|
var CLASS_UNIVERSAL = 0;
|
|
var PRIMITIVE_BIT = 32;
|
|
var TAG_SEQ = 16;
|
|
var TAG_INT = 2;
|
|
var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
|
|
var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
|
|
function base64Url(base64) {
|
|
return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function signatureAsBuffer(signature) {
|
|
if (Buffer2.isBuffer(signature)) {
|
|
return signature;
|
|
} else if (typeof signature === "string") {
|
|
return Buffer2.from(signature, "base64");
|
|
}
|
|
throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
|
|
}
|
|
function derToJose(signature, alg) {
|
|
signature = signatureAsBuffer(signature);
|
|
var paramBytes = getParamBytesForAlg(alg);
|
|
var maxEncodedParamLength = paramBytes + 1;
|
|
var inputLength = signature.length;
|
|
var offset = 0;
|
|
if (signature[offset++] !== ENCODED_TAG_SEQ) {
|
|
throw new Error('Could not find expected "seq"');
|
|
}
|
|
var seqLength = signature[offset++];
|
|
if (seqLength === (MAX_OCTET | 1)) {
|
|
seqLength = signature[offset++];
|
|
}
|
|
if (inputLength - offset < seqLength) {
|
|
throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
|
|
}
|
|
if (signature[offset++] !== ENCODED_TAG_INT) {
|
|
throw new Error('Could not find expected "int" for "r"');
|
|
}
|
|
var rLength = signature[offset++];
|
|
if (inputLength - offset - 2 < rLength) {
|
|
throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
|
|
}
|
|
if (maxEncodedParamLength < rLength) {
|
|
throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
|
|
}
|
|
var rOffset = offset;
|
|
offset += rLength;
|
|
if (signature[offset++] !== ENCODED_TAG_INT) {
|
|
throw new Error('Could not find expected "int" for "s"');
|
|
}
|
|
var sLength = signature[offset++];
|
|
if (inputLength - offset !== sLength) {
|
|
throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
|
|
}
|
|
if (maxEncodedParamLength < sLength) {
|
|
throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
|
|
}
|
|
var sOffset = offset;
|
|
offset += sLength;
|
|
if (offset !== inputLength) {
|
|
throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
|
|
}
|
|
var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
|
|
var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
|
|
for (offset = 0;offset < rPadding; ++offset) {
|
|
dst[offset] = 0;
|
|
}
|
|
signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
|
|
offset = paramBytes;
|
|
for (var o = offset;offset < o + sPadding; ++offset) {
|
|
dst[offset] = 0;
|
|
}
|
|
signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
|
|
dst = dst.toString("base64");
|
|
dst = base64Url(dst);
|
|
return dst;
|
|
}
|
|
function countPadding(buf, start, stop) {
|
|
var padding = 0;
|
|
while (start + padding < stop && buf[start + padding] === 0) {
|
|
++padding;
|
|
}
|
|
var needsSign = buf[start + padding] >= MAX_OCTET;
|
|
if (needsSign) {
|
|
--padding;
|
|
}
|
|
return padding;
|
|
}
|
|
function joseToDer(signature, alg) {
|
|
signature = signatureAsBuffer(signature);
|
|
var paramBytes = getParamBytesForAlg(alg);
|
|
var signatureBytes = signature.length;
|
|
if (signatureBytes !== paramBytes * 2) {
|
|
throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
|
|
}
|
|
var rPadding = countPadding(signature, 0, paramBytes);
|
|
var sPadding = countPadding(signature, paramBytes, signature.length);
|
|
var rLength = paramBytes - rPadding;
|
|
var sLength = paramBytes - sPadding;
|
|
var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
|
|
var shortLength = rsBytes < MAX_OCTET;
|
|
var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
|
|
var offset = 0;
|
|
dst[offset++] = ENCODED_TAG_SEQ;
|
|
if (shortLength) {
|
|
dst[offset++] = rsBytes;
|
|
} else {
|
|
dst[offset++] = MAX_OCTET | 1;
|
|
dst[offset++] = rsBytes & 255;
|
|
}
|
|
dst[offset++] = ENCODED_TAG_INT;
|
|
dst[offset++] = rLength;
|
|
if (rPadding < 0) {
|
|
dst[offset++] = 0;
|
|
offset += signature.copy(dst, offset, 0, paramBytes);
|
|
} else {
|
|
offset += signature.copy(dst, offset, rPadding, paramBytes);
|
|
}
|
|
dst[offset++] = ENCODED_TAG_INT;
|
|
dst[offset++] = sLength;
|
|
if (sPadding < 0) {
|
|
dst[offset++] = 0;
|
|
signature.copy(dst, offset, paramBytes);
|
|
} else {
|
|
signature.copy(dst, offset, paramBytes + sPadding);
|
|
}
|
|
return dst;
|
|
}
|
|
module.exports = {
|
|
derToJose,
|
|
joseToDer
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/buffer-equal-constant-time/index.js
|
|
var require_buffer_equal_constant_time = __commonJS((exports, module) => {
|
|
var Buffer2 = __require("buffer").Buffer;
|
|
var SlowBuffer = __require("buffer").SlowBuffer;
|
|
module.exports = bufferEq;
|
|
function bufferEq(a, b) {
|
|
if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
|
|
return false;
|
|
}
|
|
if (a.length !== b.length) {
|
|
return false;
|
|
}
|
|
var c = 0;
|
|
for (var i = 0;i < a.length; i++) {
|
|
c |= a[i] ^ b[i];
|
|
}
|
|
return c === 0;
|
|
}
|
|
bufferEq.install = function() {
|
|
Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
|
|
return bufferEq(this, that);
|
|
};
|
|
};
|
|
var origBufEqual = Buffer2.prototype.equal;
|
|
var origSlowBufEqual = SlowBuffer.prototype.equal;
|
|
bufferEq.restore = function() {
|
|
Buffer2.prototype.equal = origBufEqual;
|
|
SlowBuffer.prototype.equal = origSlowBufEqual;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jwa/index.js
|
|
var require_jwa = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var crypto2 = __require("crypto");
|
|
var formatEcdsa = require_ecdsa_sig_formatter();
|
|
var util = __require("util");
|
|
var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
|
|
Supported algorithms are:
|
|
"HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
|
|
var MSG_INVALID_SECRET = "secret must be a string or buffer";
|
|
var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
|
|
var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
|
|
var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
|
|
if (supportsKeyObjects) {
|
|
MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
|
|
MSG_INVALID_SECRET += "or a KeyObject";
|
|
}
|
|
function checkIsPublicKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return;
|
|
}
|
|
if (!supportsKeyObjects) {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key !== "object") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.type !== "string") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.asymmetricKeyType !== "string") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
if (typeof key.export !== "function") {
|
|
throw typeError(MSG_INVALID_VERIFIER_KEY);
|
|
}
|
|
}
|
|
function checkIsPrivateKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return;
|
|
}
|
|
if (typeof key === "object") {
|
|
return;
|
|
}
|
|
throw typeError(MSG_INVALID_SIGNER_KEY);
|
|
}
|
|
function checkIsSecretKey(key) {
|
|
if (Buffer2.isBuffer(key)) {
|
|
return;
|
|
}
|
|
if (typeof key === "string") {
|
|
return key;
|
|
}
|
|
if (!supportsKeyObjects) {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (typeof key !== "object") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (key.type !== "secret") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
if (typeof key.export !== "function") {
|
|
throw typeError(MSG_INVALID_SECRET);
|
|
}
|
|
}
|
|
function fromBase64(base64) {
|
|
return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function toBase64(base64url) {
|
|
base64url = base64url.toString();
|
|
var padding = 4 - base64url.length % 4;
|
|
if (padding !== 4) {
|
|
for (var i = 0;i < padding; ++i) {
|
|
base64url += "=";
|
|
}
|
|
}
|
|
return base64url.replace(/\-/g, "+").replace(/_/g, "/");
|
|
}
|
|
function typeError(template) {
|
|
var args = [].slice.call(arguments, 1);
|
|
var errMsg = util.format.bind(util, template).apply(null, args);
|
|
return new TypeError(errMsg);
|
|
}
|
|
function bufferOrString(obj) {
|
|
return Buffer2.isBuffer(obj) || typeof obj === "string";
|
|
}
|
|
function normalizeInput(thing) {
|
|
if (!bufferOrString(thing))
|
|
thing = JSON.stringify(thing);
|
|
return thing;
|
|
}
|
|
function createHmacSigner(bits) {
|
|
return function sign(thing, secret) {
|
|
checkIsSecretKey(secret);
|
|
thing = normalizeInput(thing);
|
|
var hmac = crypto2.createHmac("sha" + bits, secret);
|
|
var sig = (hmac.update(thing), hmac.digest("base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
var bufferEqual;
|
|
var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
|
|
if (a.byteLength !== b.byteLength) {
|
|
return false;
|
|
}
|
|
return crypto2.timingSafeEqual(a, b);
|
|
} : function timingSafeEqual(a, b) {
|
|
if (!bufferEqual) {
|
|
bufferEqual = require_buffer_equal_constant_time();
|
|
}
|
|
return bufferEqual(a, b);
|
|
};
|
|
function createHmacVerifier(bits) {
|
|
return function verify(thing, signature, secret) {
|
|
var computedSig = createHmacSigner(bits)(thing, secret);
|
|
return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
|
|
};
|
|
}
|
|
function createKeySigner(bits) {
|
|
return function sign(thing, privateKey) {
|
|
checkIsPrivateKey(privateKey);
|
|
thing = normalizeInput(thing);
|
|
var signer = crypto2.createSign("RSA-SHA" + bits);
|
|
var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
function createKeyVerifier(bits) {
|
|
return function verify(thing, signature, publicKey) {
|
|
checkIsPublicKey(publicKey);
|
|
thing = normalizeInput(thing);
|
|
signature = toBase64(signature);
|
|
var verifier = crypto2.createVerify("RSA-SHA" + bits);
|
|
verifier.update(thing);
|
|
return verifier.verify(publicKey, signature, "base64");
|
|
};
|
|
}
|
|
function createPSSKeySigner(bits) {
|
|
return function sign(thing, privateKey) {
|
|
checkIsPrivateKey(privateKey);
|
|
thing = normalizeInput(thing);
|
|
var signer = crypto2.createSign("RSA-SHA" + bits);
|
|
var sig = (signer.update(thing), signer.sign({
|
|
key: privateKey,
|
|
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
|
|
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
|
|
}, "base64"));
|
|
return fromBase64(sig);
|
|
};
|
|
}
|
|
function createPSSKeyVerifier(bits) {
|
|
return function verify(thing, signature, publicKey) {
|
|
checkIsPublicKey(publicKey);
|
|
thing = normalizeInput(thing);
|
|
signature = toBase64(signature);
|
|
var verifier = crypto2.createVerify("RSA-SHA" + bits);
|
|
verifier.update(thing);
|
|
return verifier.verify({
|
|
key: publicKey,
|
|
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
|
|
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
|
|
}, signature, "base64");
|
|
};
|
|
}
|
|
function createECDSASigner(bits) {
|
|
var inner = createKeySigner(bits);
|
|
return function sign() {
|
|
var signature = inner.apply(null, arguments);
|
|
signature = formatEcdsa.derToJose(signature, "ES" + bits);
|
|
return signature;
|
|
};
|
|
}
|
|
function createECDSAVerifer(bits) {
|
|
var inner = createKeyVerifier(bits);
|
|
return function verify(thing, signature, publicKey) {
|
|
signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
|
|
var result = inner(thing, signature, publicKey);
|
|
return result;
|
|
};
|
|
}
|
|
function createNoneSigner() {
|
|
return function sign() {
|
|
return "";
|
|
};
|
|
}
|
|
function createNoneVerifier() {
|
|
return function verify(thing, signature) {
|
|
return signature === "";
|
|
};
|
|
}
|
|
module.exports = function jwa(algorithm) {
|
|
var signerFactories = {
|
|
hs: createHmacSigner,
|
|
rs: createKeySigner,
|
|
ps: createPSSKeySigner,
|
|
es: createECDSASigner,
|
|
none: createNoneSigner
|
|
};
|
|
var verifierFactories = {
|
|
hs: createHmacVerifier,
|
|
rs: createKeyVerifier,
|
|
ps: createPSSKeyVerifier,
|
|
es: createECDSAVerifer,
|
|
none: createNoneVerifier
|
|
};
|
|
var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
|
|
if (!match)
|
|
throw typeError(MSG_INVALID_ALGORITHM, algorithm);
|
|
var algo = (match[1] || match[3]).toLowerCase();
|
|
var bits = match[2];
|
|
return {
|
|
sign: signerFactories[algo](bits),
|
|
verify: verifierFactories[algo](bits)
|
|
};
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/tostring.js
|
|
var require_tostring = __commonJS((exports, module) => {
|
|
var Buffer2 = __require("buffer").Buffer;
|
|
module.exports = function toString(obj) {
|
|
if (typeof obj === "string")
|
|
return obj;
|
|
if (typeof obj === "number" || Buffer2.isBuffer(obj))
|
|
return obj.toString();
|
|
return JSON.stringify(obj);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/sign-stream.js
|
|
var require_sign_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var DataStream = require_data_stream();
|
|
var jwa = require_jwa();
|
|
var Stream = __require("stream");
|
|
var toString = require_tostring();
|
|
var util = __require("util");
|
|
function base64url(string, encoding) {
|
|
return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function jwsSecuredInput(header, payload, encoding) {
|
|
encoding = encoding || "utf8";
|
|
var encodedHeader = base64url(toString(header), "binary");
|
|
var encodedPayload = base64url(toString(payload), encoding);
|
|
return util.format("%s.%s", encodedHeader, encodedPayload);
|
|
}
|
|
function jwsSign(opts) {
|
|
var header = opts.header;
|
|
var payload = opts.payload;
|
|
var secretOrKey = opts.secret || opts.privateKey;
|
|
var encoding = opts.encoding;
|
|
var algo = jwa(header.alg);
|
|
var securedInput = jwsSecuredInput(header, payload, encoding);
|
|
var signature = algo.sign(securedInput, secretOrKey);
|
|
return util.format("%s.%s", securedInput, signature);
|
|
}
|
|
function SignStream(opts) {
|
|
var secret = opts.secret || opts.privateKey || opts.key;
|
|
var secretStream = new DataStream(secret);
|
|
this.readable = true;
|
|
this.header = opts.header;
|
|
this.encoding = opts.encoding;
|
|
this.secret = this.privateKey = this.key = secretStream;
|
|
this.payload = new DataStream(opts.payload);
|
|
this.secret.once("close", function() {
|
|
if (!this.payload.writable && this.readable)
|
|
this.sign();
|
|
}.bind(this));
|
|
this.payload.once("close", function() {
|
|
if (!this.secret.writable && this.readable)
|
|
this.sign();
|
|
}.bind(this));
|
|
}
|
|
util.inherits(SignStream, Stream);
|
|
SignStream.prototype.sign = function sign() {
|
|
try {
|
|
var signature = jwsSign({
|
|
header: this.header,
|
|
payload: this.payload.buffer,
|
|
secret: this.secret.buffer,
|
|
encoding: this.encoding
|
|
});
|
|
this.emit("done", signature);
|
|
this.emit("data", signature);
|
|
this.emit("end");
|
|
this.readable = false;
|
|
return signature;
|
|
} catch (e) {
|
|
this.readable = false;
|
|
this.emit("error", e);
|
|
this.emit("close");
|
|
}
|
|
};
|
|
SignStream.sign = jwsSign;
|
|
module.exports = SignStream;
|
|
});
|
|
|
|
// ../eve/node_modules/jws/lib/verify-stream.js
|
|
var require_verify_stream = __commonJS((exports, module) => {
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var DataStream = require_data_stream();
|
|
var jwa = require_jwa();
|
|
var Stream = __require("stream");
|
|
var toString = require_tostring();
|
|
var util = __require("util");
|
|
var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
|
|
function isObject(thing) {
|
|
return Object.prototype.toString.call(thing) === "[object Object]";
|
|
}
|
|
function safeJsonParse(thing) {
|
|
if (isObject(thing))
|
|
return thing;
|
|
try {
|
|
return JSON.parse(thing);
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
}
|
|
function headerFromJWS(jwsSig) {
|
|
var encodedHeader = jwsSig.split(".", 1)[0];
|
|
return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
|
|
}
|
|
function securedInputFromJWS(jwsSig) {
|
|
return jwsSig.split(".", 2).join(".");
|
|
}
|
|
function signatureFromJWS(jwsSig) {
|
|
return jwsSig.split(".")[2];
|
|
}
|
|
function payloadFromJWS(jwsSig, encoding) {
|
|
encoding = encoding || "utf8";
|
|
var payload = jwsSig.split(".")[1];
|
|
return Buffer2.from(payload, "base64").toString(encoding);
|
|
}
|
|
function isValidJws(string) {
|
|
return JWS_REGEX.test(string) && !!headerFromJWS(string);
|
|
}
|
|
function jwsVerify(jwsSig, algorithm, secretOrKey) {
|
|
if (!algorithm) {
|
|
var err = new Error("Missing algorithm parameter for jws.verify");
|
|
err.code = "MISSING_ALGORITHM";
|
|
throw err;
|
|
}
|
|
jwsSig = toString(jwsSig);
|
|
var signature = signatureFromJWS(jwsSig);
|
|
var securedInput = securedInputFromJWS(jwsSig);
|
|
var algo = jwa(algorithm);
|
|
return algo.verify(securedInput, signature, secretOrKey);
|
|
}
|
|
function jwsDecode(jwsSig, opts) {
|
|
opts = opts || {};
|
|
jwsSig = toString(jwsSig);
|
|
if (!isValidJws(jwsSig))
|
|
return null;
|
|
var header = headerFromJWS(jwsSig);
|
|
if (!header)
|
|
return null;
|
|
var payload = payloadFromJWS(jwsSig);
|
|
if (header.typ === "JWT" || opts.json)
|
|
payload = JSON.parse(payload, opts.encoding);
|
|
return {
|
|
header,
|
|
payload,
|
|
signature: signatureFromJWS(jwsSig)
|
|
};
|
|
}
|
|
function VerifyStream(opts) {
|
|
opts = opts || {};
|
|
var secretOrKey = opts.secret || opts.publicKey || opts.key;
|
|
var secretStream = new DataStream(secretOrKey);
|
|
this.readable = true;
|
|
this.algorithm = opts.algorithm;
|
|
this.encoding = opts.encoding;
|
|
this.secret = this.publicKey = this.key = secretStream;
|
|
this.signature = new DataStream(opts.signature);
|
|
this.secret.once("close", function() {
|
|
if (!this.signature.writable && this.readable)
|
|
this.verify();
|
|
}.bind(this));
|
|
this.signature.once("close", function() {
|
|
if (!this.secret.writable && this.readable)
|
|
this.verify();
|
|
}.bind(this));
|
|
}
|
|
util.inherits(VerifyStream, Stream);
|
|
VerifyStream.prototype.verify = function verify() {
|
|
try {
|
|
var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
|
|
var obj = jwsDecode(this.signature.buffer, this.encoding);
|
|
this.emit("done", valid, obj);
|
|
this.emit("data", valid);
|
|
this.emit("end");
|
|
this.readable = false;
|
|
return valid;
|
|
} catch (e) {
|
|
this.readable = false;
|
|
this.emit("error", e);
|
|
this.emit("close");
|
|
}
|
|
};
|
|
VerifyStream.decode = jwsDecode;
|
|
VerifyStream.isValid = isValidJws;
|
|
VerifyStream.verify = jwsVerify;
|
|
module.exports = VerifyStream;
|
|
});
|
|
|
|
// ../eve/node_modules/jws/index.js
|
|
var require_jws = __commonJS((exports) => {
|
|
var SignStream = require_sign_stream();
|
|
var VerifyStream = require_verify_stream();
|
|
var ALGORITHMS = [
|
|
"HS256",
|
|
"HS384",
|
|
"HS512",
|
|
"RS256",
|
|
"RS384",
|
|
"RS512",
|
|
"PS256",
|
|
"PS384",
|
|
"PS512",
|
|
"ES256",
|
|
"ES384",
|
|
"ES512"
|
|
];
|
|
exports.ALGORITHMS = ALGORITHMS;
|
|
exports.sign = SignStream.sign;
|
|
exports.verify = VerifyStream.verify;
|
|
exports.decode = VerifyStream.decode;
|
|
exports.isValid = VerifyStream.isValid;
|
|
exports.createSign = function createSign(opts) {
|
|
return new SignStream(opts);
|
|
};
|
|
exports.createVerify = function createVerify(opts) {
|
|
return new VerifyStream(opts);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/decode.js
|
|
var require_decode = __commonJS((exports, module) => {
|
|
var jws = require_jws();
|
|
module.exports = function(jwt, options2) {
|
|
options2 = options2 || {};
|
|
var decoded = jws.decode(jwt, options2);
|
|
if (!decoded) {
|
|
return null;
|
|
}
|
|
var payload = decoded.payload;
|
|
if (typeof payload === "string") {
|
|
try {
|
|
var obj = JSON.parse(payload);
|
|
if (obj !== null && typeof obj === "object") {
|
|
payload = obj;
|
|
}
|
|
} catch (e) {}
|
|
}
|
|
if (options2.complete === true) {
|
|
return {
|
|
header: decoded.header,
|
|
payload,
|
|
signature: decoded.signature
|
|
};
|
|
}
|
|
return payload;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
|
|
var require_JsonWebTokenError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = function(message, error) {
|
|
Error.call(this, message);
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, this.constructor);
|
|
}
|
|
this.name = "JsonWebTokenError";
|
|
this.message = message;
|
|
if (error)
|
|
this.inner = error;
|
|
};
|
|
JsonWebTokenError.prototype = Object.create(Error.prototype);
|
|
JsonWebTokenError.prototype.constructor = JsonWebTokenError;
|
|
module.exports = JsonWebTokenError;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
|
|
var require_NotBeforeError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var NotBeforeError = function(message, date) {
|
|
JsonWebTokenError.call(this, message);
|
|
this.name = "NotBeforeError";
|
|
this.date = date;
|
|
};
|
|
NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
|
|
NotBeforeError.prototype.constructor = NotBeforeError;
|
|
module.exports = NotBeforeError;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
|
|
var require_TokenExpiredError = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var TokenExpiredError = function(message, expiredAt) {
|
|
JsonWebTokenError.call(this, message);
|
|
this.name = "TokenExpiredError";
|
|
this.expiredAt = expiredAt;
|
|
};
|
|
TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
|
|
TokenExpiredError.prototype.constructor = TokenExpiredError;
|
|
module.exports = TokenExpiredError;
|
|
});
|
|
|
|
// ../eve/node_modules/ms/index.js
|
|
var require_ms = __commonJS((exports, module) => {
|
|
var s = 1000;
|
|
var m = s * 60;
|
|
var h = m * 60;
|
|
var d = h * 24;
|
|
var w = d * 7;
|
|
var y = d * 365.25;
|
|
module.exports = function(val, options2) {
|
|
options2 = options2 || {};
|
|
var type = typeof val;
|
|
if (type === "string" && val.length > 0) {
|
|
return parse(val);
|
|
} else if (type === "number" && isFinite(val)) {
|
|
return options2.long ? fmtLong(val) : fmtShort(val);
|
|
}
|
|
throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
|
|
};
|
|
function parse(str) {
|
|
str = String(str);
|
|
if (str.length > 100) {
|
|
return;
|
|
}
|
|
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
|
|
if (!match) {
|
|
return;
|
|
}
|
|
var n = parseFloat(match[1]);
|
|
var type = (match[2] || "ms").toLowerCase();
|
|
switch (type) {
|
|
case "years":
|
|
case "year":
|
|
case "yrs":
|
|
case "yr":
|
|
case "y":
|
|
return n * y;
|
|
case "weeks":
|
|
case "week":
|
|
case "w":
|
|
return n * w;
|
|
case "days":
|
|
case "day":
|
|
case "d":
|
|
return n * d;
|
|
case "hours":
|
|
case "hour":
|
|
case "hrs":
|
|
case "hr":
|
|
case "h":
|
|
return n * h;
|
|
case "minutes":
|
|
case "minute":
|
|
case "mins":
|
|
case "min":
|
|
case "m":
|
|
return n * m;
|
|
case "seconds":
|
|
case "second":
|
|
case "secs":
|
|
case "sec":
|
|
case "s":
|
|
return n * s;
|
|
case "milliseconds":
|
|
case "millisecond":
|
|
case "msecs":
|
|
case "msec":
|
|
case "ms":
|
|
return n;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
function fmtShort(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return Math.round(ms / d) + "d";
|
|
}
|
|
if (msAbs >= h) {
|
|
return Math.round(ms / h) + "h";
|
|
}
|
|
if (msAbs >= m) {
|
|
return Math.round(ms / m) + "m";
|
|
}
|
|
if (msAbs >= s) {
|
|
return Math.round(ms / s) + "s";
|
|
}
|
|
return ms + "ms";
|
|
}
|
|
function fmtLong(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return plural(ms, msAbs, d, "day");
|
|
}
|
|
if (msAbs >= h) {
|
|
return plural(ms, msAbs, h, "hour");
|
|
}
|
|
if (msAbs >= m) {
|
|
return plural(ms, msAbs, m, "minute");
|
|
}
|
|
if (msAbs >= s) {
|
|
return plural(ms, msAbs, s, "second");
|
|
}
|
|
return ms + " ms";
|
|
}
|
|
function plural(ms, msAbs, n, name) {
|
|
var isPlural = msAbs >= n * 1.5;
|
|
return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/timespan.js
|
|
var require_timespan = __commonJS((exports, module) => {
|
|
var ms = require_ms();
|
|
module.exports = function(time, iat) {
|
|
var timestamp = iat || Math.floor(Date.now() / 1000);
|
|
if (typeof time === "string") {
|
|
var milliseconds = ms(time);
|
|
if (typeof milliseconds === "undefined") {
|
|
return;
|
|
}
|
|
return Math.floor(timestamp + milliseconds / 1000);
|
|
} else if (typeof time === "number") {
|
|
return timestamp + time;
|
|
} else {
|
|
return;
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/constants.js
|
|
var require_constants = __commonJS((exports, module) => {
|
|
var SEMVER_SPEC_VERSION = "2.0.0";
|
|
var MAX_LENGTH = 256;
|
|
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
var MAX_SAFE_COMPONENT_LENGTH = 16;
|
|
var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
|
|
var RELEASE_TYPES = [
|
|
"major",
|
|
"premajor",
|
|
"minor",
|
|
"preminor",
|
|
"patch",
|
|
"prepatch",
|
|
"prerelease"
|
|
];
|
|
module.exports = {
|
|
MAX_LENGTH,
|
|
MAX_SAFE_COMPONENT_LENGTH,
|
|
MAX_SAFE_BUILD_LENGTH,
|
|
MAX_SAFE_INTEGER,
|
|
RELEASE_TYPES,
|
|
SEMVER_SPEC_VERSION,
|
|
FLAG_INCLUDE_PRERELEASE: 1,
|
|
FLAG_LOOSE: 2
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/debug.js
|
|
var require_debug = __commonJS((exports, module) => {
|
|
var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
|
|
module.exports = debug;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/re.js
|
|
var require_re = __commonJS((exports, module) => {
|
|
var {
|
|
MAX_SAFE_COMPONENT_LENGTH,
|
|
MAX_SAFE_BUILD_LENGTH,
|
|
MAX_LENGTH
|
|
} = require_constants();
|
|
var debug = require_debug();
|
|
exports = module.exports = {};
|
|
var re = exports.re = [];
|
|
var safeRe = exports.safeRe = [];
|
|
var src = exports.src = [];
|
|
var safeSrc = exports.safeSrc = [];
|
|
var t = exports.t = {};
|
|
var R = 0;
|
|
var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
|
|
var safeRegexReplacements = [
|
|
["\\s", 1],
|
|
["\\d", MAX_LENGTH],
|
|
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
|
|
];
|
|
var makeSafeRegex = (value) => {
|
|
for (const [token, max] of safeRegexReplacements) {
|
|
value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
|
|
}
|
|
return value;
|
|
};
|
|
var createToken = (name, value, isGlobal) => {
|
|
const safe = makeSafeRegex(value);
|
|
const index2 = R++;
|
|
debug(name, index2, value);
|
|
t[name] = index2;
|
|
src[index2] = value;
|
|
safeSrc[index2] = safe;
|
|
re[index2] = new RegExp(value, isGlobal ? "g" : undefined);
|
|
safeRe[index2] = new RegExp(safe, isGlobal ? "g" : undefined);
|
|
};
|
|
createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
|
|
createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
|
|
createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
|
|
createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
|
|
createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
|
|
createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
|
|
createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
|
|
createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
|
|
createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
|
|
createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
|
|
createToken("FULL", `^${src[t.FULLPLAIN]}$`);
|
|
createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
|
|
createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
|
|
createToken("GTLT", "((?:<|>)?=?)");
|
|
createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
|
|
createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
|
|
createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
|
|
createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
|
|
createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
|
|
createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
|
|
createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
|
|
createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
|
|
createToken("COERCERTL", src[t.COERCE], true);
|
|
createToken("COERCERTLFULL", src[t.COERCEFULL], true);
|
|
createToken("LONETILDE", "(?:~>?)");
|
|
createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
|
|
exports.tildeTrimReplace = "$1~";
|
|
createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("LONECARET", "(?:\\^)");
|
|
createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
|
|
exports.caretTrimReplace = "$1^";
|
|
createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
|
|
createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
|
|
createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
|
|
exports.comparatorTrimReplace = "$1$2$3";
|
|
createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
|
|
createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
|
|
createToken("STAR", "(<|>)?=?\\s*\\*");
|
|
createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
|
|
createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/parse-options.js
|
|
var require_parse_options = __commonJS((exports, module) => {
|
|
var looseOption = Object.freeze({ loose: true });
|
|
var emptyOpts = Object.freeze({});
|
|
var parseOptions = (options2) => {
|
|
if (!options2) {
|
|
return emptyOpts;
|
|
}
|
|
if (typeof options2 !== "object") {
|
|
return looseOption;
|
|
}
|
|
return options2;
|
|
};
|
|
module.exports = parseOptions;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/identifiers.js
|
|
var require_identifiers = __commonJS((exports, module) => {
|
|
var numeric2 = /^[0-9]+$/;
|
|
var compareIdentifiers = (a, b) => {
|
|
const anum = numeric2.test(a);
|
|
const bnum = numeric2.test(b);
|
|
if (anum && bnum) {
|
|
a = +a;
|
|
b = +b;
|
|
}
|
|
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
|
|
};
|
|
var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
|
|
module.exports = {
|
|
compareIdentifiers,
|
|
rcompareIdentifiers
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/semver.js
|
|
var require_semver = __commonJS((exports, module) => {
|
|
var debug = require_debug();
|
|
var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
|
|
var { safeRe: re, t } = require_re();
|
|
var parseOptions = require_parse_options();
|
|
var { compareIdentifiers } = require_identifiers();
|
|
|
|
class SemVer {
|
|
constructor(version2, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (version2 instanceof SemVer) {
|
|
if (version2.loose === !!options2.loose && version2.includePrerelease === !!options2.includePrerelease) {
|
|
return version2;
|
|
} else {
|
|
version2 = version2.version;
|
|
}
|
|
} else if (typeof version2 !== "string") {
|
|
throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);
|
|
}
|
|
if (version2.length > MAX_LENGTH) {
|
|
throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
|
|
}
|
|
debug("SemVer", version2, options2);
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.includePrerelease = !!options2.includePrerelease;
|
|
const m = version2.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid Version: ${version2}`);
|
|
}
|
|
this.raw = version2;
|
|
this.major = +m[1];
|
|
this.minor = +m[2];
|
|
this.patch = +m[3];
|
|
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
|
|
throw new TypeError("Invalid major version");
|
|
}
|
|
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
|
|
throw new TypeError("Invalid minor version");
|
|
}
|
|
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
|
|
throw new TypeError("Invalid patch version");
|
|
}
|
|
if (!m[4]) {
|
|
this.prerelease = [];
|
|
} else {
|
|
this.prerelease = m[4].split(".").map((id) => {
|
|
if (/^[0-9]+$/.test(id)) {
|
|
const num = +id;
|
|
if (num >= 0 && num < MAX_SAFE_INTEGER) {
|
|
return num;
|
|
}
|
|
}
|
|
return id;
|
|
});
|
|
}
|
|
this.build = m[5] ? m[5].split(".") : [];
|
|
this.format();
|
|
}
|
|
format() {
|
|
this.version = `${this.major}.${this.minor}.${this.patch}`;
|
|
if (this.prerelease.length) {
|
|
this.version += `-${this.prerelease.join(".")}`;
|
|
}
|
|
return this.version;
|
|
}
|
|
toString() {
|
|
return this.version;
|
|
}
|
|
compare(other) {
|
|
debug("SemVer.compare", this.version, this.options, other);
|
|
if (!(other instanceof SemVer)) {
|
|
if (typeof other === "string" && other === this.version) {
|
|
return 0;
|
|
}
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (other.version === this.version) {
|
|
return 0;
|
|
}
|
|
return this.compareMain(other) || this.comparePre(other);
|
|
}
|
|
compareMain(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
|
|
}
|
|
comparePre(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (this.prerelease.length && !other.prerelease.length) {
|
|
return -1;
|
|
} else if (!this.prerelease.length && other.prerelease.length) {
|
|
return 1;
|
|
} else if (!this.prerelease.length && !other.prerelease.length) {
|
|
return 0;
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.prerelease[i];
|
|
const b = other.prerelease[i];
|
|
debug("prerelease compare", i, a, b);
|
|
if (a === undefined && b === undefined) {
|
|
return 0;
|
|
} else if (b === undefined) {
|
|
return 1;
|
|
} else if (a === undefined) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
compareBuild(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.build[i];
|
|
const b = other.build[i];
|
|
debug("build compare", i, a, b);
|
|
if (a === undefined && b === undefined) {
|
|
return 0;
|
|
} else if (b === undefined) {
|
|
return 1;
|
|
} else if (a === undefined) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
inc(release, identifier, identifierBase) {
|
|
if (release.startsWith("pre")) {
|
|
if (!identifier && identifierBase === false) {
|
|
throw new Error("invalid increment argument: identifier is empty");
|
|
}
|
|
if (identifier) {
|
|
const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
|
|
if (!match || match[1] !== identifier) {
|
|
throw new Error(`invalid identifier: ${identifier}`);
|
|
}
|
|
}
|
|
}
|
|
switch (release) {
|
|
case "premajor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor = 0;
|
|
this.major++;
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "preminor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor++;
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "prepatch":
|
|
this.prerelease.length = 0;
|
|
this.inc("patch", identifier, identifierBase);
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "prerelease":
|
|
if (this.prerelease.length === 0) {
|
|
this.inc("patch", identifier, identifierBase);
|
|
}
|
|
this.inc("pre", identifier, identifierBase);
|
|
break;
|
|
case "release":
|
|
if (this.prerelease.length === 0) {
|
|
throw new Error(`version ${this.raw} is not a prerelease`);
|
|
}
|
|
this.prerelease.length = 0;
|
|
break;
|
|
case "major":
|
|
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.major++;
|
|
}
|
|
this.minor = 0;
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "minor":
|
|
if (this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.minor++;
|
|
}
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "patch":
|
|
if (this.prerelease.length === 0) {
|
|
this.patch++;
|
|
}
|
|
this.prerelease = [];
|
|
break;
|
|
case "pre": {
|
|
const base = Number(identifierBase) ? 1 : 0;
|
|
if (this.prerelease.length === 0) {
|
|
this.prerelease = [base];
|
|
} else {
|
|
let i = this.prerelease.length;
|
|
while (--i >= 0) {
|
|
if (typeof this.prerelease[i] === "number") {
|
|
this.prerelease[i]++;
|
|
i = -2;
|
|
}
|
|
}
|
|
if (i === -1) {
|
|
if (identifier === this.prerelease.join(".") && identifierBase === false) {
|
|
throw new Error("invalid increment argument: identifier already exists");
|
|
}
|
|
this.prerelease.push(base);
|
|
}
|
|
}
|
|
if (identifier) {
|
|
let prerelease = [identifier, base];
|
|
if (identifierBase === false) {
|
|
prerelease = [identifier];
|
|
}
|
|
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
|
|
if (isNaN(this.prerelease[1])) {
|
|
this.prerelease = prerelease;
|
|
}
|
|
} else {
|
|
this.prerelease = prerelease;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
throw new Error(`invalid increment argument: ${release}`);
|
|
}
|
|
this.raw = this.format();
|
|
if (this.build.length) {
|
|
this.raw += `+${this.build.join(".")}`;
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
module.exports = SemVer;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/parse.js
|
|
var require_parse = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var parse = (version2, options2, throwErrors = false) => {
|
|
if (version2 instanceof SemVer) {
|
|
return version2;
|
|
}
|
|
try {
|
|
return new SemVer(version2, options2);
|
|
} catch (er) {
|
|
if (!throwErrors) {
|
|
return null;
|
|
}
|
|
throw er;
|
|
}
|
|
};
|
|
module.exports = parse;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/valid.js
|
|
var require_valid = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var valid = (version2, options2) => {
|
|
const v = parse(version2, options2);
|
|
return v ? v.version : null;
|
|
};
|
|
module.exports = valid;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/clean.js
|
|
var require_clean = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var clean = (version2, options2) => {
|
|
const s = parse(version2.trim().replace(/^[=v]+/, ""), options2);
|
|
return s ? s.version : null;
|
|
};
|
|
module.exports = clean;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/inc.js
|
|
var require_inc = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var inc = (version2, release, options2, identifier, identifierBase) => {
|
|
if (typeof options2 === "string") {
|
|
identifierBase = identifier;
|
|
identifier = options2;
|
|
options2 = undefined;
|
|
}
|
|
try {
|
|
return new SemVer(version2 instanceof SemVer ? version2.version : version2, options2).inc(release, identifier, identifierBase).version;
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module.exports = inc;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/diff.js
|
|
var require_diff = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var diff = (version1, version2) => {
|
|
const v1 = parse(version1, null, true);
|
|
const v2 = parse(version2, null, true);
|
|
const comparison = v1.compare(v2);
|
|
if (comparison === 0) {
|
|
return null;
|
|
}
|
|
const v1Higher = comparison > 0;
|
|
const highVersion = v1Higher ? v1 : v2;
|
|
const lowVersion = v1Higher ? v2 : v1;
|
|
const highHasPre = !!highVersion.prerelease.length;
|
|
const lowHasPre = !!lowVersion.prerelease.length;
|
|
if (lowHasPre && !highHasPre) {
|
|
if (!lowVersion.patch && !lowVersion.minor) {
|
|
return "major";
|
|
}
|
|
if (lowVersion.compareMain(highVersion) === 0) {
|
|
if (lowVersion.minor && !lowVersion.patch) {
|
|
return "minor";
|
|
}
|
|
return "patch";
|
|
}
|
|
}
|
|
const prefix = highHasPre ? "pre" : "";
|
|
if (v1.major !== v2.major) {
|
|
return prefix + "major";
|
|
}
|
|
if (v1.minor !== v2.minor) {
|
|
return prefix + "minor";
|
|
}
|
|
if (v1.patch !== v2.patch) {
|
|
return prefix + "patch";
|
|
}
|
|
return "prerelease";
|
|
};
|
|
module.exports = diff;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/major.js
|
|
var require_major = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var major = (a, loose) => new SemVer(a, loose).major;
|
|
module.exports = major;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/minor.js
|
|
var require_minor = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var minor = (a, loose) => new SemVer(a, loose).minor;
|
|
module.exports = minor;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/patch.js
|
|
var require_patch = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var patch = (a, loose) => new SemVer(a, loose).patch;
|
|
module.exports = patch;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/prerelease.js
|
|
var require_prerelease = __commonJS((exports, module) => {
|
|
var parse = require_parse();
|
|
var prerelease = (version2, options2) => {
|
|
const parsed = parse(version2, options2);
|
|
return parsed && parsed.prerelease.length ? parsed.prerelease : null;
|
|
};
|
|
module.exports = prerelease;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare.js
|
|
var require_compare = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
|
|
module.exports = compare;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/rcompare.js
|
|
var require_rcompare = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var rcompare = (a, b, loose) => compare(b, a, loose);
|
|
module.exports = rcompare;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare-loose.js
|
|
var require_compare_loose = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var compareLoose = (a, b) => compare(a, b, true);
|
|
module.exports = compareLoose;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/compare-build.js
|
|
var require_compare_build = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var compareBuild = (a, b, loose) => {
|
|
const versionA = new SemVer(a, loose);
|
|
const versionB = new SemVer(b, loose);
|
|
return versionA.compare(versionB) || versionA.compareBuild(versionB);
|
|
};
|
|
module.exports = compareBuild;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/sort.js
|
|
var require_sort = __commonJS((exports, module) => {
|
|
var compareBuild = require_compare_build();
|
|
var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
|
|
module.exports = sort;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/rsort.js
|
|
var require_rsort = __commonJS((exports, module) => {
|
|
var compareBuild = require_compare_build();
|
|
var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
|
|
module.exports = rsort;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/gt.js
|
|
var require_gt = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var gt2 = (a, b, loose) => compare(a, b, loose) > 0;
|
|
module.exports = gt2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/lt.js
|
|
var require_lt = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var lt2 = (a, b, loose) => compare(a, b, loose) < 0;
|
|
module.exports = lt2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/eq.js
|
|
var require_eq = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var eq2 = (a, b, loose) => compare(a, b, loose) === 0;
|
|
module.exports = eq2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/neq.js
|
|
var require_neq = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var neq = (a, b, loose) => compare(a, b, loose) !== 0;
|
|
module.exports = neq;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/gte.js
|
|
var require_gte = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
|
|
module.exports = gte2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/lte.js
|
|
var require_lte = __commonJS((exports, module) => {
|
|
var compare = require_compare();
|
|
var lte2 = (a, b, loose) => compare(a, b, loose) <= 0;
|
|
module.exports = lte2;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/cmp.js
|
|
var require_cmp = __commonJS((exports, module) => {
|
|
var eq2 = require_eq();
|
|
var neq = require_neq();
|
|
var gt2 = require_gt();
|
|
var gte2 = require_gte();
|
|
var lt2 = require_lt();
|
|
var lte2 = require_lte();
|
|
var cmp = (a, op, b, loose) => {
|
|
switch (op) {
|
|
case "===":
|
|
if (typeof a === "object") {
|
|
a = a.version;
|
|
}
|
|
if (typeof b === "object") {
|
|
b = b.version;
|
|
}
|
|
return a === b;
|
|
case "!==":
|
|
if (typeof a === "object") {
|
|
a = a.version;
|
|
}
|
|
if (typeof b === "object") {
|
|
b = b.version;
|
|
}
|
|
return a !== b;
|
|
case "":
|
|
case "=":
|
|
case "==":
|
|
return eq2(a, b, loose);
|
|
case "!=":
|
|
return neq(a, b, loose);
|
|
case ">":
|
|
return gt2(a, b, loose);
|
|
case ">=":
|
|
return gte2(a, b, loose);
|
|
case "<":
|
|
return lt2(a, b, loose);
|
|
case "<=":
|
|
return lte2(a, b, loose);
|
|
default:
|
|
throw new TypeError(`Invalid operator: ${op}`);
|
|
}
|
|
};
|
|
module.exports = cmp;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/coerce.js
|
|
var require_coerce = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var parse = require_parse();
|
|
var { safeRe: re, t } = require_re();
|
|
var coerce = (version2, options2) => {
|
|
if (version2 instanceof SemVer) {
|
|
return version2;
|
|
}
|
|
if (typeof version2 === "number") {
|
|
version2 = String(version2);
|
|
}
|
|
if (typeof version2 !== "string") {
|
|
return null;
|
|
}
|
|
options2 = options2 || {};
|
|
let match = null;
|
|
if (!options2.rtl) {
|
|
match = version2.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
|
|
} else {
|
|
const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
|
|
let next;
|
|
while ((next = coerceRtlRegex.exec(version2)) && (!match || match.index + match[0].length !== version2.length)) {
|
|
if (!match || next.index + next[0].length !== match.index + match[0].length) {
|
|
match = next;
|
|
}
|
|
coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
|
|
}
|
|
coerceRtlRegex.lastIndex = -1;
|
|
}
|
|
if (match === null) {
|
|
return null;
|
|
}
|
|
const major = match[2];
|
|
const minor = match[3] || "0";
|
|
const patch = match[4] || "0";
|
|
const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
|
|
const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
|
|
return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
|
|
};
|
|
module.exports = coerce;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/internal/lrucache.js
|
|
var require_lrucache = __commonJS((exports, module) => {
|
|
class LRUCache {
|
|
constructor() {
|
|
this.max = 1000;
|
|
this.map = new Map;
|
|
}
|
|
get(key) {
|
|
const value = this.map.get(key);
|
|
if (value === undefined) {
|
|
return;
|
|
} else {
|
|
this.map.delete(key);
|
|
this.map.set(key, value);
|
|
return value;
|
|
}
|
|
}
|
|
delete(key) {
|
|
return this.map.delete(key);
|
|
}
|
|
set(key, value) {
|
|
const deleted = this.delete(key);
|
|
if (!deleted && value !== undefined) {
|
|
if (this.map.size >= this.max) {
|
|
const firstKey = this.map.keys().next().value;
|
|
this.delete(firstKey);
|
|
}
|
|
this.map.set(key, value);
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
module.exports = LRUCache;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/range.js
|
|
var require_range = __commonJS((exports, module) => {
|
|
var SPACE_CHARACTERS = /\s+/g;
|
|
|
|
class Range {
|
|
constructor(range, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (range instanceof Range) {
|
|
if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
|
|
return range;
|
|
} else {
|
|
return new Range(range.raw, options2);
|
|
}
|
|
}
|
|
if (range instanceof Comparator) {
|
|
this.raw = range.value;
|
|
this.set = [[range]];
|
|
this.formatted = undefined;
|
|
return this;
|
|
}
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.includePrerelease = !!options2.includePrerelease;
|
|
this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
|
|
this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
|
|
if (!this.set.length) {
|
|
throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
|
|
}
|
|
if (this.set.length > 1) {
|
|
const first = this.set[0];
|
|
this.set = this.set.filter((c) => !isNullSet(c[0]));
|
|
if (this.set.length === 0) {
|
|
this.set = [first];
|
|
} else if (this.set.length > 1) {
|
|
for (const c of this.set) {
|
|
if (c.length === 1 && isAny(c[0])) {
|
|
this.set = [c];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.formatted = undefined;
|
|
}
|
|
get range() {
|
|
if (this.formatted === undefined) {
|
|
this.formatted = "";
|
|
for (let i = 0;i < this.set.length; i++) {
|
|
if (i > 0) {
|
|
this.formatted += "||";
|
|
}
|
|
const comps = this.set[i];
|
|
for (let k = 0;k < comps.length; k++) {
|
|
if (k > 0) {
|
|
this.formatted += " ";
|
|
}
|
|
this.formatted += comps[k].toString().trim();
|
|
}
|
|
}
|
|
}
|
|
return this.formatted;
|
|
}
|
|
format() {
|
|
return this.range;
|
|
}
|
|
toString() {
|
|
return this.range;
|
|
}
|
|
parseRange(range) {
|
|
const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
|
|
const memoKey = memoOpts + ":" + range;
|
|
const cached = cache.get(memoKey);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const loose = this.options.loose;
|
|
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
|
|
range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
|
|
debug("hyphen replace", range);
|
|
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
|
|
debug("comparator trim", range);
|
|
range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
|
|
debug("tilde trim", range);
|
|
range = range.replace(re[t.CARETTRIM], caretTrimReplace);
|
|
debug("caret trim", range);
|
|
let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
|
|
if (loose) {
|
|
rangeList = rangeList.filter((comp) => {
|
|
debug("loose invalid filter", comp, this.options);
|
|
return !!comp.match(re[t.COMPARATORLOOSE]);
|
|
});
|
|
}
|
|
debug("range list", rangeList);
|
|
const rangeMap = new Map;
|
|
const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
|
|
for (const comp of comparators) {
|
|
if (isNullSet(comp)) {
|
|
return [comp];
|
|
}
|
|
rangeMap.set(comp.value, comp);
|
|
}
|
|
if (rangeMap.size > 1 && rangeMap.has("")) {
|
|
rangeMap.delete("");
|
|
}
|
|
const result = [...rangeMap.values()];
|
|
cache.set(memoKey, result);
|
|
return result;
|
|
}
|
|
intersects(range, options2) {
|
|
if (!(range instanceof Range)) {
|
|
throw new TypeError("a Range is required");
|
|
}
|
|
return this.set.some((thisComparators) => {
|
|
return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
|
|
return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
|
|
return rangeComparators.every((rangeComparator) => {
|
|
return thisComparator.intersects(rangeComparator, options2);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
test(version2) {
|
|
if (!version2) {
|
|
return false;
|
|
}
|
|
if (typeof version2 === "string") {
|
|
try {
|
|
version2 = new SemVer(version2, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let i = 0;i < this.set.length; i++) {
|
|
if (testSet(this.set[i], version2, this.options)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = Range;
|
|
var LRU = require_lrucache();
|
|
var cache = new LRU;
|
|
var parseOptions = require_parse_options();
|
|
var Comparator = require_comparator();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var {
|
|
safeRe: re,
|
|
t,
|
|
comparatorTrimReplace,
|
|
tildeTrimReplace,
|
|
caretTrimReplace
|
|
} = require_re();
|
|
var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
|
|
var isNullSet = (c) => c.value === "<0.0.0-0";
|
|
var isAny = (c) => c.value === "";
|
|
var isSatisfiable = (comparators, options2) => {
|
|
let result = true;
|
|
const remainingComparators = comparators.slice();
|
|
let testComparator = remainingComparators.pop();
|
|
while (result && remainingComparators.length) {
|
|
result = remainingComparators.every((otherComparator) => {
|
|
return testComparator.intersects(otherComparator, options2);
|
|
});
|
|
testComparator = remainingComparators.pop();
|
|
}
|
|
return result;
|
|
};
|
|
var parseComparator = (comp, options2) => {
|
|
debug("comp", comp, options2);
|
|
comp = replaceCarets(comp, options2);
|
|
debug("caret", comp);
|
|
comp = replaceTildes(comp, options2);
|
|
debug("tildes", comp);
|
|
comp = replaceXRanges(comp, options2);
|
|
debug("xrange", comp);
|
|
comp = replaceStars(comp, options2);
|
|
debug("stars", comp);
|
|
return comp;
|
|
};
|
|
var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
|
|
var replaceTildes = (comp, options2) => {
|
|
return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
|
|
};
|
|
var replaceTilde = (comp, options2) => {
|
|
const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("tilde", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
|
|
} else if (pr) {
|
|
debug("replaceTilde pr", pr);
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("tilde return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceCarets = (comp, options2) => {
|
|
return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
|
|
};
|
|
var replaceCaret = (comp, options2) => {
|
|
debug("caret", comp, options2);
|
|
const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
|
|
const z = options2.includePrerelease ? "-0" : "";
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("caret", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
if (M === "0") {
|
|
ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else if (pr) {
|
|
debug("replaceCaret pr", pr);
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else {
|
|
debug("no pr");
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
|
|
}
|
|
}
|
|
debug("caret return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceXRanges = (comp, options2) => {
|
|
debug("replaceXRanges", comp, options2);
|
|
return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
|
|
};
|
|
var replaceXRange = (comp, options2) => {
|
|
comp = comp.trim();
|
|
const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
|
|
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
|
|
debug("xRange", comp, ret, gtlt, M, m, p, pr);
|
|
const xM = isX(M);
|
|
const xm = xM || isX(m);
|
|
const xp = xm || isX(p);
|
|
const anyX = xp;
|
|
if (gtlt === "=" && anyX) {
|
|
gtlt = "";
|
|
}
|
|
pr = options2.includePrerelease ? "-0" : "";
|
|
if (xM) {
|
|
if (gtlt === ">" || gtlt === "<") {
|
|
ret = "<0.0.0-0";
|
|
} else {
|
|
ret = "*";
|
|
}
|
|
} else if (gtlt && anyX) {
|
|
if (xm) {
|
|
m = 0;
|
|
}
|
|
p = 0;
|
|
if (gtlt === ">") {
|
|
gtlt = ">=";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
m = 0;
|
|
p = 0;
|
|
} else {
|
|
m = +m + 1;
|
|
p = 0;
|
|
}
|
|
} else if (gtlt === "<=") {
|
|
gtlt = "<";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
} else {
|
|
m = +m + 1;
|
|
}
|
|
}
|
|
if (gtlt === "<") {
|
|
pr = "-0";
|
|
}
|
|
ret = `${gtlt + M}.${m}.${p}${pr}`;
|
|
} else if (xm) {
|
|
ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
|
|
} else if (xp) {
|
|
ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("xRange return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceStars = (comp, options2) => {
|
|
debug("replaceStars", comp, options2);
|
|
return comp.trim().replace(re[t.STAR], "");
|
|
};
|
|
var replaceGTE0 = (comp, options2) => {
|
|
debug("replaceGTE0", comp, options2);
|
|
return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
|
|
};
|
|
var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
|
|
if (isX(fM)) {
|
|
from = "";
|
|
} else if (isX(fm)) {
|
|
from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
|
|
} else if (isX(fp)) {
|
|
from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
|
|
} else if (fpr) {
|
|
from = `>=${from}`;
|
|
} else {
|
|
from = `>=${from}${incPr ? "-0" : ""}`;
|
|
}
|
|
if (isX(tM)) {
|
|
to = "";
|
|
} else if (isX(tm)) {
|
|
to = `<${+tM + 1}.0.0-0`;
|
|
} else if (isX(tp)) {
|
|
to = `<${tM}.${+tm + 1}.0-0`;
|
|
} else if (tpr) {
|
|
to = `<=${tM}.${tm}.${tp}-${tpr}`;
|
|
} else if (incPr) {
|
|
to = `<${tM}.${tm}.${+tp + 1}-0`;
|
|
} else {
|
|
to = `<=${to}`;
|
|
}
|
|
return `${from} ${to}`.trim();
|
|
};
|
|
var testSet = (set, version2, options2) => {
|
|
for (let i = 0;i < set.length; i++) {
|
|
if (!set[i].test(version2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (version2.prerelease.length && !options2.includePrerelease) {
|
|
for (let i = 0;i < set.length; i++) {
|
|
debug(set[i].semver);
|
|
if (set[i].semver === Comparator.ANY) {
|
|
continue;
|
|
}
|
|
if (set[i].semver.prerelease.length > 0) {
|
|
const allowed = set[i].semver;
|
|
if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/classes/comparator.js
|
|
var require_comparator = __commonJS((exports, module) => {
|
|
var ANY = Symbol("SemVer ANY");
|
|
|
|
class Comparator {
|
|
static get ANY() {
|
|
return ANY;
|
|
}
|
|
constructor(comp, options2) {
|
|
options2 = parseOptions(options2);
|
|
if (comp instanceof Comparator) {
|
|
if (comp.loose === !!options2.loose) {
|
|
return comp;
|
|
} else {
|
|
comp = comp.value;
|
|
}
|
|
}
|
|
comp = comp.trim().split(/\s+/).join(" ");
|
|
debug("comparator", comp, options2);
|
|
this.options = options2;
|
|
this.loose = !!options2.loose;
|
|
this.parse(comp);
|
|
if (this.semver === ANY) {
|
|
this.value = "";
|
|
} else {
|
|
this.value = this.operator + this.semver.version;
|
|
}
|
|
debug("comp", this);
|
|
}
|
|
parse(comp) {
|
|
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
|
|
const m = comp.match(r);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid comparator: ${comp}`);
|
|
}
|
|
this.operator = m[1] !== undefined ? m[1] : "";
|
|
if (this.operator === "=") {
|
|
this.operator = "";
|
|
}
|
|
if (!m[2]) {
|
|
this.semver = ANY;
|
|
} else {
|
|
this.semver = new SemVer(m[2], this.options.loose);
|
|
}
|
|
}
|
|
toString() {
|
|
return this.value;
|
|
}
|
|
test(version2) {
|
|
debug("Comparator.test", version2, this.options.loose);
|
|
if (this.semver === ANY || version2 === ANY) {
|
|
return true;
|
|
}
|
|
if (typeof version2 === "string") {
|
|
try {
|
|
version2 = new SemVer(version2, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
return cmp(version2, this.operator, this.semver, this.options);
|
|
}
|
|
intersects(comp, options2) {
|
|
if (!(comp instanceof Comparator)) {
|
|
throw new TypeError("a Comparator is required");
|
|
}
|
|
if (this.operator === "") {
|
|
if (this.value === "") {
|
|
return true;
|
|
}
|
|
return new Range(comp.value, options2).test(this.value);
|
|
} else if (comp.operator === "") {
|
|
if (comp.value === "") {
|
|
return true;
|
|
}
|
|
return new Range(this.value, options2).test(comp.semver);
|
|
}
|
|
options2 = parseOptions(options2);
|
|
if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
|
|
return false;
|
|
}
|
|
if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
|
|
return false;
|
|
}
|
|
if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
|
|
return true;
|
|
}
|
|
if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
|
|
return true;
|
|
}
|
|
if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
|
|
return true;
|
|
}
|
|
if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
|
|
return true;
|
|
}
|
|
if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = Comparator;
|
|
var parseOptions = require_parse_options();
|
|
var { safeRe: re, t } = require_re();
|
|
var cmp = require_cmp();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
});
|
|
|
|
// ../eve/node_modules/semver/functions/satisfies.js
|
|
var require_satisfies = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var satisfies = (version2, range, options2) => {
|
|
try {
|
|
range = new Range(range, options2);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
return range.test(version2);
|
|
};
|
|
module.exports = satisfies;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/to-comparators.js
|
|
var require_to_comparators = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
|
|
module.exports = toComparators;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/max-satisfying.js
|
|
var require_max_satisfying = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var maxSatisfying = (versions, range, options2) => {
|
|
let max = null;
|
|
let maxSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range(range, options2);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!max || maxSV.compare(v) === -1) {
|
|
max = v;
|
|
maxSV = new SemVer(max, options2);
|
|
}
|
|
}
|
|
});
|
|
return max;
|
|
};
|
|
module.exports = maxSatisfying;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/min-satisfying.js
|
|
var require_min_satisfying = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var minSatisfying = (versions, range, options2) => {
|
|
let min = null;
|
|
let minSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range(range, options2);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!min || minSV.compare(v) === 1) {
|
|
min = v;
|
|
minSV = new SemVer(min, options2);
|
|
}
|
|
}
|
|
});
|
|
return min;
|
|
};
|
|
module.exports = minSatisfying;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/min-version.js
|
|
var require_min_version = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Range = require_range();
|
|
var gt2 = require_gt();
|
|
var minVersion = (range, loose) => {
|
|
range = new Range(range, loose);
|
|
let minver = new SemVer("0.0.0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = new SemVer("0.0.0-0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = null;
|
|
for (let i = 0;i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
let setMin = null;
|
|
comparators.forEach((comparator) => {
|
|
const compver = new SemVer(comparator.semver.version);
|
|
switch (comparator.operator) {
|
|
case ">":
|
|
if (compver.prerelease.length === 0) {
|
|
compver.patch++;
|
|
} else {
|
|
compver.prerelease.push(0);
|
|
}
|
|
compver.raw = compver.format();
|
|
case "":
|
|
case ">=":
|
|
if (!setMin || gt2(compver, setMin)) {
|
|
setMin = compver;
|
|
}
|
|
break;
|
|
case "<":
|
|
case "<=":
|
|
break;
|
|
default:
|
|
throw new Error(`Unexpected operation: ${comparator.operator}`);
|
|
}
|
|
});
|
|
if (setMin && (!minver || gt2(minver, setMin))) {
|
|
minver = setMin;
|
|
}
|
|
}
|
|
if (minver && range.test(minver)) {
|
|
return minver;
|
|
}
|
|
return null;
|
|
};
|
|
module.exports = minVersion;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/valid.js
|
|
var require_valid2 = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var validRange = (range, options2) => {
|
|
try {
|
|
return new Range(range, options2).range || "*";
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module.exports = validRange;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/outside.js
|
|
var require_outside = __commonJS((exports, module) => {
|
|
var SemVer = require_semver();
|
|
var Comparator = require_comparator();
|
|
var { ANY } = Comparator;
|
|
var Range = require_range();
|
|
var satisfies = require_satisfies();
|
|
var gt2 = require_gt();
|
|
var lt2 = require_lt();
|
|
var lte2 = require_lte();
|
|
var gte2 = require_gte();
|
|
var outside = (version2, range, hilo, options2) => {
|
|
version2 = new SemVer(version2, options2);
|
|
range = new Range(range, options2);
|
|
let gtfn, ltefn, ltfn, comp, ecomp;
|
|
switch (hilo) {
|
|
case ">":
|
|
gtfn = gt2;
|
|
ltefn = lte2;
|
|
ltfn = lt2;
|
|
comp = ">";
|
|
ecomp = ">=";
|
|
break;
|
|
case "<":
|
|
gtfn = lt2;
|
|
ltefn = gte2;
|
|
ltfn = gt2;
|
|
comp = "<";
|
|
ecomp = "<=";
|
|
break;
|
|
default:
|
|
throw new TypeError('Must provide a hilo val of "<" or ">"');
|
|
}
|
|
if (satisfies(version2, range, options2)) {
|
|
return false;
|
|
}
|
|
for (let i = 0;i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
let high = null;
|
|
let low = null;
|
|
comparators.forEach((comparator) => {
|
|
if (comparator.semver === ANY) {
|
|
comparator = new Comparator(">=0.0.0");
|
|
}
|
|
high = high || comparator;
|
|
low = low || comparator;
|
|
if (gtfn(comparator.semver, high.semver, options2)) {
|
|
high = comparator;
|
|
} else if (ltfn(comparator.semver, low.semver, options2)) {
|
|
low = comparator;
|
|
}
|
|
});
|
|
if (high.operator === comp || high.operator === ecomp) {
|
|
return false;
|
|
}
|
|
if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) {
|
|
return false;
|
|
} else if (low.operator === ecomp && ltfn(version2, low.semver)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
module.exports = outside;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/gtr.js
|
|
var require_gtr = __commonJS((exports, module) => {
|
|
var outside = require_outside();
|
|
var gtr = (version2, range, options2) => outside(version2, range, ">", options2);
|
|
module.exports = gtr;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/ltr.js
|
|
var require_ltr = __commonJS((exports, module) => {
|
|
var outside = require_outside();
|
|
var ltr = (version2, range, options2) => outside(version2, range, "<", options2);
|
|
module.exports = ltr;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/intersects.js
|
|
var require_intersects = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var intersects = (r1, r2, options2) => {
|
|
r1 = new Range(r1, options2);
|
|
r2 = new Range(r2, options2);
|
|
return r1.intersects(r2, options2);
|
|
};
|
|
module.exports = intersects;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/simplify.js
|
|
var require_simplify = __commonJS((exports, module) => {
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
module.exports = (versions, range, options2) => {
|
|
const set = [];
|
|
let first = null;
|
|
let prev = null;
|
|
const v = versions.sort((a, b) => compare(a, b, options2));
|
|
for (const version2 of v) {
|
|
const included = satisfies(version2, range, options2);
|
|
if (included) {
|
|
prev = version2;
|
|
if (!first) {
|
|
first = version2;
|
|
}
|
|
} else {
|
|
if (prev) {
|
|
set.push([first, prev]);
|
|
}
|
|
prev = null;
|
|
first = null;
|
|
}
|
|
}
|
|
if (first) {
|
|
set.push([first, null]);
|
|
}
|
|
const ranges = [];
|
|
for (const [min, max] of set) {
|
|
if (min === max) {
|
|
ranges.push(min);
|
|
} else if (!max && min === v[0]) {
|
|
ranges.push("*");
|
|
} else if (!max) {
|
|
ranges.push(`>=${min}`);
|
|
} else if (min === v[0]) {
|
|
ranges.push(`<=${max}`);
|
|
} else {
|
|
ranges.push(`${min} - ${max}`);
|
|
}
|
|
}
|
|
const simplified = ranges.join(" || ");
|
|
const original = typeof range.raw === "string" ? range.raw : String(range);
|
|
return simplified.length < original.length ? simplified : range;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/semver/ranges/subset.js
|
|
var require_subset = __commonJS((exports, module) => {
|
|
var Range = require_range();
|
|
var Comparator = require_comparator();
|
|
var { ANY } = Comparator;
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
var subset = (sub, dom, options2 = {}) => {
|
|
if (sub === dom) {
|
|
return true;
|
|
}
|
|
sub = new Range(sub, options2);
|
|
dom = new Range(dom, options2);
|
|
let sawNonNull = false;
|
|
OUTER:
|
|
for (const simpleSub of sub.set) {
|
|
for (const simpleDom of dom.set) {
|
|
const isSub = simpleSubset(simpleSub, simpleDom, options2);
|
|
sawNonNull = sawNonNull || isSub !== null;
|
|
if (isSub) {
|
|
continue OUTER;
|
|
}
|
|
}
|
|
if (sawNonNull) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
|
|
var minimumVersion = [new Comparator(">=0.0.0")];
|
|
var simpleSubset = (sub, dom, options2) => {
|
|
if (sub === dom) {
|
|
return true;
|
|
}
|
|
if (sub.length === 1 && sub[0].semver === ANY) {
|
|
if (dom.length === 1 && dom[0].semver === ANY) {
|
|
return true;
|
|
} else if (options2.includePrerelease) {
|
|
sub = minimumVersionWithPreRelease;
|
|
} else {
|
|
sub = minimumVersion;
|
|
}
|
|
}
|
|
if (dom.length === 1 && dom[0].semver === ANY) {
|
|
if (options2.includePrerelease) {
|
|
return true;
|
|
} else {
|
|
dom = minimumVersion;
|
|
}
|
|
}
|
|
const eqSet = new Set;
|
|
let gt2, lt2;
|
|
for (const c of sub) {
|
|
if (c.operator === ">" || c.operator === ">=") {
|
|
gt2 = higherGT(gt2, c, options2);
|
|
} else if (c.operator === "<" || c.operator === "<=") {
|
|
lt2 = lowerLT(lt2, c, options2);
|
|
} else {
|
|
eqSet.add(c.semver);
|
|
}
|
|
}
|
|
if (eqSet.size > 1) {
|
|
return null;
|
|
}
|
|
let gtltComp;
|
|
if (gt2 && lt2) {
|
|
gtltComp = compare(gt2.semver, lt2.semver, options2);
|
|
if (gtltComp > 0) {
|
|
return null;
|
|
} else if (gtltComp === 0 && (gt2.operator !== ">=" || lt2.operator !== "<=")) {
|
|
return null;
|
|
}
|
|
}
|
|
for (const eq2 of eqSet) {
|
|
if (gt2 && !satisfies(eq2, String(gt2), options2)) {
|
|
return null;
|
|
}
|
|
if (lt2 && !satisfies(eq2, String(lt2), options2)) {
|
|
return null;
|
|
}
|
|
for (const c of dom) {
|
|
if (!satisfies(eq2, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
let higher, lower;
|
|
let hasDomLT, hasDomGT;
|
|
let needDomLTPre = lt2 && !options2.includePrerelease && lt2.semver.prerelease.length ? lt2.semver : false;
|
|
let needDomGTPre = gt2 && !options2.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false;
|
|
if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt2.operator === "<" && needDomLTPre.prerelease[0] === 0) {
|
|
needDomLTPre = false;
|
|
}
|
|
for (const c of dom) {
|
|
hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
|
|
hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
|
|
if (gt2) {
|
|
if (needDomGTPre) {
|
|
if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
|
|
needDomGTPre = false;
|
|
}
|
|
}
|
|
if (c.operator === ">" || c.operator === ">=") {
|
|
higher = higherGT(gt2, c, options2);
|
|
if (higher === c && higher !== gt2) {
|
|
return false;
|
|
}
|
|
} else if (gt2.operator === ">=" && !satisfies(gt2.semver, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (lt2) {
|
|
if (needDomLTPre) {
|
|
if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
|
|
needDomLTPre = false;
|
|
}
|
|
}
|
|
if (c.operator === "<" || c.operator === "<=") {
|
|
lower = lowerLT(lt2, c, options2);
|
|
if (lower === c && lower !== lt2) {
|
|
return false;
|
|
}
|
|
} else if (lt2.operator === "<=" && !satisfies(lt2.semver, String(c), options2)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (!c.operator && (lt2 || gt2) && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
}
|
|
if (gt2 && hasDomLT && !lt2 && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
if (lt2 && hasDomGT && !gt2 && gtltComp !== 0) {
|
|
return false;
|
|
}
|
|
if (needDomGTPre || needDomLTPre) {
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
var higherGT = (a, b, options2) => {
|
|
if (!a) {
|
|
return b;
|
|
}
|
|
const comp = compare(a.semver, b.semver, options2);
|
|
return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
|
|
};
|
|
var lowerLT = (a, b, options2) => {
|
|
if (!a) {
|
|
return b;
|
|
}
|
|
const comp = compare(a.semver, b.semver, options2);
|
|
return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
|
|
};
|
|
module.exports = subset;
|
|
});
|
|
|
|
// ../eve/node_modules/semver/index.js
|
|
var require_semver2 = __commonJS((exports, module) => {
|
|
var internalRe = require_re();
|
|
var constants = require_constants();
|
|
var SemVer = require_semver();
|
|
var identifiers = require_identifiers();
|
|
var parse = require_parse();
|
|
var valid = require_valid();
|
|
var clean = require_clean();
|
|
var inc = require_inc();
|
|
var diff = require_diff();
|
|
var major = require_major();
|
|
var minor = require_minor();
|
|
var patch = require_patch();
|
|
var prerelease = require_prerelease();
|
|
var compare = require_compare();
|
|
var rcompare = require_rcompare();
|
|
var compareLoose = require_compare_loose();
|
|
var compareBuild = require_compare_build();
|
|
var sort = require_sort();
|
|
var rsort = require_rsort();
|
|
var gt2 = require_gt();
|
|
var lt2 = require_lt();
|
|
var eq2 = require_eq();
|
|
var neq = require_neq();
|
|
var gte2 = require_gte();
|
|
var lte2 = require_lte();
|
|
var cmp = require_cmp();
|
|
var coerce = require_coerce();
|
|
var Comparator = require_comparator();
|
|
var Range = require_range();
|
|
var satisfies = require_satisfies();
|
|
var toComparators = require_to_comparators();
|
|
var maxSatisfying = require_max_satisfying();
|
|
var minSatisfying = require_min_satisfying();
|
|
var minVersion = require_min_version();
|
|
var validRange = require_valid2();
|
|
var outside = require_outside();
|
|
var gtr = require_gtr();
|
|
var ltr = require_ltr();
|
|
var intersects = require_intersects();
|
|
var simplifyRange = require_simplify();
|
|
var subset = require_subset();
|
|
module.exports = {
|
|
parse,
|
|
valid,
|
|
clean,
|
|
inc,
|
|
diff,
|
|
major,
|
|
minor,
|
|
patch,
|
|
prerelease,
|
|
compare,
|
|
rcompare,
|
|
compareLoose,
|
|
compareBuild,
|
|
sort,
|
|
rsort,
|
|
gt: gt2,
|
|
lt: lt2,
|
|
eq: eq2,
|
|
neq,
|
|
gte: gte2,
|
|
lte: lte2,
|
|
cmp,
|
|
coerce,
|
|
Comparator,
|
|
Range,
|
|
satisfies,
|
|
toComparators,
|
|
maxSatisfying,
|
|
minSatisfying,
|
|
minVersion,
|
|
validRange,
|
|
outside,
|
|
gtr,
|
|
ltr,
|
|
intersects,
|
|
simplifyRange,
|
|
subset,
|
|
SemVer,
|
|
re: internalRe.re,
|
|
src: internalRe.src,
|
|
tokens: internalRe.t,
|
|
SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
|
|
RELEASE_TYPES: constants.RELEASE_TYPES,
|
|
compareIdentifiers: identifiers.compareIdentifiers,
|
|
rcompareIdentifiers: identifiers.rcompareIdentifiers
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
|
|
var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, ">=15.7.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
|
|
var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, ">=16.9.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
|
|
var require_validateAsymmetricKey = __commonJS((exports, module) => {
|
|
var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
|
|
var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
|
|
var allowedAlgorithmsForKeys = {
|
|
ec: ["ES256", "ES384", "ES512"],
|
|
rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
|
|
"rsa-pss": ["PS256", "PS384", "PS512"]
|
|
};
|
|
var allowedCurves = {
|
|
ES256: "prime256v1",
|
|
ES384: "secp384r1",
|
|
ES512: "secp521r1"
|
|
};
|
|
module.exports = function(algorithm, key) {
|
|
if (!algorithm || !key)
|
|
return;
|
|
const keyType = key.asymmetricKeyType;
|
|
if (!keyType)
|
|
return;
|
|
const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
|
|
if (!allowedAlgorithms) {
|
|
throw new Error(`Unknown key type "${keyType}".`);
|
|
}
|
|
if (!allowedAlgorithms.includes(algorithm)) {
|
|
throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
|
|
}
|
|
if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
|
|
switch (keyType) {
|
|
case "ec":
|
|
const keyCurve = key.asymmetricKeyDetails.namedCurve;
|
|
const allowedCurve = allowedCurves[algorithm];
|
|
if (keyCurve !== allowedCurve) {
|
|
throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
|
|
}
|
|
break;
|
|
case "rsa-pss":
|
|
if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
|
|
const length = parseInt(algorithm.slice(-3), 10);
|
|
const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
|
|
if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
|
|
throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
|
|
}
|
|
if (saltLength !== undefined && saltLength > length >> 3) {
|
|
throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
|
|
var require_psSupported = __commonJS((exports, module) => {
|
|
var semver = require_semver2();
|
|
module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/verify.js
|
|
var require_verify = __commonJS((exports, module) => {
|
|
var JsonWebTokenError = require_JsonWebTokenError();
|
|
var NotBeforeError = require_NotBeforeError();
|
|
var TokenExpiredError = require_TokenExpiredError();
|
|
var decode = require_decode();
|
|
var timespan = require_timespan();
|
|
var validateAsymmetricKey = require_validateAsymmetricKey();
|
|
var PS_SUPPORTED = require_psSupported();
|
|
var jws = require_jws();
|
|
var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
|
|
var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
|
|
var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
|
|
var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
|
|
var HS_ALGS = ["HS256", "HS384", "HS512"];
|
|
if (PS_SUPPORTED) {
|
|
PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
|
|
RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
|
|
}
|
|
module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
|
|
if (typeof options2 === "function" && !callback) {
|
|
callback = options2;
|
|
options2 = {};
|
|
}
|
|
if (!options2) {
|
|
options2 = {};
|
|
}
|
|
options2 = Object.assign({}, options2);
|
|
let done;
|
|
if (callback) {
|
|
done = callback;
|
|
} else {
|
|
done = function(err, data) {
|
|
if (err)
|
|
throw err;
|
|
return data;
|
|
};
|
|
}
|
|
if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
|
|
return done(new JsonWebTokenError("clockTimestamp must be a number"));
|
|
}
|
|
if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
|
|
return done(new JsonWebTokenError("nonce must be a non-empty string"));
|
|
}
|
|
if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
|
|
return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
|
|
}
|
|
const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
|
|
if (!jwtString) {
|
|
return done(new JsonWebTokenError("jwt must be provided"));
|
|
}
|
|
if (typeof jwtString !== "string") {
|
|
return done(new JsonWebTokenError("jwt must be a string"));
|
|
}
|
|
const parts = jwtString.split(".");
|
|
if (parts.length !== 3) {
|
|
return done(new JsonWebTokenError("jwt malformed"));
|
|
}
|
|
let decodedToken;
|
|
try {
|
|
decodedToken = decode(jwtString, { complete: true });
|
|
} catch (err) {
|
|
return done(err);
|
|
}
|
|
if (!decodedToken) {
|
|
return done(new JsonWebTokenError("invalid token"));
|
|
}
|
|
const header = decodedToken.header;
|
|
let getSecret;
|
|
if (typeof secretOrPublicKey === "function") {
|
|
if (!callback) {
|
|
return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
|
|
}
|
|
getSecret = secretOrPublicKey;
|
|
} else {
|
|
getSecret = function(header2, secretCallback) {
|
|
return secretCallback(null, secretOrPublicKey);
|
|
};
|
|
}
|
|
return getSecret(header, function(err, secretOrPublicKey2) {
|
|
if (err) {
|
|
return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
|
|
}
|
|
const hasSignature = parts[2].trim() !== "";
|
|
if (!hasSignature && secretOrPublicKey2) {
|
|
return done(new JsonWebTokenError("jwt signature is required"));
|
|
}
|
|
if (hasSignature && !secretOrPublicKey2) {
|
|
return done(new JsonWebTokenError("secret or public key must be provided"));
|
|
}
|
|
if (!hasSignature && !options2.algorithms) {
|
|
return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
|
|
}
|
|
if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
|
|
try {
|
|
secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
|
|
} catch (_) {
|
|
try {
|
|
secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
|
|
} catch (_2) {
|
|
return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
|
|
}
|
|
}
|
|
}
|
|
if (!options2.algorithms) {
|
|
if (secretOrPublicKey2.type === "secret") {
|
|
options2.algorithms = HS_ALGS;
|
|
} else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
|
|
options2.algorithms = RSA_KEY_ALGS;
|
|
} else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
|
|
options2.algorithms = EC_KEY_ALGS;
|
|
} else {
|
|
options2.algorithms = PUB_KEY_ALGS;
|
|
}
|
|
}
|
|
if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
|
|
return done(new JsonWebTokenError("invalid algorithm"));
|
|
}
|
|
if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
|
|
return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
|
|
} else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
|
|
return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
|
|
}
|
|
if (!options2.allowInvalidAsymmetricKeyTypes) {
|
|
try {
|
|
validateAsymmetricKey(header.alg, secretOrPublicKey2);
|
|
} catch (e) {
|
|
return done(e);
|
|
}
|
|
}
|
|
let valid;
|
|
try {
|
|
valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
|
|
} catch (e) {
|
|
return done(e);
|
|
}
|
|
if (!valid) {
|
|
return done(new JsonWebTokenError("invalid signature"));
|
|
}
|
|
const payload = decodedToken.payload;
|
|
if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
|
|
if (typeof payload.nbf !== "number") {
|
|
return done(new JsonWebTokenError("invalid nbf value"));
|
|
}
|
|
if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
|
|
return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
|
|
}
|
|
}
|
|
if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
|
|
if (typeof payload.exp !== "number") {
|
|
return done(new JsonWebTokenError("invalid exp value"));
|
|
}
|
|
if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
|
|
return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
|
|
}
|
|
}
|
|
if (options2.audience) {
|
|
const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
|
|
const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
|
|
const match = target.some(function(targetAudience) {
|
|
return audiences.some(function(audience) {
|
|
return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
|
|
});
|
|
});
|
|
if (!match) {
|
|
return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
|
|
}
|
|
}
|
|
if (options2.issuer) {
|
|
const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
|
|
if (invalid_issuer) {
|
|
return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
|
|
}
|
|
}
|
|
if (options2.subject) {
|
|
if (payload.sub !== options2.subject) {
|
|
return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
|
|
}
|
|
}
|
|
if (options2.jwtid) {
|
|
if (payload.jti !== options2.jwtid) {
|
|
return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
|
|
}
|
|
}
|
|
if (options2.nonce) {
|
|
if (payload.nonce !== options2.nonce) {
|
|
return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
|
|
}
|
|
}
|
|
if (options2.maxAge) {
|
|
if (typeof payload.iat !== "number") {
|
|
return done(new JsonWebTokenError("iat required when maxAge is specified"));
|
|
}
|
|
const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
|
|
if (typeof maxAgeTimestamp === "undefined") {
|
|
return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
|
|
return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
|
|
}
|
|
}
|
|
if (options2.complete === true) {
|
|
const signature = decodedToken.signature;
|
|
return done(null, {
|
|
header,
|
|
payload,
|
|
signature
|
|
});
|
|
}
|
|
return done(null, payload);
|
|
});
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.includes/index.js
|
|
var require_lodash = __commonJS((exports, module) => {
|
|
var INFINITY = 1 / 0;
|
|
var MAX_SAFE_INTEGER = 9007199254740991;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var argsTag = "[object Arguments]";
|
|
var funcTag = "[object Function]";
|
|
var genTag = "[object GeneratorFunction]";
|
|
var stringTag = "[object String]";
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|
var freeParseInt = parseInt;
|
|
function arrayMap(array, iteratee) {
|
|
var index2 = -1, length = array ? array.length : 0, result = Array(length);
|
|
while (++index2 < length) {
|
|
result[index2] = iteratee(array[index2], index2, array);
|
|
}
|
|
return result;
|
|
}
|
|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
|
var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
|
|
while (fromRight ? index2-- : ++index2 < length) {
|
|
if (predicate(array[index2], index2, array)) {
|
|
return index2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIndexOf(array, value, fromIndex) {
|
|
if (value !== value) {
|
|
return baseFindIndex(array, baseIsNaN, fromIndex);
|
|
}
|
|
var index2 = fromIndex - 1, length = array.length;
|
|
while (++index2 < length) {
|
|
if (array[index2] === value) {
|
|
return index2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIsNaN(value) {
|
|
return value !== value;
|
|
}
|
|
function baseTimes(n, iteratee) {
|
|
var index2 = -1, result = Array(n);
|
|
while (++index2 < n) {
|
|
result[index2] = iteratee(index2);
|
|
}
|
|
return result;
|
|
}
|
|
function baseValues(object, props) {
|
|
return arrayMap(props, function(key) {
|
|
return object[key];
|
|
});
|
|
}
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
var objectProto = Object.prototype;
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
var objectToString = objectProto.toString;
|
|
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
|
|
var nativeKeys = overArg(Object.keys, Object);
|
|
var nativeMax = Math.max;
|
|
function arrayLikeKeys(value, inherited) {
|
|
var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
|
|
var length = result.length, skipIndexes = !!length;
|
|
for (var key in value) {
|
|
if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function baseKeys(object) {
|
|
if (!isPrototype(object)) {
|
|
return nativeKeys(object);
|
|
}
|
|
var result = [];
|
|
for (var key in Object(object)) {
|
|
if (hasOwnProperty.call(object, key) && key != "constructor") {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function isIndex(value, length) {
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
|
|
}
|
|
function isPrototype(value) {
|
|
var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
|
|
return value === proto;
|
|
}
|
|
function includes(collection, value, fromIndex, guard) {
|
|
collection = isArrayLike(collection) ? collection : values(collection);
|
|
fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
|
|
var length = collection.length;
|
|
if (fromIndex < 0) {
|
|
fromIndex = nativeMax(length + fromIndex, 0);
|
|
}
|
|
return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
|
|
}
|
|
function isArguments(value) {
|
|
return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
|
|
}
|
|
var isArray = Array.isArray;
|
|
function isArrayLike(value) {
|
|
return value != null && isLength(value.length) && !isFunction(value);
|
|
}
|
|
function isArrayLikeObject(value) {
|
|
return isObjectLike(value) && isArrayLike(value);
|
|
}
|
|
function isFunction(value) {
|
|
var tag = isObject(value) ? objectToString.call(value) : "";
|
|
return tag == funcTag || tag == genTag;
|
|
}
|
|
function isLength(value) {
|
|
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isString(value) {
|
|
return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
function keys(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|
}
|
|
function values(object) {
|
|
return object ? baseValues(object, keys(object)) : [];
|
|
}
|
|
module.exports = includes;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isboolean/index.js
|
|
var require_lodash2 = __commonJS((exports, module) => {
|
|
var boolTag = "[object Boolean]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isBoolean(value) {
|
|
return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
module.exports = isBoolean;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isinteger/index.js
|
|
var require_lodash3 = __commonJS((exports, module) => {
|
|
var INFINITY = 1 / 0;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var freeParseInt = parseInt;
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isInteger(value) {
|
|
return typeof value == "number" && value == toInteger(value);
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
module.exports = isInteger;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isnumber/index.js
|
|
var require_lodash4 = __commonJS((exports, module) => {
|
|
var numberTag = "[object Number]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isNumber(value) {
|
|
return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
|
|
}
|
|
module.exports = isNumber;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isplainobject/index.js
|
|
var require_lodash5 = __commonJS((exports, module) => {
|
|
var objectTag = "[object Object]";
|
|
function isHostObject(value) {
|
|
var result = false;
|
|
if (value != null && typeof value.toString != "function") {
|
|
try {
|
|
result = !!(value + "");
|
|
} catch (e) {}
|
|
}
|
|
return result;
|
|
}
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
var funcProto = Function.prototype;
|
|
var objectProto = Object.prototype;
|
|
var funcToString = funcProto.toString;
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
var objectCtorString = funcToString.call(Object);
|
|
var objectToString = objectProto.toString;
|
|
var getPrototype = overArg(Object.getPrototypeOf, Object);
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isPlainObject(value) {
|
|
if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
|
|
return false;
|
|
}
|
|
var proto = getPrototype(value);
|
|
if (proto === null) {
|
|
return true;
|
|
}
|
|
var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
|
|
return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
|
|
}
|
|
module.exports = isPlainObject;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.isstring/index.js
|
|
var require_lodash6 = __commonJS((exports, module) => {
|
|
var stringTag = "[object String]";
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
var isArray = Array.isArray;
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isString(value) {
|
|
return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
|
|
}
|
|
module.exports = isString;
|
|
});
|
|
|
|
// ../eve/node_modules/lodash.once/index.js
|
|
var require_lodash7 = __commonJS((exports, module) => {
|
|
var FUNC_ERROR_TEXT = "Expected a function";
|
|
var INFINITY = 1 / 0;
|
|
var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
|
var NAN = 0 / 0;
|
|
var symbolTag = "[object Symbol]";
|
|
var reTrim = /^\s+|\s+$/g;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var freeParseInt = parseInt;
|
|
var objectProto = Object.prototype;
|
|
var objectToString = objectProto.toString;
|
|
function before(n, func) {
|
|
var result;
|
|
if (typeof func != "function") {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
n = toInteger(n);
|
|
return function() {
|
|
if (--n > 0) {
|
|
result = func.apply(this, arguments);
|
|
}
|
|
if (n <= 1) {
|
|
func = undefined;
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
function once(func) {
|
|
return before(2, func);
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return !!value && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return !!value && typeof value == "object";
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger(value) {
|
|
var result = toFinite(value), remainder = result % 1;
|
|
return result === result ? remainder ? result - remainder : result : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = value.replace(reTrim, "");
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
module.exports = once;
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/sign.js
|
|
var require_sign = __commonJS((exports, module) => {
|
|
var timespan = require_timespan();
|
|
var PS_SUPPORTED = require_psSupported();
|
|
var validateAsymmetricKey = require_validateAsymmetricKey();
|
|
var jws = require_jws();
|
|
var includes = require_lodash();
|
|
var isBoolean = require_lodash2();
|
|
var isInteger = require_lodash3();
|
|
var isNumber = require_lodash4();
|
|
var isPlainObject = require_lodash5();
|
|
var isString = require_lodash6();
|
|
var once = require_lodash7();
|
|
var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
|
|
var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
|
|
if (PS_SUPPORTED) {
|
|
SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
|
|
}
|
|
var sign_options_schema = {
|
|
expiresIn: { isValid: function(value) {
|
|
return isInteger(value) || isString(value) && value;
|
|
}, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
|
|
notBefore: { isValid: function(value) {
|
|
return isInteger(value) || isString(value) && value;
|
|
}, message: '"notBefore" should be a number of seconds or string representing a timespan' },
|
|
audience: { isValid: function(value) {
|
|
return isString(value) || Array.isArray(value);
|
|
}, message: '"audience" must be a string or array' },
|
|
algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
|
|
header: { isValid: isPlainObject, message: '"header" must be an object' },
|
|
encoding: { isValid: isString, message: '"encoding" must be a string' },
|
|
issuer: { isValid: isString, message: '"issuer" must be a string' },
|
|
subject: { isValid: isString, message: '"subject" must be a string' },
|
|
jwtid: { isValid: isString, message: '"jwtid" must be a string' },
|
|
noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
|
|
keyid: { isValid: isString, message: '"keyid" must be a string' },
|
|
mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
|
|
allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
|
|
allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
|
|
};
|
|
var registered_claims_schema = {
|
|
iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
|
|
exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
|
|
nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
|
|
};
|
|
function validate(schema, allowUnknown, object, parameterName) {
|
|
if (!isPlainObject(object)) {
|
|
throw new Error('Expected "' + parameterName + '" to be a plain object.');
|
|
}
|
|
Object.keys(object).forEach(function(key) {
|
|
const validator = schema[key];
|
|
if (!validator) {
|
|
if (!allowUnknown) {
|
|
throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
|
|
}
|
|
return;
|
|
}
|
|
if (!validator.isValid(object[key])) {
|
|
throw new Error(validator.message);
|
|
}
|
|
});
|
|
}
|
|
function validateOptions(options2) {
|
|
return validate(sign_options_schema, false, options2, "options");
|
|
}
|
|
function validatePayload(payload) {
|
|
return validate(registered_claims_schema, true, payload, "payload");
|
|
}
|
|
var options_to_payload = {
|
|
audience: "aud",
|
|
issuer: "iss",
|
|
subject: "sub",
|
|
jwtid: "jti"
|
|
};
|
|
var options_for_objects = [
|
|
"expiresIn",
|
|
"notBefore",
|
|
"noTimestamp",
|
|
"audience",
|
|
"issuer",
|
|
"subject",
|
|
"jwtid"
|
|
];
|
|
module.exports = function(payload, secretOrPrivateKey, options2, callback) {
|
|
if (typeof options2 === "function") {
|
|
callback = options2;
|
|
options2 = {};
|
|
} else {
|
|
options2 = options2 || {};
|
|
}
|
|
const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
|
|
const header = Object.assign({
|
|
alg: options2.algorithm || "HS256",
|
|
typ: isObjectPayload ? "JWT" : undefined,
|
|
kid: options2.keyid
|
|
}, options2.header);
|
|
function failure(err) {
|
|
if (callback) {
|
|
return callback(err);
|
|
}
|
|
throw err;
|
|
}
|
|
if (!secretOrPrivateKey && options2.algorithm !== "none") {
|
|
return failure(new Error("secretOrPrivateKey must have a value"));
|
|
}
|
|
if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
|
|
try {
|
|
secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
|
|
} catch (_) {
|
|
try {
|
|
secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
|
|
} catch (_2) {
|
|
return failure(new Error("secretOrPrivateKey is not valid key material"));
|
|
}
|
|
}
|
|
}
|
|
if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
|
|
return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
|
|
} else if (/^(?:RS|PS|ES)/.test(header.alg)) {
|
|
if (secretOrPrivateKey.type !== "private") {
|
|
return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
|
|
}
|
|
if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
|
|
return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
|
|
}
|
|
}
|
|
if (typeof payload === "undefined") {
|
|
return failure(new Error("payload is required"));
|
|
} else if (isObjectPayload) {
|
|
try {
|
|
validatePayload(payload);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
if (!options2.mutatePayload) {
|
|
payload = Object.assign({}, payload);
|
|
}
|
|
} else {
|
|
const invalid_options = options_for_objects.filter(function(opt) {
|
|
return typeof options2[opt] !== "undefined";
|
|
});
|
|
if (invalid_options.length > 0) {
|
|
return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
|
|
}
|
|
}
|
|
if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
|
|
return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
|
|
}
|
|
if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
|
|
return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
|
|
}
|
|
try {
|
|
validateOptions(options2);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
if (!options2.allowInvalidAsymmetricKeyTypes) {
|
|
try {
|
|
validateAsymmetricKey(header.alg, secretOrPrivateKey);
|
|
} catch (error) {
|
|
return failure(error);
|
|
}
|
|
}
|
|
const timestamp = payload.iat || Math.floor(Date.now() / 1000);
|
|
if (options2.noTimestamp) {
|
|
delete payload.iat;
|
|
} else if (isObjectPayload) {
|
|
payload.iat = timestamp;
|
|
}
|
|
if (typeof options2.notBefore !== "undefined") {
|
|
try {
|
|
payload.nbf = timespan(options2.notBefore, timestamp);
|
|
} catch (err) {
|
|
return failure(err);
|
|
}
|
|
if (typeof payload.nbf === "undefined") {
|
|
return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
}
|
|
if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
|
|
try {
|
|
payload.exp = timespan(options2.expiresIn, timestamp);
|
|
} catch (err) {
|
|
return failure(err);
|
|
}
|
|
if (typeof payload.exp === "undefined") {
|
|
return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
|
|
}
|
|
}
|
|
Object.keys(options_to_payload).forEach(function(key) {
|
|
const claim = options_to_payload[key];
|
|
if (typeof options2[key] !== "undefined") {
|
|
if (typeof payload[claim] !== "undefined") {
|
|
return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
|
|
}
|
|
payload[claim] = options2[key];
|
|
}
|
|
});
|
|
const encoding = options2.encoding || "utf8";
|
|
if (typeof callback === "function") {
|
|
callback = callback && once(callback);
|
|
jws.createSign({
|
|
header,
|
|
privateKey: secretOrPrivateKey,
|
|
payload,
|
|
encoding
|
|
}).once("error", callback).once("done", function(signature) {
|
|
if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
|
|
return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
|
|
}
|
|
callback(null, signature);
|
|
});
|
|
} else {
|
|
let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
|
|
if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
|
|
throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
|
|
}
|
|
return signature;
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jsonwebtoken/index.js
|
|
var require_jsonwebtoken = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
decode: require_decode(),
|
|
verify: require_verify(),
|
|
sign: require_sign(),
|
|
JsonWebTokenError: require_JsonWebTokenError(),
|
|
NotBeforeError: require_NotBeforeError(),
|
|
TokenExpiredError: require_TokenExpiredError()
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/bn.js/lib/bn.js
|
|
var require_bn = __commonJS((exports, module) => {
|
|
(function(module2, exports2) {
|
|
function assert(val, msg) {
|
|
if (!val)
|
|
throw new Error(msg || "Assertion failed");
|
|
}
|
|
function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor;
|
|
var TempCtor = function() {};
|
|
TempCtor.prototype = superCtor.prototype;
|
|
ctor.prototype = new TempCtor;
|
|
ctor.prototype.constructor = ctor;
|
|
}
|
|
function BN(number, base, endian) {
|
|
if (BN.isBN(number)) {
|
|
return number;
|
|
}
|
|
this.negative = 0;
|
|
this.words = null;
|
|
this.length = 0;
|
|
this.red = null;
|
|
if (number !== null) {
|
|
if (base === "le" || base === "be") {
|
|
endian = base;
|
|
base = 10;
|
|
}
|
|
this._init(number || 0, base || 10, endian || "be");
|
|
}
|
|
}
|
|
if (typeof module2 === "object") {
|
|
module2.exports = BN;
|
|
} else {
|
|
exports2.BN = BN;
|
|
}
|
|
BN.BN = BN;
|
|
BN.wordSize = 26;
|
|
var Buffer2;
|
|
try {
|
|
if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
|
|
Buffer2 = window.Buffer;
|
|
} else {
|
|
Buffer2 = __require("buffer").Buffer;
|
|
}
|
|
} catch (e) {}
|
|
BN.isBN = function isBN(num) {
|
|
if (num instanceof BN) {
|
|
return true;
|
|
}
|
|
return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
|
|
};
|
|
BN.max = function max(left, right) {
|
|
if (left.cmp(right) > 0)
|
|
return left;
|
|
return right;
|
|
};
|
|
BN.min = function min(left, right) {
|
|
if (left.cmp(right) < 0)
|
|
return left;
|
|
return right;
|
|
};
|
|
BN.prototype._init = function init(number, base, endian) {
|
|
if (typeof number === "number") {
|
|
return this._initNumber(number, base, endian);
|
|
}
|
|
if (typeof number === "object") {
|
|
return this._initArray(number, base, endian);
|
|
}
|
|
if (base === "hex") {
|
|
base = 16;
|
|
}
|
|
assert(base === (base | 0) && base >= 2 && base <= 36);
|
|
number = number.toString().replace(/\s+/g, "");
|
|
var start = 0;
|
|
if (number[0] === "-") {
|
|
start++;
|
|
this.negative = 1;
|
|
}
|
|
if (start < number.length) {
|
|
if (base === 16) {
|
|
this._parseHex(number, start, endian);
|
|
} else {
|
|
this._parseBase(number, base, start);
|
|
if (endian === "le") {
|
|
this._initArray(this.toArray(), base, endian);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
BN.prototype._initNumber = function _initNumber(number, base, endian) {
|
|
if (number < 0) {
|
|
this.negative = 1;
|
|
number = -number;
|
|
}
|
|
if (number < 67108864) {
|
|
this.words = [number & 67108863];
|
|
this.length = 1;
|
|
} else if (number < 4503599627370496) {
|
|
this.words = [
|
|
number & 67108863,
|
|
number / 67108864 & 67108863
|
|
];
|
|
this.length = 2;
|
|
} else {
|
|
assert(number < 9007199254740992);
|
|
this.words = [
|
|
number & 67108863,
|
|
number / 67108864 & 67108863,
|
|
1
|
|
];
|
|
this.length = 3;
|
|
}
|
|
if (endian !== "le")
|
|
return;
|
|
this._initArray(this.toArray(), base, endian);
|
|
};
|
|
BN.prototype._initArray = function _initArray(number, base, endian) {
|
|
assert(typeof number.length === "number");
|
|
if (number.length <= 0) {
|
|
this.words = [0];
|
|
this.length = 1;
|
|
return this;
|
|
}
|
|
this.length = Math.ceil(number.length / 3);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
var j, w;
|
|
var off = 0;
|
|
if (endian === "be") {
|
|
for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
|
|
w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
|
|
this.words[j] |= w << off & 67108863;
|
|
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
} else if (endian === "le") {
|
|
for (i = 0, j = 0;i < number.length; i += 3) {
|
|
w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
|
|
this.words[j] |= w << off & 67108863;
|
|
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
return this.strip();
|
|
};
|
|
function parseHex4Bits(string, index2) {
|
|
var c = string.charCodeAt(index2);
|
|
if (c >= 65 && c <= 70) {
|
|
return c - 55;
|
|
} else if (c >= 97 && c <= 102) {
|
|
return c - 87;
|
|
} else {
|
|
return c - 48 & 15;
|
|
}
|
|
}
|
|
function parseHexByte(string, lowerBound, index2) {
|
|
var r = parseHex4Bits(string, index2);
|
|
if (index2 - 1 >= lowerBound) {
|
|
r |= parseHex4Bits(string, index2 - 1) << 4;
|
|
}
|
|
return r;
|
|
}
|
|
BN.prototype._parseHex = function _parseHex(number, start, endian) {
|
|
this.length = Math.ceil((number.length - start) / 6);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
var off = 0;
|
|
var j = 0;
|
|
var w;
|
|
if (endian === "be") {
|
|
for (i = number.length - 1;i >= start; i -= 2) {
|
|
w = parseHexByte(number, start, i) << off;
|
|
this.words[j] |= w & 67108863;
|
|
if (off >= 18) {
|
|
off -= 18;
|
|
j += 1;
|
|
this.words[j] |= w >>> 26;
|
|
} else {
|
|
off += 8;
|
|
}
|
|
}
|
|
} else {
|
|
var parseLength = number.length - start;
|
|
for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
|
|
w = parseHexByte(number, start, i) << off;
|
|
this.words[j] |= w & 67108863;
|
|
if (off >= 18) {
|
|
off -= 18;
|
|
j += 1;
|
|
this.words[j] |= w >>> 26;
|
|
} else {
|
|
off += 8;
|
|
}
|
|
}
|
|
}
|
|
this.strip();
|
|
};
|
|
function parseBase(str, start, end, mul) {
|
|
var r = 0;
|
|
var len = Math.min(str.length, end);
|
|
for (var i = start;i < len; i++) {
|
|
var c = str.charCodeAt(i) - 48;
|
|
r *= mul;
|
|
if (c >= 49) {
|
|
r += c - 49 + 10;
|
|
} else if (c >= 17) {
|
|
r += c - 17 + 10;
|
|
} else {
|
|
r += c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
BN.prototype._parseBase = function _parseBase(number, base, start) {
|
|
this.words = [0];
|
|
this.length = 1;
|
|
for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
|
|
limbLen++;
|
|
}
|
|
limbLen--;
|
|
limbPow = limbPow / base | 0;
|
|
var total = number.length - start;
|
|
var mod = total % limbLen;
|
|
var end = Math.min(total, total - mod) + start;
|
|
var word = 0;
|
|
for (var i = start;i < end; i += limbLen) {
|
|
word = parseBase(number, i, i + limbLen, base);
|
|
this.imuln(limbPow);
|
|
if (this.words[0] + word < 67108864) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
if (mod !== 0) {
|
|
var pow = 1;
|
|
word = parseBase(number, i, number.length, base);
|
|
for (i = 0;i < mod; i++) {
|
|
pow *= base;
|
|
}
|
|
this.imuln(pow);
|
|
if (this.words[0] + word < 67108864) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
this.strip();
|
|
};
|
|
BN.prototype.copy = function copy(dest) {
|
|
dest.words = new Array(this.length);
|
|
for (var i = 0;i < this.length; i++) {
|
|
dest.words[i] = this.words[i];
|
|
}
|
|
dest.length = this.length;
|
|
dest.negative = this.negative;
|
|
dest.red = this.red;
|
|
};
|
|
BN.prototype.clone = function clone() {
|
|
var r = new BN(null);
|
|
this.copy(r);
|
|
return r;
|
|
};
|
|
BN.prototype._expand = function _expand(size) {
|
|
while (this.length < size) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.strip = function strip() {
|
|
while (this.length > 1 && this.words[this.length - 1] === 0) {
|
|
this.length--;
|
|
}
|
|
return this._normSign();
|
|
};
|
|
BN.prototype._normSign = function _normSign() {
|
|
if (this.length === 1 && this.words[0] === 0) {
|
|
this.negative = 0;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.inspect = function inspect() {
|
|
return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
|
|
};
|
|
var zeros = [
|
|
"",
|
|
"0",
|
|
"00",
|
|
"000",
|
|
"0000",
|
|
"00000",
|
|
"000000",
|
|
"0000000",
|
|
"00000000",
|
|
"000000000",
|
|
"0000000000",
|
|
"00000000000",
|
|
"000000000000",
|
|
"0000000000000",
|
|
"00000000000000",
|
|
"000000000000000",
|
|
"0000000000000000",
|
|
"00000000000000000",
|
|
"000000000000000000",
|
|
"0000000000000000000",
|
|
"00000000000000000000",
|
|
"000000000000000000000",
|
|
"0000000000000000000000",
|
|
"00000000000000000000000",
|
|
"000000000000000000000000",
|
|
"0000000000000000000000000"
|
|
];
|
|
var groupSizes = [
|
|
0,
|
|
0,
|
|
25,
|
|
16,
|
|
12,
|
|
11,
|
|
10,
|
|
9,
|
|
8,
|
|
8,
|
|
7,
|
|
7,
|
|
7,
|
|
7,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5
|
|
];
|
|
var groupBases = [
|
|
0,
|
|
0,
|
|
33554432,
|
|
43046721,
|
|
16777216,
|
|
48828125,
|
|
60466176,
|
|
40353607,
|
|
16777216,
|
|
43046721,
|
|
1e7,
|
|
19487171,
|
|
35831808,
|
|
62748517,
|
|
7529536,
|
|
11390625,
|
|
16777216,
|
|
24137569,
|
|
34012224,
|
|
47045881,
|
|
64000000,
|
|
4084101,
|
|
5153632,
|
|
6436343,
|
|
7962624,
|
|
9765625,
|
|
11881376,
|
|
14348907,
|
|
17210368,
|
|
20511149,
|
|
24300000,
|
|
28629151,
|
|
33554432,
|
|
39135393,
|
|
45435424,
|
|
52521875,
|
|
60466176
|
|
];
|
|
BN.prototype.toString = function toString(base, padding) {
|
|
base = base || 10;
|
|
padding = padding | 0 || 1;
|
|
var out;
|
|
if (base === 16 || base === "hex") {
|
|
out = "";
|
|
var off = 0;
|
|
var carry = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var w = this.words[i];
|
|
var word = ((w << off | carry) & 16777215).toString(16);
|
|
carry = w >>> 24 - off & 16777215;
|
|
off += 2;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
i--;
|
|
}
|
|
if (carry !== 0 || i !== this.length - 1) {
|
|
out = zeros[6 - word.length] + word + out;
|
|
} else {
|
|
out = word + out;
|
|
}
|
|
}
|
|
if (carry !== 0) {
|
|
out = carry.toString(16) + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = "0" + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = "-" + out;
|
|
}
|
|
return out;
|
|
}
|
|
if (base === (base | 0) && base >= 2 && base <= 36) {
|
|
var groupSize = groupSizes[base];
|
|
var groupBase = groupBases[base];
|
|
out = "";
|
|
var c = this.clone();
|
|
c.negative = 0;
|
|
while (!c.isZero()) {
|
|
var r = c.modn(groupBase).toString(base);
|
|
c = c.idivn(groupBase);
|
|
if (!c.isZero()) {
|
|
out = zeros[groupSize - r.length] + r + out;
|
|
} else {
|
|
out = r + out;
|
|
}
|
|
}
|
|
if (this.isZero()) {
|
|
out = "0" + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = "0" + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = "-" + out;
|
|
}
|
|
return out;
|
|
}
|
|
assert(false, "Base should be between 2 and 36");
|
|
};
|
|
BN.prototype.toNumber = function toNumber() {
|
|
var ret = this.words[0];
|
|
if (this.length === 2) {
|
|
ret += this.words[1] * 67108864;
|
|
} else if (this.length === 3 && this.words[2] === 1) {
|
|
ret += 4503599627370496 + this.words[1] * 67108864;
|
|
} else if (this.length > 2) {
|
|
assert(false, "Number can only safely store up to 53 bits");
|
|
}
|
|
return this.negative !== 0 ? -ret : ret;
|
|
};
|
|
BN.prototype.toJSON = function toJSON() {
|
|
return this.toString(16);
|
|
};
|
|
BN.prototype.toBuffer = function toBuffer(endian, length) {
|
|
assert(typeof Buffer2 !== "undefined");
|
|
return this.toArrayLike(Buffer2, endian, length);
|
|
};
|
|
BN.prototype.toArray = function toArray(endian, length) {
|
|
return this.toArrayLike(Array, endian, length);
|
|
};
|
|
BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
|
|
var byteLength = this.byteLength();
|
|
var reqLength = length || Math.max(1, byteLength);
|
|
assert(byteLength <= reqLength, "byte array longer than desired length");
|
|
assert(reqLength > 0, "Requested array length <= 0");
|
|
this.strip();
|
|
var littleEndian = endian === "le";
|
|
var res = new ArrayType(reqLength);
|
|
var b, i;
|
|
var q = this.clone();
|
|
if (!littleEndian) {
|
|
for (i = 0;i < reqLength - byteLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
for (i = 0;!q.isZero(); i++) {
|
|
b = q.andln(255);
|
|
q.iushrn(8);
|
|
res[reqLength - i - 1] = b;
|
|
}
|
|
} else {
|
|
for (i = 0;!q.isZero(); i++) {
|
|
b = q.andln(255);
|
|
q.iushrn(8);
|
|
res[i] = b;
|
|
}
|
|
for (;i < reqLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
if (Math.clz32) {
|
|
BN.prototype._countBits = function _countBits(w) {
|
|
return 32 - Math.clz32(w);
|
|
};
|
|
} else {
|
|
BN.prototype._countBits = function _countBits(w) {
|
|
var t = w;
|
|
var r = 0;
|
|
if (t >= 4096) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if (t >= 64) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if (t >= 8) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if (t >= 2) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
return r + t;
|
|
};
|
|
}
|
|
BN.prototype._zeroBits = function _zeroBits(w) {
|
|
if (w === 0)
|
|
return 26;
|
|
var t = w;
|
|
var r = 0;
|
|
if ((t & 8191) === 0) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if ((t & 127) === 0) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if ((t & 15) === 0) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if ((t & 3) === 0) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
if ((t & 1) === 0) {
|
|
r++;
|
|
}
|
|
return r;
|
|
};
|
|
BN.prototype.bitLength = function bitLength() {
|
|
var w = this.words[this.length - 1];
|
|
var hi = this._countBits(w);
|
|
return (this.length - 1) * 26 + hi;
|
|
};
|
|
function toBitArray(num) {
|
|
var w = new Array(num.bitLength());
|
|
for (var bit = 0;bit < w.length; bit++) {
|
|
var off = bit / 26 | 0;
|
|
var wbit = bit % 26;
|
|
w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
|
|
}
|
|
return w;
|
|
}
|
|
BN.prototype.zeroBits = function zeroBits() {
|
|
if (this.isZero())
|
|
return 0;
|
|
var r = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var b = this._zeroBits(this.words[i]);
|
|
r += b;
|
|
if (b !== 26)
|
|
break;
|
|
}
|
|
return r;
|
|
};
|
|
BN.prototype.byteLength = function byteLength() {
|
|
return Math.ceil(this.bitLength() / 8);
|
|
};
|
|
BN.prototype.toTwos = function toTwos(width) {
|
|
if (this.negative !== 0) {
|
|
return this.abs().inotn(width).iaddn(1);
|
|
}
|
|
return this.clone();
|
|
};
|
|
BN.prototype.fromTwos = function fromTwos(width) {
|
|
if (this.testn(width - 1)) {
|
|
return this.notn(width).iaddn(1).ineg();
|
|
}
|
|
return this.clone();
|
|
};
|
|
BN.prototype.isNeg = function isNeg() {
|
|
return this.negative !== 0;
|
|
};
|
|
BN.prototype.neg = function neg() {
|
|
return this.clone().ineg();
|
|
};
|
|
BN.prototype.ineg = function ineg() {
|
|
if (!this.isZero()) {
|
|
this.negative ^= 1;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.iuor = function iuor(num) {
|
|
while (this.length < num.length) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
for (var i = 0;i < num.length; i++) {
|
|
this.words[i] = this.words[i] | num.words[i];
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ior = function ior(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuor(num);
|
|
};
|
|
BN.prototype.or = function or(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().ior(num);
|
|
return num.clone().ior(this);
|
|
};
|
|
BN.prototype.uor = function uor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuor(num);
|
|
return num.clone().iuor(this);
|
|
};
|
|
BN.prototype.iuand = function iuand(num) {
|
|
var b;
|
|
if (this.length > num.length) {
|
|
b = num;
|
|
} else {
|
|
b = this;
|
|
}
|
|
for (var i = 0;i < b.length; i++) {
|
|
this.words[i] = this.words[i] & num.words[i];
|
|
}
|
|
this.length = b.length;
|
|
return this.strip();
|
|
};
|
|
BN.prototype.iand = function iand(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuand(num);
|
|
};
|
|
BN.prototype.and = function and(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iand(num);
|
|
return num.clone().iand(this);
|
|
};
|
|
BN.prototype.uand = function uand(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuand(num);
|
|
return num.clone().iuand(this);
|
|
};
|
|
BN.prototype.iuxor = function iuxor(num) {
|
|
var a;
|
|
var b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
for (var i = 0;i < b.length; i++) {
|
|
this.words[i] = a.words[i] ^ b.words[i];
|
|
}
|
|
if (this !== a) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
this.length = a.length;
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ixor = function ixor(num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuxor(num);
|
|
};
|
|
BN.prototype.xor = function xor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().ixor(num);
|
|
return num.clone().ixor(this);
|
|
};
|
|
BN.prototype.uxor = function uxor(num) {
|
|
if (this.length > num.length)
|
|
return this.clone().iuxor(num);
|
|
return num.clone().iuxor(this);
|
|
};
|
|
BN.prototype.inotn = function inotn(width) {
|
|
assert(typeof width === "number" && width >= 0);
|
|
var bytesNeeded = Math.ceil(width / 26) | 0;
|
|
var bitsLeft = width % 26;
|
|
this._expand(bytesNeeded);
|
|
if (bitsLeft > 0) {
|
|
bytesNeeded--;
|
|
}
|
|
for (var i = 0;i < bytesNeeded; i++) {
|
|
this.words[i] = ~this.words[i] & 67108863;
|
|
}
|
|
if (bitsLeft > 0) {
|
|
this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.notn = function notn(width) {
|
|
return this.clone().inotn(width);
|
|
};
|
|
BN.prototype.setn = function setn(bit, val) {
|
|
assert(typeof bit === "number" && bit >= 0);
|
|
var off = bit / 26 | 0;
|
|
var wbit = bit % 26;
|
|
this._expand(off + 1);
|
|
if (val) {
|
|
this.words[off] = this.words[off] | 1 << wbit;
|
|
} else {
|
|
this.words[off] = this.words[off] & ~(1 << wbit);
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.iadd = function iadd(num) {
|
|
var r;
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
this.negative = 0;
|
|
r = this.isub(num);
|
|
this.negative ^= 1;
|
|
return this._normSign();
|
|
} else if (this.negative === 0 && num.negative !== 0) {
|
|
num.negative = 0;
|
|
r = this.isub(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
}
|
|
var a, b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
var carry = 0;
|
|
for (var i = 0;i < b.length; i++) {
|
|
r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
|
|
this.words[i] = r & 67108863;
|
|
carry = r >>> 26;
|
|
}
|
|
for (;carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
this.words[i] = r & 67108863;
|
|
carry = r >>> 26;
|
|
}
|
|
this.length = a.length;
|
|
if (carry !== 0) {
|
|
this.words[this.length] = carry;
|
|
this.length++;
|
|
} else if (a !== this) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.add = function add(num) {
|
|
var res;
|
|
if (num.negative !== 0 && this.negative === 0) {
|
|
num.negative = 0;
|
|
res = this.sub(num);
|
|
num.negative ^= 1;
|
|
return res;
|
|
} else if (num.negative === 0 && this.negative !== 0) {
|
|
this.negative = 0;
|
|
res = num.sub(this);
|
|
this.negative = 1;
|
|
return res;
|
|
}
|
|
if (this.length > num.length)
|
|
return this.clone().iadd(num);
|
|
return num.clone().iadd(this);
|
|
};
|
|
BN.prototype.isub = function isub(num) {
|
|
if (num.negative !== 0) {
|
|
num.negative = 0;
|
|
var r = this.iadd(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
} else if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iadd(num);
|
|
this.negative = 1;
|
|
return this._normSign();
|
|
}
|
|
var cmp = this.cmp(num);
|
|
if (cmp === 0) {
|
|
this.negative = 0;
|
|
this.length = 1;
|
|
this.words[0] = 0;
|
|
return this;
|
|
}
|
|
var a, b;
|
|
if (cmp > 0) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
var carry = 0;
|
|
for (var i = 0;i < b.length; i++) {
|
|
r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 67108863;
|
|
}
|
|
for (;carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 67108863;
|
|
}
|
|
if (carry === 0 && i < a.length && a !== this) {
|
|
for (;i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
this.length = Math.max(this.length, i);
|
|
if (a !== this) {
|
|
this.negative = 1;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.sub = function sub(num) {
|
|
return this.clone().isub(num);
|
|
};
|
|
function smallMulTo(self2, num, out) {
|
|
out.negative = num.negative ^ self2.negative;
|
|
var len = self2.length + num.length | 0;
|
|
out.length = len;
|
|
len = len - 1 | 0;
|
|
var a = self2.words[0] | 0;
|
|
var b = num.words[0] | 0;
|
|
var r = a * b;
|
|
var lo = r & 67108863;
|
|
var carry = r / 67108864 | 0;
|
|
out.words[0] = lo;
|
|
for (var k = 1;k < len; k++) {
|
|
var ncarry = carry >>> 26;
|
|
var rword = carry & 67108863;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
|
|
var i = k - j | 0;
|
|
a = self2.words[i] | 0;
|
|
b = num.words[j] | 0;
|
|
r = a * b + rword;
|
|
ncarry += r / 67108864 | 0;
|
|
rword = r & 67108863;
|
|
}
|
|
out.words[k] = rword | 0;
|
|
carry = ncarry | 0;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry | 0;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
return out.strip();
|
|
}
|
|
var comb10MulTo = function comb10MulTo(self2, num, out) {
|
|
var a = self2.words;
|
|
var b = num.words;
|
|
var o = out.words;
|
|
var c = 0;
|
|
var lo;
|
|
var mid;
|
|
var hi;
|
|
var a0 = a[0] | 0;
|
|
var al0 = a0 & 8191;
|
|
var ah0 = a0 >>> 13;
|
|
var a1 = a[1] | 0;
|
|
var al1 = a1 & 8191;
|
|
var ah1 = a1 >>> 13;
|
|
var a2 = a[2] | 0;
|
|
var al2 = a2 & 8191;
|
|
var ah2 = a2 >>> 13;
|
|
var a3 = a[3] | 0;
|
|
var al3 = a3 & 8191;
|
|
var ah3 = a3 >>> 13;
|
|
var a4 = a[4] | 0;
|
|
var al4 = a4 & 8191;
|
|
var ah4 = a4 >>> 13;
|
|
var a5 = a[5] | 0;
|
|
var al5 = a5 & 8191;
|
|
var ah5 = a5 >>> 13;
|
|
var a6 = a[6] | 0;
|
|
var al6 = a6 & 8191;
|
|
var ah6 = a6 >>> 13;
|
|
var a7 = a[7] | 0;
|
|
var al7 = a7 & 8191;
|
|
var ah7 = a7 >>> 13;
|
|
var a8 = a[8] | 0;
|
|
var al8 = a8 & 8191;
|
|
var ah8 = a8 >>> 13;
|
|
var a9 = a[9] | 0;
|
|
var al9 = a9 & 8191;
|
|
var ah9 = a9 >>> 13;
|
|
var b0 = b[0] | 0;
|
|
var bl0 = b0 & 8191;
|
|
var bh0 = b0 >>> 13;
|
|
var b1 = b[1] | 0;
|
|
var bl1 = b1 & 8191;
|
|
var bh1 = b1 >>> 13;
|
|
var b2 = b[2] | 0;
|
|
var bl2 = b2 & 8191;
|
|
var bh2 = b2 >>> 13;
|
|
var b3 = b[3] | 0;
|
|
var bl3 = b3 & 8191;
|
|
var bh3 = b3 >>> 13;
|
|
var b4 = b[4] | 0;
|
|
var bl4 = b4 & 8191;
|
|
var bh4 = b4 >>> 13;
|
|
var b5 = b[5] | 0;
|
|
var bl5 = b5 & 8191;
|
|
var bh5 = b5 >>> 13;
|
|
var b6 = b[6] | 0;
|
|
var bl6 = b6 & 8191;
|
|
var bh6 = b6 >>> 13;
|
|
var b7 = b[7] | 0;
|
|
var bl7 = b7 & 8191;
|
|
var bh7 = b7 >>> 13;
|
|
var b8 = b[8] | 0;
|
|
var bl8 = b8 & 8191;
|
|
var bh8 = b8 >>> 13;
|
|
var b9 = b[9] | 0;
|
|
var bl9 = b9 & 8191;
|
|
var bh9 = b9 >>> 13;
|
|
out.negative = self2.negative ^ num.negative;
|
|
out.length = 19;
|
|
lo = Math.imul(al0, bl0);
|
|
mid = Math.imul(al0, bh0);
|
|
mid = mid + Math.imul(ah0, bl0) | 0;
|
|
hi = Math.imul(ah0, bh0);
|
|
var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
|
|
w0 &= 67108863;
|
|
lo = Math.imul(al1, bl0);
|
|
mid = Math.imul(al1, bh0);
|
|
mid = mid + Math.imul(ah1, bl0) | 0;
|
|
hi = Math.imul(ah1, bh0);
|
|
lo = lo + Math.imul(al0, bl1) | 0;
|
|
mid = mid + Math.imul(al0, bh1) | 0;
|
|
mid = mid + Math.imul(ah0, bl1) | 0;
|
|
hi = hi + Math.imul(ah0, bh1) | 0;
|
|
var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
|
|
w1 &= 67108863;
|
|
lo = Math.imul(al2, bl0);
|
|
mid = Math.imul(al2, bh0);
|
|
mid = mid + Math.imul(ah2, bl0) | 0;
|
|
hi = Math.imul(ah2, bh0);
|
|
lo = lo + Math.imul(al1, bl1) | 0;
|
|
mid = mid + Math.imul(al1, bh1) | 0;
|
|
mid = mid + Math.imul(ah1, bl1) | 0;
|
|
hi = hi + Math.imul(ah1, bh1) | 0;
|
|
lo = lo + Math.imul(al0, bl2) | 0;
|
|
mid = mid + Math.imul(al0, bh2) | 0;
|
|
mid = mid + Math.imul(ah0, bl2) | 0;
|
|
hi = hi + Math.imul(ah0, bh2) | 0;
|
|
var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
|
|
w2 &= 67108863;
|
|
lo = Math.imul(al3, bl0);
|
|
mid = Math.imul(al3, bh0);
|
|
mid = mid + Math.imul(ah3, bl0) | 0;
|
|
hi = Math.imul(ah3, bh0);
|
|
lo = lo + Math.imul(al2, bl1) | 0;
|
|
mid = mid + Math.imul(al2, bh1) | 0;
|
|
mid = mid + Math.imul(ah2, bl1) | 0;
|
|
hi = hi + Math.imul(ah2, bh1) | 0;
|
|
lo = lo + Math.imul(al1, bl2) | 0;
|
|
mid = mid + Math.imul(al1, bh2) | 0;
|
|
mid = mid + Math.imul(ah1, bl2) | 0;
|
|
hi = hi + Math.imul(ah1, bh2) | 0;
|
|
lo = lo + Math.imul(al0, bl3) | 0;
|
|
mid = mid + Math.imul(al0, bh3) | 0;
|
|
mid = mid + Math.imul(ah0, bl3) | 0;
|
|
hi = hi + Math.imul(ah0, bh3) | 0;
|
|
var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
|
|
w3 &= 67108863;
|
|
lo = Math.imul(al4, bl0);
|
|
mid = Math.imul(al4, bh0);
|
|
mid = mid + Math.imul(ah4, bl0) | 0;
|
|
hi = Math.imul(ah4, bh0);
|
|
lo = lo + Math.imul(al3, bl1) | 0;
|
|
mid = mid + Math.imul(al3, bh1) | 0;
|
|
mid = mid + Math.imul(ah3, bl1) | 0;
|
|
hi = hi + Math.imul(ah3, bh1) | 0;
|
|
lo = lo + Math.imul(al2, bl2) | 0;
|
|
mid = mid + Math.imul(al2, bh2) | 0;
|
|
mid = mid + Math.imul(ah2, bl2) | 0;
|
|
hi = hi + Math.imul(ah2, bh2) | 0;
|
|
lo = lo + Math.imul(al1, bl3) | 0;
|
|
mid = mid + Math.imul(al1, bh3) | 0;
|
|
mid = mid + Math.imul(ah1, bl3) | 0;
|
|
hi = hi + Math.imul(ah1, bh3) | 0;
|
|
lo = lo + Math.imul(al0, bl4) | 0;
|
|
mid = mid + Math.imul(al0, bh4) | 0;
|
|
mid = mid + Math.imul(ah0, bl4) | 0;
|
|
hi = hi + Math.imul(ah0, bh4) | 0;
|
|
var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
|
|
w4 &= 67108863;
|
|
lo = Math.imul(al5, bl0);
|
|
mid = Math.imul(al5, bh0);
|
|
mid = mid + Math.imul(ah5, bl0) | 0;
|
|
hi = Math.imul(ah5, bh0);
|
|
lo = lo + Math.imul(al4, bl1) | 0;
|
|
mid = mid + Math.imul(al4, bh1) | 0;
|
|
mid = mid + Math.imul(ah4, bl1) | 0;
|
|
hi = hi + Math.imul(ah4, bh1) | 0;
|
|
lo = lo + Math.imul(al3, bl2) | 0;
|
|
mid = mid + Math.imul(al3, bh2) | 0;
|
|
mid = mid + Math.imul(ah3, bl2) | 0;
|
|
hi = hi + Math.imul(ah3, bh2) | 0;
|
|
lo = lo + Math.imul(al2, bl3) | 0;
|
|
mid = mid + Math.imul(al2, bh3) | 0;
|
|
mid = mid + Math.imul(ah2, bl3) | 0;
|
|
hi = hi + Math.imul(ah2, bh3) | 0;
|
|
lo = lo + Math.imul(al1, bl4) | 0;
|
|
mid = mid + Math.imul(al1, bh4) | 0;
|
|
mid = mid + Math.imul(ah1, bl4) | 0;
|
|
hi = hi + Math.imul(ah1, bh4) | 0;
|
|
lo = lo + Math.imul(al0, bl5) | 0;
|
|
mid = mid + Math.imul(al0, bh5) | 0;
|
|
mid = mid + Math.imul(ah0, bl5) | 0;
|
|
hi = hi + Math.imul(ah0, bh5) | 0;
|
|
var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
|
|
w5 &= 67108863;
|
|
lo = Math.imul(al6, bl0);
|
|
mid = Math.imul(al6, bh0);
|
|
mid = mid + Math.imul(ah6, bl0) | 0;
|
|
hi = Math.imul(ah6, bh0);
|
|
lo = lo + Math.imul(al5, bl1) | 0;
|
|
mid = mid + Math.imul(al5, bh1) | 0;
|
|
mid = mid + Math.imul(ah5, bl1) | 0;
|
|
hi = hi + Math.imul(ah5, bh1) | 0;
|
|
lo = lo + Math.imul(al4, bl2) | 0;
|
|
mid = mid + Math.imul(al4, bh2) | 0;
|
|
mid = mid + Math.imul(ah4, bl2) | 0;
|
|
hi = hi + Math.imul(ah4, bh2) | 0;
|
|
lo = lo + Math.imul(al3, bl3) | 0;
|
|
mid = mid + Math.imul(al3, bh3) | 0;
|
|
mid = mid + Math.imul(ah3, bl3) | 0;
|
|
hi = hi + Math.imul(ah3, bh3) | 0;
|
|
lo = lo + Math.imul(al2, bl4) | 0;
|
|
mid = mid + Math.imul(al2, bh4) | 0;
|
|
mid = mid + Math.imul(ah2, bl4) | 0;
|
|
hi = hi + Math.imul(ah2, bh4) | 0;
|
|
lo = lo + Math.imul(al1, bl5) | 0;
|
|
mid = mid + Math.imul(al1, bh5) | 0;
|
|
mid = mid + Math.imul(ah1, bl5) | 0;
|
|
hi = hi + Math.imul(ah1, bh5) | 0;
|
|
lo = lo + Math.imul(al0, bl6) | 0;
|
|
mid = mid + Math.imul(al0, bh6) | 0;
|
|
mid = mid + Math.imul(ah0, bl6) | 0;
|
|
hi = hi + Math.imul(ah0, bh6) | 0;
|
|
var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
|
|
w6 &= 67108863;
|
|
lo = Math.imul(al7, bl0);
|
|
mid = Math.imul(al7, bh0);
|
|
mid = mid + Math.imul(ah7, bl0) | 0;
|
|
hi = Math.imul(ah7, bh0);
|
|
lo = lo + Math.imul(al6, bl1) | 0;
|
|
mid = mid + Math.imul(al6, bh1) | 0;
|
|
mid = mid + Math.imul(ah6, bl1) | 0;
|
|
hi = hi + Math.imul(ah6, bh1) | 0;
|
|
lo = lo + Math.imul(al5, bl2) | 0;
|
|
mid = mid + Math.imul(al5, bh2) | 0;
|
|
mid = mid + Math.imul(ah5, bl2) | 0;
|
|
hi = hi + Math.imul(ah5, bh2) | 0;
|
|
lo = lo + Math.imul(al4, bl3) | 0;
|
|
mid = mid + Math.imul(al4, bh3) | 0;
|
|
mid = mid + Math.imul(ah4, bl3) | 0;
|
|
hi = hi + Math.imul(ah4, bh3) | 0;
|
|
lo = lo + Math.imul(al3, bl4) | 0;
|
|
mid = mid + Math.imul(al3, bh4) | 0;
|
|
mid = mid + Math.imul(ah3, bl4) | 0;
|
|
hi = hi + Math.imul(ah3, bh4) | 0;
|
|
lo = lo + Math.imul(al2, bl5) | 0;
|
|
mid = mid + Math.imul(al2, bh5) | 0;
|
|
mid = mid + Math.imul(ah2, bl5) | 0;
|
|
hi = hi + Math.imul(ah2, bh5) | 0;
|
|
lo = lo + Math.imul(al1, bl6) | 0;
|
|
mid = mid + Math.imul(al1, bh6) | 0;
|
|
mid = mid + Math.imul(ah1, bl6) | 0;
|
|
hi = hi + Math.imul(ah1, bh6) | 0;
|
|
lo = lo + Math.imul(al0, bl7) | 0;
|
|
mid = mid + Math.imul(al0, bh7) | 0;
|
|
mid = mid + Math.imul(ah0, bl7) | 0;
|
|
hi = hi + Math.imul(ah0, bh7) | 0;
|
|
var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
|
|
w7 &= 67108863;
|
|
lo = Math.imul(al8, bl0);
|
|
mid = Math.imul(al8, bh0);
|
|
mid = mid + Math.imul(ah8, bl0) | 0;
|
|
hi = Math.imul(ah8, bh0);
|
|
lo = lo + Math.imul(al7, bl1) | 0;
|
|
mid = mid + Math.imul(al7, bh1) | 0;
|
|
mid = mid + Math.imul(ah7, bl1) | 0;
|
|
hi = hi + Math.imul(ah7, bh1) | 0;
|
|
lo = lo + Math.imul(al6, bl2) | 0;
|
|
mid = mid + Math.imul(al6, bh2) | 0;
|
|
mid = mid + Math.imul(ah6, bl2) | 0;
|
|
hi = hi + Math.imul(ah6, bh2) | 0;
|
|
lo = lo + Math.imul(al5, bl3) | 0;
|
|
mid = mid + Math.imul(al5, bh3) | 0;
|
|
mid = mid + Math.imul(ah5, bl3) | 0;
|
|
hi = hi + Math.imul(ah5, bh3) | 0;
|
|
lo = lo + Math.imul(al4, bl4) | 0;
|
|
mid = mid + Math.imul(al4, bh4) | 0;
|
|
mid = mid + Math.imul(ah4, bl4) | 0;
|
|
hi = hi + Math.imul(ah4, bh4) | 0;
|
|
lo = lo + Math.imul(al3, bl5) | 0;
|
|
mid = mid + Math.imul(al3, bh5) | 0;
|
|
mid = mid + Math.imul(ah3, bl5) | 0;
|
|
hi = hi + Math.imul(ah3, bh5) | 0;
|
|
lo = lo + Math.imul(al2, bl6) | 0;
|
|
mid = mid + Math.imul(al2, bh6) | 0;
|
|
mid = mid + Math.imul(ah2, bl6) | 0;
|
|
hi = hi + Math.imul(ah2, bh6) | 0;
|
|
lo = lo + Math.imul(al1, bl7) | 0;
|
|
mid = mid + Math.imul(al1, bh7) | 0;
|
|
mid = mid + Math.imul(ah1, bl7) | 0;
|
|
hi = hi + Math.imul(ah1, bh7) | 0;
|
|
lo = lo + Math.imul(al0, bl8) | 0;
|
|
mid = mid + Math.imul(al0, bh8) | 0;
|
|
mid = mid + Math.imul(ah0, bl8) | 0;
|
|
hi = hi + Math.imul(ah0, bh8) | 0;
|
|
var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
|
|
w8 &= 67108863;
|
|
lo = Math.imul(al9, bl0);
|
|
mid = Math.imul(al9, bh0);
|
|
mid = mid + Math.imul(ah9, bl0) | 0;
|
|
hi = Math.imul(ah9, bh0);
|
|
lo = lo + Math.imul(al8, bl1) | 0;
|
|
mid = mid + Math.imul(al8, bh1) | 0;
|
|
mid = mid + Math.imul(ah8, bl1) | 0;
|
|
hi = hi + Math.imul(ah8, bh1) | 0;
|
|
lo = lo + Math.imul(al7, bl2) | 0;
|
|
mid = mid + Math.imul(al7, bh2) | 0;
|
|
mid = mid + Math.imul(ah7, bl2) | 0;
|
|
hi = hi + Math.imul(ah7, bh2) | 0;
|
|
lo = lo + Math.imul(al6, bl3) | 0;
|
|
mid = mid + Math.imul(al6, bh3) | 0;
|
|
mid = mid + Math.imul(ah6, bl3) | 0;
|
|
hi = hi + Math.imul(ah6, bh3) | 0;
|
|
lo = lo + Math.imul(al5, bl4) | 0;
|
|
mid = mid + Math.imul(al5, bh4) | 0;
|
|
mid = mid + Math.imul(ah5, bl4) | 0;
|
|
hi = hi + Math.imul(ah5, bh4) | 0;
|
|
lo = lo + Math.imul(al4, bl5) | 0;
|
|
mid = mid + Math.imul(al4, bh5) | 0;
|
|
mid = mid + Math.imul(ah4, bl5) | 0;
|
|
hi = hi + Math.imul(ah4, bh5) | 0;
|
|
lo = lo + Math.imul(al3, bl6) | 0;
|
|
mid = mid + Math.imul(al3, bh6) | 0;
|
|
mid = mid + Math.imul(ah3, bl6) | 0;
|
|
hi = hi + Math.imul(ah3, bh6) | 0;
|
|
lo = lo + Math.imul(al2, bl7) | 0;
|
|
mid = mid + Math.imul(al2, bh7) | 0;
|
|
mid = mid + Math.imul(ah2, bl7) | 0;
|
|
hi = hi + Math.imul(ah2, bh7) | 0;
|
|
lo = lo + Math.imul(al1, bl8) | 0;
|
|
mid = mid + Math.imul(al1, bh8) | 0;
|
|
mid = mid + Math.imul(ah1, bl8) | 0;
|
|
hi = hi + Math.imul(ah1, bh8) | 0;
|
|
lo = lo + Math.imul(al0, bl9) | 0;
|
|
mid = mid + Math.imul(al0, bh9) | 0;
|
|
mid = mid + Math.imul(ah0, bl9) | 0;
|
|
hi = hi + Math.imul(ah0, bh9) | 0;
|
|
var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
|
|
w9 &= 67108863;
|
|
lo = Math.imul(al9, bl1);
|
|
mid = Math.imul(al9, bh1);
|
|
mid = mid + Math.imul(ah9, bl1) | 0;
|
|
hi = Math.imul(ah9, bh1);
|
|
lo = lo + Math.imul(al8, bl2) | 0;
|
|
mid = mid + Math.imul(al8, bh2) | 0;
|
|
mid = mid + Math.imul(ah8, bl2) | 0;
|
|
hi = hi + Math.imul(ah8, bh2) | 0;
|
|
lo = lo + Math.imul(al7, bl3) | 0;
|
|
mid = mid + Math.imul(al7, bh3) | 0;
|
|
mid = mid + Math.imul(ah7, bl3) | 0;
|
|
hi = hi + Math.imul(ah7, bh3) | 0;
|
|
lo = lo + Math.imul(al6, bl4) | 0;
|
|
mid = mid + Math.imul(al6, bh4) | 0;
|
|
mid = mid + Math.imul(ah6, bl4) | 0;
|
|
hi = hi + Math.imul(ah6, bh4) | 0;
|
|
lo = lo + Math.imul(al5, bl5) | 0;
|
|
mid = mid + Math.imul(al5, bh5) | 0;
|
|
mid = mid + Math.imul(ah5, bl5) | 0;
|
|
hi = hi + Math.imul(ah5, bh5) | 0;
|
|
lo = lo + Math.imul(al4, bl6) | 0;
|
|
mid = mid + Math.imul(al4, bh6) | 0;
|
|
mid = mid + Math.imul(ah4, bl6) | 0;
|
|
hi = hi + Math.imul(ah4, bh6) | 0;
|
|
lo = lo + Math.imul(al3, bl7) | 0;
|
|
mid = mid + Math.imul(al3, bh7) | 0;
|
|
mid = mid + Math.imul(ah3, bl7) | 0;
|
|
hi = hi + Math.imul(ah3, bh7) | 0;
|
|
lo = lo + Math.imul(al2, bl8) | 0;
|
|
mid = mid + Math.imul(al2, bh8) | 0;
|
|
mid = mid + Math.imul(ah2, bl8) | 0;
|
|
hi = hi + Math.imul(ah2, bh8) | 0;
|
|
lo = lo + Math.imul(al1, bl9) | 0;
|
|
mid = mid + Math.imul(al1, bh9) | 0;
|
|
mid = mid + Math.imul(ah1, bl9) | 0;
|
|
hi = hi + Math.imul(ah1, bh9) | 0;
|
|
var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
|
|
w10 &= 67108863;
|
|
lo = Math.imul(al9, bl2);
|
|
mid = Math.imul(al9, bh2);
|
|
mid = mid + Math.imul(ah9, bl2) | 0;
|
|
hi = Math.imul(ah9, bh2);
|
|
lo = lo + Math.imul(al8, bl3) | 0;
|
|
mid = mid + Math.imul(al8, bh3) | 0;
|
|
mid = mid + Math.imul(ah8, bl3) | 0;
|
|
hi = hi + Math.imul(ah8, bh3) | 0;
|
|
lo = lo + Math.imul(al7, bl4) | 0;
|
|
mid = mid + Math.imul(al7, bh4) | 0;
|
|
mid = mid + Math.imul(ah7, bl4) | 0;
|
|
hi = hi + Math.imul(ah7, bh4) | 0;
|
|
lo = lo + Math.imul(al6, bl5) | 0;
|
|
mid = mid + Math.imul(al6, bh5) | 0;
|
|
mid = mid + Math.imul(ah6, bl5) | 0;
|
|
hi = hi + Math.imul(ah6, bh5) | 0;
|
|
lo = lo + Math.imul(al5, bl6) | 0;
|
|
mid = mid + Math.imul(al5, bh6) | 0;
|
|
mid = mid + Math.imul(ah5, bl6) | 0;
|
|
hi = hi + Math.imul(ah5, bh6) | 0;
|
|
lo = lo + Math.imul(al4, bl7) | 0;
|
|
mid = mid + Math.imul(al4, bh7) | 0;
|
|
mid = mid + Math.imul(ah4, bl7) | 0;
|
|
hi = hi + Math.imul(ah4, bh7) | 0;
|
|
lo = lo + Math.imul(al3, bl8) | 0;
|
|
mid = mid + Math.imul(al3, bh8) | 0;
|
|
mid = mid + Math.imul(ah3, bl8) | 0;
|
|
hi = hi + Math.imul(ah3, bh8) | 0;
|
|
lo = lo + Math.imul(al2, bl9) | 0;
|
|
mid = mid + Math.imul(al2, bh9) | 0;
|
|
mid = mid + Math.imul(ah2, bl9) | 0;
|
|
hi = hi + Math.imul(ah2, bh9) | 0;
|
|
var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
|
|
w11 &= 67108863;
|
|
lo = Math.imul(al9, bl3);
|
|
mid = Math.imul(al9, bh3);
|
|
mid = mid + Math.imul(ah9, bl3) | 0;
|
|
hi = Math.imul(ah9, bh3);
|
|
lo = lo + Math.imul(al8, bl4) | 0;
|
|
mid = mid + Math.imul(al8, bh4) | 0;
|
|
mid = mid + Math.imul(ah8, bl4) | 0;
|
|
hi = hi + Math.imul(ah8, bh4) | 0;
|
|
lo = lo + Math.imul(al7, bl5) | 0;
|
|
mid = mid + Math.imul(al7, bh5) | 0;
|
|
mid = mid + Math.imul(ah7, bl5) | 0;
|
|
hi = hi + Math.imul(ah7, bh5) | 0;
|
|
lo = lo + Math.imul(al6, bl6) | 0;
|
|
mid = mid + Math.imul(al6, bh6) | 0;
|
|
mid = mid + Math.imul(ah6, bl6) | 0;
|
|
hi = hi + Math.imul(ah6, bh6) | 0;
|
|
lo = lo + Math.imul(al5, bl7) | 0;
|
|
mid = mid + Math.imul(al5, bh7) | 0;
|
|
mid = mid + Math.imul(ah5, bl7) | 0;
|
|
hi = hi + Math.imul(ah5, bh7) | 0;
|
|
lo = lo + Math.imul(al4, bl8) | 0;
|
|
mid = mid + Math.imul(al4, bh8) | 0;
|
|
mid = mid + Math.imul(ah4, bl8) | 0;
|
|
hi = hi + Math.imul(ah4, bh8) | 0;
|
|
lo = lo + Math.imul(al3, bl9) | 0;
|
|
mid = mid + Math.imul(al3, bh9) | 0;
|
|
mid = mid + Math.imul(ah3, bl9) | 0;
|
|
hi = hi + Math.imul(ah3, bh9) | 0;
|
|
var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
|
|
w12 &= 67108863;
|
|
lo = Math.imul(al9, bl4);
|
|
mid = Math.imul(al9, bh4);
|
|
mid = mid + Math.imul(ah9, bl4) | 0;
|
|
hi = Math.imul(ah9, bh4);
|
|
lo = lo + Math.imul(al8, bl5) | 0;
|
|
mid = mid + Math.imul(al8, bh5) | 0;
|
|
mid = mid + Math.imul(ah8, bl5) | 0;
|
|
hi = hi + Math.imul(ah8, bh5) | 0;
|
|
lo = lo + Math.imul(al7, bl6) | 0;
|
|
mid = mid + Math.imul(al7, bh6) | 0;
|
|
mid = mid + Math.imul(ah7, bl6) | 0;
|
|
hi = hi + Math.imul(ah7, bh6) | 0;
|
|
lo = lo + Math.imul(al6, bl7) | 0;
|
|
mid = mid + Math.imul(al6, bh7) | 0;
|
|
mid = mid + Math.imul(ah6, bl7) | 0;
|
|
hi = hi + Math.imul(ah6, bh7) | 0;
|
|
lo = lo + Math.imul(al5, bl8) | 0;
|
|
mid = mid + Math.imul(al5, bh8) | 0;
|
|
mid = mid + Math.imul(ah5, bl8) | 0;
|
|
hi = hi + Math.imul(ah5, bh8) | 0;
|
|
lo = lo + Math.imul(al4, bl9) | 0;
|
|
mid = mid + Math.imul(al4, bh9) | 0;
|
|
mid = mid + Math.imul(ah4, bl9) | 0;
|
|
hi = hi + Math.imul(ah4, bh9) | 0;
|
|
var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
|
|
w13 &= 67108863;
|
|
lo = Math.imul(al9, bl5);
|
|
mid = Math.imul(al9, bh5);
|
|
mid = mid + Math.imul(ah9, bl5) | 0;
|
|
hi = Math.imul(ah9, bh5);
|
|
lo = lo + Math.imul(al8, bl6) | 0;
|
|
mid = mid + Math.imul(al8, bh6) | 0;
|
|
mid = mid + Math.imul(ah8, bl6) | 0;
|
|
hi = hi + Math.imul(ah8, bh6) | 0;
|
|
lo = lo + Math.imul(al7, bl7) | 0;
|
|
mid = mid + Math.imul(al7, bh7) | 0;
|
|
mid = mid + Math.imul(ah7, bl7) | 0;
|
|
hi = hi + Math.imul(ah7, bh7) | 0;
|
|
lo = lo + Math.imul(al6, bl8) | 0;
|
|
mid = mid + Math.imul(al6, bh8) | 0;
|
|
mid = mid + Math.imul(ah6, bl8) | 0;
|
|
hi = hi + Math.imul(ah6, bh8) | 0;
|
|
lo = lo + Math.imul(al5, bl9) | 0;
|
|
mid = mid + Math.imul(al5, bh9) | 0;
|
|
mid = mid + Math.imul(ah5, bl9) | 0;
|
|
hi = hi + Math.imul(ah5, bh9) | 0;
|
|
var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
|
|
w14 &= 67108863;
|
|
lo = Math.imul(al9, bl6);
|
|
mid = Math.imul(al9, bh6);
|
|
mid = mid + Math.imul(ah9, bl6) | 0;
|
|
hi = Math.imul(ah9, bh6);
|
|
lo = lo + Math.imul(al8, bl7) | 0;
|
|
mid = mid + Math.imul(al8, bh7) | 0;
|
|
mid = mid + Math.imul(ah8, bl7) | 0;
|
|
hi = hi + Math.imul(ah8, bh7) | 0;
|
|
lo = lo + Math.imul(al7, bl8) | 0;
|
|
mid = mid + Math.imul(al7, bh8) | 0;
|
|
mid = mid + Math.imul(ah7, bl8) | 0;
|
|
hi = hi + Math.imul(ah7, bh8) | 0;
|
|
lo = lo + Math.imul(al6, bl9) | 0;
|
|
mid = mid + Math.imul(al6, bh9) | 0;
|
|
mid = mid + Math.imul(ah6, bl9) | 0;
|
|
hi = hi + Math.imul(ah6, bh9) | 0;
|
|
var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
|
|
w15 &= 67108863;
|
|
lo = Math.imul(al9, bl7);
|
|
mid = Math.imul(al9, bh7);
|
|
mid = mid + Math.imul(ah9, bl7) | 0;
|
|
hi = Math.imul(ah9, bh7);
|
|
lo = lo + Math.imul(al8, bl8) | 0;
|
|
mid = mid + Math.imul(al8, bh8) | 0;
|
|
mid = mid + Math.imul(ah8, bl8) | 0;
|
|
hi = hi + Math.imul(ah8, bh8) | 0;
|
|
lo = lo + Math.imul(al7, bl9) | 0;
|
|
mid = mid + Math.imul(al7, bh9) | 0;
|
|
mid = mid + Math.imul(ah7, bl9) | 0;
|
|
hi = hi + Math.imul(ah7, bh9) | 0;
|
|
var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
|
|
w16 &= 67108863;
|
|
lo = Math.imul(al9, bl8);
|
|
mid = Math.imul(al9, bh8);
|
|
mid = mid + Math.imul(ah9, bl8) | 0;
|
|
hi = Math.imul(ah9, bh8);
|
|
lo = lo + Math.imul(al8, bl9) | 0;
|
|
mid = mid + Math.imul(al8, bh9) | 0;
|
|
mid = mid + Math.imul(ah8, bl9) | 0;
|
|
hi = hi + Math.imul(ah8, bh9) | 0;
|
|
var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
|
|
w17 &= 67108863;
|
|
lo = Math.imul(al9, bl9);
|
|
mid = Math.imul(al9, bh9);
|
|
mid = mid + Math.imul(ah9, bl9) | 0;
|
|
hi = Math.imul(ah9, bh9);
|
|
var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
|
|
w18 &= 67108863;
|
|
o[0] = w0;
|
|
o[1] = w1;
|
|
o[2] = w2;
|
|
o[3] = w3;
|
|
o[4] = w4;
|
|
o[5] = w5;
|
|
o[6] = w6;
|
|
o[7] = w7;
|
|
o[8] = w8;
|
|
o[9] = w9;
|
|
o[10] = w10;
|
|
o[11] = w11;
|
|
o[12] = w12;
|
|
o[13] = w13;
|
|
o[14] = w14;
|
|
o[15] = w15;
|
|
o[16] = w16;
|
|
o[17] = w17;
|
|
o[18] = w18;
|
|
if (c !== 0) {
|
|
o[19] = c;
|
|
out.length++;
|
|
}
|
|
return out;
|
|
};
|
|
if (!Math.imul) {
|
|
comb10MulTo = smallMulTo;
|
|
}
|
|
function bigMulTo(self2, num, out) {
|
|
out.negative = num.negative ^ self2.negative;
|
|
out.length = self2.length + num.length;
|
|
var carry = 0;
|
|
var hncarry = 0;
|
|
for (var k = 0;k < out.length - 1; k++) {
|
|
var ncarry = hncarry;
|
|
hncarry = 0;
|
|
var rword = carry & 67108863;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
|
|
var i = k - j;
|
|
var a = self2.words[i] | 0;
|
|
var b = num.words[j] | 0;
|
|
var r = a * b;
|
|
var lo = r & 67108863;
|
|
ncarry = ncarry + (r / 67108864 | 0) | 0;
|
|
lo = lo + rword | 0;
|
|
rword = lo & 67108863;
|
|
ncarry = ncarry + (lo >>> 26) | 0;
|
|
hncarry += ncarry >>> 26;
|
|
ncarry &= 67108863;
|
|
}
|
|
out.words[k] = rword;
|
|
carry = ncarry;
|
|
ncarry = hncarry;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
return out.strip();
|
|
}
|
|
function jumboMulTo(self2, num, out) {
|
|
var fftm = new FFTM;
|
|
return fftm.mulp(self2, num, out);
|
|
}
|
|
BN.prototype.mulTo = function mulTo(num, out) {
|
|
var res;
|
|
var len = this.length + num.length;
|
|
if (this.length === 10 && num.length === 10) {
|
|
res = comb10MulTo(this, num, out);
|
|
} else if (len < 63) {
|
|
res = smallMulTo(this, num, out);
|
|
} else if (len < 1024) {
|
|
res = bigMulTo(this, num, out);
|
|
} else {
|
|
res = jumboMulTo(this, num, out);
|
|
}
|
|
return res;
|
|
};
|
|
function FFTM(x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
FFTM.prototype.makeRBT = function makeRBT(N) {
|
|
var t = new Array(N);
|
|
var l = BN.prototype._countBits(N) - 1;
|
|
for (var i = 0;i < N; i++) {
|
|
t[i] = this.revBin(i, l, N);
|
|
}
|
|
return t;
|
|
};
|
|
FFTM.prototype.revBin = function revBin(x, l, N) {
|
|
if (x === 0 || x === N - 1)
|
|
return x;
|
|
var rb = 0;
|
|
for (var i = 0;i < l; i++) {
|
|
rb |= (x & 1) << l - i - 1;
|
|
x >>= 1;
|
|
}
|
|
return rb;
|
|
};
|
|
FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
|
|
for (var i = 0;i < N; i++) {
|
|
rtws[i] = rws[rbt[i]];
|
|
itws[i] = iws[rbt[i]];
|
|
}
|
|
};
|
|
FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
|
|
this.permute(rbt, rws, iws, rtws, itws, N);
|
|
for (var s = 1;s < N; s <<= 1) {
|
|
var l = s << 1;
|
|
var rtwdf = Math.cos(2 * Math.PI / l);
|
|
var itwdf = Math.sin(2 * Math.PI / l);
|
|
for (var p = 0;p < N; p += l) {
|
|
var rtwdf_ = rtwdf;
|
|
var itwdf_ = itwdf;
|
|
for (var j = 0;j < s; j++) {
|
|
var re = rtws[p + j];
|
|
var ie = itws[p + j];
|
|
var ro = rtws[p + j + s];
|
|
var io = itws[p + j + s];
|
|
var rx = rtwdf_ * ro - itwdf_ * io;
|
|
io = rtwdf_ * io + itwdf_ * ro;
|
|
ro = rx;
|
|
rtws[p + j] = re + ro;
|
|
itws[p + j] = ie + io;
|
|
rtws[p + j + s] = re - ro;
|
|
itws[p + j + s] = ie - io;
|
|
if (j !== l) {
|
|
rx = rtwdf * rtwdf_ - itwdf * itwdf_;
|
|
itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
|
|
rtwdf_ = rx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
|
|
var N = Math.max(m, n) | 1;
|
|
var odd = N & 1;
|
|
var i = 0;
|
|
for (N = N / 2 | 0;N; N = N >>> 1) {
|
|
i++;
|
|
}
|
|
return 1 << i + 1 + odd;
|
|
};
|
|
FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
|
|
if (N <= 1)
|
|
return;
|
|
for (var i = 0;i < N / 2; i++) {
|
|
var t = rws[i];
|
|
rws[i] = rws[N - i - 1];
|
|
rws[N - i - 1] = t;
|
|
t = iws[i];
|
|
iws[i] = -iws[N - i - 1];
|
|
iws[N - i - 1] = -t;
|
|
}
|
|
};
|
|
FFTM.prototype.normalize13b = function normalize13b(ws, N) {
|
|
var carry = 0;
|
|
for (var i = 0;i < N / 2; i++) {
|
|
var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
|
|
ws[i] = w & 67108863;
|
|
if (w < 67108864) {
|
|
carry = 0;
|
|
} else {
|
|
carry = w / 67108864 | 0;
|
|
}
|
|
}
|
|
return ws;
|
|
};
|
|
FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
|
|
var carry = 0;
|
|
for (var i = 0;i < len; i++) {
|
|
carry = carry + (ws[i] | 0);
|
|
rws[2 * i] = carry & 8191;
|
|
carry = carry >>> 13;
|
|
rws[2 * i + 1] = carry & 8191;
|
|
carry = carry >>> 13;
|
|
}
|
|
for (i = 2 * len;i < N; ++i) {
|
|
rws[i] = 0;
|
|
}
|
|
assert(carry === 0);
|
|
assert((carry & ~8191) === 0);
|
|
};
|
|
FFTM.prototype.stub = function stub(N) {
|
|
var ph = new Array(N);
|
|
for (var i = 0;i < N; i++) {
|
|
ph[i] = 0;
|
|
}
|
|
return ph;
|
|
};
|
|
FFTM.prototype.mulp = function mulp(x, y, out) {
|
|
var N = 2 * this.guessLen13b(x.length, y.length);
|
|
var rbt = this.makeRBT(N);
|
|
var _ = this.stub(N);
|
|
var rws = new Array(N);
|
|
var rwst = new Array(N);
|
|
var iwst = new Array(N);
|
|
var nrws = new Array(N);
|
|
var nrwst = new Array(N);
|
|
var niwst = new Array(N);
|
|
var rmws = out.words;
|
|
rmws.length = N;
|
|
this.convert13b(x.words, x.length, rws, N);
|
|
this.convert13b(y.words, y.length, nrws, N);
|
|
this.transform(rws, _, rwst, iwst, N, rbt);
|
|
this.transform(nrws, _, nrwst, niwst, N, rbt);
|
|
for (var i = 0;i < N; i++) {
|
|
var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
|
|
iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
|
|
rwst[i] = rx;
|
|
}
|
|
this.conjugate(rwst, iwst, N);
|
|
this.transform(rwst, iwst, rmws, _, N, rbt);
|
|
this.conjugate(rmws, _, N);
|
|
this.normalize13b(rmws, N);
|
|
out.negative = x.negative ^ y.negative;
|
|
out.length = x.length + y.length;
|
|
return out.strip();
|
|
};
|
|
BN.prototype.mul = function mul(num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return this.mulTo(num, out);
|
|
};
|
|
BN.prototype.mulf = function mulf(num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return jumboMulTo(this, num, out);
|
|
};
|
|
BN.prototype.imul = function imul(num) {
|
|
return this.clone().mulTo(num, this);
|
|
};
|
|
BN.prototype.imuln = function imuln(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
var carry = 0;
|
|
for (var i = 0;i < this.length; i++) {
|
|
var w = (this.words[i] | 0) * num;
|
|
var lo = (w & 67108863) + (carry & 67108863);
|
|
carry >>= 26;
|
|
carry += w / 67108864 | 0;
|
|
carry += lo >>> 26;
|
|
this.words[i] = lo & 67108863;
|
|
}
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
this.length = num === 0 ? 1 : this.length;
|
|
return this;
|
|
};
|
|
BN.prototype.muln = function muln(num) {
|
|
return this.clone().imuln(num);
|
|
};
|
|
BN.prototype.sqr = function sqr() {
|
|
return this.mul(this);
|
|
};
|
|
BN.prototype.isqr = function isqr() {
|
|
return this.imul(this.clone());
|
|
};
|
|
BN.prototype.pow = function pow(num) {
|
|
var w = toBitArray(num);
|
|
if (w.length === 0)
|
|
return new BN(1);
|
|
var res = this;
|
|
for (var i = 0;i < w.length; i++, res = res.sqr()) {
|
|
if (w[i] !== 0)
|
|
break;
|
|
}
|
|
if (++i < w.length) {
|
|
for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
|
|
if (w[i] === 0)
|
|
continue;
|
|
res = res.mul(q);
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.iushln = function iushln(bits) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
var carryMask = 67108863 >>> 26 - r << 26 - r;
|
|
var i;
|
|
if (r !== 0) {
|
|
var carry = 0;
|
|
for (i = 0;i < this.length; i++) {
|
|
var newCarry = this.words[i] & carryMask;
|
|
var c = (this.words[i] | 0) - newCarry << r;
|
|
this.words[i] = c | carry;
|
|
carry = newCarry >>> 26 - r;
|
|
}
|
|
if (carry) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
}
|
|
if (s !== 0) {
|
|
for (i = this.length - 1;i >= 0; i--) {
|
|
this.words[i + s] = this.words[i];
|
|
}
|
|
for (i = 0;i < s; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
this.length += s;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ishln = function ishln(bits) {
|
|
assert(this.negative === 0);
|
|
return this.iushln(bits);
|
|
};
|
|
BN.prototype.iushrn = function iushrn(bits, hint, extended) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var h;
|
|
if (hint) {
|
|
h = (hint - hint % 26) / 26;
|
|
} else {
|
|
h = 0;
|
|
}
|
|
var r = bits % 26;
|
|
var s = Math.min((bits - r) / 26, this.length);
|
|
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
var maskedWords = extended;
|
|
h -= s;
|
|
h = Math.max(0, h);
|
|
if (maskedWords) {
|
|
for (var i = 0;i < s; i++) {
|
|
maskedWords.words[i] = this.words[i];
|
|
}
|
|
maskedWords.length = s;
|
|
}
|
|
if (s === 0) {} else if (this.length > s) {
|
|
this.length -= s;
|
|
for (i = 0;i < this.length; i++) {
|
|
this.words[i] = this.words[i + s];
|
|
}
|
|
} else {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
var carry = 0;
|
|
for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
|
|
var word = this.words[i] | 0;
|
|
this.words[i] = carry << 26 - r | word >>> r;
|
|
carry = word & mask;
|
|
}
|
|
if (maskedWords && carry !== 0) {
|
|
maskedWords.words[maskedWords.length++] = carry;
|
|
}
|
|
if (this.length === 0) {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.ishrn = function ishrn(bits, hint, extended) {
|
|
assert(this.negative === 0);
|
|
return this.iushrn(bits, hint, extended);
|
|
};
|
|
BN.prototype.shln = function shln(bits) {
|
|
return this.clone().ishln(bits);
|
|
};
|
|
BN.prototype.ushln = function ushln(bits) {
|
|
return this.clone().iushln(bits);
|
|
};
|
|
BN.prototype.shrn = function shrn(bits) {
|
|
return this.clone().ishrn(bits);
|
|
};
|
|
BN.prototype.ushrn = function ushrn(bits) {
|
|
return this.clone().iushrn(bits);
|
|
};
|
|
BN.prototype.testn = function testn(bit) {
|
|
assert(typeof bit === "number" && bit >= 0);
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
if (this.length <= s)
|
|
return false;
|
|
var w = this.words[s];
|
|
return !!(w & q);
|
|
};
|
|
BN.prototype.imaskn = function imaskn(bits) {
|
|
assert(typeof bits === "number" && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
assert(this.negative === 0, "imaskn works only with positive numbers");
|
|
if (this.length <= s) {
|
|
return this;
|
|
}
|
|
if (r !== 0) {
|
|
s++;
|
|
}
|
|
this.length = Math.min(s, this.length);
|
|
if (r !== 0) {
|
|
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
this.words[this.length - 1] &= mask;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.maskn = function maskn(bits) {
|
|
return this.clone().imaskn(bits);
|
|
};
|
|
BN.prototype.iaddn = function iaddn(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
if (num < 0)
|
|
return this.isubn(-num);
|
|
if (this.negative !== 0) {
|
|
if (this.length === 1 && (this.words[0] | 0) < num) {
|
|
this.words[0] = num - (this.words[0] | 0);
|
|
this.negative = 0;
|
|
return this;
|
|
}
|
|
this.negative = 0;
|
|
this.isubn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
return this._iaddn(num);
|
|
};
|
|
BN.prototype._iaddn = function _iaddn(num) {
|
|
this.words[0] += num;
|
|
for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
|
|
this.words[i] -= 67108864;
|
|
if (i === this.length - 1) {
|
|
this.words[i + 1] = 1;
|
|
} else {
|
|
this.words[i + 1]++;
|
|
}
|
|
}
|
|
this.length = Math.max(this.length, i + 1);
|
|
return this;
|
|
};
|
|
BN.prototype.isubn = function isubn(num) {
|
|
assert(typeof num === "number");
|
|
assert(num < 67108864);
|
|
if (num < 0)
|
|
return this.iaddn(-num);
|
|
if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iaddn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
this.words[0] -= num;
|
|
if (this.length === 1 && this.words[0] < 0) {
|
|
this.words[0] = -this.words[0];
|
|
this.negative = 1;
|
|
} else {
|
|
for (var i = 0;i < this.length && this.words[i] < 0; i++) {
|
|
this.words[i] += 67108864;
|
|
this.words[i + 1] -= 1;
|
|
}
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.addn = function addn(num) {
|
|
return this.clone().iaddn(num);
|
|
};
|
|
BN.prototype.subn = function subn(num) {
|
|
return this.clone().isubn(num);
|
|
};
|
|
BN.prototype.iabs = function iabs() {
|
|
this.negative = 0;
|
|
return this;
|
|
};
|
|
BN.prototype.abs = function abs() {
|
|
return this.clone().iabs();
|
|
};
|
|
BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
|
|
var len = num.length + shift;
|
|
var i;
|
|
this._expand(len);
|
|
var w;
|
|
var carry = 0;
|
|
for (i = 0;i < num.length; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
var right = (num.words[i] | 0) * mul;
|
|
w -= right & 67108863;
|
|
carry = (w >> 26) - (right / 67108864 | 0);
|
|
this.words[i + shift] = w & 67108863;
|
|
}
|
|
for (;i < this.length - shift; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i + shift] = w & 67108863;
|
|
}
|
|
if (carry === 0)
|
|
return this.strip();
|
|
assert(carry === -1);
|
|
carry = 0;
|
|
for (i = 0;i < this.length; i++) {
|
|
w = -(this.words[i] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i] = w & 67108863;
|
|
}
|
|
this.negative = 1;
|
|
return this.strip();
|
|
};
|
|
BN.prototype._wordDiv = function _wordDiv(num, mode) {
|
|
var shift = this.length - num.length;
|
|
var a = this.clone();
|
|
var b = num;
|
|
var bhi = b.words[b.length - 1] | 0;
|
|
var bhiBits = this._countBits(bhi);
|
|
shift = 26 - bhiBits;
|
|
if (shift !== 0) {
|
|
b = b.ushln(shift);
|
|
a.iushln(shift);
|
|
bhi = b.words[b.length - 1] | 0;
|
|
}
|
|
var m = a.length - b.length;
|
|
var q;
|
|
if (mode !== "mod") {
|
|
q = new BN(null);
|
|
q.length = m + 1;
|
|
q.words = new Array(q.length);
|
|
for (var i = 0;i < q.length; i++) {
|
|
q.words[i] = 0;
|
|
}
|
|
}
|
|
var diff = a.clone()._ishlnsubmul(b, 1, m);
|
|
if (diff.negative === 0) {
|
|
a = diff;
|
|
if (q) {
|
|
q.words[m] = 1;
|
|
}
|
|
}
|
|
for (var j = m - 1;j >= 0; j--) {
|
|
var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
|
|
qj = Math.min(qj / bhi | 0, 67108863);
|
|
a._ishlnsubmul(b, qj, j);
|
|
while (a.negative !== 0) {
|
|
qj--;
|
|
a.negative = 0;
|
|
a._ishlnsubmul(b, 1, j);
|
|
if (!a.isZero()) {
|
|
a.negative ^= 1;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.words[j] = qj;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.strip();
|
|
}
|
|
a.strip();
|
|
if (mode !== "div" && shift !== 0) {
|
|
a.iushrn(shift);
|
|
}
|
|
return {
|
|
div: q || null,
|
|
mod: a
|
|
};
|
|
};
|
|
BN.prototype.divmod = function divmod(num, mode, positive) {
|
|
assert(!num.isZero());
|
|
if (this.isZero()) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: new BN(0)
|
|
};
|
|
}
|
|
var div, mod, res;
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
res = this.neg().divmod(num, mode);
|
|
if (mode !== "mod") {
|
|
div = res.div.neg();
|
|
}
|
|
if (mode !== "div") {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.iadd(num);
|
|
}
|
|
}
|
|
return {
|
|
div,
|
|
mod
|
|
};
|
|
}
|
|
if (this.negative === 0 && num.negative !== 0) {
|
|
res = this.divmod(num.neg(), mode);
|
|
if (mode !== "mod") {
|
|
div = res.div.neg();
|
|
}
|
|
return {
|
|
div,
|
|
mod: res.mod
|
|
};
|
|
}
|
|
if ((this.negative & num.negative) !== 0) {
|
|
res = this.neg().divmod(num.neg(), mode);
|
|
if (mode !== "div") {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.isub(num);
|
|
}
|
|
}
|
|
return {
|
|
div: res.div,
|
|
mod
|
|
};
|
|
}
|
|
if (num.length > this.length || this.cmp(num) < 0) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: this
|
|
};
|
|
}
|
|
if (num.length === 1) {
|
|
if (mode === "div") {
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: null
|
|
};
|
|
}
|
|
if (mode === "mod") {
|
|
return {
|
|
div: null,
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
return this._wordDiv(num, mode);
|
|
};
|
|
BN.prototype.div = function div(num) {
|
|
return this.divmod(num, "div", false).div;
|
|
};
|
|
BN.prototype.mod = function mod(num) {
|
|
return this.divmod(num, "mod", false).mod;
|
|
};
|
|
BN.prototype.umod = function umod(num) {
|
|
return this.divmod(num, "mod", true).mod;
|
|
};
|
|
BN.prototype.divRound = function divRound(num) {
|
|
var dm = this.divmod(num);
|
|
if (dm.mod.isZero())
|
|
return dm.div;
|
|
var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
|
|
var half = num.ushrn(1);
|
|
var r2 = num.andln(1);
|
|
var cmp = mod.cmp(half);
|
|
if (cmp < 0 || r2 === 1 && cmp === 0)
|
|
return dm.div;
|
|
return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
|
|
};
|
|
BN.prototype.modn = function modn(num) {
|
|
assert(num <= 67108863);
|
|
var p = (1 << 26) % num;
|
|
var acc = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
acc = (p * acc + (this.words[i] | 0)) % num;
|
|
}
|
|
return acc;
|
|
};
|
|
BN.prototype.idivn = function idivn(num) {
|
|
assert(num <= 67108863);
|
|
var carry = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
var w = (this.words[i] | 0) + carry * 67108864;
|
|
this.words[i] = w / num | 0;
|
|
carry = w % num;
|
|
}
|
|
return this.strip();
|
|
};
|
|
BN.prototype.divn = function divn(num) {
|
|
return this.clone().idivn(num);
|
|
};
|
|
BN.prototype.egcd = function egcd(p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
var x = this;
|
|
var y = p.clone();
|
|
if (x.negative !== 0) {
|
|
x = x.umod(p);
|
|
} else {
|
|
x = x.clone();
|
|
}
|
|
var A = new BN(1);
|
|
var B = new BN(0);
|
|
var C = new BN(0);
|
|
var D = new BN(1);
|
|
var g = 0;
|
|
while (x.isEven() && y.isEven()) {
|
|
x.iushrn(1);
|
|
y.iushrn(1);
|
|
++g;
|
|
}
|
|
var yp = y.clone();
|
|
var xp = x.clone();
|
|
while (!x.isZero()) {
|
|
for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
|
|
;
|
|
if (i > 0) {
|
|
x.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (A.isOdd() || B.isOdd()) {
|
|
A.iadd(yp);
|
|
B.isub(xp);
|
|
}
|
|
A.iushrn(1);
|
|
B.iushrn(1);
|
|
}
|
|
}
|
|
for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
|
|
;
|
|
if (j > 0) {
|
|
y.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (C.isOdd() || D.isOdd()) {
|
|
C.iadd(yp);
|
|
D.isub(xp);
|
|
}
|
|
C.iushrn(1);
|
|
D.iushrn(1);
|
|
}
|
|
}
|
|
if (x.cmp(y) >= 0) {
|
|
x.isub(y);
|
|
A.isub(C);
|
|
B.isub(D);
|
|
} else {
|
|
y.isub(x);
|
|
C.isub(A);
|
|
D.isub(B);
|
|
}
|
|
}
|
|
return {
|
|
a: C,
|
|
b: D,
|
|
gcd: y.iushln(g)
|
|
};
|
|
};
|
|
BN.prototype._invmp = function _invmp(p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
var a = this;
|
|
var b = p.clone();
|
|
if (a.negative !== 0) {
|
|
a = a.umod(p);
|
|
} else {
|
|
a = a.clone();
|
|
}
|
|
var x1 = new BN(1);
|
|
var x2 = new BN(0);
|
|
var delta = b.clone();
|
|
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
|
|
for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
|
|
;
|
|
if (i > 0) {
|
|
a.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (x1.isOdd()) {
|
|
x1.iadd(delta);
|
|
}
|
|
x1.iushrn(1);
|
|
}
|
|
}
|
|
for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
|
|
;
|
|
if (j > 0) {
|
|
b.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (x2.isOdd()) {
|
|
x2.iadd(delta);
|
|
}
|
|
x2.iushrn(1);
|
|
}
|
|
}
|
|
if (a.cmp(b) >= 0) {
|
|
a.isub(b);
|
|
x1.isub(x2);
|
|
} else {
|
|
b.isub(a);
|
|
x2.isub(x1);
|
|
}
|
|
}
|
|
var res;
|
|
if (a.cmpn(1) === 0) {
|
|
res = x1;
|
|
} else {
|
|
res = x2;
|
|
}
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(p);
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.gcd = function gcd(num) {
|
|
if (this.isZero())
|
|
return num.abs();
|
|
if (num.isZero())
|
|
return this.abs();
|
|
var a = this.clone();
|
|
var b = num.clone();
|
|
a.negative = 0;
|
|
b.negative = 0;
|
|
for (var shift = 0;a.isEven() && b.isEven(); shift++) {
|
|
a.iushrn(1);
|
|
b.iushrn(1);
|
|
}
|
|
do {
|
|
while (a.isEven()) {
|
|
a.iushrn(1);
|
|
}
|
|
while (b.isEven()) {
|
|
b.iushrn(1);
|
|
}
|
|
var r = a.cmp(b);
|
|
if (r < 0) {
|
|
var t = a;
|
|
a = b;
|
|
b = t;
|
|
} else if (r === 0 || b.cmpn(1) === 0) {
|
|
break;
|
|
}
|
|
a.isub(b);
|
|
} while (true);
|
|
return b.iushln(shift);
|
|
};
|
|
BN.prototype.invm = function invm(num) {
|
|
return this.egcd(num).a.umod(num);
|
|
};
|
|
BN.prototype.isEven = function isEven() {
|
|
return (this.words[0] & 1) === 0;
|
|
};
|
|
BN.prototype.isOdd = function isOdd() {
|
|
return (this.words[0] & 1) === 1;
|
|
};
|
|
BN.prototype.andln = function andln(num) {
|
|
return this.words[0] & num;
|
|
};
|
|
BN.prototype.bincn = function bincn(bit) {
|
|
assert(typeof bit === "number");
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
if (this.length <= s) {
|
|
this._expand(s + 1);
|
|
this.words[s] |= q;
|
|
return this;
|
|
}
|
|
var carry = q;
|
|
for (var i = s;carry !== 0 && i < this.length; i++) {
|
|
var w = this.words[i] | 0;
|
|
w += carry;
|
|
carry = w >>> 26;
|
|
w &= 67108863;
|
|
this.words[i] = w;
|
|
}
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
return this;
|
|
};
|
|
BN.prototype.isZero = function isZero() {
|
|
return this.length === 1 && this.words[0] === 0;
|
|
};
|
|
BN.prototype.cmpn = function cmpn(num) {
|
|
var negative = num < 0;
|
|
if (this.negative !== 0 && !negative)
|
|
return -1;
|
|
if (this.negative === 0 && negative)
|
|
return 1;
|
|
this.strip();
|
|
var res;
|
|
if (this.length > 1) {
|
|
res = 1;
|
|
} else {
|
|
if (negative) {
|
|
num = -num;
|
|
}
|
|
assert(num <= 67108863, "Number is too big");
|
|
var w = this.words[0] | 0;
|
|
res = w === num ? 0 : w < num ? -1 : 1;
|
|
}
|
|
if (this.negative !== 0)
|
|
return -res | 0;
|
|
return res;
|
|
};
|
|
BN.prototype.cmp = function cmp(num) {
|
|
if (this.negative !== 0 && num.negative === 0)
|
|
return -1;
|
|
if (this.negative === 0 && num.negative !== 0)
|
|
return 1;
|
|
var res = this.ucmp(num);
|
|
if (this.negative !== 0)
|
|
return -res | 0;
|
|
return res;
|
|
};
|
|
BN.prototype.ucmp = function ucmp(num) {
|
|
if (this.length > num.length)
|
|
return 1;
|
|
if (this.length < num.length)
|
|
return -1;
|
|
var res = 0;
|
|
for (var i = this.length - 1;i >= 0; i--) {
|
|
var a = this.words[i] | 0;
|
|
var b = num.words[i] | 0;
|
|
if (a === b)
|
|
continue;
|
|
if (a < b) {
|
|
res = -1;
|
|
} else if (a > b) {
|
|
res = 1;
|
|
}
|
|
break;
|
|
}
|
|
return res;
|
|
};
|
|
BN.prototype.gtn = function gtn(num) {
|
|
return this.cmpn(num) === 1;
|
|
};
|
|
BN.prototype.gt = function gt(num) {
|
|
return this.cmp(num) === 1;
|
|
};
|
|
BN.prototype.gten = function gten(num) {
|
|
return this.cmpn(num) >= 0;
|
|
};
|
|
BN.prototype.gte = function gte(num) {
|
|
return this.cmp(num) >= 0;
|
|
};
|
|
BN.prototype.ltn = function ltn(num) {
|
|
return this.cmpn(num) === -1;
|
|
};
|
|
BN.prototype.lt = function lt(num) {
|
|
return this.cmp(num) === -1;
|
|
};
|
|
BN.prototype.lten = function lten(num) {
|
|
return this.cmpn(num) <= 0;
|
|
};
|
|
BN.prototype.lte = function lte(num) {
|
|
return this.cmp(num) <= 0;
|
|
};
|
|
BN.prototype.eqn = function eqn(num) {
|
|
return this.cmpn(num) === 0;
|
|
};
|
|
BN.prototype.eq = function eq(num) {
|
|
return this.cmp(num) === 0;
|
|
};
|
|
BN.red = function red(num) {
|
|
return new Red(num);
|
|
};
|
|
BN.prototype.toRed = function toRed(ctx) {
|
|
assert(!this.red, "Already a number in reduction context");
|
|
assert(this.negative === 0, "red works only with positives");
|
|
return ctx.convertTo(this)._forceRed(ctx);
|
|
};
|
|
BN.prototype.fromRed = function fromRed() {
|
|
assert(this.red, "fromRed works only with numbers in reduction context");
|
|
return this.red.convertFrom(this);
|
|
};
|
|
BN.prototype._forceRed = function _forceRed(ctx) {
|
|
this.red = ctx;
|
|
return this;
|
|
};
|
|
BN.prototype.forceRed = function forceRed(ctx) {
|
|
assert(!this.red, "Already a number in reduction context");
|
|
return this._forceRed(ctx);
|
|
};
|
|
BN.prototype.redAdd = function redAdd(num) {
|
|
assert(this.red, "redAdd works only with red numbers");
|
|
return this.red.add(this, num);
|
|
};
|
|
BN.prototype.redIAdd = function redIAdd(num) {
|
|
assert(this.red, "redIAdd works only with red numbers");
|
|
return this.red.iadd(this, num);
|
|
};
|
|
BN.prototype.redSub = function redSub(num) {
|
|
assert(this.red, "redSub works only with red numbers");
|
|
return this.red.sub(this, num);
|
|
};
|
|
BN.prototype.redISub = function redISub(num) {
|
|
assert(this.red, "redISub works only with red numbers");
|
|
return this.red.isub(this, num);
|
|
};
|
|
BN.prototype.redShl = function redShl(num) {
|
|
assert(this.red, "redShl works only with red numbers");
|
|
return this.red.shl(this, num);
|
|
};
|
|
BN.prototype.redMul = function redMul(num) {
|
|
assert(this.red, "redMul works only with red numbers");
|
|
this.red._verify2(this, num);
|
|
return this.red.mul(this, num);
|
|
};
|
|
BN.prototype.redIMul = function redIMul(num) {
|
|
assert(this.red, "redMul works only with red numbers");
|
|
this.red._verify2(this, num);
|
|
return this.red.imul(this, num);
|
|
};
|
|
BN.prototype.redSqr = function redSqr() {
|
|
assert(this.red, "redSqr works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.sqr(this);
|
|
};
|
|
BN.prototype.redISqr = function redISqr() {
|
|
assert(this.red, "redISqr works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.isqr(this);
|
|
};
|
|
BN.prototype.redSqrt = function redSqrt() {
|
|
assert(this.red, "redSqrt works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.sqrt(this);
|
|
};
|
|
BN.prototype.redInvm = function redInvm() {
|
|
assert(this.red, "redInvm works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.invm(this);
|
|
};
|
|
BN.prototype.redNeg = function redNeg() {
|
|
assert(this.red, "redNeg works only with red numbers");
|
|
this.red._verify1(this);
|
|
return this.red.neg(this);
|
|
};
|
|
BN.prototype.redPow = function redPow(num) {
|
|
assert(this.red && !num.red, "redPow(normalNum)");
|
|
this.red._verify1(this);
|
|
return this.red.pow(this, num);
|
|
};
|
|
var primes = {
|
|
k256: null,
|
|
p224: null,
|
|
p192: null,
|
|
p25519: null
|
|
};
|
|
function MPrime(name, p) {
|
|
this.name = name;
|
|
this.p = new BN(p, 16);
|
|
this.n = this.p.bitLength();
|
|
this.k = new BN(1).iushln(this.n).isub(this.p);
|
|
this.tmp = this._tmp();
|
|
}
|
|
MPrime.prototype._tmp = function _tmp() {
|
|
var tmp = new BN(null);
|
|
tmp.words = new Array(Math.ceil(this.n / 13));
|
|
return tmp;
|
|
};
|
|
MPrime.prototype.ireduce = function ireduce(num) {
|
|
var r = num;
|
|
var rlen;
|
|
do {
|
|
this.split(r, this.tmp);
|
|
r = this.imulK(r);
|
|
r = r.iadd(this.tmp);
|
|
rlen = r.bitLength();
|
|
} while (rlen > this.n);
|
|
var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
|
|
if (cmp === 0) {
|
|
r.words[0] = 0;
|
|
r.length = 1;
|
|
} else if (cmp > 0) {
|
|
r.isub(this.p);
|
|
} else {
|
|
if (r.strip !== undefined) {
|
|
r.strip();
|
|
} else {
|
|
r._strip();
|
|
}
|
|
}
|
|
return r;
|
|
};
|
|
MPrime.prototype.split = function split(input, out) {
|
|
input.iushrn(this.n, 0, out);
|
|
};
|
|
MPrime.prototype.imulK = function imulK(num) {
|
|
return num.imul(this.k);
|
|
};
|
|
function K256() {
|
|
MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
|
|
}
|
|
inherits(K256, MPrime);
|
|
K256.prototype.split = function split(input, output) {
|
|
var mask = 4194303;
|
|
var outLen = Math.min(input.length, 9);
|
|
for (var i = 0;i < outLen; i++) {
|
|
output.words[i] = input.words[i];
|
|
}
|
|
output.length = outLen;
|
|
if (input.length <= 9) {
|
|
input.words[0] = 0;
|
|
input.length = 1;
|
|
return;
|
|
}
|
|
var prev = input.words[9];
|
|
output.words[output.length++] = prev & mask;
|
|
for (i = 10;i < input.length; i++) {
|
|
var next = input.words[i] | 0;
|
|
input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
|
|
prev = next;
|
|
}
|
|
prev >>>= 22;
|
|
input.words[i - 10] = prev;
|
|
if (prev === 0 && input.length > 10) {
|
|
input.length -= 10;
|
|
} else {
|
|
input.length -= 9;
|
|
}
|
|
};
|
|
K256.prototype.imulK = function imulK(num) {
|
|
num.words[num.length] = 0;
|
|
num.words[num.length + 1] = 0;
|
|
num.length += 2;
|
|
var lo = 0;
|
|
for (var i = 0;i < num.length; i++) {
|
|
var w = num.words[i] | 0;
|
|
lo += w * 977;
|
|
num.words[i] = lo & 67108863;
|
|
lo = w * 64 + (lo / 67108864 | 0);
|
|
}
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
}
|
|
}
|
|
return num;
|
|
};
|
|
function P224() {
|
|
MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
|
|
}
|
|
inherits(P224, MPrime);
|
|
function P192() {
|
|
MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
|
|
}
|
|
inherits(P192, MPrime);
|
|
function P25519() {
|
|
MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
|
|
}
|
|
inherits(P25519, MPrime);
|
|
P25519.prototype.imulK = function imulK(num) {
|
|
var carry = 0;
|
|
for (var i = 0;i < num.length; i++) {
|
|
var hi = (num.words[i] | 0) * 19 + carry;
|
|
var lo = hi & 67108863;
|
|
hi >>>= 26;
|
|
num.words[i] = lo;
|
|
carry = hi;
|
|
}
|
|
if (carry !== 0) {
|
|
num.words[num.length++] = carry;
|
|
}
|
|
return num;
|
|
};
|
|
BN._prime = function prime(name) {
|
|
if (primes[name])
|
|
return primes[name];
|
|
var prime;
|
|
if (name === "k256") {
|
|
prime = new K256;
|
|
} else if (name === "p224") {
|
|
prime = new P224;
|
|
} else if (name === "p192") {
|
|
prime = new P192;
|
|
} else if (name === "p25519") {
|
|
prime = new P25519;
|
|
} else {
|
|
throw new Error("Unknown prime " + name);
|
|
}
|
|
primes[name] = prime;
|
|
return prime;
|
|
};
|
|
function Red(m) {
|
|
if (typeof m === "string") {
|
|
var prime = BN._prime(m);
|
|
this.m = prime.p;
|
|
this.prime = prime;
|
|
} else {
|
|
assert(m.gtn(1), "modulus must be greater than 1");
|
|
this.m = m;
|
|
this.prime = null;
|
|
}
|
|
}
|
|
Red.prototype._verify1 = function _verify1(a) {
|
|
assert(a.negative === 0, "red works only with positives");
|
|
assert(a.red, "red works only with red numbers");
|
|
};
|
|
Red.prototype._verify2 = function _verify2(a, b) {
|
|
assert((a.negative | b.negative) === 0, "red works only with positives");
|
|
assert(a.red && a.red === b.red, "red works only with red numbers");
|
|
};
|
|
Red.prototype.imod = function imod(a) {
|
|
if (this.prime)
|
|
return this.prime.ireduce(a)._forceRed(this);
|
|
return a.umod(this.m)._forceRed(this);
|
|
};
|
|
Red.prototype.neg = function neg(a) {
|
|
if (a.isZero()) {
|
|
return a.clone();
|
|
}
|
|
return this.m.sub(a)._forceRed(this);
|
|
};
|
|
Red.prototype.add = function add(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.add(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Red.prototype.iadd = function iadd(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.iadd(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.sub = function sub(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.sub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Red.prototype.isub = function isub(a, b) {
|
|
this._verify2(a, b);
|
|
var res = a.isub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.shl = function shl(a, num) {
|
|
this._verify1(a);
|
|
return this.imod(a.ushln(num));
|
|
};
|
|
Red.prototype.imul = function imul(a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.imul(b));
|
|
};
|
|
Red.prototype.mul = function mul(a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.mul(b));
|
|
};
|
|
Red.prototype.isqr = function isqr(a) {
|
|
return this.imul(a, a.clone());
|
|
};
|
|
Red.prototype.sqr = function sqr(a) {
|
|
return this.mul(a, a);
|
|
};
|
|
Red.prototype.sqrt = function sqrt(a) {
|
|
if (a.isZero())
|
|
return a.clone();
|
|
var mod3 = this.m.andln(3);
|
|
assert(mod3 % 2 === 1);
|
|
if (mod3 === 3) {
|
|
var pow = this.m.add(new BN(1)).iushrn(2);
|
|
return this.pow(a, pow);
|
|
}
|
|
var q = this.m.subn(1);
|
|
var s = 0;
|
|
while (!q.isZero() && q.andln(1) === 0) {
|
|
s++;
|
|
q.iushrn(1);
|
|
}
|
|
assert(!q.isZero());
|
|
var one = new BN(1).toRed(this);
|
|
var nOne = one.redNeg();
|
|
var lpow = this.m.subn(1).iushrn(1);
|
|
var z = this.m.bitLength();
|
|
z = new BN(2 * z * z).toRed(this);
|
|
while (this.pow(z, lpow).cmp(nOne) !== 0) {
|
|
z.redIAdd(nOne);
|
|
}
|
|
var c = this.pow(z, q);
|
|
var r = this.pow(a, q.addn(1).iushrn(1));
|
|
var t = this.pow(a, q);
|
|
var m = s;
|
|
while (t.cmp(one) !== 0) {
|
|
var tmp = t;
|
|
for (var i = 0;tmp.cmp(one) !== 0; i++) {
|
|
tmp = tmp.redSqr();
|
|
}
|
|
assert(i < m);
|
|
var b = this.pow(c, new BN(1).iushln(m - i - 1));
|
|
r = r.redMul(b);
|
|
c = b.redSqr();
|
|
t = t.redMul(c);
|
|
m = i;
|
|
}
|
|
return r;
|
|
};
|
|
Red.prototype.invm = function invm(a) {
|
|
var inv = a._invmp(this.m);
|
|
if (inv.negative !== 0) {
|
|
inv.negative = 0;
|
|
return this.imod(inv).redNeg();
|
|
} else {
|
|
return this.imod(inv);
|
|
}
|
|
};
|
|
Red.prototype.pow = function pow(a, num) {
|
|
if (num.isZero())
|
|
return new BN(1).toRed(this);
|
|
if (num.cmpn(1) === 0)
|
|
return a.clone();
|
|
var windowSize = 4;
|
|
var wnd = new Array(1 << windowSize);
|
|
wnd[0] = new BN(1).toRed(this);
|
|
wnd[1] = a;
|
|
for (var i = 2;i < wnd.length; i++) {
|
|
wnd[i] = this.mul(wnd[i - 1], a);
|
|
}
|
|
var res = wnd[0];
|
|
var current = 0;
|
|
var currentLen = 0;
|
|
var start = num.bitLength() % 26;
|
|
if (start === 0) {
|
|
start = 26;
|
|
}
|
|
for (i = num.length - 1;i >= 0; i--) {
|
|
var word = num.words[i];
|
|
for (var j = start - 1;j >= 0; j--) {
|
|
var bit = word >> j & 1;
|
|
if (res !== wnd[0]) {
|
|
res = this.sqr(res);
|
|
}
|
|
if (bit === 0 && current === 0) {
|
|
currentLen = 0;
|
|
continue;
|
|
}
|
|
current <<= 1;
|
|
current |= bit;
|
|
currentLen++;
|
|
if (currentLen !== windowSize && (i !== 0 || j !== 0))
|
|
continue;
|
|
res = this.mul(res, wnd[current]);
|
|
currentLen = 0;
|
|
current = 0;
|
|
}
|
|
start = 26;
|
|
}
|
|
return res;
|
|
};
|
|
Red.prototype.convertTo = function convertTo(num) {
|
|
var r = num.umod(this.m);
|
|
return r === num ? r.clone() : r;
|
|
};
|
|
Red.prototype.convertFrom = function convertFrom(num) {
|
|
var res = num.clone();
|
|
res.red = null;
|
|
return res;
|
|
};
|
|
BN.mont = function mont(num) {
|
|
return new Mont(num);
|
|
};
|
|
function Mont(m) {
|
|
Red.call(this, m);
|
|
this.shift = this.m.bitLength();
|
|
if (this.shift % 26 !== 0) {
|
|
this.shift += 26 - this.shift % 26;
|
|
}
|
|
this.r = new BN(1).iushln(this.shift);
|
|
this.r2 = this.imod(this.r.sqr());
|
|
this.rinv = this.r._invmp(this.m);
|
|
this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
|
|
this.minv = this.minv.umod(this.r);
|
|
this.minv = this.r.sub(this.minv);
|
|
}
|
|
inherits(Mont, Red);
|
|
Mont.prototype.convertTo = function convertTo(num) {
|
|
return this.imod(num.ushln(this.shift));
|
|
};
|
|
Mont.prototype.convertFrom = function convertFrom(num) {
|
|
var r = this.imod(num.mul(this.rinv));
|
|
r.red = null;
|
|
return r;
|
|
};
|
|
Mont.prototype.imul = function imul(a, b) {
|
|
if (a.isZero() || b.isZero()) {
|
|
a.words[0] = 0;
|
|
a.length = 1;
|
|
return a;
|
|
}
|
|
var t = a.imul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Mont.prototype.mul = function mul(a, b) {
|
|
if (a.isZero() || b.isZero())
|
|
return new BN(0)._forceRed(this);
|
|
var t = a.mul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
Mont.prototype.invm = function invm(a) {
|
|
var res = this.imod(a._invmp(this.m).mul(this.r2));
|
|
return res._forceRed(this);
|
|
};
|
|
})(typeof module === "undefined" || module, exports);
|
|
});
|
|
|
|
// ../eve/node_modules/inherits/inherits_browser.js
|
|
var require_inherits_browser = __commonJS((exports, module) => {
|
|
if (typeof Object.create === "function") {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor;
|
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|
constructor: {
|
|
value: ctor,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
}
|
|
};
|
|
} else {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
if (superCtor) {
|
|
ctor.super_ = superCtor;
|
|
var TempCtor = function() {};
|
|
TempCtor.prototype = superCtor.prototype;
|
|
ctor.prototype = new TempCtor;
|
|
ctor.prototype.constructor = ctor;
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/inherits/inherits.js
|
|
var require_inherits = __commonJS((exports, module) => {
|
|
try {
|
|
util = __require("util");
|
|
if (typeof util.inherits !== "function")
|
|
throw "";
|
|
module.exports = util.inherits;
|
|
} catch (e) {
|
|
module.exports = require_inherits_browser();
|
|
}
|
|
var util;
|
|
});
|
|
|
|
// ../eve/node_modules/safer-buffer/safer.js
|
|
var require_safer = __commonJS((exports, module) => {
|
|
var buffer = __require("buffer");
|
|
var Buffer2 = buffer.Buffer;
|
|
var safer = {};
|
|
var key;
|
|
for (key in buffer) {
|
|
if (!buffer.hasOwnProperty(key))
|
|
continue;
|
|
if (key === "SlowBuffer" || key === "Buffer")
|
|
continue;
|
|
safer[key] = buffer[key];
|
|
}
|
|
var Safer = safer.Buffer = {};
|
|
for (key in Buffer2) {
|
|
if (!Buffer2.hasOwnProperty(key))
|
|
continue;
|
|
if (key === "allocUnsafe" || key === "allocUnsafeSlow")
|
|
continue;
|
|
Safer[key] = Buffer2[key];
|
|
}
|
|
safer.Buffer.prototype = Buffer2.prototype;
|
|
if (!Safer.from || Safer.from === Uint8Array.from) {
|
|
Safer.from = function(value, encodingOrOffset, length) {
|
|
if (typeof value === "number") {
|
|
throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
|
|
}
|
|
if (value && typeof value.length === "undefined") {
|
|
throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
|
|
}
|
|
return Buffer2(value, encodingOrOffset, length);
|
|
};
|
|
}
|
|
if (!Safer.alloc) {
|
|
Safer.alloc = function(size, fill, encoding) {
|
|
if (typeof size !== "number") {
|
|
throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
|
|
}
|
|
if (size < 0 || size >= 2 * (1 << 30)) {
|
|
throw new RangeError('The value "' + size + '" is invalid for option "size"');
|
|
}
|
|
var buf = Buffer2(size);
|
|
if (!fill || fill.length === 0) {
|
|
buf.fill(0);
|
|
} else if (typeof encoding === "string") {
|
|
buf.fill(fill, encoding);
|
|
} else {
|
|
buf.fill(fill);
|
|
}
|
|
return buf;
|
|
};
|
|
}
|
|
if (!safer.kStringMaxLength) {
|
|
try {
|
|
safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
|
|
} catch (e) {}
|
|
}
|
|
if (!safer.constants) {
|
|
safer.constants = {
|
|
MAX_LENGTH: safer.kMaxLength
|
|
};
|
|
if (safer.kStringMaxLength) {
|
|
safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
|
|
}
|
|
}
|
|
module.exports = safer;
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
|
|
var require_reporter = __commonJS((exports) => {
|
|
var inherits = require_inherits();
|
|
function Reporter(options2) {
|
|
this._reporterState = {
|
|
obj: null,
|
|
path: [],
|
|
options: options2 || {},
|
|
errors: []
|
|
};
|
|
}
|
|
exports.Reporter = Reporter;
|
|
Reporter.prototype.isError = function isError(obj) {
|
|
return obj instanceof ReporterError;
|
|
};
|
|
Reporter.prototype.save = function save() {
|
|
const state = this._reporterState;
|
|
return { obj: state.obj, pathLen: state.path.length };
|
|
};
|
|
Reporter.prototype.restore = function restore(data) {
|
|
const state = this._reporterState;
|
|
state.obj = data.obj;
|
|
state.path = state.path.slice(0, data.pathLen);
|
|
};
|
|
Reporter.prototype.enterKey = function enterKey(key) {
|
|
return this._reporterState.path.push(key);
|
|
};
|
|
Reporter.prototype.exitKey = function exitKey(index2) {
|
|
const state = this._reporterState;
|
|
state.path = state.path.slice(0, index2 - 1);
|
|
};
|
|
Reporter.prototype.leaveKey = function leaveKey(index2, key, value) {
|
|
const state = this._reporterState;
|
|
this.exitKey(index2);
|
|
if (state.obj !== null)
|
|
state.obj[key] = value;
|
|
};
|
|
Reporter.prototype.path = function path() {
|
|
return this._reporterState.path.join("/");
|
|
};
|
|
Reporter.prototype.enterObject = function enterObject() {
|
|
const state = this._reporterState;
|
|
const prev = state.obj;
|
|
state.obj = {};
|
|
return prev;
|
|
};
|
|
Reporter.prototype.leaveObject = function leaveObject(prev) {
|
|
const state = this._reporterState;
|
|
const now = state.obj;
|
|
state.obj = prev;
|
|
return now;
|
|
};
|
|
Reporter.prototype.error = function error(msg) {
|
|
let err;
|
|
const state = this._reporterState;
|
|
const inherited = msg instanceof ReporterError;
|
|
if (inherited) {
|
|
err = msg;
|
|
} else {
|
|
err = new ReporterError(state.path.map(function(elem) {
|
|
return "[" + JSON.stringify(elem) + "]";
|
|
}).join(""), msg.message || msg, msg.stack);
|
|
}
|
|
if (!state.options.partial)
|
|
throw err;
|
|
if (!inherited)
|
|
state.errors.push(err);
|
|
return err;
|
|
};
|
|
Reporter.prototype.wrapResult = function wrapResult(result) {
|
|
const state = this._reporterState;
|
|
if (!state.options.partial)
|
|
return result;
|
|
return {
|
|
result: this.isError(result) ? null : result,
|
|
errors: state.errors
|
|
};
|
|
};
|
|
function ReporterError(path, msg) {
|
|
this.path = path;
|
|
this.rethrow(msg);
|
|
}
|
|
inherits(ReporterError, Error);
|
|
ReporterError.prototype.rethrow = function rethrow(msg) {
|
|
this.message = msg + " at: " + (this.path || "(shallow)");
|
|
if (Error.captureStackTrace)
|
|
Error.captureStackTrace(this, ReporterError);
|
|
if (!this.stack) {
|
|
try {
|
|
throw new Error(this.message);
|
|
} catch (e) {
|
|
this.stack = e.stack;
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
|
|
var require_buffer = __commonJS((exports) => {
|
|
var inherits = require_inherits();
|
|
var Reporter = require_reporter().Reporter;
|
|
var Buffer2 = require_safer().Buffer;
|
|
function DecoderBuffer(base, options2) {
|
|
Reporter.call(this, options2);
|
|
if (!Buffer2.isBuffer(base)) {
|
|
this.error("Input not Buffer");
|
|
return;
|
|
}
|
|
this.base = base;
|
|
this.offset = 0;
|
|
this.length = base.length;
|
|
}
|
|
inherits(DecoderBuffer, Reporter);
|
|
exports.DecoderBuffer = DecoderBuffer;
|
|
DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
|
|
if (data instanceof DecoderBuffer) {
|
|
return true;
|
|
}
|
|
const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
|
|
return isCompatible;
|
|
};
|
|
DecoderBuffer.prototype.save = function save() {
|
|
return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
|
|
};
|
|
DecoderBuffer.prototype.restore = function restore(save) {
|
|
const res = new DecoderBuffer(this.base);
|
|
res.offset = save.offset;
|
|
res.length = this.offset;
|
|
this.offset = save.offset;
|
|
Reporter.prototype.restore.call(this, save.reporter);
|
|
return res;
|
|
};
|
|
DecoderBuffer.prototype.isEmpty = function isEmpty() {
|
|
return this.offset === this.length;
|
|
};
|
|
DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
|
|
if (this.offset + 1 <= this.length)
|
|
return this.base.readUInt8(this.offset++, true);
|
|
else
|
|
return this.error(fail || "DecoderBuffer overrun");
|
|
};
|
|
DecoderBuffer.prototype.skip = function skip(bytes, fail) {
|
|
if (!(this.offset + bytes <= this.length))
|
|
return this.error(fail || "DecoderBuffer overrun");
|
|
const res = new DecoderBuffer(this.base);
|
|
res._reporterState = this._reporterState;
|
|
res.offset = this.offset;
|
|
res.length = this.offset + bytes;
|
|
this.offset += bytes;
|
|
return res;
|
|
};
|
|
DecoderBuffer.prototype.raw = function raw(save) {
|
|
return this.base.slice(save ? save.offset : this.offset, this.length);
|
|
};
|
|
function EncoderBuffer(value, reporter) {
|
|
if (Array.isArray(value)) {
|
|
this.length = 0;
|
|
this.value = value.map(function(item) {
|
|
if (!EncoderBuffer.isEncoderBuffer(item))
|
|
item = new EncoderBuffer(item, reporter);
|
|
this.length += item.length;
|
|
return item;
|
|
}, this);
|
|
} else if (typeof value === "number") {
|
|
if (!(0 <= value && value <= 255))
|
|
return reporter.error("non-byte EncoderBuffer value");
|
|
this.value = value;
|
|
this.length = 1;
|
|
} else if (typeof value === "string") {
|
|
this.value = value;
|
|
this.length = Buffer2.byteLength(value);
|
|
} else if (Buffer2.isBuffer(value)) {
|
|
this.value = value;
|
|
this.length = value.length;
|
|
} else {
|
|
return reporter.error("Unsupported type: " + typeof value);
|
|
}
|
|
}
|
|
exports.EncoderBuffer = EncoderBuffer;
|
|
EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
|
|
if (data instanceof EncoderBuffer) {
|
|
return true;
|
|
}
|
|
const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
|
|
return isCompatible;
|
|
};
|
|
EncoderBuffer.prototype.join = function join(out, offset) {
|
|
if (!out)
|
|
out = Buffer2.alloc(this.length);
|
|
if (!offset)
|
|
offset = 0;
|
|
if (this.length === 0)
|
|
return out;
|
|
if (Array.isArray(this.value)) {
|
|
this.value.forEach(function(item) {
|
|
item.join(out, offset);
|
|
offset += item.length;
|
|
});
|
|
} else {
|
|
if (typeof this.value === "number")
|
|
out[offset] = this.value;
|
|
else if (typeof this.value === "string")
|
|
out.write(this.value, offset);
|
|
else if (Buffer2.isBuffer(this.value))
|
|
this.value.copy(out, offset);
|
|
offset += this.length;
|
|
}
|
|
return out;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/minimalistic-assert/index.js
|
|
var require_minimalistic_assert = __commonJS((exports, module) => {
|
|
module.exports = assert;
|
|
function assert(val, msg) {
|
|
if (!val)
|
|
throw new Error(msg || "Assertion failed");
|
|
}
|
|
assert.equal = function assertEqual(l, r, msg) {
|
|
if (l != r)
|
|
throw new Error(msg || "Assertion failed: " + l + " != " + r);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
|
|
var require_node = __commonJS((exports, module) => {
|
|
var Reporter = require_reporter().Reporter;
|
|
var EncoderBuffer = require_buffer().EncoderBuffer;
|
|
var DecoderBuffer = require_buffer().DecoderBuffer;
|
|
var assert = require_minimalistic_assert();
|
|
var tags = [
|
|
"seq",
|
|
"seqof",
|
|
"set",
|
|
"setof",
|
|
"objid",
|
|
"bool",
|
|
"gentime",
|
|
"utctime",
|
|
"null_",
|
|
"enum",
|
|
"int",
|
|
"objDesc",
|
|
"bitstr",
|
|
"bmpstr",
|
|
"charstr",
|
|
"genstr",
|
|
"graphstr",
|
|
"ia5str",
|
|
"iso646str",
|
|
"numstr",
|
|
"octstr",
|
|
"printstr",
|
|
"t61str",
|
|
"unistr",
|
|
"utf8str",
|
|
"videostr"
|
|
];
|
|
var methods = [
|
|
"key",
|
|
"obj",
|
|
"use",
|
|
"optional",
|
|
"explicit",
|
|
"implicit",
|
|
"def",
|
|
"choice",
|
|
"any",
|
|
"contains"
|
|
].concat(tags);
|
|
var overrided = [
|
|
"_peekTag",
|
|
"_decodeTag",
|
|
"_use",
|
|
"_decodeStr",
|
|
"_decodeObjid",
|
|
"_decodeTime",
|
|
"_decodeNull",
|
|
"_decodeInt",
|
|
"_decodeBool",
|
|
"_decodeList",
|
|
"_encodeComposite",
|
|
"_encodeStr",
|
|
"_encodeObjid",
|
|
"_encodeTime",
|
|
"_encodeNull",
|
|
"_encodeInt",
|
|
"_encodeBool"
|
|
];
|
|
function Node(enc, parent, name) {
|
|
const state = {};
|
|
this._baseState = state;
|
|
state.name = name;
|
|
state.enc = enc;
|
|
state.parent = parent || null;
|
|
state.children = null;
|
|
state.tag = null;
|
|
state.args = null;
|
|
state.reverseArgs = null;
|
|
state.choice = null;
|
|
state.optional = false;
|
|
state.any = false;
|
|
state.obj = false;
|
|
state.use = null;
|
|
state.useDecoder = null;
|
|
state.key = null;
|
|
state["default"] = null;
|
|
state.explicit = null;
|
|
state.implicit = null;
|
|
state.contains = null;
|
|
if (!state.parent) {
|
|
state.children = [];
|
|
this._wrap();
|
|
}
|
|
}
|
|
module.exports = Node;
|
|
var stateProps = [
|
|
"enc",
|
|
"parent",
|
|
"children",
|
|
"tag",
|
|
"args",
|
|
"reverseArgs",
|
|
"choice",
|
|
"optional",
|
|
"any",
|
|
"obj",
|
|
"use",
|
|
"alteredUse",
|
|
"key",
|
|
"default",
|
|
"explicit",
|
|
"implicit",
|
|
"contains"
|
|
];
|
|
Node.prototype.clone = function clone() {
|
|
const state = this._baseState;
|
|
const cstate = {};
|
|
stateProps.forEach(function(prop) {
|
|
cstate[prop] = state[prop];
|
|
});
|
|
const res = new this.constructor(cstate.parent);
|
|
res._baseState = cstate;
|
|
return res;
|
|
};
|
|
Node.prototype._wrap = function wrap() {
|
|
const state = this._baseState;
|
|
methods.forEach(function(method) {
|
|
this[method] = function _wrappedMethod() {
|
|
const clone = new this.constructor(this);
|
|
state.children.push(clone);
|
|
return clone[method].apply(clone, arguments);
|
|
};
|
|
}, this);
|
|
};
|
|
Node.prototype._init = function init(body) {
|
|
const state = this._baseState;
|
|
assert(state.parent === null);
|
|
body.call(this);
|
|
state.children = state.children.filter(function(child) {
|
|
return child._baseState.parent === this;
|
|
}, this);
|
|
assert.equal(state.children.length, 1, "Root node can have only one child");
|
|
};
|
|
Node.prototype._useArgs = function useArgs(args) {
|
|
const state = this._baseState;
|
|
const children = args.filter(function(arg) {
|
|
return arg instanceof this.constructor;
|
|
}, this);
|
|
args = args.filter(function(arg) {
|
|
return !(arg instanceof this.constructor);
|
|
}, this);
|
|
if (children.length !== 0) {
|
|
assert(state.children === null);
|
|
state.children = children;
|
|
children.forEach(function(child) {
|
|
child._baseState.parent = this;
|
|
}, this);
|
|
}
|
|
if (args.length !== 0) {
|
|
assert(state.args === null);
|
|
state.args = args;
|
|
state.reverseArgs = args.map(function(arg) {
|
|
if (typeof arg !== "object" || arg.constructor !== Object)
|
|
return arg;
|
|
const res = {};
|
|
Object.keys(arg).forEach(function(key) {
|
|
if (key == (key | 0))
|
|
key |= 0;
|
|
const value = arg[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
});
|
|
}
|
|
};
|
|
overrided.forEach(function(method) {
|
|
Node.prototype[method] = function _overrided() {
|
|
const state = this._baseState;
|
|
throw new Error(method + " not implemented for encoding: " + state.enc);
|
|
};
|
|
});
|
|
tags.forEach(function(tag) {
|
|
Node.prototype[tag] = function _tagMethod() {
|
|
const state = this._baseState;
|
|
const args = Array.prototype.slice.call(arguments);
|
|
assert(state.tag === null);
|
|
state.tag = tag;
|
|
this._useArgs(args);
|
|
return this;
|
|
};
|
|
});
|
|
Node.prototype.use = function use(item) {
|
|
assert(item);
|
|
const state = this._baseState;
|
|
assert(state.use === null);
|
|
state.use = item;
|
|
return this;
|
|
};
|
|
Node.prototype.optional = function optional() {
|
|
const state = this._baseState;
|
|
state.optional = true;
|
|
return this;
|
|
};
|
|
Node.prototype.def = function def(val) {
|
|
const state = this._baseState;
|
|
assert(state["default"] === null);
|
|
state["default"] = val;
|
|
state.optional = true;
|
|
return this;
|
|
};
|
|
Node.prototype.explicit = function explicit(num) {
|
|
const state = this._baseState;
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.explicit = num;
|
|
return this;
|
|
};
|
|
Node.prototype.implicit = function implicit(num) {
|
|
const state = this._baseState;
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.implicit = num;
|
|
return this;
|
|
};
|
|
Node.prototype.obj = function obj() {
|
|
const state = this._baseState;
|
|
const args = Array.prototype.slice.call(arguments);
|
|
state.obj = true;
|
|
if (args.length !== 0)
|
|
this._useArgs(args);
|
|
return this;
|
|
};
|
|
Node.prototype.key = function key(newKey) {
|
|
const state = this._baseState;
|
|
assert(state.key === null);
|
|
state.key = newKey;
|
|
return this;
|
|
};
|
|
Node.prototype.any = function any() {
|
|
const state = this._baseState;
|
|
state.any = true;
|
|
return this;
|
|
};
|
|
Node.prototype.choice = function choice(obj) {
|
|
const state = this._baseState;
|
|
assert(state.choice === null);
|
|
state.choice = obj;
|
|
this._useArgs(Object.keys(obj).map(function(key) {
|
|
return obj[key];
|
|
}));
|
|
return this;
|
|
};
|
|
Node.prototype.contains = function contains(item) {
|
|
const state = this._baseState;
|
|
assert(state.use === null);
|
|
state.contains = item;
|
|
return this;
|
|
};
|
|
Node.prototype._decode = function decode(input, options2) {
|
|
const state = this._baseState;
|
|
if (state.parent === null)
|
|
return input.wrapResult(state.children[0]._decode(input, options2));
|
|
let result = state["default"];
|
|
let present = true;
|
|
let prevKey = null;
|
|
if (state.key !== null)
|
|
prevKey = input.enterKey(state.key);
|
|
if (state.optional) {
|
|
let tag = null;
|
|
if (state.explicit !== null)
|
|
tag = state.explicit;
|
|
else if (state.implicit !== null)
|
|
tag = state.implicit;
|
|
else if (state.tag !== null)
|
|
tag = state.tag;
|
|
if (tag === null && !state.any) {
|
|
const save = input.save();
|
|
try {
|
|
if (state.choice === null)
|
|
this._decodeGeneric(state.tag, input, options2);
|
|
else
|
|
this._decodeChoice(input, options2);
|
|
present = true;
|
|
} catch (e) {
|
|
present = false;
|
|
}
|
|
input.restore(save);
|
|
} else {
|
|
present = this._peekTag(input, tag, state.any);
|
|
if (input.isError(present))
|
|
return present;
|
|
}
|
|
}
|
|
let prevObj;
|
|
if (state.obj && present)
|
|
prevObj = input.enterObject();
|
|
if (present) {
|
|
if (state.explicit !== null) {
|
|
const explicit = this._decodeTag(input, state.explicit);
|
|
if (input.isError(explicit))
|
|
return explicit;
|
|
input = explicit;
|
|
}
|
|
const start = input.offset;
|
|
if (state.use === null && state.choice === null) {
|
|
let save;
|
|
if (state.any)
|
|
save = input.save();
|
|
const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
|
|
if (input.isError(body))
|
|
return body;
|
|
if (state.any)
|
|
result = input.raw(save);
|
|
else
|
|
input = body;
|
|
}
|
|
if (options2 && options2.track && state.tag !== null)
|
|
options2.track(input.path(), start, input.length, "tagged");
|
|
if (options2 && options2.track && state.tag !== null)
|
|
options2.track(input.path(), input.offset, input.length, "content");
|
|
if (state.any) {} else if (state.choice === null) {
|
|
result = this._decodeGeneric(state.tag, input, options2);
|
|
} else {
|
|
result = this._decodeChoice(input, options2);
|
|
}
|
|
if (input.isError(result))
|
|
return result;
|
|
if (!state.any && state.choice === null && state.children !== null) {
|
|
state.children.forEach(function decodeChildren(child) {
|
|
child._decode(input, options2);
|
|
});
|
|
}
|
|
if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
|
|
const data = new DecoderBuffer(result);
|
|
result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
|
|
}
|
|
}
|
|
if (state.obj && present)
|
|
result = input.leaveObject(prevObj);
|
|
if (state.key !== null && (result !== null || present === true))
|
|
input.leaveKey(prevKey, state.key, result);
|
|
else if (prevKey !== null)
|
|
input.exitKey(prevKey);
|
|
return result;
|
|
};
|
|
Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
|
|
const state = this._baseState;
|
|
if (tag === "seq" || tag === "set")
|
|
return null;
|
|
if (tag === "seqof" || tag === "setof")
|
|
return this._decodeList(input, tag, state.args[0], options2);
|
|
else if (/str$/.test(tag))
|
|
return this._decodeStr(input, tag, options2);
|
|
else if (tag === "objid" && state.args)
|
|
return this._decodeObjid(input, state.args[0], state.args[1], options2);
|
|
else if (tag === "objid")
|
|
return this._decodeObjid(input, null, null, options2);
|
|
else if (tag === "gentime" || tag === "utctime")
|
|
return this._decodeTime(input, tag, options2);
|
|
else if (tag === "null_")
|
|
return this._decodeNull(input, options2);
|
|
else if (tag === "bool")
|
|
return this._decodeBool(input, options2);
|
|
else if (tag === "objDesc")
|
|
return this._decodeStr(input, tag, options2);
|
|
else if (tag === "int" || tag === "enum")
|
|
return this._decodeInt(input, state.args && state.args[0], options2);
|
|
if (state.use !== null) {
|
|
return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
|
|
} else {
|
|
return input.error("unknown tag: " + tag);
|
|
}
|
|
};
|
|
Node.prototype._getUse = function _getUse(entity, obj) {
|
|
const state = this._baseState;
|
|
state.useDecoder = this._use(entity, obj);
|
|
assert(state.useDecoder._baseState.parent === null);
|
|
state.useDecoder = state.useDecoder._baseState.children[0];
|
|
if (state.implicit !== state.useDecoder._baseState.implicit) {
|
|
state.useDecoder = state.useDecoder.clone();
|
|
state.useDecoder._baseState.implicit = state.implicit;
|
|
}
|
|
return state.useDecoder;
|
|
};
|
|
Node.prototype._decodeChoice = function decodeChoice(input, options2) {
|
|
const state = this._baseState;
|
|
let result = null;
|
|
let match = false;
|
|
Object.keys(state.choice).some(function(key) {
|
|
const save = input.save();
|
|
const node = state.choice[key];
|
|
try {
|
|
const value = node._decode(input, options2);
|
|
if (input.isError(value))
|
|
return false;
|
|
result = { type: key, value };
|
|
match = true;
|
|
} catch (e) {
|
|
input.restore(save);
|
|
return false;
|
|
}
|
|
return true;
|
|
}, this);
|
|
if (!match)
|
|
return input.error("Choice not matched");
|
|
return result;
|
|
};
|
|
Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
|
|
return new EncoderBuffer(data, this.reporter);
|
|
};
|
|
Node.prototype._encode = function encode(data, reporter, parent) {
|
|
const state = this._baseState;
|
|
if (state["default"] !== null && state["default"] === data)
|
|
return;
|
|
const result = this._encodeValue(data, reporter, parent);
|
|
if (result === undefined)
|
|
return;
|
|
if (this._skipDefault(result, reporter, parent))
|
|
return;
|
|
return result;
|
|
};
|
|
Node.prototype._encodeValue = function encode(data, reporter, parent) {
|
|
const state = this._baseState;
|
|
if (state.parent === null)
|
|
return state.children[0]._encode(data, reporter || new Reporter);
|
|
let result = null;
|
|
this.reporter = reporter;
|
|
if (state.optional && data === undefined) {
|
|
if (state["default"] !== null)
|
|
data = state["default"];
|
|
else
|
|
return;
|
|
}
|
|
let content = null;
|
|
let primitive = false;
|
|
if (state.any) {
|
|
result = this._createEncoderBuffer(data);
|
|
} else if (state.choice) {
|
|
result = this._encodeChoice(data, reporter);
|
|
} else if (state.contains) {
|
|
content = this._getUse(state.contains, parent)._encode(data, reporter);
|
|
primitive = true;
|
|
} else if (state.children) {
|
|
content = state.children.map(function(child) {
|
|
if (child._baseState.tag === "null_")
|
|
return child._encode(null, reporter, data);
|
|
if (child._baseState.key === null)
|
|
return reporter.error("Child should have a key");
|
|
const prevKey = reporter.enterKey(child._baseState.key);
|
|
if (typeof data !== "object")
|
|
return reporter.error("Child expected, but input is not object");
|
|
const res = child._encode(data[child._baseState.key], reporter, data);
|
|
reporter.leaveKey(prevKey);
|
|
return res;
|
|
}, this).filter(function(child) {
|
|
return child;
|
|
});
|
|
content = this._createEncoderBuffer(content);
|
|
} else {
|
|
if (state.tag === "seqof" || state.tag === "setof") {
|
|
if (!(state.args && state.args.length === 1))
|
|
return reporter.error("Too many args for : " + state.tag);
|
|
if (!Array.isArray(data))
|
|
return reporter.error("seqof/setof, but data is not Array");
|
|
const child = this.clone();
|
|
child._baseState.implicit = null;
|
|
content = this._createEncoderBuffer(data.map(function(item) {
|
|
const state2 = this._baseState;
|
|
return this._getUse(state2.args[0], data)._encode(item, reporter);
|
|
}, child));
|
|
} else if (state.use !== null) {
|
|
result = this._getUse(state.use, parent)._encode(data, reporter);
|
|
} else {
|
|
content = this._encodePrimitive(state.tag, data);
|
|
primitive = true;
|
|
}
|
|
}
|
|
if (!state.any && state.choice === null) {
|
|
const tag = state.implicit !== null ? state.implicit : state.tag;
|
|
const cls = state.implicit === null ? "universal" : "context";
|
|
if (tag === null) {
|
|
if (state.use === null)
|
|
reporter.error("Tag could be omitted only for .use()");
|
|
} else {
|
|
if (state.use === null)
|
|
result = this._encodeComposite(tag, primitive, cls, content);
|
|
}
|
|
}
|
|
if (state.explicit !== null)
|
|
result = this._encodeComposite(state.explicit, false, "context", result);
|
|
return result;
|
|
};
|
|
Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
|
|
const state = this._baseState;
|
|
const node = state.choice[data.type];
|
|
if (!node) {
|
|
assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
|
|
}
|
|
return node._encode(data.value, reporter);
|
|
};
|
|
Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
|
|
const state = this._baseState;
|
|
if (/str$/.test(tag))
|
|
return this._encodeStr(data, tag);
|
|
else if (tag === "objid" && state.args)
|
|
return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
|
|
else if (tag === "objid")
|
|
return this._encodeObjid(data, null, null);
|
|
else if (tag === "gentime" || tag === "utctime")
|
|
return this._encodeTime(data, tag);
|
|
else if (tag === "null_")
|
|
return this._encodeNull();
|
|
else if (tag === "int" || tag === "enum")
|
|
return this._encodeInt(data, state.args && state.reverseArgs[0]);
|
|
else if (tag === "bool")
|
|
return this._encodeBool(data);
|
|
else if (tag === "objDesc")
|
|
return this._encodeStr(data, tag);
|
|
else
|
|
throw new Error("Unsupported tag: " + tag);
|
|
};
|
|
Node.prototype._isNumstr = function isNumstr(str) {
|
|
return /^[0-9 ]*$/.test(str);
|
|
};
|
|
Node.prototype._isPrintstr = function isPrintstr(str) {
|
|
return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
|
|
var require_der = __commonJS((exports) => {
|
|
function reverse(map) {
|
|
const res = {};
|
|
Object.keys(map).forEach(function(key) {
|
|
if ((key | 0) == key)
|
|
key = key | 0;
|
|
const value = map[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
}
|
|
exports.tagClass = {
|
|
0: "universal",
|
|
1: "application",
|
|
2: "context",
|
|
3: "private"
|
|
};
|
|
exports.tagClassByName = reverse(exports.tagClass);
|
|
exports.tag = {
|
|
0: "end",
|
|
1: "bool",
|
|
2: "int",
|
|
3: "bitstr",
|
|
4: "octstr",
|
|
5: "null_",
|
|
6: "objid",
|
|
7: "objDesc",
|
|
8: "external",
|
|
9: "real",
|
|
10: "enum",
|
|
11: "embed",
|
|
12: "utf8str",
|
|
13: "relativeOid",
|
|
16: "seq",
|
|
17: "set",
|
|
18: "numstr",
|
|
19: "printstr",
|
|
20: "t61str",
|
|
21: "videostr",
|
|
22: "ia5str",
|
|
23: "utctime",
|
|
24: "gentime",
|
|
25: "graphstr",
|
|
26: "iso646str",
|
|
27: "genstr",
|
|
28: "unistr",
|
|
29: "charstr",
|
|
30: "bmpstr"
|
|
};
|
|
exports.tagByName = reverse(exports.tag);
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
|
|
var require_der2 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var Buffer2 = require_safer().Buffer;
|
|
var Node = require_node();
|
|
var der = require_der();
|
|
function DEREncoder(entity) {
|
|
this.enc = "der";
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
this.tree = new DERNode;
|
|
this.tree._init(entity.body);
|
|
}
|
|
module.exports = DEREncoder;
|
|
DEREncoder.prototype.encode = function encode(data, reporter) {
|
|
return this.tree._encode(data, reporter).join();
|
|
};
|
|
function DERNode(parent) {
|
|
Node.call(this, "der", parent);
|
|
}
|
|
inherits(DERNode, Node);
|
|
DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
|
|
const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
|
|
if (content.length < 128) {
|
|
const header2 = Buffer2.alloc(2);
|
|
header2[0] = encodedTag;
|
|
header2[1] = content.length;
|
|
return this._createEncoderBuffer([header2, content]);
|
|
}
|
|
let lenOctets = 1;
|
|
for (let i = content.length;i >= 256; i >>= 8)
|
|
lenOctets++;
|
|
const header = Buffer2.alloc(1 + 1 + lenOctets);
|
|
header[0] = encodedTag;
|
|
header[1] = 128 | lenOctets;
|
|
for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
|
|
header[i] = j & 255;
|
|
return this._createEncoderBuffer([header, content]);
|
|
};
|
|
DERNode.prototype._encodeStr = function encodeStr(str, tag) {
|
|
if (tag === "bitstr") {
|
|
return this._createEncoderBuffer([str.unused | 0, str.data]);
|
|
} else if (tag === "bmpstr") {
|
|
const buf = Buffer2.alloc(str.length * 2);
|
|
for (let i = 0;i < str.length; i++) {
|
|
buf.writeUInt16BE(str.charCodeAt(i), i * 2);
|
|
}
|
|
return this._createEncoderBuffer(buf);
|
|
} else if (tag === "numstr") {
|
|
if (!this._isNumstr(str)) {
|
|
return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === "printstr") {
|
|
if (!this._isPrintstr(str)) {
|
|
return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (/str$/.test(tag)) {
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === "objDesc") {
|
|
return this._createEncoderBuffer(str);
|
|
} else {
|
|
return this.reporter.error("Encoding of string type: " + tag + " unsupported");
|
|
}
|
|
};
|
|
DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
|
|
if (typeof id === "string") {
|
|
if (!values)
|
|
return this.reporter.error("string objid given, but no values map found");
|
|
if (!values.hasOwnProperty(id))
|
|
return this.reporter.error("objid not found in values map");
|
|
id = values[id].split(/[\s.]+/g);
|
|
for (let i = 0;i < id.length; i++)
|
|
id[i] |= 0;
|
|
} else if (Array.isArray(id)) {
|
|
id = id.slice();
|
|
for (let i = 0;i < id.length; i++)
|
|
id[i] |= 0;
|
|
}
|
|
if (!Array.isArray(id)) {
|
|
return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
|
|
}
|
|
if (!relative) {
|
|
if (id[1] >= 40)
|
|
return this.reporter.error("Second objid identifier OOB");
|
|
id.splice(0, 2, id[0] * 40 + id[1]);
|
|
}
|
|
let size = 0;
|
|
for (let i = 0;i < id.length; i++) {
|
|
let ident = id[i];
|
|
for (size++;ident >= 128; ident >>= 7)
|
|
size++;
|
|
}
|
|
const objid = Buffer2.alloc(size);
|
|
let offset = objid.length - 1;
|
|
for (let i = id.length - 1;i >= 0; i--) {
|
|
let ident = id[i];
|
|
objid[offset--] = ident & 127;
|
|
while ((ident >>= 7) > 0)
|
|
objid[offset--] = 128 | ident & 127;
|
|
}
|
|
return this._createEncoderBuffer(objid);
|
|
};
|
|
function two(num) {
|
|
if (num < 10)
|
|
return "0" + num;
|
|
else
|
|
return num;
|
|
}
|
|
DERNode.prototype._encodeTime = function encodeTime(time, tag) {
|
|
let str;
|
|
const date = new Date(time);
|
|
if (tag === "gentime") {
|
|
str = [
|
|
two(date.getUTCFullYear()),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
"Z"
|
|
].join("");
|
|
} else if (tag === "utctime") {
|
|
str = [
|
|
two(date.getUTCFullYear() % 100),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
"Z"
|
|
].join("");
|
|
} else {
|
|
this.reporter.error("Encoding " + tag + " time is not supported yet");
|
|
}
|
|
return this._encodeStr(str, "octstr");
|
|
};
|
|
DERNode.prototype._encodeNull = function encodeNull() {
|
|
return this._createEncoderBuffer("");
|
|
};
|
|
DERNode.prototype._encodeInt = function encodeInt(num, values) {
|
|
if (typeof num === "string") {
|
|
if (!values)
|
|
return this.reporter.error("String int or enum given, but no values map");
|
|
if (!values.hasOwnProperty(num)) {
|
|
return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
|
|
}
|
|
num = values[num];
|
|
}
|
|
if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
|
|
const numArray = num.toArray();
|
|
if (!num.sign && numArray[0] & 128) {
|
|
numArray.unshift(0);
|
|
}
|
|
num = Buffer2.from(numArray);
|
|
}
|
|
if (Buffer2.isBuffer(num)) {
|
|
let size2 = num.length;
|
|
if (num.length === 0)
|
|
size2++;
|
|
const out2 = Buffer2.alloc(size2);
|
|
num.copy(out2);
|
|
if (num.length === 0)
|
|
out2[0] = 0;
|
|
return this._createEncoderBuffer(out2);
|
|
}
|
|
if (num < 128)
|
|
return this._createEncoderBuffer(num);
|
|
if (num < 256)
|
|
return this._createEncoderBuffer([0, num]);
|
|
let size = 1;
|
|
for (let i = num;i >= 256; i >>= 8)
|
|
size++;
|
|
const out = new Array(size);
|
|
for (let i = out.length - 1;i >= 0; i--) {
|
|
out[i] = num & 255;
|
|
num >>= 8;
|
|
}
|
|
if (out[0] & 128) {
|
|
out.unshift(0);
|
|
}
|
|
return this._createEncoderBuffer(Buffer2.from(out));
|
|
};
|
|
DERNode.prototype._encodeBool = function encodeBool(value) {
|
|
return this._createEncoderBuffer(value ? 255 : 0);
|
|
};
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === "function")
|
|
entity = entity(obj);
|
|
return entity._getEncoder("der").tree;
|
|
};
|
|
DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
|
|
const state = this._baseState;
|
|
let i;
|
|
if (state["default"] === null)
|
|
return false;
|
|
const data = dataBuffer.join();
|
|
if (state.defaultBuffer === undefined)
|
|
state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
|
|
if (data.length !== state.defaultBuffer.length)
|
|
return false;
|
|
for (i = 0;i < data.length; i++)
|
|
if (data[i] !== state.defaultBuffer[i])
|
|
return false;
|
|
return true;
|
|
};
|
|
function encodeTag(tag, primitive, cls, reporter) {
|
|
let res;
|
|
if (tag === "seqof")
|
|
tag = "seq";
|
|
else if (tag === "setof")
|
|
tag = "set";
|
|
if (der.tagByName.hasOwnProperty(tag))
|
|
res = der.tagByName[tag];
|
|
else if (typeof tag === "number" && (tag | 0) === tag)
|
|
res = tag;
|
|
else
|
|
return reporter.error("Unknown tag: " + tag);
|
|
if (res >= 31)
|
|
return reporter.error("Multi-octet tag encoding unsupported");
|
|
if (!primitive)
|
|
res |= 32;
|
|
res |= der.tagClassByName[cls || "universal"] << 6;
|
|
return res;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
|
|
var require_pem = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var DEREncoder = require_der2();
|
|
function PEMEncoder(entity) {
|
|
DEREncoder.call(this, entity);
|
|
this.enc = "pem";
|
|
}
|
|
inherits(PEMEncoder, DEREncoder);
|
|
module.exports = PEMEncoder;
|
|
PEMEncoder.prototype.encode = function encode(data, options2) {
|
|
const buf = DEREncoder.prototype.encode.call(this, data);
|
|
const p = buf.toString("base64");
|
|
const out = ["-----BEGIN " + options2.label + "-----"];
|
|
for (let i = 0;i < p.length; i += 64)
|
|
out.push(p.slice(i, i + 64));
|
|
out.push("-----END " + options2.label + "-----");
|
|
return out.join(`
|
|
`);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
|
|
var require_encoders = __commonJS((exports) => {
|
|
var encoders = exports;
|
|
encoders.der = require_der2();
|
|
encoders.pem = require_pem();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
|
|
var require_der3 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var bignum = require_bn();
|
|
var DecoderBuffer = require_buffer().DecoderBuffer;
|
|
var Node = require_node();
|
|
var der = require_der();
|
|
function DERDecoder(entity) {
|
|
this.enc = "der";
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
this.tree = new DERNode;
|
|
this.tree._init(entity.body);
|
|
}
|
|
module.exports = DERDecoder;
|
|
DERDecoder.prototype.decode = function decode(data, options2) {
|
|
if (!DecoderBuffer.isDecoderBuffer(data)) {
|
|
data = new DecoderBuffer(data, options2);
|
|
}
|
|
return this.tree._decode(data, options2);
|
|
};
|
|
function DERNode(parent) {
|
|
Node.call(this, "der", parent);
|
|
}
|
|
inherits(DERNode, Node);
|
|
DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
|
|
if (buffer.isEmpty())
|
|
return false;
|
|
const state = buffer.save();
|
|
const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
buffer.restore(state);
|
|
return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
|
|
};
|
|
DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
|
|
const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
|
|
if (buffer.isError(len))
|
|
return len;
|
|
if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
|
|
return buffer.error('Failed to match tag: "' + tag + '"');
|
|
}
|
|
if (decodedTag.primitive || len !== null)
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
const state = buffer.save();
|
|
const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
|
|
if (buffer.isError(res))
|
|
return res;
|
|
len = buffer.offset - state.offset;
|
|
buffer.restore(state);
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
};
|
|
DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
|
|
for (;; ) {
|
|
const tag = derDecodeTag(buffer, fail);
|
|
if (buffer.isError(tag))
|
|
return tag;
|
|
const len = derDecodeLen(buffer, tag.primitive, fail);
|
|
if (buffer.isError(len))
|
|
return len;
|
|
let res;
|
|
if (tag.primitive || len !== null)
|
|
res = buffer.skip(len);
|
|
else
|
|
res = this._skipUntilEnd(buffer, fail);
|
|
if (buffer.isError(res))
|
|
return res;
|
|
if (tag.tagStr === "end")
|
|
break;
|
|
}
|
|
};
|
|
DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
|
|
const result = [];
|
|
while (!buffer.isEmpty()) {
|
|
const possibleEnd = this._peekTag(buffer, "end");
|
|
if (buffer.isError(possibleEnd))
|
|
return possibleEnd;
|
|
const res = decoder.decode(buffer, "der", options2);
|
|
if (buffer.isError(res) && possibleEnd)
|
|
break;
|
|
result.push(res);
|
|
}
|
|
return result;
|
|
};
|
|
DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
|
|
if (tag === "bitstr") {
|
|
const unused = buffer.readUInt8();
|
|
if (buffer.isError(unused))
|
|
return unused;
|
|
return { unused, data: buffer.raw() };
|
|
} else if (tag === "bmpstr") {
|
|
const raw = buffer.raw();
|
|
if (raw.length % 2 === 1)
|
|
return buffer.error("Decoding of string type: bmpstr length mismatch");
|
|
let str = "";
|
|
for (let i = 0;i < raw.length / 2; i++) {
|
|
str += String.fromCharCode(raw.readUInt16BE(i * 2));
|
|
}
|
|
return str;
|
|
} else if (tag === "numstr") {
|
|
const numstr = buffer.raw().toString("ascii");
|
|
if (!this._isNumstr(numstr)) {
|
|
return buffer.error("Decoding of string type: " + "numstr unsupported characters");
|
|
}
|
|
return numstr;
|
|
} else if (tag === "octstr") {
|
|
return buffer.raw();
|
|
} else if (tag === "objDesc") {
|
|
return buffer.raw();
|
|
} else if (tag === "printstr") {
|
|
const printstr = buffer.raw().toString("ascii");
|
|
if (!this._isPrintstr(printstr)) {
|
|
return buffer.error("Decoding of string type: " + "printstr unsupported characters");
|
|
}
|
|
return printstr;
|
|
} else if (/str$/.test(tag)) {
|
|
return buffer.raw().toString();
|
|
} else {
|
|
return buffer.error("Decoding of string type: " + tag + " unsupported");
|
|
}
|
|
};
|
|
DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
|
|
let result;
|
|
const identifiers = [];
|
|
let ident = 0;
|
|
let subident = 0;
|
|
while (!buffer.isEmpty()) {
|
|
subident = buffer.readUInt8();
|
|
ident <<= 7;
|
|
ident |= subident & 127;
|
|
if ((subident & 128) === 0) {
|
|
identifiers.push(ident);
|
|
ident = 0;
|
|
}
|
|
}
|
|
if (subident & 128)
|
|
identifiers.push(ident);
|
|
const first = identifiers[0] / 40 | 0;
|
|
const second = identifiers[0] % 40;
|
|
if (relative)
|
|
result = identifiers;
|
|
else
|
|
result = [first, second].concat(identifiers.slice(1));
|
|
if (values) {
|
|
let tmp = values[result.join(" ")];
|
|
if (tmp === undefined)
|
|
tmp = values[result.join(".")];
|
|
if (tmp !== undefined)
|
|
result = tmp;
|
|
}
|
|
return result;
|
|
};
|
|
DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
|
|
const str = buffer.raw().toString();
|
|
let year;
|
|
let mon;
|
|
let day;
|
|
let hour;
|
|
let min;
|
|
let sec;
|
|
if (tag === "gentime") {
|
|
year = str.slice(0, 4) | 0;
|
|
mon = str.slice(4, 6) | 0;
|
|
day = str.slice(6, 8) | 0;
|
|
hour = str.slice(8, 10) | 0;
|
|
min = str.slice(10, 12) | 0;
|
|
sec = str.slice(12, 14) | 0;
|
|
} else if (tag === "utctime") {
|
|
year = str.slice(0, 2) | 0;
|
|
mon = str.slice(2, 4) | 0;
|
|
day = str.slice(4, 6) | 0;
|
|
hour = str.slice(6, 8) | 0;
|
|
min = str.slice(8, 10) | 0;
|
|
sec = str.slice(10, 12) | 0;
|
|
if (year < 70)
|
|
year = 2000 + year;
|
|
else
|
|
year = 1900 + year;
|
|
} else {
|
|
return buffer.error("Decoding " + tag + " time is not supported yet");
|
|
}
|
|
return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
|
|
};
|
|
DERNode.prototype._decodeNull = function decodeNull() {
|
|
return null;
|
|
};
|
|
DERNode.prototype._decodeBool = function decodeBool(buffer) {
|
|
const res = buffer.readUInt8();
|
|
if (buffer.isError(res))
|
|
return res;
|
|
else
|
|
return res !== 0;
|
|
};
|
|
DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
|
|
const raw = buffer.raw();
|
|
let res = new bignum(raw);
|
|
if (values)
|
|
res = values[res.toString(10)] || res;
|
|
return res;
|
|
};
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === "function")
|
|
entity = entity(obj);
|
|
return entity._getDecoder("der").tree;
|
|
};
|
|
function derDecodeTag(buf, fail) {
|
|
let tag = buf.readUInt8(fail);
|
|
if (buf.isError(tag))
|
|
return tag;
|
|
const cls = der.tagClass[tag >> 6];
|
|
const primitive = (tag & 32) === 0;
|
|
if ((tag & 31) === 31) {
|
|
let oct = tag;
|
|
tag = 0;
|
|
while ((oct & 128) === 128) {
|
|
oct = buf.readUInt8(fail);
|
|
if (buf.isError(oct))
|
|
return oct;
|
|
tag <<= 7;
|
|
tag |= oct & 127;
|
|
}
|
|
} else {
|
|
tag &= 31;
|
|
}
|
|
const tagStr = der.tag[tag];
|
|
return {
|
|
cls,
|
|
primitive,
|
|
tag,
|
|
tagStr
|
|
};
|
|
}
|
|
function derDecodeLen(buf, primitive, fail) {
|
|
let len = buf.readUInt8(fail);
|
|
if (buf.isError(len))
|
|
return len;
|
|
if (!primitive && len === 128)
|
|
return null;
|
|
if ((len & 128) === 0) {
|
|
return len;
|
|
}
|
|
const num = len & 127;
|
|
if (num > 4)
|
|
return buf.error("length octect is too long");
|
|
len = 0;
|
|
for (let i = 0;i < num; i++) {
|
|
len <<= 8;
|
|
const j = buf.readUInt8(fail);
|
|
if (buf.isError(j))
|
|
return j;
|
|
len |= j;
|
|
}
|
|
return len;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
|
|
var require_pem2 = __commonJS((exports, module) => {
|
|
var inherits = require_inherits();
|
|
var Buffer2 = require_safer().Buffer;
|
|
var DERDecoder = require_der3();
|
|
function PEMDecoder(entity) {
|
|
DERDecoder.call(this, entity);
|
|
this.enc = "pem";
|
|
}
|
|
inherits(PEMDecoder, DERDecoder);
|
|
module.exports = PEMDecoder;
|
|
PEMDecoder.prototype.decode = function decode(data, options2) {
|
|
const lines = data.toString().split(/[\r\n]+/g);
|
|
const label = options2.label.toUpperCase();
|
|
const re = /^-----(BEGIN|END) ([^-]+)-----$/;
|
|
let start = -1;
|
|
let end = -1;
|
|
for (let i = 0;i < lines.length; i++) {
|
|
const match = lines[i].match(re);
|
|
if (match === null)
|
|
continue;
|
|
if (match[2] !== label)
|
|
continue;
|
|
if (start === -1) {
|
|
if (match[1] !== "BEGIN")
|
|
break;
|
|
start = i;
|
|
} else {
|
|
if (match[1] !== "END")
|
|
break;
|
|
end = i;
|
|
break;
|
|
}
|
|
}
|
|
if (start === -1 || end === -1)
|
|
throw new Error("PEM section not found for: " + label);
|
|
const base64 = lines.slice(start + 1, end).join("");
|
|
base64.replace(/[^a-z0-9+/=]+/gi, "");
|
|
const input = Buffer2.from(base64, "base64");
|
|
return DERDecoder.prototype.decode.call(this, input, options2);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
|
|
var require_decoders = __commonJS((exports) => {
|
|
var decoders = exports;
|
|
decoders.der = require_der3();
|
|
decoders.pem = require_pem2();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/api.js
|
|
var require_api = __commonJS((exports) => {
|
|
var encoders = require_encoders();
|
|
var decoders = require_decoders();
|
|
var inherits = require_inherits();
|
|
var api = exports;
|
|
api.define = function define(name, body) {
|
|
return new Entity(name, body);
|
|
};
|
|
function Entity(name, body) {
|
|
this.name = name;
|
|
this.body = body;
|
|
this.decoders = {};
|
|
this.encoders = {};
|
|
}
|
|
Entity.prototype._createNamed = function createNamed(Base) {
|
|
const name = this.name;
|
|
function Generated(entity) {
|
|
this._initNamed(entity, name);
|
|
}
|
|
inherits(Generated, Base);
|
|
Generated.prototype._initNamed = function _initNamed(entity, name2) {
|
|
Base.call(this, entity, name2);
|
|
};
|
|
return new Generated(this);
|
|
};
|
|
Entity.prototype._getDecoder = function _getDecoder(enc) {
|
|
enc = enc || "der";
|
|
if (!this.decoders.hasOwnProperty(enc))
|
|
this.decoders[enc] = this._createNamed(decoders[enc]);
|
|
return this.decoders[enc];
|
|
};
|
|
Entity.prototype.decode = function decode(data, enc, options2) {
|
|
return this._getDecoder(enc).decode(data, options2);
|
|
};
|
|
Entity.prototype._getEncoder = function _getEncoder(enc) {
|
|
enc = enc || "der";
|
|
if (!this.encoders.hasOwnProperty(enc))
|
|
this.encoders[enc] = this._createNamed(encoders[enc]);
|
|
return this.encoders[enc];
|
|
};
|
|
Entity.prototype.encode = function encode(data, enc, reporter) {
|
|
return this._getEncoder(enc).encode(data, reporter);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
|
|
var require_base = __commonJS((exports) => {
|
|
var base = exports;
|
|
base.Reporter = require_reporter().Reporter;
|
|
base.DecoderBuffer = require_buffer().DecoderBuffer;
|
|
base.EncoderBuffer = require_buffer().EncoderBuffer;
|
|
base.Node = require_node();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
|
|
var require_constants2 = __commonJS((exports) => {
|
|
var constants = exports;
|
|
constants._reverse = function reverse(map) {
|
|
const res = {};
|
|
Object.keys(map).forEach(function(key) {
|
|
if ((key | 0) == key)
|
|
key = key | 0;
|
|
const value = map[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
};
|
|
constants.der = require_der();
|
|
});
|
|
|
|
// ../eve/node_modules/asn1.js/lib/asn1.js
|
|
var require_asn1 = __commonJS((exports) => {
|
|
var asn1 = exports;
|
|
asn1.bignum = require_bn();
|
|
asn1.define = require_api().define;
|
|
asn1.base = require_base();
|
|
asn1.constants = require_constants2();
|
|
asn1.decoders = require_decoders();
|
|
asn1.encoders = require_encoders();
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/package.json
|
|
var require_package = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
name: "elliptic",
|
|
version: "6.6.1",
|
|
description: "EC cryptography",
|
|
main: "lib/elliptic.js",
|
|
files: [
|
|
"lib"
|
|
],
|
|
scripts: {
|
|
lint: "eslint lib test",
|
|
"lint:fix": "npm run lint -- --fix",
|
|
unit: "istanbul test _mocha --reporter=spec test/index.js",
|
|
test: "npm run lint && npm run unit",
|
|
version: "grunt dist && git add dist/"
|
|
},
|
|
repository: {
|
|
type: "git",
|
|
url: "git@github.com:indutny/elliptic"
|
|
},
|
|
keywords: [
|
|
"EC",
|
|
"Elliptic",
|
|
"curve",
|
|
"Cryptography"
|
|
],
|
|
author: "Fedor Indutny <fedor@indutny.com>",
|
|
license: "MIT",
|
|
bugs: {
|
|
url: "https://github.com/indutny/elliptic/issues"
|
|
},
|
|
homepage: "https://github.com/indutny/elliptic",
|
|
devDependencies: {
|
|
brfs: "^2.0.2",
|
|
coveralls: "^3.1.0",
|
|
eslint: "^7.6.0",
|
|
grunt: "^1.2.1",
|
|
"grunt-browserify": "^5.3.0",
|
|
"grunt-cli": "^1.3.2",
|
|
"grunt-contrib-connect": "^3.0.0",
|
|
"grunt-contrib-copy": "^1.0.0",
|
|
"grunt-contrib-uglify": "^5.0.0",
|
|
"grunt-mocha-istanbul": "^5.0.2",
|
|
"grunt-saucelabs": "^9.0.1",
|
|
istanbul: "^0.4.5",
|
|
mocha: "^8.0.1"
|
|
},
|
|
dependencies: {
|
|
"bn.js": "^4.11.9",
|
|
brorand: "^1.1.0",
|
|
"hash.js": "^1.0.0",
|
|
"hmac-drbg": "^1.0.1",
|
|
inherits: "^2.0.4",
|
|
"minimalistic-assert": "^1.0.1",
|
|
"minimalistic-crypto-utils": "^1.0.1"
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
|
|
var require_utils = __commonJS((exports) => {
|
|
var utils = exports;
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg !== "string") {
|
|
for (var i = 0;i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
return res;
|
|
}
|
|
if (enc === "hex") {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, "");
|
|
if (msg.length % 2 !== 0)
|
|
msg = "0" + msg;
|
|
for (var i = 0;i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
} else {
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
var hi = c >> 8;
|
|
var lo = c & 255;
|
|
if (hi)
|
|
res.push(hi, lo);
|
|
else
|
|
res.push(lo);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
utils.toArray = toArray;
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return "0" + word;
|
|
else
|
|
return word;
|
|
}
|
|
utils.zero2 = zero2;
|
|
function toHex(msg) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
utils.toHex = toHex;
|
|
utils.encode = function encode(arr, enc) {
|
|
if (enc === "hex")
|
|
return toHex(arr);
|
|
else
|
|
return arr;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/utils.js
|
|
var require_utils2 = __commonJS((exports) => {
|
|
var utils = exports;
|
|
var BN = require_bn();
|
|
var minAssert = require_minimalistic_assert();
|
|
var minUtils = require_utils();
|
|
utils.assert = minAssert;
|
|
utils.toArray = minUtils.toArray;
|
|
utils.zero2 = minUtils.zero2;
|
|
utils.toHex = minUtils.toHex;
|
|
utils.encode = minUtils.encode;
|
|
function getNAF(num, w, bits) {
|
|
var naf = new Array(Math.max(num.bitLength(), bits) + 1);
|
|
var i;
|
|
for (i = 0;i < naf.length; i += 1) {
|
|
naf[i] = 0;
|
|
}
|
|
var ws = 1 << w + 1;
|
|
var k = num.clone();
|
|
for (i = 0;i < naf.length; i++) {
|
|
var z;
|
|
var mod = k.andln(ws - 1);
|
|
if (k.isOdd()) {
|
|
if (mod > (ws >> 1) - 1)
|
|
z = (ws >> 1) - mod;
|
|
else
|
|
z = mod;
|
|
k.isubn(z);
|
|
} else {
|
|
z = 0;
|
|
}
|
|
naf[i] = z;
|
|
k.iushrn(1);
|
|
}
|
|
return naf;
|
|
}
|
|
utils.getNAF = getNAF;
|
|
function getJSF(k1, k2) {
|
|
var jsf = [
|
|
[],
|
|
[]
|
|
];
|
|
k1 = k1.clone();
|
|
k2 = k2.clone();
|
|
var d1 = 0;
|
|
var d2 = 0;
|
|
var m8;
|
|
while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
|
|
var m14 = k1.andln(3) + d1 & 3;
|
|
var m24 = k2.andln(3) + d2 & 3;
|
|
if (m14 === 3)
|
|
m14 = -1;
|
|
if (m24 === 3)
|
|
m24 = -1;
|
|
var u1;
|
|
if ((m14 & 1) === 0) {
|
|
u1 = 0;
|
|
} else {
|
|
m8 = k1.andln(7) + d1 & 7;
|
|
if ((m8 === 3 || m8 === 5) && m24 === 2)
|
|
u1 = -m14;
|
|
else
|
|
u1 = m14;
|
|
}
|
|
jsf[0].push(u1);
|
|
var u2;
|
|
if ((m24 & 1) === 0) {
|
|
u2 = 0;
|
|
} else {
|
|
m8 = k2.andln(7) + d2 & 7;
|
|
if ((m8 === 3 || m8 === 5) && m14 === 2)
|
|
u2 = -m24;
|
|
else
|
|
u2 = m24;
|
|
}
|
|
jsf[1].push(u2);
|
|
if (2 * d1 === u1 + 1)
|
|
d1 = 1 - d1;
|
|
if (2 * d2 === u2 + 1)
|
|
d2 = 1 - d2;
|
|
k1.iushrn(1);
|
|
k2.iushrn(1);
|
|
}
|
|
return jsf;
|
|
}
|
|
utils.getJSF = getJSF;
|
|
function cachedProperty(obj, name, computer) {
|
|
var key = "_" + name;
|
|
obj.prototype[name] = function cachedProperty() {
|
|
return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
|
|
};
|
|
}
|
|
utils.cachedProperty = cachedProperty;
|
|
function parseBytes(bytes) {
|
|
return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
|
|
}
|
|
utils.parseBytes = parseBytes;
|
|
function intFromLE(bytes) {
|
|
return new BN(bytes, "hex", "le");
|
|
}
|
|
utils.intFromLE = intFromLE;
|
|
});
|
|
|
|
// ../eve/node_modules/brorand/index.js
|
|
var require_brorand = __commonJS((exports, module) => {
|
|
var r;
|
|
module.exports = function rand(len) {
|
|
if (!r)
|
|
r = new Rand(null);
|
|
return r.generate(len);
|
|
};
|
|
function Rand(rand) {
|
|
this.rand = rand;
|
|
}
|
|
module.exports.Rand = Rand;
|
|
Rand.prototype.generate = function generate(len) {
|
|
return this._rand(len);
|
|
};
|
|
Rand.prototype._rand = function _rand(n) {
|
|
if (this.rand.getBytes)
|
|
return this.rand.getBytes(n);
|
|
var res = new Uint8Array(n);
|
|
for (var i = 0;i < res.length; i++)
|
|
res[i] = this.rand.getByte();
|
|
return res;
|
|
};
|
|
if (typeof self === "object") {
|
|
if (self.crypto && self.crypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.crypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
} else if (self.msCrypto && self.msCrypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.msCrypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
} else if (typeof window === "object") {
|
|
Rand.prototype._rand = function() {
|
|
throw new Error("Not implemented yet");
|
|
};
|
|
}
|
|
} else {
|
|
try {
|
|
crypto2 = __require("crypto");
|
|
if (typeof crypto2.randomBytes !== "function")
|
|
throw new Error("Not supported");
|
|
Rand.prototype._rand = function _rand(n) {
|
|
return crypto2.randomBytes(n);
|
|
};
|
|
} catch (e) {}
|
|
}
|
|
var crypto2;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
|
|
var require_base2 = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var getNAF = utils.getNAF;
|
|
var getJSF = utils.getJSF;
|
|
var assert = utils.assert;
|
|
function BaseCurve(type, conf) {
|
|
this.type = type;
|
|
this.p = new BN(conf.p, 16);
|
|
this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
|
|
this.zero = new BN(0).toRed(this.red);
|
|
this.one = new BN(1).toRed(this.red);
|
|
this.two = new BN(2).toRed(this.red);
|
|
this.n = conf.n && new BN(conf.n, 16);
|
|
this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
|
|
this._wnafT1 = new Array(4);
|
|
this._wnafT2 = new Array(4);
|
|
this._wnafT3 = new Array(4);
|
|
this._wnafT4 = new Array(4);
|
|
this._bitLength = this.n ? this.n.bitLength() : 0;
|
|
var adjustCount = this.n && this.p.div(this.n);
|
|
if (!adjustCount || adjustCount.cmpn(100) > 0) {
|
|
this.redN = null;
|
|
} else {
|
|
this._maxwellTrick = true;
|
|
this.redN = this.n.toRed(this.red);
|
|
}
|
|
}
|
|
module.exports = BaseCurve;
|
|
BaseCurve.prototype.point = function point() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BaseCurve.prototype.validate = function validate() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
|
|
assert(p.precomputed);
|
|
var doubles = p._getDoubles();
|
|
var naf = getNAF(k, 1, this._bitLength);
|
|
var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
|
|
I /= 3;
|
|
var repr = [];
|
|
var j;
|
|
var nafW;
|
|
for (j = 0;j < naf.length; j += doubles.step) {
|
|
nafW = 0;
|
|
for (var l = j + doubles.step - 1;l >= j; l--)
|
|
nafW = (nafW << 1) + naf[l];
|
|
repr.push(nafW);
|
|
}
|
|
var a = this.jpoint(null, null, null);
|
|
var b = this.jpoint(null, null, null);
|
|
for (var i = I;i > 0; i--) {
|
|
for (j = 0;j < repr.length; j++) {
|
|
nafW = repr[j];
|
|
if (nafW === i)
|
|
b = b.mixedAdd(doubles.points[j]);
|
|
else if (nafW === -i)
|
|
b = b.mixedAdd(doubles.points[j].neg());
|
|
}
|
|
a = a.add(b);
|
|
}
|
|
return a.toP();
|
|
};
|
|
BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
|
|
var w = 4;
|
|
var nafPoints = p._getNAFPoints(w);
|
|
w = nafPoints.wnd;
|
|
var wnd = nafPoints.points;
|
|
var naf = getNAF(k, w, this._bitLength);
|
|
var acc = this.jpoint(null, null, null);
|
|
for (var i = naf.length - 1;i >= 0; i--) {
|
|
for (var l = 0;i >= 0 && naf[i] === 0; i--)
|
|
l++;
|
|
if (i >= 0)
|
|
l++;
|
|
acc = acc.dblp(l);
|
|
if (i < 0)
|
|
break;
|
|
var z = naf[i];
|
|
assert(z !== 0);
|
|
if (p.type === "affine") {
|
|
if (z > 0)
|
|
acc = acc.mixedAdd(wnd[z - 1 >> 1]);
|
|
else
|
|
acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
|
|
} else {
|
|
if (z > 0)
|
|
acc = acc.add(wnd[z - 1 >> 1]);
|
|
else
|
|
acc = acc.add(wnd[-z - 1 >> 1].neg());
|
|
}
|
|
}
|
|
return p.type === "affine" ? acc.toP() : acc;
|
|
};
|
|
BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
|
|
var wndWidth = this._wnafT1;
|
|
var wnd = this._wnafT2;
|
|
var naf = this._wnafT3;
|
|
var max = 0;
|
|
var i;
|
|
var j;
|
|
var p;
|
|
for (i = 0;i < len; i++) {
|
|
p = points[i];
|
|
var nafPoints = p._getNAFPoints(defW);
|
|
wndWidth[i] = nafPoints.wnd;
|
|
wnd[i] = nafPoints.points;
|
|
}
|
|
for (i = len - 1;i >= 1; i -= 2) {
|
|
var a = i - 1;
|
|
var b = i;
|
|
if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
|
|
naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
|
|
naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
|
|
max = Math.max(naf[a].length, max);
|
|
max = Math.max(naf[b].length, max);
|
|
continue;
|
|
}
|
|
var comb = [
|
|
points[a],
|
|
null,
|
|
null,
|
|
points[b]
|
|
];
|
|
if (points[a].y.cmp(points[b].y) === 0) {
|
|
comb[1] = points[a].add(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
} else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].add(points[b].neg());
|
|
} else {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
}
|
|
var index2 = [
|
|
-3,
|
|
-1,
|
|
-5,
|
|
-7,
|
|
0,
|
|
7,
|
|
5,
|
|
1,
|
|
3
|
|
];
|
|
var jsf = getJSF(coeffs[a], coeffs[b]);
|
|
max = Math.max(jsf[0].length, max);
|
|
naf[a] = new Array(max);
|
|
naf[b] = new Array(max);
|
|
for (j = 0;j < max; j++) {
|
|
var ja = jsf[0][j] | 0;
|
|
var jb = jsf[1][j] | 0;
|
|
naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)];
|
|
naf[b][j] = 0;
|
|
wnd[a] = comb;
|
|
}
|
|
}
|
|
var acc = this.jpoint(null, null, null);
|
|
var tmp = this._wnafT4;
|
|
for (i = max;i >= 0; i--) {
|
|
var k = 0;
|
|
while (i >= 0) {
|
|
var zero = true;
|
|
for (j = 0;j < len; j++) {
|
|
tmp[j] = naf[j][i] | 0;
|
|
if (tmp[j] !== 0)
|
|
zero = false;
|
|
}
|
|
if (!zero)
|
|
break;
|
|
k++;
|
|
i--;
|
|
}
|
|
if (i >= 0)
|
|
k++;
|
|
acc = acc.dblp(k);
|
|
if (i < 0)
|
|
break;
|
|
for (j = 0;j < len; j++) {
|
|
var z = tmp[j];
|
|
if (z === 0)
|
|
continue;
|
|
else if (z > 0)
|
|
p = wnd[j][z - 1 >> 1];
|
|
else if (z < 0)
|
|
p = wnd[j][-z - 1 >> 1].neg();
|
|
if (p.type === "affine")
|
|
acc = acc.mixedAdd(p);
|
|
else
|
|
acc = acc.add(p);
|
|
}
|
|
}
|
|
for (i = 0;i < len; i++)
|
|
wnd[i] = null;
|
|
if (jacobianResult)
|
|
return acc;
|
|
else
|
|
return acc.toP();
|
|
};
|
|
function BasePoint(curve, type) {
|
|
this.curve = curve;
|
|
this.type = type;
|
|
this.precomputed = null;
|
|
}
|
|
BaseCurve.BasePoint = BasePoint;
|
|
BasePoint.prototype.eq = function eq() {
|
|
throw new Error("Not implemented");
|
|
};
|
|
BasePoint.prototype.validate = function validate() {
|
|
return this.curve.validate(this);
|
|
};
|
|
BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
bytes = utils.toArray(bytes, enc);
|
|
var len = this.p.byteLength();
|
|
if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
|
|
if (bytes[0] === 6)
|
|
assert(bytes[bytes.length - 1] % 2 === 0);
|
|
else if (bytes[0] === 7)
|
|
assert(bytes[bytes.length - 1] % 2 === 1);
|
|
var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
|
|
return res;
|
|
} else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
|
|
return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
|
|
}
|
|
throw new Error("Unknown point format");
|
|
};
|
|
BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
|
|
return this.encode(enc, true);
|
|
};
|
|
BasePoint.prototype._encode = function _encode(compact) {
|
|
var len = this.curve.p.byteLength();
|
|
var x = this.getX().toArray("be", len);
|
|
if (compact)
|
|
return [this.getY().isEven() ? 2 : 3].concat(x);
|
|
return [4].concat(x, this.getY().toArray("be", len));
|
|
};
|
|
BasePoint.prototype.encode = function encode(enc, compact) {
|
|
return utils.encode(this._encode(compact), enc);
|
|
};
|
|
BasePoint.prototype.precompute = function precompute(power) {
|
|
if (this.precomputed)
|
|
return this;
|
|
var precomputed = {
|
|
doubles: null,
|
|
naf: null,
|
|
beta: null
|
|
};
|
|
precomputed.naf = this._getNAFPoints(8);
|
|
precomputed.doubles = this._getDoubles(4, power);
|
|
precomputed.beta = this._getBeta();
|
|
this.precomputed = precomputed;
|
|
return this;
|
|
};
|
|
BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
|
|
if (!this.precomputed)
|
|
return false;
|
|
var doubles = this.precomputed.doubles;
|
|
if (!doubles)
|
|
return false;
|
|
return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
|
|
};
|
|
BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
|
|
if (this.precomputed && this.precomputed.doubles)
|
|
return this.precomputed.doubles;
|
|
var doubles = [this];
|
|
var acc = this;
|
|
for (var i = 0;i < power; i += step) {
|
|
for (var j = 0;j < step; j++)
|
|
acc = acc.dbl();
|
|
doubles.push(acc);
|
|
}
|
|
return {
|
|
step,
|
|
points: doubles
|
|
};
|
|
};
|
|
BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
|
|
if (this.precomputed && this.precomputed.naf)
|
|
return this.precomputed.naf;
|
|
var res = [this];
|
|
var max = (1 << wnd) - 1;
|
|
var dbl = max === 1 ? null : this.dbl();
|
|
for (var i = 1;i < max; i++)
|
|
res[i] = res[i - 1].add(dbl);
|
|
return {
|
|
wnd,
|
|
points: res
|
|
};
|
|
};
|
|
BasePoint.prototype._getBeta = function _getBeta() {
|
|
return null;
|
|
};
|
|
BasePoint.prototype.dblp = function dblp(k) {
|
|
var r = this;
|
|
for (var i = 0;i < k; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
|
|
var require_short = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var assert = utils.assert;
|
|
function ShortCurve(conf) {
|
|
Base.call(this, "short", conf);
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.tinv = this.two.redInvm();
|
|
this.zeroA = this.a.fromRed().cmpn(0) === 0;
|
|
this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
|
|
this.endo = this._getEndomorphism(conf);
|
|
this._endoWnafT1 = new Array(4);
|
|
this._endoWnafT2 = new Array(4);
|
|
}
|
|
inherits(ShortCurve, Base);
|
|
module.exports = ShortCurve;
|
|
ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
|
|
if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
|
|
return;
|
|
var beta;
|
|
var lambda;
|
|
if (conf.beta) {
|
|
beta = new BN(conf.beta, 16).toRed(this.red);
|
|
} else {
|
|
var betas = this._getEndoRoots(this.p);
|
|
beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
|
|
beta = beta.toRed(this.red);
|
|
}
|
|
if (conf.lambda) {
|
|
lambda = new BN(conf.lambda, 16);
|
|
} else {
|
|
var lambdas = this._getEndoRoots(this.n);
|
|
if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
|
|
lambda = lambdas[0];
|
|
} else {
|
|
lambda = lambdas[1];
|
|
assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
|
|
}
|
|
}
|
|
var basis;
|
|
if (conf.basis) {
|
|
basis = conf.basis.map(function(vec) {
|
|
return {
|
|
a: new BN(vec.a, 16),
|
|
b: new BN(vec.b, 16)
|
|
};
|
|
});
|
|
} else {
|
|
basis = this._getEndoBasis(lambda);
|
|
}
|
|
return {
|
|
beta,
|
|
lambda,
|
|
basis
|
|
};
|
|
};
|
|
ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
|
|
var red = num === this.p ? this.red : BN.mont(num);
|
|
var tinv = new BN(2).toRed(red).redInvm();
|
|
var ntinv = tinv.redNeg();
|
|
var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
|
|
var l1 = ntinv.redAdd(s).fromRed();
|
|
var l2 = ntinv.redSub(s).fromRed();
|
|
return [l1, l2];
|
|
};
|
|
ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
|
|
var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
|
|
var u = lambda;
|
|
var v = this.n.clone();
|
|
var x1 = new BN(1);
|
|
var y1 = new BN(0);
|
|
var x2 = new BN(0);
|
|
var y2 = new BN(1);
|
|
var a0;
|
|
var b0;
|
|
var a1;
|
|
var b1;
|
|
var a2;
|
|
var b2;
|
|
var prevR;
|
|
var i = 0;
|
|
var r;
|
|
var x;
|
|
while (u.cmpn(0) !== 0) {
|
|
var q = v.div(u);
|
|
r = v.sub(q.mul(u));
|
|
x = x2.sub(q.mul(x1));
|
|
var y = y2.sub(q.mul(y1));
|
|
if (!a1 && r.cmp(aprxSqrt) < 0) {
|
|
a0 = prevR.neg();
|
|
b0 = x1;
|
|
a1 = r.neg();
|
|
b1 = x;
|
|
} else if (a1 && ++i === 2) {
|
|
break;
|
|
}
|
|
prevR = r;
|
|
v = u;
|
|
u = r;
|
|
x2 = x1;
|
|
x1 = x;
|
|
y2 = y1;
|
|
y1 = y;
|
|
}
|
|
a2 = r.neg();
|
|
b2 = x;
|
|
var len1 = a1.sqr().add(b1.sqr());
|
|
var len2 = a2.sqr().add(b2.sqr());
|
|
if (len2.cmp(len1) >= 0) {
|
|
a2 = a0;
|
|
b2 = b0;
|
|
}
|
|
if (a1.negative) {
|
|
a1 = a1.neg();
|
|
b1 = b1.neg();
|
|
}
|
|
if (a2.negative) {
|
|
a2 = a2.neg();
|
|
b2 = b2.neg();
|
|
}
|
|
return [
|
|
{ a: a1, b: b1 },
|
|
{ a: a2, b: b2 }
|
|
];
|
|
};
|
|
ShortCurve.prototype._endoSplit = function _endoSplit(k) {
|
|
var basis = this.endo.basis;
|
|
var v1 = basis[0];
|
|
var v2 = basis[1];
|
|
var c1 = v2.b.mul(k).divRound(this.n);
|
|
var c2 = v1.b.neg().mul(k).divRound(this.n);
|
|
var p1 = c1.mul(v1.a);
|
|
var p2 = c2.mul(v2.a);
|
|
var q1 = c1.mul(v1.b);
|
|
var q2 = c2.mul(v2.b);
|
|
var k1 = k.sub(p1).sub(p2);
|
|
var k2 = q1.add(q2).neg();
|
|
return { k1, k2 };
|
|
};
|
|
ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
ShortCurve.prototype.validate = function validate(point) {
|
|
if (point.inf)
|
|
return true;
|
|
var x = point.x;
|
|
var y = point.y;
|
|
var ax = this.a.redMul(x);
|
|
var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
|
|
return y.redSqr().redISub(rhs).cmpn(0) === 0;
|
|
};
|
|
ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
|
|
var npoints = this._endoWnafT1;
|
|
var ncoeffs = this._endoWnafT2;
|
|
for (var i = 0;i < points.length; i++) {
|
|
var split = this._endoSplit(coeffs[i]);
|
|
var p = points[i];
|
|
var beta = p._getBeta();
|
|
if (split.k1.negative) {
|
|
split.k1.ineg();
|
|
p = p.neg(true);
|
|
}
|
|
if (split.k2.negative) {
|
|
split.k2.ineg();
|
|
beta = beta.neg(true);
|
|
}
|
|
npoints[i * 2] = p;
|
|
npoints[i * 2 + 1] = beta;
|
|
ncoeffs[i * 2] = split.k1;
|
|
ncoeffs[i * 2 + 1] = split.k2;
|
|
}
|
|
var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
|
|
for (var j = 0;j < i * 2; j++) {
|
|
npoints[j] = null;
|
|
ncoeffs[j] = null;
|
|
}
|
|
return res;
|
|
};
|
|
function Point(curve, x, y, isRed) {
|
|
Base.BasePoint.call(this, curve, "affine");
|
|
if (x === null && y === null) {
|
|
this.x = null;
|
|
this.y = null;
|
|
this.inf = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
if (isRed) {
|
|
this.x.forceRed(this.curve.red);
|
|
this.y.forceRed(this.curve.red);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
this.inf = false;
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
ShortCurve.prototype.point = function point(x, y, isRed) {
|
|
return new Point(this, x, y, isRed);
|
|
};
|
|
ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
|
|
return Point.fromJSON(this, obj, red);
|
|
};
|
|
Point.prototype._getBeta = function _getBeta() {
|
|
if (!this.curve.endo)
|
|
return;
|
|
var pre = this.precomputed;
|
|
if (pre && pre.beta)
|
|
return pre.beta;
|
|
var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
|
|
if (pre) {
|
|
var curve = this.curve;
|
|
var endoMul = function(p) {
|
|
return curve.point(p.x.redMul(curve.endo.beta), p.y);
|
|
};
|
|
pre.beta = beta;
|
|
beta.precomputed = {
|
|
beta: null,
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(endoMul)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(endoMul)
|
|
}
|
|
};
|
|
}
|
|
return beta;
|
|
};
|
|
Point.prototype.toJSON = function toJSON() {
|
|
if (!this.precomputed)
|
|
return [this.x, this.y];
|
|
return [this.x, this.y, this.precomputed && {
|
|
doubles: this.precomputed.doubles && {
|
|
step: this.precomputed.doubles.step,
|
|
points: this.precomputed.doubles.points.slice(1)
|
|
},
|
|
naf: this.precomputed.naf && {
|
|
wnd: this.precomputed.naf.wnd,
|
|
points: this.precomputed.naf.points.slice(1)
|
|
}
|
|
}];
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj, red) {
|
|
if (typeof obj === "string")
|
|
obj = JSON.parse(obj);
|
|
var res = curve.point(obj[0], obj[1], red);
|
|
if (!obj[2])
|
|
return res;
|
|
function obj2point(obj2) {
|
|
return curve.point(obj2[0], obj2[1], red);
|
|
}
|
|
var pre = obj[2];
|
|
res.precomputed = {
|
|
beta: null,
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: [res].concat(pre.doubles.points.map(obj2point))
|
|
},
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: [res].concat(pre.naf.points.map(obj2point))
|
|
}
|
|
};
|
|
return res;
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.inf;
|
|
};
|
|
Point.prototype.add = function add(p) {
|
|
if (this.inf)
|
|
return p;
|
|
if (p.inf)
|
|
return this;
|
|
if (this.eq(p))
|
|
return this.dbl();
|
|
if (this.neg().eq(p))
|
|
return this.curve.point(null, null);
|
|
if (this.x.cmp(p.x) === 0)
|
|
return this.curve.point(null, null);
|
|
var c = this.y.redSub(p.y);
|
|
if (c.cmpn(0) !== 0)
|
|
c = c.redMul(this.x.redSub(p.x).redInvm());
|
|
var nx = c.redSqr().redISub(this.x).redISub(p.x);
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.inf)
|
|
return this;
|
|
var ys1 = this.y.redAdd(this.y);
|
|
if (ys1.cmpn(0) === 0)
|
|
return this.curve.point(null, null);
|
|
var a = this.curve.a;
|
|
var x2 = this.x.redSqr();
|
|
var dyinv = ys1.redInvm();
|
|
var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
|
|
var nx = c.redSqr().redISub(this.x.redAdd(this.x));
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
return this.x.fromRed();
|
|
};
|
|
Point.prototype.getY = function getY() {
|
|
return this.y.fromRed();
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
k = new BN(k, 16);
|
|
if (this.isInfinity())
|
|
return this;
|
|
else if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd([this], [k]);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
|
|
var points = [this, p2];
|
|
var coeffs = [k1, k2];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2);
|
|
};
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
|
|
var points = [this, p2];
|
|
var coeffs = [k1, k2];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs, true);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
|
|
};
|
|
Point.prototype.eq = function eq(p) {
|
|
return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
|
|
};
|
|
Point.prototype.neg = function neg(_precompute) {
|
|
if (this.inf)
|
|
return this;
|
|
var res = this.curve.point(this.x, this.y.redNeg());
|
|
if (_precompute && this.precomputed) {
|
|
var pre = this.precomputed;
|
|
var negate = function(p) {
|
|
return p.neg();
|
|
};
|
|
res.precomputed = {
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(negate)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(negate)
|
|
}
|
|
};
|
|
}
|
|
return res;
|
|
};
|
|
Point.prototype.toJ = function toJ() {
|
|
if (this.inf)
|
|
return this.curve.jpoint(null, null, null);
|
|
var res = this.curve.jpoint(this.x, this.y, this.curve.one);
|
|
return res;
|
|
};
|
|
function JPoint(curve, x, y, z) {
|
|
Base.BasePoint.call(this, curve, "jacobian");
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.y = this.curve.one;
|
|
this.z = new BN(0);
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = new BN(z, 16);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
this.zOne = this.z === this.curve.one;
|
|
}
|
|
inherits(JPoint, Base.BasePoint);
|
|
ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
|
|
return new JPoint(this, x, y, z);
|
|
};
|
|
JPoint.prototype.toP = function toP() {
|
|
if (this.isInfinity())
|
|
return this.curve.point(null, null);
|
|
var zinv = this.z.redInvm();
|
|
var zinv2 = zinv.redSqr();
|
|
var ax = this.x.redMul(zinv2);
|
|
var ay = this.y.redMul(zinv2).redMul(zinv);
|
|
return this.curve.point(ax, ay);
|
|
};
|
|
JPoint.prototype.neg = function neg() {
|
|
return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
|
|
};
|
|
JPoint.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
if (p.isInfinity())
|
|
return this;
|
|
var pz2 = p.z.redSqr();
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x.redMul(pz2);
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y.redMul(pz2.redMul(p.z));
|
|
var s2 = p.y.redMul(z2.redMul(this.z));
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(p.z).redMul(h);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.mixedAdd = function mixedAdd(p) {
|
|
if (this.isInfinity())
|
|
return p.toJ();
|
|
if (p.isInfinity())
|
|
return this;
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x;
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y;
|
|
var s2 = p.y.redMul(z2).redMul(this.z);
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(h);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.dblp = function dblp(pow) {
|
|
if (pow === 0)
|
|
return this;
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (!pow)
|
|
return this.dbl();
|
|
var i;
|
|
if (this.curve.zeroA || this.curve.threeA) {
|
|
var r = this;
|
|
for (i = 0;i < pow; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
}
|
|
var a = this.curve.a;
|
|
var tinv = this.curve.tinv;
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
var jyd = jy.redAdd(jy);
|
|
for (i = 0;i < pow; i++) {
|
|
var jx2 = jx.redSqr();
|
|
var jyd2 = jyd.redSqr();
|
|
var jyd4 = jyd2.redSqr();
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
var t1 = jx.redMul(jyd2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
var dny = c.redMul(t2);
|
|
dny = dny.redIAdd(dny).redISub(jyd4);
|
|
var nz = jyd.redMul(jz);
|
|
if (i + 1 < pow)
|
|
jz4 = jz4.redMul(jyd4);
|
|
jx = nx;
|
|
jz = nz;
|
|
jyd = dny;
|
|
}
|
|
return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
|
|
};
|
|
JPoint.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (this.curve.zeroA)
|
|
return this._zeroDbl();
|
|
else if (this.curve.threeA)
|
|
return this._threeDbl();
|
|
else
|
|
return this._dbl();
|
|
};
|
|
JPoint.prototype._zeroDbl = function _zeroDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
nx = t;
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = b.redSqr();
|
|
var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
|
|
d = d.redIAdd(d);
|
|
var e = a.redAdd(a).redIAdd(a);
|
|
var f = e.redSqr();
|
|
var c8 = c.redIAdd(c);
|
|
c8 = c8.redIAdd(c8);
|
|
c8 = c8.redIAdd(c8);
|
|
nx = f.redISub(d).redISub(d);
|
|
ny = e.redMul(d.redISub(nx)).redISub(c8);
|
|
nz = this.y.redMul(this.z);
|
|
nz = nz.redIAdd(nz);
|
|
}
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype._threeDbl = function _threeDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
nx = t;
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
var delta = this.z.redSqr();
|
|
var gamma = this.y.redSqr();
|
|
var beta = this.x.redMul(gamma);
|
|
var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
|
|
alpha = alpha.redAdd(alpha).redIAdd(alpha);
|
|
var beta4 = beta.redIAdd(beta);
|
|
beta4 = beta4.redIAdd(beta4);
|
|
var beta8 = beta4.redAdd(beta4);
|
|
nx = alpha.redSqr().redISub(beta8);
|
|
nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
|
|
var ggamma8 = gamma.redSqr();
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
|
|
}
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype._dbl = function _dbl() {
|
|
var a = this.curve.a;
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
var jx2 = jx.redSqr();
|
|
var jy2 = jy.redSqr();
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
var jxd4 = jx.redAdd(jx);
|
|
jxd4 = jxd4.redIAdd(jxd4);
|
|
var t1 = jxd4.redMul(jy2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
var jyd8 = jy2.redSqr();
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
var ny = c.redMul(t2).redISub(jyd8);
|
|
var nz = jy.redAdd(jy).redMul(jz);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.trpl = function trpl() {
|
|
if (!this.curve.zeroA)
|
|
return this.dbl().add(this);
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var zz = this.z.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var mm = m.redSqr();
|
|
var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
e = e.redIAdd(e);
|
|
e = e.redAdd(e).redIAdd(e);
|
|
e = e.redISub(mm);
|
|
var ee = e.redSqr();
|
|
var t = yyyy.redIAdd(yyyy);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
|
|
var yyu4 = yy.redMul(u);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
var nx = this.x.redMul(ee).redISub(yyu4);
|
|
nx = nx.redIAdd(nx);
|
|
nx = nx.redIAdd(nx);
|
|
var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
JPoint.prototype.mul = function mul(k, kbase) {
|
|
k = new BN(k, kbase);
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
JPoint.prototype.eq = function eq(p) {
|
|
if (p.type === "affine")
|
|
return this.eq(p.toJ());
|
|
if (this === p)
|
|
return true;
|
|
var z2 = this.z.redSqr();
|
|
var pz2 = p.z.redSqr();
|
|
if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
|
|
return false;
|
|
var z3 = z2.redMul(this.z);
|
|
var pz3 = pz2.redMul(p.z);
|
|
return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
|
|
};
|
|
JPoint.prototype.eqXToP = function eqXToP(x) {
|
|
var zs = this.z.redSqr();
|
|
var rx = x.toRed(this.curve.red).redMul(zs);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(zs);
|
|
for (;; ) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
};
|
|
JPoint.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC JPoint Infinity>";
|
|
return "<EC JPoint x: " + this.x.toString(16, 2) + " y: " + this.y.toString(16, 2) + " z: " + this.z.toString(16, 2) + ">";
|
|
};
|
|
JPoint.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
|
|
var require_mont = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var utils = require_utils2();
|
|
function MontCurve(conf) {
|
|
Base.call(this, "mont", conf);
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.i4 = new BN(4).toRed(this.red).redInvm();
|
|
this.two = new BN(2).toRed(this.red);
|
|
this.a24 = this.i4.redMul(this.a.redAdd(this.two));
|
|
}
|
|
inherits(MontCurve, Base);
|
|
module.exports = MontCurve;
|
|
MontCurve.prototype.validate = function validate(point) {
|
|
var x = point.normalize().x;
|
|
var x2 = x.redSqr();
|
|
var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
|
|
var y = rhs.redSqrt();
|
|
return y.redSqr().cmp(rhs) === 0;
|
|
};
|
|
function Point(curve, x, z) {
|
|
Base.BasePoint.call(this, curve, "projective");
|
|
if (x === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.z = this.curve.zero;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.z = new BN(z, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
return this.point(utils.toArray(bytes, enc), 1);
|
|
};
|
|
MontCurve.prototype.point = function point(x, z) {
|
|
return new Point(this, x, z);
|
|
};
|
|
MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
Point.prototype.precompute = function precompute() {};
|
|
Point.prototype._encode = function _encode() {
|
|
return this.getX().toArray("be", this.curve.p.byteLength());
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1] || curve.one);
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
var a = this.x.redAdd(this.z);
|
|
var aa = a.redSqr();
|
|
var b = this.x.redSub(this.z);
|
|
var bb = b.redSqr();
|
|
var c = aa.redSub(bb);
|
|
var nx = aa.redMul(bb);
|
|
var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
Point.prototype.add = function add() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.diffAdd = function diffAdd(p, diff) {
|
|
var a = this.x.redAdd(this.z);
|
|
var b = this.x.redSub(this.z);
|
|
var c = p.x.redAdd(p.z);
|
|
var d = p.x.redSub(p.z);
|
|
var da = d.redMul(a);
|
|
var cb = c.redMul(b);
|
|
var nx = diff.z.redMul(da.redAdd(cb).redSqr());
|
|
var nz = diff.x.redMul(da.redISub(cb).redSqr());
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
var t = k.clone();
|
|
var a = this;
|
|
var b = this.curve.point(null, null);
|
|
var c = this;
|
|
for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
|
|
bits.push(t.andln(1));
|
|
for (var i = bits.length - 1;i >= 0; i--) {
|
|
if (bits[i] === 0) {
|
|
a = a.diffAdd(b, c);
|
|
b = b.dbl();
|
|
} else {
|
|
b = a.diffAdd(b, c);
|
|
a = a.dbl();
|
|
}
|
|
}
|
|
return b;
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.jumlAdd = function jumlAdd() {
|
|
throw new Error("Not supported on Montgomery curve");
|
|
};
|
|
Point.prototype.eq = function eq(other) {
|
|
return this.getX().cmp(other.getX()) === 0;
|
|
};
|
|
Point.prototype.normalize = function normalize() {
|
|
this.x = this.x.redMul(this.z.redInvm());
|
|
this.z = this.curve.one;
|
|
return this;
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
return this.x.fromRed();
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
|
|
var require_edwards = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var BN = require_bn();
|
|
var inherits = require_inherits();
|
|
var Base = require_base2();
|
|
var assert = utils.assert;
|
|
function EdwardsCurve(conf) {
|
|
this.twisted = (conf.a | 0) !== 1;
|
|
this.mOneA = this.twisted && (conf.a | 0) === -1;
|
|
this.extended = this.mOneA;
|
|
Base.call(this, "edwards", conf);
|
|
this.a = new BN(conf.a, 16).umod(this.red.m);
|
|
this.a = this.a.toRed(this.red);
|
|
this.c = new BN(conf.c, 16).toRed(this.red);
|
|
this.c2 = this.c.redSqr();
|
|
this.d = new BN(conf.d, 16).toRed(this.red);
|
|
this.dd = this.d.redAdd(this.d);
|
|
assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
|
|
this.oneC = (conf.c | 0) === 1;
|
|
}
|
|
inherits(EdwardsCurve, Base);
|
|
module.exports = EdwardsCurve;
|
|
EdwardsCurve.prototype._mulA = function _mulA(num) {
|
|
if (this.mOneA)
|
|
return num.redNeg();
|
|
else
|
|
return this.a.redMul(num);
|
|
};
|
|
EdwardsCurve.prototype._mulC = function _mulC(num) {
|
|
if (this.oneC)
|
|
return num;
|
|
else
|
|
return this.c.redMul(num);
|
|
};
|
|
EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
|
|
return this.point(x, y, z, t);
|
|
};
|
|
EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
var x2 = x.redSqr();
|
|
var rhs = this.c2.redSub(this.a.redMul(x2));
|
|
var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
|
|
var y2 = rhs.redMul(lhs.redInvm());
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
|
|
y = new BN(y, 16);
|
|
if (!y.red)
|
|
y = y.toRed(this.red);
|
|
var y2 = y.redSqr();
|
|
var lhs = y2.redSub(this.c2);
|
|
var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
|
|
var x2 = lhs.redMul(rhs.redInvm());
|
|
if (x2.cmp(this.zero) === 0) {
|
|
if (odd)
|
|
throw new Error("invalid point");
|
|
else
|
|
return this.point(this.zero, y);
|
|
}
|
|
var x = x2.redSqrt();
|
|
if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
|
|
throw new Error("invalid point");
|
|
if (x.fromRed().isOdd() !== odd)
|
|
x = x.redNeg();
|
|
return this.point(x, y);
|
|
};
|
|
EdwardsCurve.prototype.validate = function validate(point) {
|
|
if (point.isInfinity())
|
|
return true;
|
|
point.normalize();
|
|
var x2 = point.x.redSqr();
|
|
var y2 = point.y.redSqr();
|
|
var lhs = x2.redMul(this.a).redAdd(y2);
|
|
var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
|
|
return lhs.cmp(rhs) === 0;
|
|
};
|
|
function Point(curve, x, y, z, t) {
|
|
Base.BasePoint.call(this, curve, "projective");
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.zero;
|
|
this.y = this.curve.one;
|
|
this.z = this.curve.one;
|
|
this.t = this.curve.zero;
|
|
this.zOne = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = z ? new BN(z, 16) : this.curve.one;
|
|
this.t = t && new BN(t, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
if (this.t && !this.t.red)
|
|
this.t = this.t.toRed(this.curve.red);
|
|
this.zOne = this.z === this.curve.one;
|
|
if (this.curve.extended && !this.t) {
|
|
this.t = this.x.redMul(this.y);
|
|
if (!this.zOne)
|
|
this.t = this.t.redMul(this.z.redInvm());
|
|
}
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
EdwardsCurve.prototype.point = function point(x, y, z, t) {
|
|
return new Point(this, x, y, z, t);
|
|
};
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1], obj[2]);
|
|
};
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return "<EC Point Infinity>";
|
|
return "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
|
|
};
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
|
|
};
|
|
Point.prototype._extDbl = function _extDbl() {
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = this.z.redSqr();
|
|
c = c.redIAdd(c);
|
|
var d = this.curve._mulA(a);
|
|
var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
|
|
var g = d.redAdd(b);
|
|
var f = g.redSub(c);
|
|
var h = d.redSub(b);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
Point.prototype._projDbl = function _projDbl() {
|
|
var b = this.x.redAdd(this.y).redSqr();
|
|
var c = this.x.redSqr();
|
|
var d = this.y.redSqr();
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
var e;
|
|
var h;
|
|
var j;
|
|
if (this.curve.twisted) {
|
|
e = this.curve._mulA(c);
|
|
var f = e.redAdd(d);
|
|
if (this.zOne) {
|
|
nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redSqr().redSub(f).redSub(f);
|
|
} else {
|
|
h = this.z.redSqr();
|
|
j = f.redSub(h).redISub(h);
|
|
nx = b.redSub(c).redISub(d).redMul(j);
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redMul(j);
|
|
}
|
|
} else {
|
|
e = c.redAdd(d);
|
|
h = this.curve._mulC(this.z).redSqr();
|
|
j = e.redSub(h).redSub(h);
|
|
nx = this.curve._mulC(b.redISub(e)).redMul(j);
|
|
ny = this.curve._mulC(e).redMul(c.redISub(d));
|
|
nz = e.redMul(j);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (this.curve.extended)
|
|
return this._extDbl();
|
|
else
|
|
return this._projDbl();
|
|
};
|
|
Point.prototype._extAdd = function _extAdd(p) {
|
|
var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
|
|
var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
|
|
var c = this.t.redMul(this.curve.dd).redMul(p.t);
|
|
var d = this.z.redMul(p.z.redAdd(p.z));
|
|
var e = b.redSub(a);
|
|
var f = d.redSub(c);
|
|
var g = d.redAdd(c);
|
|
var h = b.redAdd(a);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
Point.prototype._projAdd = function _projAdd(p) {
|
|
var a = this.z.redMul(p.z);
|
|
var b = a.redSqr();
|
|
var c = this.x.redMul(p.x);
|
|
var d = this.y.redMul(p.y);
|
|
var e = this.curve.d.redMul(c).redMul(d);
|
|
var f = b.redSub(e);
|
|
var g = b.redAdd(e);
|
|
var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
|
|
var nx = a.redMul(f).redMul(tmp);
|
|
var ny;
|
|
var nz;
|
|
if (this.curve.twisted) {
|
|
ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
|
|
nz = f.redMul(g);
|
|
} else {
|
|
ny = a.redMul(g).redMul(d.redSub(c));
|
|
nz = this.curve._mulC(f).redMul(g);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
Point.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
if (p.isInfinity())
|
|
return this;
|
|
if (this.curve.extended)
|
|
return this._extAdd(p);
|
|
else
|
|
return this._projAdd(p);
|
|
};
|
|
Point.prototype.mul = function mul(k) {
|
|
if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
|
|
};
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
|
|
};
|
|
Point.prototype.normalize = function normalize() {
|
|
if (this.zOne)
|
|
return this;
|
|
var zi = this.z.redInvm();
|
|
this.x = this.x.redMul(zi);
|
|
this.y = this.y.redMul(zi);
|
|
if (this.t)
|
|
this.t = this.t.redMul(zi);
|
|
this.z = this.curve.one;
|
|
this.zOne = true;
|
|
return this;
|
|
};
|
|
Point.prototype.neg = function neg() {
|
|
return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
|
|
};
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
return this.x.fromRed();
|
|
};
|
|
Point.prototype.getY = function getY() {
|
|
this.normalize();
|
|
return this.y.fromRed();
|
|
};
|
|
Point.prototype.eq = function eq(other) {
|
|
return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
|
|
};
|
|
Point.prototype.eqXToP = function eqXToP(x) {
|
|
var rx = x.toRed(this.curve.red).redMul(this.z);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(this.z);
|
|
for (;; ) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
};
|
|
Point.prototype.toP = Point.prototype.normalize;
|
|
Point.prototype.mixedAdd = Point.prototype.add;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
|
|
var require_curve = __commonJS((exports) => {
|
|
var curve = exports;
|
|
curve.base = require_base2();
|
|
curve.short = require_short();
|
|
curve.mont = require_mont();
|
|
curve.edwards = require_edwards();
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/utils.js
|
|
var require_utils3 = __commonJS((exports) => {
|
|
var assert = require_minimalistic_assert();
|
|
var inherits = require_inherits();
|
|
exports.inherits = inherits;
|
|
function isSurrogatePair(msg, i) {
|
|
if ((msg.charCodeAt(i) & 64512) !== 55296) {
|
|
return false;
|
|
}
|
|
if (i < 0 || i + 1 >= msg.length) {
|
|
return false;
|
|
}
|
|
return (msg.charCodeAt(i + 1) & 64512) === 56320;
|
|
}
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg === "string") {
|
|
if (!enc) {
|
|
var p = 0;
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
if (c < 128) {
|
|
res[p++] = c;
|
|
} else if (c < 2048) {
|
|
res[p++] = c >> 6 | 192;
|
|
res[p++] = c & 63 | 128;
|
|
} else if (isSurrogatePair(msg, i)) {
|
|
c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
|
|
res[p++] = c >> 18 | 240;
|
|
res[p++] = c >> 12 & 63 | 128;
|
|
res[p++] = c >> 6 & 63 | 128;
|
|
res[p++] = c & 63 | 128;
|
|
} else {
|
|
res[p++] = c >> 12 | 224;
|
|
res[p++] = c >> 6 & 63 | 128;
|
|
res[p++] = c & 63 | 128;
|
|
}
|
|
}
|
|
} else if (enc === "hex") {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, "");
|
|
if (msg.length % 2 !== 0)
|
|
msg = "0" + msg;
|
|
for (i = 0;i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
}
|
|
} else {
|
|
for (i = 0;i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.toArray = toArray;
|
|
function toHex(msg) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
exports.toHex = toHex;
|
|
function htonl(w) {
|
|
var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
|
|
return res >>> 0;
|
|
}
|
|
exports.htonl = htonl;
|
|
function toHex32(msg, endian) {
|
|
var res = "";
|
|
for (var i = 0;i < msg.length; i++) {
|
|
var w = msg[i];
|
|
if (endian === "little")
|
|
w = htonl(w);
|
|
res += zero8(w.toString(16));
|
|
}
|
|
return res;
|
|
}
|
|
exports.toHex32 = toHex32;
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return "0" + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero2 = zero2;
|
|
function zero8(word) {
|
|
if (word.length === 7)
|
|
return "0" + word;
|
|
else if (word.length === 6)
|
|
return "00" + word;
|
|
else if (word.length === 5)
|
|
return "000" + word;
|
|
else if (word.length === 4)
|
|
return "0000" + word;
|
|
else if (word.length === 3)
|
|
return "00000" + word;
|
|
else if (word.length === 2)
|
|
return "000000" + word;
|
|
else if (word.length === 1)
|
|
return "0000000" + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero8 = zero8;
|
|
function join32(msg, start, end, endian) {
|
|
var len = end - start;
|
|
assert(len % 4 === 0);
|
|
var res = new Array(len / 4);
|
|
for (var i = 0, k = start;i < res.length; i++, k += 4) {
|
|
var w;
|
|
if (endian === "big")
|
|
w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
|
|
else
|
|
w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
|
|
res[i] = w >>> 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.join32 = join32;
|
|
function split32(msg, endian) {
|
|
var res = new Array(msg.length * 4);
|
|
for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
|
|
var m = msg[i];
|
|
if (endian === "big") {
|
|
res[k] = m >>> 24;
|
|
res[k + 1] = m >>> 16 & 255;
|
|
res[k + 2] = m >>> 8 & 255;
|
|
res[k + 3] = m & 255;
|
|
} else {
|
|
res[k + 3] = m >>> 24;
|
|
res[k + 2] = m >>> 16 & 255;
|
|
res[k + 1] = m >>> 8 & 255;
|
|
res[k] = m & 255;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
exports.split32 = split32;
|
|
function rotr32(w, b) {
|
|
return w >>> b | w << 32 - b;
|
|
}
|
|
exports.rotr32 = rotr32;
|
|
function rotl32(w, b) {
|
|
return w << b | w >>> 32 - b;
|
|
}
|
|
exports.rotl32 = rotl32;
|
|
function sum32(a, b) {
|
|
return a + b >>> 0;
|
|
}
|
|
exports.sum32 = sum32;
|
|
function sum32_3(a, b, c) {
|
|
return a + b + c >>> 0;
|
|
}
|
|
exports.sum32_3 = sum32_3;
|
|
function sum32_4(a, b, c, d) {
|
|
return a + b + c + d >>> 0;
|
|
}
|
|
exports.sum32_4 = sum32_4;
|
|
function sum32_5(a, b, c, d, e) {
|
|
return a + b + c + d + e >>> 0;
|
|
}
|
|
exports.sum32_5 = sum32_5;
|
|
function sum64(buf, pos, ah, al) {
|
|
var bh = buf[pos];
|
|
var bl = buf[pos + 1];
|
|
var lo = al + bl >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
buf[pos] = hi >>> 0;
|
|
buf[pos + 1] = lo;
|
|
}
|
|
exports.sum64 = sum64;
|
|
function sum64_hi(ah, al, bh, bl) {
|
|
var lo = al + bl >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_hi = sum64_hi;
|
|
function sum64_lo(ah, al, bh, bl) {
|
|
var lo = al + bl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_lo = sum64_lo;
|
|
function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = lo + bl >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = lo + cl >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = lo + dl >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
var hi = ah + bh + ch + dh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_4_hi = sum64_4_hi;
|
|
function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var lo = al + bl + cl + dl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_4_lo = sum64_4_lo;
|
|
function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = lo + bl >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = lo + cl >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = lo + dl >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
lo = lo + el >>> 0;
|
|
carry += lo < el ? 1 : 0;
|
|
var hi = ah + bh + ch + dh + eh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_5_hi = sum64_5_hi;
|
|
function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var lo = al + bl + cl + dl + el;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_5_lo = sum64_5_lo;
|
|
function rotr64_hi(ah, al, num) {
|
|
var r = al << 32 - num | ah >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_hi = rotr64_hi;
|
|
function rotr64_lo(ah, al, num) {
|
|
var r = ah << 32 - num | al >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_lo = rotr64_lo;
|
|
function shr64_hi(ah, al, num) {
|
|
return ah >>> num;
|
|
}
|
|
exports.shr64_hi = shr64_hi;
|
|
function shr64_lo(ah, al, num) {
|
|
var r = ah << 32 - num | al >>> num;
|
|
return r >>> 0;
|
|
}
|
|
exports.shr64_lo = shr64_lo;
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/common.js
|
|
var require_common = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var assert = require_minimalistic_assert();
|
|
function BlockHash() {
|
|
this.pending = null;
|
|
this.pendingTotal = 0;
|
|
this.blockSize = this.constructor.blockSize;
|
|
this.outSize = this.constructor.outSize;
|
|
this.hmacStrength = this.constructor.hmacStrength;
|
|
this.padLength = this.constructor.padLength / 8;
|
|
this.endian = "big";
|
|
this._delta8 = this.blockSize / 8;
|
|
this._delta32 = this.blockSize / 32;
|
|
}
|
|
exports.BlockHash = BlockHash;
|
|
BlockHash.prototype.update = function update(msg, enc) {
|
|
msg = utils.toArray(msg, enc);
|
|
if (!this.pending)
|
|
this.pending = msg;
|
|
else
|
|
this.pending = this.pending.concat(msg);
|
|
this.pendingTotal += msg.length;
|
|
if (this.pending.length >= this._delta8) {
|
|
msg = this.pending;
|
|
var r = msg.length % this._delta8;
|
|
this.pending = msg.slice(msg.length - r, msg.length);
|
|
if (this.pending.length === 0)
|
|
this.pending = null;
|
|
msg = utils.join32(msg, 0, msg.length - r, this.endian);
|
|
for (var i = 0;i < msg.length; i += this._delta32)
|
|
this._update(msg, i, i + this._delta32);
|
|
}
|
|
return this;
|
|
};
|
|
BlockHash.prototype.digest = function digest(enc) {
|
|
this.update(this._pad());
|
|
assert(this.pending === null);
|
|
return this._digest(enc);
|
|
};
|
|
BlockHash.prototype._pad = function pad() {
|
|
var len = this.pendingTotal;
|
|
var bytes = this._delta8;
|
|
var k = bytes - (len + this.padLength) % bytes;
|
|
var res = new Array(k + this.padLength);
|
|
res[0] = 128;
|
|
for (var i = 1;i < k; i++)
|
|
res[i] = 0;
|
|
len <<= 3;
|
|
if (this.endian === "big") {
|
|
for (var t = 8;t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = len >>> 24 & 255;
|
|
res[i++] = len >>> 16 & 255;
|
|
res[i++] = len >>> 8 & 255;
|
|
res[i++] = len & 255;
|
|
} else {
|
|
res[i++] = len & 255;
|
|
res[i++] = len >>> 8 & 255;
|
|
res[i++] = len >>> 16 & 255;
|
|
res[i++] = len >>> 24 & 255;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
for (t = 8;t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
}
|
|
return res;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/common.js
|
|
var require_common2 = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var rotr32 = utils.rotr32;
|
|
function ft_1(s, x, y, z) {
|
|
if (s === 0)
|
|
return ch32(x, y, z);
|
|
if (s === 1 || s === 3)
|
|
return p32(x, y, z);
|
|
if (s === 2)
|
|
return maj32(x, y, z);
|
|
}
|
|
exports.ft_1 = ft_1;
|
|
function ch32(x, y, z) {
|
|
return x & y ^ ~x & z;
|
|
}
|
|
exports.ch32 = ch32;
|
|
function maj32(x, y, z) {
|
|
return x & y ^ x & z ^ y & z;
|
|
}
|
|
exports.maj32 = maj32;
|
|
function p32(x, y, z) {
|
|
return x ^ y ^ z;
|
|
}
|
|
exports.p32 = p32;
|
|
function s0_256(x) {
|
|
return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
|
|
}
|
|
exports.s0_256 = s0_256;
|
|
function s1_256(x) {
|
|
return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
|
|
}
|
|
exports.s1_256 = s1_256;
|
|
function g0_256(x) {
|
|
return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
|
|
}
|
|
exports.g0_256 = g0_256;
|
|
function g1_256(x) {
|
|
return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
|
|
}
|
|
exports.g1_256 = g1_256;
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/1.js
|
|
var require_1 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var shaCommon = require_common2();
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ft_1 = shaCommon.ft_1;
|
|
var BlockHash = common.BlockHash;
|
|
var sha1_K = [
|
|
1518500249,
|
|
1859775393,
|
|
2400959708,
|
|
3395469782
|
|
];
|
|
function SHA1() {
|
|
if (!(this instanceof SHA1))
|
|
return new SHA1;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1732584193,
|
|
4023233417,
|
|
2562383102,
|
|
271733878,
|
|
3285377520
|
|
];
|
|
this.W = new Array(80);
|
|
}
|
|
utils.inherits(SHA1, BlockHash);
|
|
module.exports = SHA1;
|
|
SHA1.blockSize = 512;
|
|
SHA1.outSize = 160;
|
|
SHA1.hmacStrength = 80;
|
|
SHA1.padLength = 64;
|
|
SHA1.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i++)
|
|
W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
for (i = 0;i < W.length; i++) {
|
|
var s = ~~(i / 20);
|
|
var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
|
|
e = d;
|
|
d = c;
|
|
c = rotl32(b, 30);
|
|
b = a;
|
|
a = t;
|
|
}
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
};
|
|
SHA1.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/256.js
|
|
var require_256 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var shaCommon = require_common2();
|
|
var assert = require_minimalistic_assert();
|
|
var sum32 = utils.sum32;
|
|
var sum32_4 = utils.sum32_4;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ch32 = shaCommon.ch32;
|
|
var maj32 = shaCommon.maj32;
|
|
var s0_256 = shaCommon.s0_256;
|
|
var s1_256 = shaCommon.s1_256;
|
|
var g0_256 = shaCommon.g0_256;
|
|
var g1_256 = shaCommon.g1_256;
|
|
var BlockHash = common.BlockHash;
|
|
var sha256_K = [
|
|
1116352408,
|
|
1899447441,
|
|
3049323471,
|
|
3921009573,
|
|
961987163,
|
|
1508970993,
|
|
2453635748,
|
|
2870763221,
|
|
3624381080,
|
|
310598401,
|
|
607225278,
|
|
1426881987,
|
|
1925078388,
|
|
2162078206,
|
|
2614888103,
|
|
3248222580,
|
|
3835390401,
|
|
4022224774,
|
|
264347078,
|
|
604807628,
|
|
770255983,
|
|
1249150122,
|
|
1555081692,
|
|
1996064986,
|
|
2554220882,
|
|
2821834349,
|
|
2952996808,
|
|
3210313671,
|
|
3336571891,
|
|
3584528711,
|
|
113926993,
|
|
338241895,
|
|
666307205,
|
|
773529912,
|
|
1294757372,
|
|
1396182291,
|
|
1695183700,
|
|
1986661051,
|
|
2177026350,
|
|
2456956037,
|
|
2730485921,
|
|
2820302411,
|
|
3259730800,
|
|
3345764771,
|
|
3516065817,
|
|
3600352804,
|
|
4094571909,
|
|
275423344,
|
|
430227734,
|
|
506948616,
|
|
659060556,
|
|
883997877,
|
|
958139571,
|
|
1322822218,
|
|
1537002063,
|
|
1747873779,
|
|
1955562222,
|
|
2024104815,
|
|
2227730452,
|
|
2361852424,
|
|
2428436474,
|
|
2756734187,
|
|
3204031479,
|
|
3329325298
|
|
];
|
|
function SHA256() {
|
|
if (!(this instanceof SHA256))
|
|
return new SHA256;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1779033703,
|
|
3144134277,
|
|
1013904242,
|
|
2773480762,
|
|
1359893119,
|
|
2600822924,
|
|
528734635,
|
|
1541459225
|
|
];
|
|
this.k = sha256_K;
|
|
this.W = new Array(64);
|
|
}
|
|
utils.inherits(SHA256, BlockHash);
|
|
module.exports = SHA256;
|
|
SHA256.blockSize = 512;
|
|
SHA256.outSize = 256;
|
|
SHA256.hmacStrength = 192;
|
|
SHA256.padLength = 64;
|
|
SHA256.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i++)
|
|
W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
var f = this.h[5];
|
|
var g = this.h[6];
|
|
var h = this.h[7];
|
|
assert(this.k.length === W.length);
|
|
for (i = 0;i < W.length; i++) {
|
|
var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
|
|
var T2 = sum32(s0_256(a), maj32(a, b, c));
|
|
h = g;
|
|
g = f;
|
|
f = e;
|
|
e = sum32(d, T1);
|
|
d = c;
|
|
c = b;
|
|
b = a;
|
|
a = sum32(T1, T2);
|
|
}
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
this.h[5] = sum32(this.h[5], f);
|
|
this.h[6] = sum32(this.h[6], g);
|
|
this.h[7] = sum32(this.h[7], h);
|
|
};
|
|
SHA256.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/224.js
|
|
var require_224 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var SHA256 = require_256();
|
|
function SHA224() {
|
|
if (!(this instanceof SHA224))
|
|
return new SHA224;
|
|
SHA256.call(this);
|
|
this.h = [
|
|
3238371032,
|
|
914150663,
|
|
812702999,
|
|
4144912697,
|
|
4290775857,
|
|
1750603025,
|
|
1694076839,
|
|
3204075428
|
|
];
|
|
}
|
|
utils.inherits(SHA224, SHA256);
|
|
module.exports = SHA224;
|
|
SHA224.blockSize = 512;
|
|
SHA224.outSize = 224;
|
|
SHA224.hmacStrength = 192;
|
|
SHA224.padLength = 64;
|
|
SHA224.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h.slice(0, 7), "big");
|
|
else
|
|
return utils.split32(this.h.slice(0, 7), "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/512.js
|
|
var require_512 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var assert = require_minimalistic_assert();
|
|
var rotr64_hi = utils.rotr64_hi;
|
|
var rotr64_lo = utils.rotr64_lo;
|
|
var shr64_hi = utils.shr64_hi;
|
|
var shr64_lo = utils.shr64_lo;
|
|
var sum64 = utils.sum64;
|
|
var sum64_hi = utils.sum64_hi;
|
|
var sum64_lo = utils.sum64_lo;
|
|
var sum64_4_hi = utils.sum64_4_hi;
|
|
var sum64_4_lo = utils.sum64_4_lo;
|
|
var sum64_5_hi = utils.sum64_5_hi;
|
|
var sum64_5_lo = utils.sum64_5_lo;
|
|
var BlockHash = common.BlockHash;
|
|
var sha512_K = [
|
|
1116352408,
|
|
3609767458,
|
|
1899447441,
|
|
602891725,
|
|
3049323471,
|
|
3964484399,
|
|
3921009573,
|
|
2173295548,
|
|
961987163,
|
|
4081628472,
|
|
1508970993,
|
|
3053834265,
|
|
2453635748,
|
|
2937671579,
|
|
2870763221,
|
|
3664609560,
|
|
3624381080,
|
|
2734883394,
|
|
310598401,
|
|
1164996542,
|
|
607225278,
|
|
1323610764,
|
|
1426881987,
|
|
3590304994,
|
|
1925078388,
|
|
4068182383,
|
|
2162078206,
|
|
991336113,
|
|
2614888103,
|
|
633803317,
|
|
3248222580,
|
|
3479774868,
|
|
3835390401,
|
|
2666613458,
|
|
4022224774,
|
|
944711139,
|
|
264347078,
|
|
2341262773,
|
|
604807628,
|
|
2007800933,
|
|
770255983,
|
|
1495990901,
|
|
1249150122,
|
|
1856431235,
|
|
1555081692,
|
|
3175218132,
|
|
1996064986,
|
|
2198950837,
|
|
2554220882,
|
|
3999719339,
|
|
2821834349,
|
|
766784016,
|
|
2952996808,
|
|
2566594879,
|
|
3210313671,
|
|
3203337956,
|
|
3336571891,
|
|
1034457026,
|
|
3584528711,
|
|
2466948901,
|
|
113926993,
|
|
3758326383,
|
|
338241895,
|
|
168717936,
|
|
666307205,
|
|
1188179964,
|
|
773529912,
|
|
1546045734,
|
|
1294757372,
|
|
1522805485,
|
|
1396182291,
|
|
2643833823,
|
|
1695183700,
|
|
2343527390,
|
|
1986661051,
|
|
1014477480,
|
|
2177026350,
|
|
1206759142,
|
|
2456956037,
|
|
344077627,
|
|
2730485921,
|
|
1290863460,
|
|
2820302411,
|
|
3158454273,
|
|
3259730800,
|
|
3505952657,
|
|
3345764771,
|
|
106217008,
|
|
3516065817,
|
|
3606008344,
|
|
3600352804,
|
|
1432725776,
|
|
4094571909,
|
|
1467031594,
|
|
275423344,
|
|
851169720,
|
|
430227734,
|
|
3100823752,
|
|
506948616,
|
|
1363258195,
|
|
659060556,
|
|
3750685593,
|
|
883997877,
|
|
3785050280,
|
|
958139571,
|
|
3318307427,
|
|
1322822218,
|
|
3812723403,
|
|
1537002063,
|
|
2003034995,
|
|
1747873779,
|
|
3602036899,
|
|
1955562222,
|
|
1575990012,
|
|
2024104815,
|
|
1125592928,
|
|
2227730452,
|
|
2716904306,
|
|
2361852424,
|
|
442776044,
|
|
2428436474,
|
|
593698344,
|
|
2756734187,
|
|
3733110249,
|
|
3204031479,
|
|
2999351573,
|
|
3329325298,
|
|
3815920427,
|
|
3391569614,
|
|
3928383900,
|
|
3515267271,
|
|
566280711,
|
|
3940187606,
|
|
3454069534,
|
|
4118630271,
|
|
4000239992,
|
|
116418474,
|
|
1914138554,
|
|
174292421,
|
|
2731055270,
|
|
289380356,
|
|
3203993006,
|
|
460393269,
|
|
320620315,
|
|
685471733,
|
|
587496836,
|
|
852142971,
|
|
1086792851,
|
|
1017036298,
|
|
365543100,
|
|
1126000580,
|
|
2618297676,
|
|
1288033470,
|
|
3409855158,
|
|
1501505948,
|
|
4234509866,
|
|
1607167915,
|
|
987167468,
|
|
1816402316,
|
|
1246189591
|
|
];
|
|
function SHA512() {
|
|
if (!(this instanceof SHA512))
|
|
return new SHA512;
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
1779033703,
|
|
4089235720,
|
|
3144134277,
|
|
2227873595,
|
|
1013904242,
|
|
4271175723,
|
|
2773480762,
|
|
1595750129,
|
|
1359893119,
|
|
2917565137,
|
|
2600822924,
|
|
725511199,
|
|
528734635,
|
|
4215389547,
|
|
1541459225,
|
|
327033209
|
|
];
|
|
this.k = sha512_K;
|
|
this.W = new Array(160);
|
|
}
|
|
utils.inherits(SHA512, BlockHash);
|
|
module.exports = SHA512;
|
|
SHA512.blockSize = 1024;
|
|
SHA512.outSize = 512;
|
|
SHA512.hmacStrength = 192;
|
|
SHA512.padLength = 128;
|
|
SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
|
|
var W = this.W;
|
|
for (var i = 0;i < 32; i++)
|
|
W[i] = msg[start + i];
|
|
for (;i < W.length; i += 2) {
|
|
var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
|
|
var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
|
|
var c1_hi = W[i - 14];
|
|
var c1_lo = W[i - 13];
|
|
var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
|
|
var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
|
|
var c3_hi = W[i - 32];
|
|
var c3_lo = W[i - 31];
|
|
W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
|
|
W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
|
|
}
|
|
};
|
|
SHA512.prototype._update = function _update(msg, start) {
|
|
this._prepareBlock(msg, start);
|
|
var W = this.W;
|
|
var ah = this.h[0];
|
|
var al = this.h[1];
|
|
var bh = this.h[2];
|
|
var bl = this.h[3];
|
|
var ch = this.h[4];
|
|
var cl = this.h[5];
|
|
var dh = this.h[6];
|
|
var dl = this.h[7];
|
|
var eh = this.h[8];
|
|
var el = this.h[9];
|
|
var fh = this.h[10];
|
|
var fl = this.h[11];
|
|
var gh = this.h[12];
|
|
var gl = this.h[13];
|
|
var hh = this.h[14];
|
|
var hl = this.h[15];
|
|
assert(this.k.length === W.length);
|
|
for (var i = 0;i < W.length; i += 2) {
|
|
var c0_hi = hh;
|
|
var c0_lo = hl;
|
|
var c1_hi = s1_512_hi(eh, el);
|
|
var c1_lo = s1_512_lo(eh, el);
|
|
var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
|
|
var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
|
|
var c3_hi = this.k[i];
|
|
var c3_lo = this.k[i + 1];
|
|
var c4_hi = W[i];
|
|
var c4_lo = W[i + 1];
|
|
var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
|
|
var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
|
|
c0_hi = s0_512_hi(ah, al);
|
|
c0_lo = s0_512_lo(ah, al);
|
|
c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
|
|
c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
|
|
var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
hh = gh;
|
|
hl = gl;
|
|
gh = fh;
|
|
gl = fl;
|
|
fh = eh;
|
|
fl = el;
|
|
eh = sum64_hi(dh, dl, T1_hi, T1_lo);
|
|
el = sum64_lo(dl, dl, T1_hi, T1_lo);
|
|
dh = ch;
|
|
dl = cl;
|
|
ch = bh;
|
|
cl = bl;
|
|
bh = ah;
|
|
bl = al;
|
|
ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
}
|
|
sum64(this.h, 0, ah, al);
|
|
sum64(this.h, 2, bh, bl);
|
|
sum64(this.h, 4, ch, cl);
|
|
sum64(this.h, 6, dh, dl);
|
|
sum64(this.h, 8, eh, el);
|
|
sum64(this.h, 10, fh, fl);
|
|
sum64(this.h, 12, gh, gl);
|
|
sum64(this.h, 14, hh, hl);
|
|
};
|
|
SHA512.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "big");
|
|
else
|
|
return utils.split32(this.h, "big");
|
|
};
|
|
function ch64_hi(xh, xl, yh, yl, zh) {
|
|
var r = xh & yh ^ ~xh & zh;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function ch64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = xl & yl ^ ~xl & zl;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function maj64_hi(xh, xl, yh, yl, zh) {
|
|
var r = xh & yh ^ xh & zh ^ yh & zh;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function maj64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = xl & yl ^ xl & zl ^ yl & zl;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 28);
|
|
var c1_hi = rotr64_hi(xl, xh, 2);
|
|
var c2_hi = rotr64_hi(xl, xh, 7);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 28);
|
|
var c1_lo = rotr64_lo(xl, xh, 2);
|
|
var c2_lo = rotr64_lo(xl, xh, 7);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 14);
|
|
var c1_hi = rotr64_hi(xh, xl, 18);
|
|
var c2_hi = rotr64_hi(xl, xh, 9);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function s1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 14);
|
|
var c1_lo = rotr64_lo(xh, xl, 18);
|
|
var c2_lo = rotr64_lo(xl, xh, 9);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 1);
|
|
var c1_hi = rotr64_hi(xh, xl, 8);
|
|
var c2_hi = shr64_hi(xh, xl, 7);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 1);
|
|
var c1_lo = rotr64_lo(xh, xl, 8);
|
|
var c2_lo = shr64_lo(xh, xl, 7);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 19);
|
|
var c1_hi = rotr64_hi(xl, xh, 29);
|
|
var c2_hi = shr64_hi(xh, xl, 6);
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
function g1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 19);
|
|
var c1_lo = rotr64_lo(xl, xh, 29);
|
|
var c2_lo = shr64_lo(xh, xl, 6);
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 4294967296;
|
|
return r;
|
|
}
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha/384.js
|
|
var require_384 = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var SHA512 = require_512();
|
|
function SHA384() {
|
|
if (!(this instanceof SHA384))
|
|
return new SHA384;
|
|
SHA512.call(this);
|
|
this.h = [
|
|
3418070365,
|
|
3238371032,
|
|
1654270250,
|
|
914150663,
|
|
2438529370,
|
|
812702999,
|
|
355462360,
|
|
4144912697,
|
|
1731405415,
|
|
4290775857,
|
|
2394180231,
|
|
1750603025,
|
|
3675008525,
|
|
1694076839,
|
|
1203062813,
|
|
3204075428
|
|
];
|
|
}
|
|
utils.inherits(SHA384, SHA512);
|
|
module.exports = SHA384;
|
|
SHA384.blockSize = 1024;
|
|
SHA384.outSize = 384;
|
|
SHA384.hmacStrength = 192;
|
|
SHA384.padLength = 128;
|
|
SHA384.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h.slice(0, 12), "big");
|
|
else
|
|
return utils.split32(this.h.slice(0, 12), "big");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/sha.js
|
|
var require_sha = __commonJS((exports) => {
|
|
exports.sha1 = require_1();
|
|
exports.sha224 = require_224();
|
|
exports.sha256 = require_256();
|
|
exports.sha384 = require_384();
|
|
exports.sha512 = require_512();
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/ripemd.js
|
|
var require_ripemd = __commonJS((exports) => {
|
|
var utils = require_utils3();
|
|
var common = require_common();
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_3 = utils.sum32_3;
|
|
var sum32_4 = utils.sum32_4;
|
|
var BlockHash = common.BlockHash;
|
|
function RIPEMD160() {
|
|
if (!(this instanceof RIPEMD160))
|
|
return new RIPEMD160;
|
|
BlockHash.call(this);
|
|
this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
|
|
this.endian = "little";
|
|
}
|
|
utils.inherits(RIPEMD160, BlockHash);
|
|
exports.ripemd160 = RIPEMD160;
|
|
RIPEMD160.blockSize = 512;
|
|
RIPEMD160.outSize = 160;
|
|
RIPEMD160.hmacStrength = 192;
|
|
RIPEMD160.padLength = 64;
|
|
RIPEMD160.prototype._update = function update(msg, start) {
|
|
var A = this.h[0];
|
|
var B = this.h[1];
|
|
var C = this.h[2];
|
|
var D = this.h[3];
|
|
var E = this.h[4];
|
|
var Ah = A;
|
|
var Bh = B;
|
|
var Ch = C;
|
|
var Dh = D;
|
|
var Eh = E;
|
|
for (var j = 0;j < 80; j++) {
|
|
var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
|
|
A = E;
|
|
E = D;
|
|
D = rotl32(C, 10);
|
|
C = B;
|
|
B = T;
|
|
T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
|
|
Ah = Eh;
|
|
Eh = Dh;
|
|
Dh = rotl32(Ch, 10);
|
|
Ch = Bh;
|
|
Bh = T;
|
|
}
|
|
T = sum32_3(this.h[1], C, Dh);
|
|
this.h[1] = sum32_3(this.h[2], D, Eh);
|
|
this.h[2] = sum32_3(this.h[3], E, Ah);
|
|
this.h[3] = sum32_3(this.h[4], A, Bh);
|
|
this.h[4] = sum32_3(this.h[0], B, Ch);
|
|
this.h[0] = T;
|
|
};
|
|
RIPEMD160.prototype._digest = function digest(enc) {
|
|
if (enc === "hex")
|
|
return utils.toHex32(this.h, "little");
|
|
else
|
|
return utils.split32(this.h, "little");
|
|
};
|
|
function f(j, x, y, z) {
|
|
if (j <= 15)
|
|
return x ^ y ^ z;
|
|
else if (j <= 31)
|
|
return x & y | ~x & z;
|
|
else if (j <= 47)
|
|
return (x | ~y) ^ z;
|
|
else if (j <= 63)
|
|
return x & z | y & ~z;
|
|
else
|
|
return x ^ (y | ~z);
|
|
}
|
|
function K(j) {
|
|
if (j <= 15)
|
|
return 0;
|
|
else if (j <= 31)
|
|
return 1518500249;
|
|
else if (j <= 47)
|
|
return 1859775393;
|
|
else if (j <= 63)
|
|
return 2400959708;
|
|
else
|
|
return 2840853838;
|
|
}
|
|
function Kh(j) {
|
|
if (j <= 15)
|
|
return 1352829926;
|
|
else if (j <= 31)
|
|
return 1548603684;
|
|
else if (j <= 47)
|
|
return 1836072691;
|
|
else if (j <= 63)
|
|
return 2053994217;
|
|
else
|
|
return 0;
|
|
}
|
|
var r = [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
7,
|
|
4,
|
|
13,
|
|
1,
|
|
10,
|
|
6,
|
|
15,
|
|
3,
|
|
12,
|
|
0,
|
|
9,
|
|
5,
|
|
2,
|
|
14,
|
|
11,
|
|
8,
|
|
3,
|
|
10,
|
|
14,
|
|
4,
|
|
9,
|
|
15,
|
|
8,
|
|
1,
|
|
2,
|
|
7,
|
|
0,
|
|
6,
|
|
13,
|
|
11,
|
|
5,
|
|
12,
|
|
1,
|
|
9,
|
|
11,
|
|
10,
|
|
0,
|
|
8,
|
|
12,
|
|
4,
|
|
13,
|
|
3,
|
|
7,
|
|
15,
|
|
14,
|
|
5,
|
|
6,
|
|
2,
|
|
4,
|
|
0,
|
|
5,
|
|
9,
|
|
7,
|
|
12,
|
|
2,
|
|
10,
|
|
14,
|
|
1,
|
|
3,
|
|
8,
|
|
11,
|
|
6,
|
|
15,
|
|
13
|
|
];
|
|
var rh = [
|
|
5,
|
|
14,
|
|
7,
|
|
0,
|
|
9,
|
|
2,
|
|
11,
|
|
4,
|
|
13,
|
|
6,
|
|
15,
|
|
8,
|
|
1,
|
|
10,
|
|
3,
|
|
12,
|
|
6,
|
|
11,
|
|
3,
|
|
7,
|
|
0,
|
|
13,
|
|
5,
|
|
10,
|
|
14,
|
|
15,
|
|
8,
|
|
12,
|
|
4,
|
|
9,
|
|
1,
|
|
2,
|
|
15,
|
|
5,
|
|
1,
|
|
3,
|
|
7,
|
|
14,
|
|
6,
|
|
9,
|
|
11,
|
|
8,
|
|
12,
|
|
2,
|
|
10,
|
|
0,
|
|
4,
|
|
13,
|
|
8,
|
|
6,
|
|
4,
|
|
1,
|
|
3,
|
|
11,
|
|
15,
|
|
0,
|
|
5,
|
|
12,
|
|
2,
|
|
13,
|
|
9,
|
|
7,
|
|
10,
|
|
14,
|
|
12,
|
|
15,
|
|
10,
|
|
4,
|
|
1,
|
|
5,
|
|
8,
|
|
7,
|
|
6,
|
|
2,
|
|
13,
|
|
14,
|
|
0,
|
|
3,
|
|
9,
|
|
11
|
|
];
|
|
var s = [
|
|
11,
|
|
14,
|
|
15,
|
|
12,
|
|
5,
|
|
8,
|
|
7,
|
|
9,
|
|
11,
|
|
13,
|
|
14,
|
|
15,
|
|
6,
|
|
7,
|
|
9,
|
|
8,
|
|
7,
|
|
6,
|
|
8,
|
|
13,
|
|
11,
|
|
9,
|
|
7,
|
|
15,
|
|
7,
|
|
12,
|
|
15,
|
|
9,
|
|
11,
|
|
7,
|
|
13,
|
|
12,
|
|
11,
|
|
13,
|
|
6,
|
|
7,
|
|
14,
|
|
9,
|
|
13,
|
|
15,
|
|
14,
|
|
8,
|
|
13,
|
|
6,
|
|
5,
|
|
12,
|
|
7,
|
|
5,
|
|
11,
|
|
12,
|
|
14,
|
|
15,
|
|
14,
|
|
15,
|
|
9,
|
|
8,
|
|
9,
|
|
14,
|
|
5,
|
|
6,
|
|
8,
|
|
6,
|
|
5,
|
|
12,
|
|
9,
|
|
15,
|
|
5,
|
|
11,
|
|
6,
|
|
8,
|
|
13,
|
|
12,
|
|
5,
|
|
12,
|
|
13,
|
|
14,
|
|
11,
|
|
8,
|
|
5,
|
|
6
|
|
];
|
|
var sh = [
|
|
8,
|
|
9,
|
|
9,
|
|
11,
|
|
13,
|
|
15,
|
|
15,
|
|
5,
|
|
7,
|
|
7,
|
|
8,
|
|
11,
|
|
14,
|
|
14,
|
|
12,
|
|
6,
|
|
9,
|
|
13,
|
|
15,
|
|
7,
|
|
12,
|
|
8,
|
|
9,
|
|
11,
|
|
7,
|
|
7,
|
|
12,
|
|
7,
|
|
6,
|
|
15,
|
|
13,
|
|
11,
|
|
9,
|
|
7,
|
|
15,
|
|
11,
|
|
8,
|
|
6,
|
|
6,
|
|
14,
|
|
12,
|
|
13,
|
|
5,
|
|
14,
|
|
13,
|
|
13,
|
|
7,
|
|
5,
|
|
15,
|
|
5,
|
|
8,
|
|
11,
|
|
14,
|
|
14,
|
|
6,
|
|
14,
|
|
6,
|
|
9,
|
|
12,
|
|
9,
|
|
12,
|
|
5,
|
|
15,
|
|
8,
|
|
8,
|
|
5,
|
|
12,
|
|
9,
|
|
12,
|
|
5,
|
|
14,
|
|
6,
|
|
8,
|
|
13,
|
|
6,
|
|
5,
|
|
15,
|
|
13,
|
|
11,
|
|
11
|
|
];
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash/hmac.js
|
|
var require_hmac = __commonJS((exports, module) => {
|
|
var utils = require_utils3();
|
|
var assert = require_minimalistic_assert();
|
|
function Hmac(hash, key, enc) {
|
|
if (!(this instanceof Hmac))
|
|
return new Hmac(hash, key, enc);
|
|
this.Hash = hash;
|
|
this.blockSize = hash.blockSize / 8;
|
|
this.outSize = hash.outSize / 8;
|
|
this.inner = null;
|
|
this.outer = null;
|
|
this._init(utils.toArray(key, enc));
|
|
}
|
|
module.exports = Hmac;
|
|
Hmac.prototype._init = function init(key) {
|
|
if (key.length > this.blockSize)
|
|
key = new this.Hash().update(key).digest();
|
|
assert(key.length <= this.blockSize);
|
|
for (var i = key.length;i < this.blockSize; i++)
|
|
key.push(0);
|
|
for (i = 0;i < key.length; i++)
|
|
key[i] ^= 54;
|
|
this.inner = new this.Hash().update(key);
|
|
for (i = 0;i < key.length; i++)
|
|
key[i] ^= 106;
|
|
this.outer = new this.Hash().update(key);
|
|
};
|
|
Hmac.prototype.update = function update(msg, enc) {
|
|
this.inner.update(msg, enc);
|
|
return this;
|
|
};
|
|
Hmac.prototype.digest = function digest(enc) {
|
|
this.outer.update(this.inner.digest());
|
|
return this.outer.digest(enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/hash.js/lib/hash.js
|
|
var require_hash = __commonJS((exports) => {
|
|
var hash = exports;
|
|
hash.utils = require_utils3();
|
|
hash.common = require_common();
|
|
hash.sha = require_sha();
|
|
hash.ripemd = require_ripemd();
|
|
hash.hmac = require_hmac();
|
|
hash.sha1 = hash.sha.sha1;
|
|
hash.sha256 = hash.sha.sha256;
|
|
hash.sha224 = hash.sha.sha224;
|
|
hash.sha384 = hash.sha.sha384;
|
|
hash.sha512 = hash.sha.sha512;
|
|
hash.ripemd160 = hash.ripemd.ripemd160;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
|
|
var require_secp256k1 = __commonJS((exports, module) => {
|
|
module.exports = {
|
|
doubles: {
|
|
step: 4,
|
|
points: [
|
|
[
|
|
"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
|
|
"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
|
|
],
|
|
[
|
|
"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
|
"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
|
|
],
|
|
[
|
|
"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
|
|
"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
|
|
],
|
|
[
|
|
"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
|
"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
|
|
],
|
|
[
|
|
"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
|
|
"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
|
|
],
|
|
[
|
|
"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
|
|
"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
|
|
],
|
|
[
|
|
"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
|
|
"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
|
|
],
|
|
[
|
|
"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
|
|
"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
|
|
],
|
|
[
|
|
"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
|
|
"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
|
|
],
|
|
[
|
|
"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
|
|
"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
|
|
],
|
|
[
|
|
"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
|
|
"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
|
|
],
|
|
[
|
|
"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
|
|
"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
|
|
],
|
|
[
|
|
"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
|
|
"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
|
|
],
|
|
[
|
|
"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
|
|
"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
|
|
],
|
|
[
|
|
"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
|
|
"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
|
|
],
|
|
[
|
|
"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
|
|
"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
|
|
],
|
|
[
|
|
"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
|
|
"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
|
|
],
|
|
[
|
|
"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
|
|
"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
|
|
],
|
|
[
|
|
"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
|
|
"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
|
|
],
|
|
[
|
|
"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
|
|
"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
|
|
],
|
|
[
|
|
"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
|
|
"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
|
|
],
|
|
[
|
|
"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
|
|
"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
|
|
],
|
|
[
|
|
"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
|
|
"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
|
|
],
|
|
[
|
|
"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
|
|
"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
|
|
],
|
|
[
|
|
"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
|
|
"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
|
|
],
|
|
[
|
|
"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
|
|
"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
|
|
],
|
|
[
|
|
"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
|
|
"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
|
|
],
|
|
[
|
|
"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
|
|
"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
|
|
],
|
|
[
|
|
"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
|
|
"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
|
|
],
|
|
[
|
|
"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
|
|
"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
|
|
],
|
|
[
|
|
"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
|
|
"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
|
|
],
|
|
[
|
|
"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
|
|
"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
|
|
],
|
|
[
|
|
"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
|
|
"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
|
|
],
|
|
[
|
|
"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
|
|
"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
|
|
],
|
|
[
|
|
"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
|
|
"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
|
|
],
|
|
[
|
|
"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
|
|
"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
|
|
],
|
|
[
|
|
"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
|
|
"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
|
|
],
|
|
[
|
|
"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
|
|
"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
|
|
],
|
|
[
|
|
"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
|
|
"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
|
|
],
|
|
[
|
|
"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
|
|
"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
|
|
],
|
|
[
|
|
"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
|
|
"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
|
|
],
|
|
[
|
|
"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
|
|
"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
|
|
],
|
|
[
|
|
"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
|
|
"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
|
|
],
|
|
[
|
|
"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
|
|
"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
|
|
],
|
|
[
|
|
"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
|
|
"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
|
|
],
|
|
[
|
|
"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
|
|
"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
|
|
],
|
|
[
|
|
"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
|
|
"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
|
|
],
|
|
[
|
|
"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
|
|
"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
|
|
],
|
|
[
|
|
"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
|
|
"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
|
|
],
|
|
[
|
|
"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
|
|
"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
|
|
],
|
|
[
|
|
"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
|
|
"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
|
|
],
|
|
[
|
|
"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
|
|
"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
|
|
],
|
|
[
|
|
"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
|
|
"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
|
|
],
|
|
[
|
|
"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
|
|
"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
|
|
],
|
|
[
|
|
"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
|
|
"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
|
|
],
|
|
[
|
|
"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
|
|
"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
|
|
],
|
|
[
|
|
"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
|
|
"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
|
|
],
|
|
[
|
|
"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
|
|
"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
|
|
],
|
|
[
|
|
"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
|
|
"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
|
|
],
|
|
[
|
|
"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
|
|
"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
|
|
],
|
|
[
|
|
"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
|
|
"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
|
|
],
|
|
[
|
|
"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
|
|
"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
|
|
],
|
|
[
|
|
"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
|
|
"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
|
|
],
|
|
[
|
|
"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
|
|
"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
|
|
],
|
|
[
|
|
"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
|
|
"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
|
|
]
|
|
]
|
|
},
|
|
naf: {
|
|
wnd: 7,
|
|
points: [
|
|
[
|
|
"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
|
|
"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
|
|
],
|
|
[
|
|
"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
|
|
"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
|
|
],
|
|
[
|
|
"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
|
|
"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
|
|
],
|
|
[
|
|
"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
|
|
"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
|
|
],
|
|
[
|
|
"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
|
|
"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
|
|
],
|
|
[
|
|
"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
|
|
"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
|
|
],
|
|
[
|
|
"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
|
|
"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
|
|
],
|
|
[
|
|
"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
|
|
"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
|
|
],
|
|
[
|
|
"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
|
|
"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
|
|
],
|
|
[
|
|
"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
|
|
"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
|
|
],
|
|
[
|
|
"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
|
|
"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
|
|
],
|
|
[
|
|
"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
|
|
"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
|
|
],
|
|
[
|
|
"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
|
|
"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
|
|
],
|
|
[
|
|
"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
|
|
"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
|
|
],
|
|
[
|
|
"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
|
|
"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
|
|
],
|
|
[
|
|
"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
|
|
"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
|
|
],
|
|
[
|
|
"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
|
|
"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
|
|
],
|
|
[
|
|
"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
|
|
"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
|
|
],
|
|
[
|
|
"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
|
|
"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
|
|
],
|
|
[
|
|
"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
|
|
"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
|
|
],
|
|
[
|
|
"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
|
|
"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
|
|
],
|
|
[
|
|
"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
|
|
"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
|
|
],
|
|
[
|
|
"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
|
|
"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
|
|
],
|
|
[
|
|
"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
|
|
"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
|
|
],
|
|
[
|
|
"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
|
|
"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
|
|
],
|
|
[
|
|
"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
|
|
"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
|
|
],
|
|
[
|
|
"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
|
|
"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
|
|
],
|
|
[
|
|
"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
|
|
"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
|
|
],
|
|
[
|
|
"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
|
|
"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
|
|
],
|
|
[
|
|
"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
|
|
"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
|
|
],
|
|
[
|
|
"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
|
|
"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
|
|
],
|
|
[
|
|
"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
|
|
"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
|
|
],
|
|
[
|
|
"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
|
|
"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
|
|
],
|
|
[
|
|
"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
|
|
"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
|
|
],
|
|
[
|
|
"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
|
|
"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
|
|
],
|
|
[
|
|
"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
|
|
"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
|
|
],
|
|
[
|
|
"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
|
|
"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
|
|
],
|
|
[
|
|
"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
|
|
"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
|
|
],
|
|
[
|
|
"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
|
|
"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
|
|
],
|
|
[
|
|
"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
|
|
"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
|
|
],
|
|
[
|
|
"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
|
|
"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
|
|
],
|
|
[
|
|
"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
|
|
"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
|
|
],
|
|
[
|
|
"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
|
|
"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
|
|
],
|
|
[
|
|
"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
|
|
"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
|
|
],
|
|
[
|
|
"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
|
|
"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
|
|
],
|
|
[
|
|
"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
|
|
"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
|
|
],
|
|
[
|
|
"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
|
|
"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
|
|
],
|
|
[
|
|
"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
|
|
"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
|
|
],
|
|
[
|
|
"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
|
|
"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
|
|
],
|
|
[
|
|
"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
|
|
"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
|
|
],
|
|
[
|
|
"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
|
|
"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
|
|
],
|
|
[
|
|
"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
|
|
"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
|
|
],
|
|
[
|
|
"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
|
|
"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
|
|
],
|
|
[
|
|
"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
|
|
"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
|
|
],
|
|
[
|
|
"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
|
|
"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
|
|
],
|
|
[
|
|
"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
|
|
"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
|
|
],
|
|
[
|
|
"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
|
|
"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
|
|
],
|
|
[
|
|
"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
|
|
"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
|
|
],
|
|
[
|
|
"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
|
|
"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
|
|
],
|
|
[
|
|
"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
|
|
"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
|
|
],
|
|
[
|
|
"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
|
|
"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
|
|
],
|
|
[
|
|
"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
|
|
"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
|
|
],
|
|
[
|
|
"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
|
|
"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
|
|
],
|
|
[
|
|
"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
|
|
"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
|
|
],
|
|
[
|
|
"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
|
|
"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
|
|
],
|
|
[
|
|
"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
|
|
"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
|
|
],
|
|
[
|
|
"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
|
|
"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
|
|
],
|
|
[
|
|
"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
|
|
"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
|
|
],
|
|
[
|
|
"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
|
|
"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
|
|
],
|
|
[
|
|
"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
|
|
"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
|
|
],
|
|
[
|
|
"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
|
|
"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
|
|
],
|
|
[
|
|
"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
|
|
"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
|
|
],
|
|
[
|
|
"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
|
|
"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
|
|
],
|
|
[
|
|
"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
|
|
"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
|
|
],
|
|
[
|
|
"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
|
|
"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
|
|
],
|
|
[
|
|
"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
|
|
"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
|
|
],
|
|
[
|
|
"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
|
|
"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
|
|
],
|
|
[
|
|
"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
|
|
"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
|
|
],
|
|
[
|
|
"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
|
|
"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
|
|
],
|
|
[
|
|
"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
|
|
"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
|
|
],
|
|
[
|
|
"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
|
|
"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
|
|
],
|
|
[
|
|
"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
|
|
"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
|
|
],
|
|
[
|
|
"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
|
|
"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
|
|
],
|
|
[
|
|
"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
|
|
"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
|
|
],
|
|
[
|
|
"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
|
|
"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
|
|
],
|
|
[
|
|
"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
|
|
"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
|
|
],
|
|
[
|
|
"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
|
|
"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
|
|
],
|
|
[
|
|
"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
|
|
"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
|
|
],
|
|
[
|
|
"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
|
|
"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
|
|
],
|
|
[
|
|
"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
|
|
"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
|
|
],
|
|
[
|
|
"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
|
|
"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
|
|
],
|
|
[
|
|
"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
|
|
"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
|
|
],
|
|
[
|
|
"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
|
|
"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
|
|
],
|
|
[
|
|
"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
|
|
"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
|
|
],
|
|
[
|
|
"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
|
|
"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
|
|
],
|
|
[
|
|
"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
|
|
"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
|
|
],
|
|
[
|
|
"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
|
|
"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
|
|
],
|
|
[
|
|
"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
|
|
"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
|
|
],
|
|
[
|
|
"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
|
|
"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
|
|
],
|
|
[
|
|
"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
|
|
"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
|
|
],
|
|
[
|
|
"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
|
|
"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
|
|
],
|
|
[
|
|
"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
|
|
"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
|
|
],
|
|
[
|
|
"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
|
|
"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
|
|
],
|
|
[
|
|
"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
|
|
"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
|
|
],
|
|
[
|
|
"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
|
|
"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
|
|
],
|
|
[
|
|
"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
|
|
"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
|
|
],
|
|
[
|
|
"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
|
|
"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
|
|
],
|
|
[
|
|
"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
|
|
"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
|
|
],
|
|
[
|
|
"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
|
|
"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
|
|
],
|
|
[
|
|
"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
|
|
"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
|
|
],
|
|
[
|
|
"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
|
|
"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
|
|
],
|
|
[
|
|
"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
|
|
"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
|
|
],
|
|
[
|
|
"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
|
|
"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
|
|
],
|
|
[
|
|
"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
|
|
"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
|
|
],
|
|
[
|
|
"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
|
|
"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
|
|
],
|
|
[
|
|
"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
|
|
"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
|
|
],
|
|
[
|
|
"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
|
|
"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
|
|
],
|
|
[
|
|
"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
|
|
"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
|
|
],
|
|
[
|
|
"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
|
|
"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
|
|
],
|
|
[
|
|
"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
|
|
"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
|
|
],
|
|
[
|
|
"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
|
|
"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
|
|
],
|
|
[
|
|
"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
|
|
"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
|
|
],
|
|
[
|
|
"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
|
|
"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
|
|
],
|
|
[
|
|
"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
|
|
"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
|
|
],
|
|
[
|
|
"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
|
|
"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
|
|
],
|
|
[
|
|
"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
|
|
"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
|
|
],
|
|
[
|
|
"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
|
|
"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
|
|
]
|
|
]
|
|
}
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/curves.js
|
|
var require_curves = __commonJS((exports) => {
|
|
var curves = exports;
|
|
var hash = require_hash();
|
|
var curve = require_curve();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function PresetCurve(options2) {
|
|
if (options2.type === "short")
|
|
this.curve = new curve.short(options2);
|
|
else if (options2.type === "edwards")
|
|
this.curve = new curve.edwards(options2);
|
|
else
|
|
this.curve = new curve.mont(options2);
|
|
this.g = this.curve.g;
|
|
this.n = this.curve.n;
|
|
this.hash = options2.hash;
|
|
assert(this.g.validate(), "Invalid curve");
|
|
assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
|
|
}
|
|
curves.PresetCurve = PresetCurve;
|
|
function defineCurve(name, options2) {
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get: function() {
|
|
var curve2 = new PresetCurve(options2);
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
value: curve2
|
|
});
|
|
return curve2;
|
|
}
|
|
});
|
|
}
|
|
defineCurve("p192", {
|
|
type: "short",
|
|
prime: "p192",
|
|
p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
|
|
a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
|
|
b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
|
|
n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
|
|
"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
|
|
]
|
|
});
|
|
defineCurve("p224", {
|
|
type: "short",
|
|
prime: "p224",
|
|
p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
|
|
a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
|
|
b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
|
|
n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
|
|
"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
|
|
]
|
|
});
|
|
defineCurve("p256", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
|
|
a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
|
|
b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
|
|
n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
|
|
"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
|
|
]
|
|
});
|
|
defineCurve("p384", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
|
|
a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
|
|
b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
|
|
n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
|
|
hash: hash.sha384,
|
|
gRed: false,
|
|
g: [
|
|
"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
|
|
"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
|
|
]
|
|
});
|
|
defineCurve("p521", {
|
|
type: "short",
|
|
prime: null,
|
|
p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
|
|
a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
|
|
b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
|
|
n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
|
|
hash: hash.sha512,
|
|
gRed: false,
|
|
g: [
|
|
"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
|
|
"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
|
|
]
|
|
});
|
|
defineCurve("curve25519", {
|
|
type: "mont",
|
|
prime: "p25519",
|
|
p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
|
|
a: "76d06",
|
|
b: "1",
|
|
n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"9"
|
|
]
|
|
});
|
|
defineCurve("ed25519", {
|
|
type: "edwards",
|
|
prime: "p25519",
|
|
p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
|
|
a: "-1",
|
|
c: "1",
|
|
d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
|
|
n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
|
|
"6666666666666666666666666666666666666666666666666666666666666658"
|
|
]
|
|
});
|
|
var pre;
|
|
try {
|
|
pre = require_secp256k1();
|
|
} catch (e) {
|
|
pre = undefined;
|
|
}
|
|
defineCurve("secp256k1", {
|
|
type: "short",
|
|
prime: "k256",
|
|
p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
|
|
a: "0",
|
|
b: "7",
|
|
n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
|
|
h: "1",
|
|
hash: hash.sha256,
|
|
beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
|
|
lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
|
|
basis: [
|
|
{
|
|
a: "3086d221a7d46bcde86c90e49284eb15",
|
|
b: "-e4437ed6010e88286f547fa90abfe4c3"
|
|
},
|
|
{
|
|
a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
|
|
b: "3086d221a7d46bcde86c90e49284eb15"
|
|
}
|
|
],
|
|
gRed: false,
|
|
g: [
|
|
"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
|
|
"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
|
|
pre
|
|
]
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
|
|
var require_hmac_drbg = __commonJS((exports, module) => {
|
|
var hash = require_hash();
|
|
var utils = require_utils();
|
|
var assert = require_minimalistic_assert();
|
|
function HmacDRBG(options2) {
|
|
if (!(this instanceof HmacDRBG))
|
|
return new HmacDRBG(options2);
|
|
this.hash = options2.hash;
|
|
this.predResist = !!options2.predResist;
|
|
this.outLen = this.hash.outSize;
|
|
this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
|
|
this._reseed = null;
|
|
this.reseedInterval = null;
|
|
this.K = null;
|
|
this.V = null;
|
|
var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
|
|
var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
|
|
var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
|
|
assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
|
|
this._init(entropy, nonce, pers);
|
|
}
|
|
module.exports = HmacDRBG;
|
|
HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
|
|
var seed = entropy.concat(nonce).concat(pers);
|
|
this.K = new Array(this.outLen / 8);
|
|
this.V = new Array(this.outLen / 8);
|
|
for (var i = 0;i < this.V.length; i++) {
|
|
this.K[i] = 0;
|
|
this.V[i] = 1;
|
|
}
|
|
this._update(seed);
|
|
this._reseed = 1;
|
|
this.reseedInterval = 281474976710656;
|
|
};
|
|
HmacDRBG.prototype._hmac = function hmac() {
|
|
return new hash.hmac(this.hash, this.K);
|
|
};
|
|
HmacDRBG.prototype._update = function update(seed) {
|
|
var kmac = this._hmac().update(this.V).update([0]);
|
|
if (seed)
|
|
kmac = kmac.update(seed);
|
|
this.K = kmac.digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
if (!seed)
|
|
return;
|
|
this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
};
|
|
HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
|
|
if (typeof entropyEnc !== "string") {
|
|
addEnc = add;
|
|
add = entropyEnc;
|
|
entropyEnc = null;
|
|
}
|
|
entropy = utils.toArray(entropy, entropyEnc);
|
|
add = utils.toArray(add, addEnc);
|
|
assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
|
|
this._update(entropy.concat(add || []));
|
|
this._reseed = 1;
|
|
};
|
|
HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
|
|
if (this._reseed > this.reseedInterval)
|
|
throw new Error("Reseed is required");
|
|
if (typeof enc !== "string") {
|
|
addEnc = add;
|
|
add = enc;
|
|
enc = null;
|
|
}
|
|
if (add) {
|
|
add = utils.toArray(add, addEnc || "hex");
|
|
this._update(add);
|
|
}
|
|
var temp = [];
|
|
while (temp.length < len) {
|
|
this.V = this._hmac().update(this.V).digest();
|
|
temp = temp.concat(this.V);
|
|
}
|
|
var res = temp.slice(0, len);
|
|
this._update(add);
|
|
this._reseed++;
|
|
return utils.encode(res, enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
|
|
var require_key = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function KeyPair(ec, options2) {
|
|
this.ec = ec;
|
|
this.priv = null;
|
|
this.pub = null;
|
|
if (options2.priv)
|
|
this._importPrivate(options2.priv, options2.privEnc);
|
|
if (options2.pub)
|
|
this._importPublic(options2.pub, options2.pubEnc);
|
|
}
|
|
module.exports = KeyPair;
|
|
KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
return new KeyPair(ec, {
|
|
pub,
|
|
pubEnc: enc
|
|
});
|
|
};
|
|
KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
|
|
if (priv instanceof KeyPair)
|
|
return priv;
|
|
return new KeyPair(ec, {
|
|
priv,
|
|
privEnc: enc
|
|
});
|
|
};
|
|
KeyPair.prototype.validate = function validate() {
|
|
var pub = this.getPublic();
|
|
if (pub.isInfinity())
|
|
return { result: false, reason: "Invalid public key" };
|
|
if (!pub.validate())
|
|
return { result: false, reason: "Public key is not a point" };
|
|
if (!pub.mul(this.ec.curve.n).isInfinity())
|
|
return { result: false, reason: "Public key * N != O" };
|
|
return { result: true, reason: null };
|
|
};
|
|
KeyPair.prototype.getPublic = function getPublic(compact, enc) {
|
|
if (typeof compact === "string") {
|
|
enc = compact;
|
|
compact = null;
|
|
}
|
|
if (!this.pub)
|
|
this.pub = this.ec.g.mul(this.priv);
|
|
if (!enc)
|
|
return this.pub;
|
|
return this.pub.encode(enc, compact);
|
|
};
|
|
KeyPair.prototype.getPrivate = function getPrivate(enc) {
|
|
if (enc === "hex")
|
|
return this.priv.toString(16, 2);
|
|
else
|
|
return this.priv;
|
|
};
|
|
KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
|
|
this.priv = new BN(key, enc || 16);
|
|
this.priv = this.priv.umod(this.ec.curve.n);
|
|
};
|
|
KeyPair.prototype._importPublic = function _importPublic(key, enc) {
|
|
if (key.x || key.y) {
|
|
if (this.ec.curve.type === "mont") {
|
|
assert(key.x, "Need x coordinate");
|
|
} else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
|
|
assert(key.x && key.y, "Need both x and y coordinate");
|
|
}
|
|
this.pub = this.ec.curve.point(key.x, key.y);
|
|
return;
|
|
}
|
|
this.pub = this.ec.curve.decodePoint(key, enc);
|
|
};
|
|
KeyPair.prototype.derive = function derive(pub) {
|
|
if (!pub.validate()) {
|
|
assert(pub.validate(), "public point not validated");
|
|
}
|
|
return pub.mul(this.priv).getX();
|
|
};
|
|
KeyPair.prototype.sign = function sign(msg, enc, options2) {
|
|
return this.ec.sign(msg, this, enc, options2);
|
|
};
|
|
KeyPair.prototype.verify = function verify(msg, signature, options2) {
|
|
return this.ec.verify(msg, signature, this, undefined, options2);
|
|
};
|
|
KeyPair.prototype.inspect = function inspect() {
|
|
return "<Key priv: " + (this.priv && this.priv.toString(16, 2)) + " pub: " + (this.pub && this.pub.inspect()) + " >";
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
|
|
var require_signature = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
function Signature(options2, enc) {
|
|
if (options2 instanceof Signature)
|
|
return options2;
|
|
if (this._importDER(options2, enc))
|
|
return;
|
|
assert(options2.r && options2.s, "Signature without r or s");
|
|
this.r = new BN(options2.r, 16);
|
|
this.s = new BN(options2.s, 16);
|
|
if (options2.recoveryParam === undefined)
|
|
this.recoveryParam = null;
|
|
else
|
|
this.recoveryParam = options2.recoveryParam;
|
|
}
|
|
module.exports = Signature;
|
|
function Position() {
|
|
this.place = 0;
|
|
}
|
|
function getLength(buf, p) {
|
|
var initial = buf[p.place++];
|
|
if (!(initial & 128)) {
|
|
return initial;
|
|
}
|
|
var octetLen = initial & 15;
|
|
if (octetLen === 0 || octetLen > 4) {
|
|
return false;
|
|
}
|
|
if (buf[p.place] === 0) {
|
|
return false;
|
|
}
|
|
var val = 0;
|
|
for (var i = 0, off = p.place;i < octetLen; i++, off++) {
|
|
val <<= 8;
|
|
val |= buf[off];
|
|
val >>>= 0;
|
|
}
|
|
if (val <= 127) {
|
|
return false;
|
|
}
|
|
p.place = off;
|
|
return val;
|
|
}
|
|
function rmPadding(buf) {
|
|
var i = 0;
|
|
var len = buf.length - 1;
|
|
while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
|
|
i++;
|
|
}
|
|
if (i === 0) {
|
|
return buf;
|
|
}
|
|
return buf.slice(i);
|
|
}
|
|
Signature.prototype._importDER = function _importDER(data, enc) {
|
|
data = utils.toArray(data, enc);
|
|
var p = new Position;
|
|
if (data[p.place++] !== 48) {
|
|
return false;
|
|
}
|
|
var len = getLength(data, p);
|
|
if (len === false) {
|
|
return false;
|
|
}
|
|
if (len + p.place !== data.length) {
|
|
return false;
|
|
}
|
|
if (data[p.place++] !== 2) {
|
|
return false;
|
|
}
|
|
var rlen = getLength(data, p);
|
|
if (rlen === false) {
|
|
return false;
|
|
}
|
|
if ((data[p.place] & 128) !== 0) {
|
|
return false;
|
|
}
|
|
var r = data.slice(p.place, rlen + p.place);
|
|
p.place += rlen;
|
|
if (data[p.place++] !== 2) {
|
|
return false;
|
|
}
|
|
var slen = getLength(data, p);
|
|
if (slen === false) {
|
|
return false;
|
|
}
|
|
if (data.length !== slen + p.place) {
|
|
return false;
|
|
}
|
|
if ((data[p.place] & 128) !== 0) {
|
|
return false;
|
|
}
|
|
var s = data.slice(p.place, slen + p.place);
|
|
if (r[0] === 0) {
|
|
if (r[1] & 128) {
|
|
r = r.slice(1);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
if (s[0] === 0) {
|
|
if (s[1] & 128) {
|
|
s = s.slice(1);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
this.r = new BN(r);
|
|
this.s = new BN(s);
|
|
this.recoveryParam = null;
|
|
return true;
|
|
};
|
|
function constructLength(arr, len) {
|
|
if (len < 128) {
|
|
arr.push(len);
|
|
return;
|
|
}
|
|
var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
|
|
arr.push(octets | 128);
|
|
while (--octets) {
|
|
arr.push(len >>> (octets << 3) & 255);
|
|
}
|
|
arr.push(len);
|
|
}
|
|
Signature.prototype.toDER = function toDER(enc) {
|
|
var r = this.r.toArray();
|
|
var s = this.s.toArray();
|
|
if (r[0] & 128)
|
|
r = [0].concat(r);
|
|
if (s[0] & 128)
|
|
s = [0].concat(s);
|
|
r = rmPadding(r);
|
|
s = rmPadding(s);
|
|
while (!s[0] && !(s[1] & 128)) {
|
|
s = s.slice(1);
|
|
}
|
|
var arr = [2];
|
|
constructLength(arr, r.length);
|
|
arr = arr.concat(r);
|
|
arr.push(2);
|
|
constructLength(arr, s.length);
|
|
var backHalf = arr.concat(s);
|
|
var res = [48];
|
|
constructLength(res, backHalf.length);
|
|
res = res.concat(backHalf);
|
|
return utils.encode(res, enc);
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
|
|
var require_ec = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var HmacDRBG = require_hmac_drbg();
|
|
var utils = require_utils2();
|
|
var curves = require_curves();
|
|
var rand = require_brorand();
|
|
var assert = utils.assert;
|
|
var KeyPair = require_key();
|
|
var Signature = require_signature();
|
|
function EC(options2) {
|
|
if (!(this instanceof EC))
|
|
return new EC(options2);
|
|
if (typeof options2 === "string") {
|
|
assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
|
|
options2 = curves[options2];
|
|
}
|
|
if (options2 instanceof curves.PresetCurve)
|
|
options2 = { curve: options2 };
|
|
this.curve = options2.curve.curve;
|
|
this.n = this.curve.n;
|
|
this.nh = this.n.ushrn(1);
|
|
this.g = this.curve.g;
|
|
this.g = options2.curve.g;
|
|
this.g.precompute(options2.curve.n.bitLength() + 1);
|
|
this.hash = options2.hash || options2.curve.hash;
|
|
}
|
|
module.exports = EC;
|
|
EC.prototype.keyPair = function keyPair(options2) {
|
|
return new KeyPair(this, options2);
|
|
};
|
|
EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
|
|
return KeyPair.fromPrivate(this, priv, enc);
|
|
};
|
|
EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
|
|
return KeyPair.fromPublic(this, pub, enc);
|
|
};
|
|
EC.prototype.genKeyPair = function genKeyPair(options2) {
|
|
if (!options2)
|
|
options2 = {};
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
pers: options2.pers,
|
|
persEnc: options2.persEnc || "utf8",
|
|
entropy: options2.entropy || rand(this.hash.hmacStrength),
|
|
entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
|
|
nonce: this.n.toArray()
|
|
});
|
|
var bytes = this.n.byteLength();
|
|
var ns2 = this.n.sub(new BN(2));
|
|
for (;; ) {
|
|
var priv = new BN(drbg.generate(bytes));
|
|
if (priv.cmp(ns2) > 0)
|
|
continue;
|
|
priv.iaddn(1);
|
|
return this.keyFromPrivate(priv);
|
|
}
|
|
};
|
|
EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
|
|
var byteLength;
|
|
if (BN.isBN(msg) || typeof msg === "number") {
|
|
msg = new BN(msg, 16);
|
|
byteLength = msg.byteLength();
|
|
} else if (typeof msg === "object") {
|
|
byteLength = msg.length;
|
|
msg = new BN(msg, 16);
|
|
} else {
|
|
var str = msg.toString();
|
|
byteLength = str.length + 1 >>> 1;
|
|
msg = new BN(str, 16);
|
|
}
|
|
if (typeof bitLength !== "number") {
|
|
bitLength = byteLength * 8;
|
|
}
|
|
var delta = bitLength - this.n.bitLength();
|
|
if (delta > 0)
|
|
msg = msg.ushrn(delta);
|
|
if (!truncOnly && msg.cmp(this.n) >= 0)
|
|
return msg.sub(this.n);
|
|
else
|
|
return msg;
|
|
};
|
|
EC.prototype.sign = function sign(msg, key, enc, options2) {
|
|
if (typeof enc === "object") {
|
|
options2 = enc;
|
|
enc = null;
|
|
}
|
|
if (!options2)
|
|
options2 = {};
|
|
if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
|
|
assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
|
|
assert(msg.length >>> 0 === msg.length);
|
|
for (var i = 0;i < msg.length; i++)
|
|
assert((msg[i] & 255) === msg[i]);
|
|
}
|
|
key = this.keyFromPrivate(key, enc);
|
|
msg = this._truncateToN(msg, false, options2.msgBitLength);
|
|
assert(!msg.isNeg(), "Can not sign a negative message");
|
|
var bytes = this.n.byteLength();
|
|
var bkey = key.getPrivate().toArray("be", bytes);
|
|
var nonce = msg.toArray("be", bytes);
|
|
assert(new BN(nonce).eq(msg), "Can not sign message");
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
entropy: bkey,
|
|
nonce,
|
|
pers: options2.pers,
|
|
persEnc: options2.persEnc || "utf8"
|
|
});
|
|
var ns1 = this.n.sub(new BN(1));
|
|
for (var iter = 0;; iter++) {
|
|
var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
|
|
k = this._truncateToN(k, true);
|
|
if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
|
|
continue;
|
|
var kp = this.g.mul(k);
|
|
if (kp.isInfinity())
|
|
continue;
|
|
var kpX = kp.getX();
|
|
var r = kpX.umod(this.n);
|
|
if (r.cmpn(0) === 0)
|
|
continue;
|
|
var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
|
|
s = s.umod(this.n);
|
|
if (s.cmpn(0) === 0)
|
|
continue;
|
|
var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
|
|
if (options2.canonical && s.cmp(this.nh) > 0) {
|
|
s = this.n.sub(s);
|
|
recoveryParam ^= 1;
|
|
}
|
|
return new Signature({ r, s, recoveryParam });
|
|
}
|
|
};
|
|
EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
|
|
if (!options2)
|
|
options2 = {};
|
|
msg = this._truncateToN(msg, false, options2.msgBitLength);
|
|
key = this.keyFromPublic(key, enc);
|
|
signature = new Signature(signature, "hex");
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
|
|
return false;
|
|
if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
|
|
return false;
|
|
var sinv = s.invm(this.n);
|
|
var u1 = sinv.mul(msg).umod(this.n);
|
|
var u2 = sinv.mul(r).umod(this.n);
|
|
var p;
|
|
if (!this.curve._maxwellTrick) {
|
|
p = this.g.mulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
return p.getX().umod(this.n).cmp(r) === 0;
|
|
}
|
|
p = this.g.jmulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
return p.eqXToP(r);
|
|
};
|
|
EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
|
|
assert((3 & j) === j, "The recovery param is more than two bits");
|
|
signature = new Signature(signature, enc);
|
|
var n = this.n;
|
|
var e = new BN(msg);
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
var isYOdd = j & 1;
|
|
var isSecondKey = j >> 1;
|
|
if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
|
|
throw new Error("Unable to find sencond key candinate");
|
|
if (isSecondKey)
|
|
r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
|
|
else
|
|
r = this.curve.pointFromX(r, isYOdd);
|
|
var rInv = signature.r.invm(n);
|
|
var s1 = n.sub(e).mul(rInv).umod(n);
|
|
var s2 = s.mul(rInv).umod(n);
|
|
return this.g.mulAdd(s1, r, s2);
|
|
};
|
|
EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
|
|
signature = new Signature(signature, enc);
|
|
if (signature.recoveryParam !== null)
|
|
return signature.recoveryParam;
|
|
for (var i = 0;i < 4; i++) {
|
|
var Qprime;
|
|
try {
|
|
Qprime = this.recoverPubKey(e, signature, i);
|
|
} catch (e2) {
|
|
continue;
|
|
}
|
|
if (Qprime.eq(Q))
|
|
return i;
|
|
}
|
|
throw new Error("Unable to find valid recovery factor");
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
|
|
var require_key2 = __commonJS((exports, module) => {
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var cachedProperty = utils.cachedProperty;
|
|
function KeyPair(eddsa, params) {
|
|
this.eddsa = eddsa;
|
|
this._secret = parseBytes(params.secret);
|
|
if (eddsa.isPoint(params.pub))
|
|
this._pub = params.pub;
|
|
else
|
|
this._pubBytes = parseBytes(params.pub);
|
|
}
|
|
KeyPair.fromPublic = function fromPublic(eddsa, pub) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
return new KeyPair(eddsa, { pub });
|
|
};
|
|
KeyPair.fromSecret = function fromSecret(eddsa, secret) {
|
|
if (secret instanceof KeyPair)
|
|
return secret;
|
|
return new KeyPair(eddsa, { secret });
|
|
};
|
|
KeyPair.prototype.secret = function secret() {
|
|
return this._secret;
|
|
};
|
|
cachedProperty(KeyPair, "pubBytes", function pubBytes() {
|
|
return this.eddsa.encodePoint(this.pub());
|
|
});
|
|
cachedProperty(KeyPair, "pub", function pub() {
|
|
if (this._pubBytes)
|
|
return this.eddsa.decodePoint(this._pubBytes);
|
|
return this.eddsa.g.mul(this.priv());
|
|
});
|
|
cachedProperty(KeyPair, "privBytes", function privBytes() {
|
|
var eddsa = this.eddsa;
|
|
var hash = this.hash();
|
|
var lastIx = eddsa.encodingLength - 1;
|
|
var a = hash.slice(0, eddsa.encodingLength);
|
|
a[0] &= 248;
|
|
a[lastIx] &= 127;
|
|
a[lastIx] |= 64;
|
|
return a;
|
|
});
|
|
cachedProperty(KeyPair, "priv", function priv() {
|
|
return this.eddsa.decodeInt(this.privBytes());
|
|
});
|
|
cachedProperty(KeyPair, "hash", function hash() {
|
|
return this.eddsa.hash().update(this.secret()).digest();
|
|
});
|
|
cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
|
|
return this.hash().slice(this.eddsa.encodingLength);
|
|
});
|
|
KeyPair.prototype.sign = function sign(message) {
|
|
assert(this._secret, "KeyPair can only verify");
|
|
return this.eddsa.sign(message, this);
|
|
};
|
|
KeyPair.prototype.verify = function verify(message, sig) {
|
|
return this.eddsa.verify(message, sig, this);
|
|
};
|
|
KeyPair.prototype.getSecret = function getSecret(enc) {
|
|
assert(this._secret, "KeyPair is public only");
|
|
return utils.encode(this.secret(), enc);
|
|
};
|
|
KeyPair.prototype.getPublic = function getPublic(enc) {
|
|
return utils.encode(this.pubBytes(), enc);
|
|
};
|
|
module.exports = KeyPair;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
|
|
var require_signature2 = __commonJS((exports, module) => {
|
|
var BN = require_bn();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var cachedProperty = utils.cachedProperty;
|
|
var parseBytes = utils.parseBytes;
|
|
function Signature(eddsa, sig) {
|
|
this.eddsa = eddsa;
|
|
if (typeof sig !== "object")
|
|
sig = parseBytes(sig);
|
|
if (Array.isArray(sig)) {
|
|
assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
|
|
sig = {
|
|
R: sig.slice(0, eddsa.encodingLength),
|
|
S: sig.slice(eddsa.encodingLength)
|
|
};
|
|
}
|
|
assert(sig.R && sig.S, "Signature without R or S");
|
|
if (eddsa.isPoint(sig.R))
|
|
this._R = sig.R;
|
|
if (sig.S instanceof BN)
|
|
this._S = sig.S;
|
|
this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
|
|
this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
|
|
}
|
|
cachedProperty(Signature, "S", function S() {
|
|
return this.eddsa.decodeInt(this.Sencoded());
|
|
});
|
|
cachedProperty(Signature, "R", function R() {
|
|
return this.eddsa.decodePoint(this.Rencoded());
|
|
});
|
|
cachedProperty(Signature, "Rencoded", function Rencoded() {
|
|
return this.eddsa.encodePoint(this.R());
|
|
});
|
|
cachedProperty(Signature, "Sencoded", function Sencoded() {
|
|
return this.eddsa.encodeInt(this.S());
|
|
});
|
|
Signature.prototype.toBytes = function toBytes() {
|
|
return this.Rencoded().concat(this.Sencoded());
|
|
};
|
|
Signature.prototype.toHex = function toHex() {
|
|
return utils.encode(this.toBytes(), "hex").toUpperCase();
|
|
};
|
|
module.exports = Signature;
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
|
|
var require_eddsa = __commonJS((exports, module) => {
|
|
var hash = require_hash();
|
|
var curves = require_curves();
|
|
var utils = require_utils2();
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var KeyPair = require_key2();
|
|
var Signature = require_signature2();
|
|
function EDDSA(curve) {
|
|
assert(curve === "ed25519", "only tested with ed25519 so far");
|
|
if (!(this instanceof EDDSA))
|
|
return new EDDSA(curve);
|
|
curve = curves[curve].curve;
|
|
this.curve = curve;
|
|
this.g = curve.g;
|
|
this.g.precompute(curve.n.bitLength() + 1);
|
|
this.pointClass = curve.point().constructor;
|
|
this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
|
|
this.hash = hash.sha512;
|
|
}
|
|
module.exports = EDDSA;
|
|
EDDSA.prototype.sign = function sign(message, secret) {
|
|
message = parseBytes(message);
|
|
var key = this.keyFromSecret(secret);
|
|
var r = this.hashInt(key.messagePrefix(), message);
|
|
var R = this.g.mul(r);
|
|
var Rencoded = this.encodePoint(R);
|
|
var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
|
|
var S = r.add(s_).umod(this.curve.n);
|
|
return this.makeSignature({ R, S, Rencoded });
|
|
};
|
|
EDDSA.prototype.verify = function verify(message, sig, pub) {
|
|
message = parseBytes(message);
|
|
sig = this.makeSignature(sig);
|
|
if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
|
|
return false;
|
|
}
|
|
var key = this.keyFromPublic(pub);
|
|
var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
|
|
var SG = this.g.mul(sig.S());
|
|
var RplusAh = sig.R().add(key.pub().mul(h));
|
|
return RplusAh.eq(SG);
|
|
};
|
|
EDDSA.prototype.hashInt = function hashInt() {
|
|
var hash2 = this.hash();
|
|
for (var i = 0;i < arguments.length; i++)
|
|
hash2.update(arguments[i]);
|
|
return utils.intFromLE(hash2.digest()).umod(this.curve.n);
|
|
};
|
|
EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
|
|
return KeyPair.fromPublic(this, pub);
|
|
};
|
|
EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
|
|
return KeyPair.fromSecret(this, secret);
|
|
};
|
|
EDDSA.prototype.makeSignature = function makeSignature(sig) {
|
|
if (sig instanceof Signature)
|
|
return sig;
|
|
return new Signature(this, sig);
|
|
};
|
|
EDDSA.prototype.encodePoint = function encodePoint(point) {
|
|
var enc = point.getY().toArray("le", this.encodingLength);
|
|
enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
|
|
return enc;
|
|
};
|
|
EDDSA.prototype.decodePoint = function decodePoint(bytes) {
|
|
bytes = utils.parseBytes(bytes);
|
|
var lastIx = bytes.length - 1;
|
|
var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
|
|
var xIsOdd = (bytes[lastIx] & 128) !== 0;
|
|
var y = utils.intFromLE(normed);
|
|
return this.curve.pointFromY(y, xIsOdd);
|
|
};
|
|
EDDSA.prototype.encodeInt = function encodeInt(num) {
|
|
return num.toArray("le", this.encodingLength);
|
|
};
|
|
EDDSA.prototype.decodeInt = function decodeInt(bytes) {
|
|
return utils.intFromLE(bytes);
|
|
};
|
|
EDDSA.prototype.isPoint = function isPoint(val) {
|
|
return val instanceof this.pointClass;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/elliptic/lib/elliptic.js
|
|
var require_elliptic = __commonJS((exports) => {
|
|
var elliptic = exports;
|
|
elliptic.version = require_package().version;
|
|
elliptic.utils = require_utils2();
|
|
elliptic.rand = require_brorand();
|
|
elliptic.curve = require_curve();
|
|
elliptic.curves = require_curves();
|
|
elliptic.ec = require_ec();
|
|
elliptic.eddsa = require_eddsa();
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
|
|
var require_b64_to_bn = __commonJS((exports, module) => {
|
|
var BN = require_asn1().bignum;
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
module.exports = function base64ToBigNum(val, zero) {
|
|
var buf = Buffer2.from(val, "base64");
|
|
var bn = val = new BN(buf, 10, "be").iabs();
|
|
if (zero) {
|
|
buf.fill(0);
|
|
}
|
|
return bn;
|
|
};
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
|
|
var require_algorithm_identifier = __commonJS((exports, module) => {
|
|
module.exports = require_asn1().define("AlgorithmIdentifer", function() {
|
|
this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
|
|
var require_public_key_info = __commonJS((exports, module) => {
|
|
var AlgorithmIdentifier = require_algorithm_identifier();
|
|
module.exports = require_asn1().define("PublicKeyInfo", function() {
|
|
this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
|
|
var require_version = __commonJS((exports, module) => {
|
|
module.exports = require_asn1().define("Version", function() {
|
|
this.int();
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
|
|
var require_private_key_info = __commonJS((exports, module) => {
|
|
var AlgorithmIdentifier = require_algorithm_identifier();
|
|
var Version = require_version();
|
|
module.exports = require_asn1().define("PrivateKeyInfo", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
|
|
});
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/ec.js
|
|
var require_ec2 = __commonJS((exports, module) => {
|
|
var asn1 = require_asn1();
|
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
var EC = require_elliptic().ec;
|
|
var b64ToBn = require_b64_to_bn();
|
|
var PublicKeyInfo = require_public_key_info();
|
|
var PrivateKeyInfo = require_private_key_info();
|
|
var Version = require_version();
|
|
var ECParameters = asn1.define("ECParameters", function() {
|
|
this.choice({
|
|
namedCurve: this.objid()
|
|
});
|
|
});
|
|
var ecPrivkeyVer1 = 1;
|
|
var ECPrivateKey = asn1.define("ECPrivateKey", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
|
|
});
|
|
var curves = {
|
|
"P-256": "p256",
|
|
"P-384": "p384",
|
|
"P-521": "p521"
|
|
};
|
|
var oids = {
|
|
"P-256": [1, 2, 840, 10045, 3, 1, 7],
|
|
"P-384": [1, 3, 132, 0, 34],
|
|
"P-521": [1, 3, 132, 0, 35]
|
|
};
|
|
var parameters = {};
|
|
var algorithms = {};
|
|
Object.keys(oids).forEach(function(crv) {
|
|
parameters[crv] = ECParameters.encode({
|
|
type: "namedCurve",
|
|
value: oids[crv]
|
|
}, "der");
|
|
algorithms[crv] = {
|
|
algorithm: [1, 2, 840, 10045, 2, 1],
|
|
parameters: parameters[crv]
|
|
};
|
|
});
|
|
oids = null;
|
|
function ecJwkToBuffer(jwk, opts) {
|
|
if (typeof jwk.crv !== "string") {
|
|
throw new TypeError('Expected "jwk.crv" to be a String');
|
|
}
|
|
var hasD = typeof jwk.d === "string";
|
|
var xyTypes = hasD ? ["undefined", "string"] : ["string"];
|
|
if (xyTypes.indexOf(typeof jwk.x) === -1) {
|
|
throw new TypeError('Expected "jwk.x" to be a String');
|
|
}
|
|
if (xyTypes.indexOf(typeof jwk.y) === -1) {
|
|
throw new TypeError('Expected "jwk.y" to be a String');
|
|
}
|
|
if (opts.private && !hasD) {
|
|
throw new TypeError('Expected "jwk.d" to be a String');
|
|
}
|
|
var curveName = curves[jwk.crv];
|
|
if (!curveName) {
|
|
throw new Error('Unsupported curve "' + jwk.crv + '"');
|
|
}
|
|
var curve = new EC(curveName);
|
|
var key = {};
|
|
var hasPub = jwk.x && jwk.y;
|
|
if (hasPub) {
|
|
key.pub = {
|
|
x: b64ToBn(jwk.x, false),
|
|
y: b64ToBn(jwk.y, false)
|
|
};
|
|
}
|
|
if (opts.private || !hasPub) {
|
|
key.priv = b64ToBn(jwk.d, true);
|
|
}
|
|
key = curve.keyPair(key);
|
|
var keyValidation = key.validate();
|
|
if (!keyValidation.result) {
|
|
throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
|
|
}
|
|
var result = keyToPem(jwk.crv, key, opts);
|
|
return result;
|
|
}
|
|
function keyToPem(crv, key, opts) {
|
|
var compact = false;
|
|
var publicKey = key.getPublic(compact, "hex");
|
|
publicKey = Buffer2.from(publicKey, "hex");
|
|
publicKey = {
|
|
unused: 0,
|
|
data: publicKey
|
|
};
|
|
var result;
|
|
if (opts.private) {
|
|
var privateKey = key.getPrivate("hex");
|
|
privateKey = Buffer2.from(privateKey, "hex");
|
|
result = PrivateKeyInfo.encode({
|
|
version: 0,
|
|
privateKeyAlgorithm: algorithms[crv],
|
|
privateKey: ECPrivateKey.encode({
|
|
version: ecPrivkeyVer1,
|
|
privateKey,
|
|
parameters: parameters[crv],
|
|
publicKey
|
|
}, "der")
|
|
}, "pem", {
|
|
label: "PRIVATE KEY"
|
|
});
|
|
privateKey.fill(0);
|
|
} else {
|
|
result = PublicKeyInfo.encode({
|
|
algorithm: algorithms[crv],
|
|
PublicKey: publicKey
|
|
}, "pem", {
|
|
label: "PUBLIC KEY"
|
|
});
|
|
}
|
|
if (result.slice(-1) !== `
|
|
`) {
|
|
result += `
|
|
`;
|
|
}
|
|
return result;
|
|
}
|
|
module.exports = ecJwkToBuffer;
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/rsa.js
|
|
var require_rsa = __commonJS((exports, module) => {
|
|
var asn1 = require_asn1();
|
|
var b64ToBn = require_b64_to_bn();
|
|
var PublicKeyInfo = require_public_key_info();
|
|
var PrivateKeyInfo = require_private_key_info();
|
|
var Version = require_version();
|
|
var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
|
|
this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
|
|
});
|
|
var RSAPublicKey = asn1.define("RSAPublicKey", function() {
|
|
this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
|
|
});
|
|
var algorithm = {
|
|
algorithm: [1, 2, 840, 113549, 1, 1, 1],
|
|
parameters: [5, 0]
|
|
};
|
|
function rsaJwkToBuffer(jwk, opts) {
|
|
if (typeof jwk.e !== "string") {
|
|
throw new TypeError('Expected "jwk.e" to be a String');
|
|
}
|
|
if (typeof jwk.n !== "string") {
|
|
throw new TypeError('Expected "jwk.n" to be a String');
|
|
}
|
|
if (opts.private) {
|
|
if (typeof jwk.d !== "string") {
|
|
throw new TypeError('Expected "jwk.d" to be a String');
|
|
}
|
|
if (typeof jwk.p !== "string") {
|
|
throw new TypeError('Expected "jwk.p" to be a String');
|
|
}
|
|
if (typeof jwk.q !== "string") {
|
|
throw new TypeError('Expected "jwk.q" to be a String');
|
|
}
|
|
if (typeof jwk.dp !== "string") {
|
|
throw new TypeError('Expected "jwk.dp" to be a String');
|
|
}
|
|
if (typeof jwk.dq !== "string") {
|
|
throw new TypeError('Expected "jwk.dq" to be a String');
|
|
}
|
|
if (typeof jwk.qi !== "string") {
|
|
throw new TypeError('Expected "jwk.qi" to be a String');
|
|
}
|
|
}
|
|
var pem;
|
|
if (opts.private) {
|
|
pem = PrivateKeyInfo.encode({
|
|
version: 0,
|
|
privateKeyAlgorithm: algorithm,
|
|
privateKey: RSAPrivateKey.encode({
|
|
version: 0,
|
|
modulus: b64ToBn(jwk.n, false),
|
|
publicExponent: b64ToBn(jwk.e, false),
|
|
privateExponent: b64ToBn(jwk.d, true),
|
|
prime1: b64ToBn(jwk.p, true),
|
|
prime2: b64ToBn(jwk.q, true),
|
|
exponent1: b64ToBn(jwk.dp, true),
|
|
exponent2: b64ToBn(jwk.dq, true),
|
|
coefficient: b64ToBn(jwk.qi, true)
|
|
}, "der")
|
|
}, "pem", {
|
|
label: "PRIVATE KEY"
|
|
});
|
|
} else {
|
|
pem = PublicKeyInfo.encode({
|
|
algorithm,
|
|
PublicKey: {
|
|
unused: 0,
|
|
data: RSAPublicKey.encode({
|
|
modulus: b64ToBn(jwk.n, false),
|
|
publicExponent: b64ToBn(jwk.e, false)
|
|
}, "der")
|
|
}
|
|
}, "pem", {
|
|
label: "PUBLIC KEY"
|
|
});
|
|
}
|
|
if (pem.slice(-1) !== `
|
|
`) {
|
|
pem += `
|
|
`;
|
|
}
|
|
return pem;
|
|
}
|
|
module.exports = rsaJwkToBuffer;
|
|
});
|
|
|
|
// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
|
|
var require_jwk_to_pem = __commonJS((exports, module) => {
|
|
var ec = require_ec2();
|
|
var rsa = require_rsa();
|
|
function jwkToBuffer(jwk, opts) {
|
|
if (typeof jwk !== "object" || jwk === null) {
|
|
throw new TypeError('Expected "jwk" to be an Object');
|
|
}
|
|
var kty = jwk.kty;
|
|
if (typeof kty !== "string") {
|
|
throw new TypeError('Expected "jwk.kty" to be a String');
|
|
}
|
|
opts = opts || {};
|
|
opts.private = opts.private === true;
|
|
switch (kty) {
|
|
case "EC": {
|
|
return ec(jwk, opts);
|
|
}
|
|
case "RSA": {
|
|
return rsa(jwk, opts);
|
|
}
|
|
default: {
|
|
throw new Error('Unsupported key type "' + kty + '"');
|
|
}
|
|
}
|
|
}
|
|
module.exports = jwkToBuffer;
|
|
});
|
|
|
|
// ../util/node_modules/stream-chain/src/defs.js
|
|
var require_defs = __commonJS((exports, module) => {
|
|
var none = Symbol.for("object-stream.none");
|
|
var stop = Symbol.for("object-stream.stop");
|
|
var finalSymbol = Symbol.for("object-stream.final");
|
|
var manySymbol = Symbol.for("object-stream.many");
|
|
var flushSymbol = Symbol.for("object-stream.flush");
|
|
var fListSymbol = Symbol.for("object-stream.fList");
|
|
var finalValue = (value) => ({ [finalSymbol]: 1, value });
|
|
var many = (values) => ({ [manySymbol]: 1, values });
|
|
var isFinalValue = (o) => o && o[finalSymbol] === 1;
|
|
var isMany = (o) => o && o[manySymbol] === 1;
|
|
var isFlushable = (o) => o && o[flushSymbol] === 1;
|
|
var isFunctionList = (o) => o && o[fListSymbol] === 1;
|
|
var getFinalValue = (o) => o.value;
|
|
var getManyValues = (o) => o.values;
|
|
var getFunctionList = (o) => o.fList;
|
|
var flushable = (write, final2 = null) => {
|
|
const fn = final2 ? (value) => value === none ? final2() : write(value) : write;
|
|
fn[flushSymbol] = 1;
|
|
return fn;
|
|
};
|
|
var setFunctionList = (o, fns) => {
|
|
o.fList = fns;
|
|
o[fListSymbol] = 1;
|
|
return o;
|
|
};
|
|
var clearFunctionList = (o) => {
|
|
delete o.fList;
|
|
delete o[fListSymbol];
|
|
return o;
|
|
};
|
|
|
|
class Stop extends Error {
|
|
}
|
|
var toMany = (value) => value === none ? many([]) : value && value[manySymbol] === 1 ? value : many([value]);
|
|
var normalizeMany = (o) => {
|
|
if (o?.[manySymbol] === 1) {
|
|
switch (o.values.length) {
|
|
case 0:
|
|
return none;
|
|
case 1:
|
|
return o.values[0];
|
|
}
|
|
}
|
|
return o;
|
|
};
|
|
var combineMany = (a, b) => {
|
|
const values = a === none ? [] : a?.[manySymbol] === 1 ? a.values.slice() : [a];
|
|
if (b === none) {} else if (b?.[manySymbol] === 1) {
|
|
values.push(...b.values);
|
|
} else {
|
|
values.push(b);
|
|
}
|
|
return many(values);
|
|
};
|
|
var combineManyMut = (a, b) => {
|
|
const values = a === none ? [] : a?.[manySymbol] === 1 ? a.values : [a];
|
|
if (b === none) {} else if (b?.[manySymbol] === 1) {
|
|
values.push(...b.values);
|
|
} else {
|
|
values.push(b);
|
|
}
|
|
return many(values);
|
|
};
|
|
var final = finalValue;
|
|
exports.none = none;
|
|
exports.stop = stop;
|
|
exports.Stop = Stop;
|
|
exports.finalSymbol = finalSymbol;
|
|
exports.finalValue = finalValue;
|
|
exports.final = final;
|
|
exports.isFinalValue = isFinalValue;
|
|
exports.getFinalValue = getFinalValue;
|
|
exports.manySymbol = manySymbol;
|
|
exports.many = many;
|
|
exports.isMany = isMany;
|
|
exports.getManyValues = getManyValues;
|
|
exports.getFunctionList = getFunctionList;
|
|
exports.flushSymbol = flushSymbol;
|
|
exports.flushable = flushable;
|
|
exports.isFlushable = isFlushable;
|
|
exports.fListSymbol = fListSymbol;
|
|
exports.isFunctionList = isFunctionList;
|
|
exports.getFunctionList = getFunctionList;
|
|
exports.setFunctionList = setFunctionList;
|
|
exports.clearFunctionList = clearFunctionList;
|
|
exports.toMany = toMany;
|
|
exports.normalizeMany = normalizeMany;
|
|
exports.combineMany = combineMany;
|
|
exports.combineManyMut = combineManyMut;
|
|
});
|
|
|
|
// ../util/node_modules/stream-chain/src/gen.js
|
|
var require_gen = __commonJS((exports, module) => {
|
|
var defs = require_defs();
|
|
var next = async function* (value, fns, index2) {
|
|
for (let i = index2;i <= fns.length; ++i) {
|
|
if (value && typeof value.then == "function") {
|
|
value = await value;
|
|
}
|
|
if (value === defs.none)
|
|
break;
|
|
if (value === defs.stop)
|
|
throw new defs.Stop;
|
|
if (defs.isFinalValue(value)) {
|
|
yield defs.getFinalValue(value);
|
|
break;
|
|
}
|
|
if (defs.isMany(value)) {
|
|
const values = defs.getManyValues(value);
|
|
if (i == fns.length) {
|
|
yield* values;
|
|
} else {
|
|
for (let j = 0;j < values.length; ++j) {
|
|
yield* next(values[j], fns, i);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if (value && typeof value.next == "function") {
|
|
for (;; ) {
|
|
let data = value.next();
|
|
if (data && typeof data.then == "function") {
|
|
data = await data;
|
|
}
|
|
if (data.done)
|
|
break;
|
|
if (i == fns.length) {
|
|
yield data.value;
|
|
} else {
|
|
yield* next(data.value, fns, i);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if (i == fns.length) {
|
|
yield value;
|
|
break;
|
|
}
|
|
const f = fns[i];
|
|
value = f(value);
|
|
}
|
|
};
|
|
var gen = (...fns) => {
|
|
fns = fns.filter((fn) => fn).flat(Infinity).map((fn) => defs.isFunctionList(fn) ? defs.getFunctionList(fn) : fn).flat(Infinity);
|
|
if (!fns.length) {
|
|
fns = [(x) => x];
|
|
}
|
|
let flushed = false;
|
|
let g = async function* (value) {
|
|
if (flushed)
|
|
throw Error("Call to a flushed pipe.");
|
|
if (value !== defs.none) {
|
|
yield* next(value, fns, 0);
|
|
} else {
|
|
flushed = true;
|
|
for (let i = 0;i < fns.length; ++i) {
|
|
const f = fns[i];
|
|
if (defs.isFlushable(f)) {
|
|
yield* next(f(defs.none), fns, i + 1);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const needToFlush = fns.some((fn) => defs.isFlushable(fn));
|
|
if (needToFlush)
|
|
g = defs.flushable(g);
|
|
return defs.setFunctionList(g, fns);
|
|
};
|
|
module.exports = gen;
|
|
module.exports.next = next;
|
|
});
|
|
|
|
// ../util/node_modules/stream-chain/src/asStream.js
|
|
var require_asStream = __commonJS((exports, module) => {
|
|
var { Duplex } = __require("stream");
|
|
var defs = require_defs();
|
|
var asStream = (fn, options2) => {
|
|
if (typeof fn != "function")
|
|
throw TypeError("Only a function is accepted as the first argument");
|
|
let paused = Promise.resolve(), resolvePaused = null;
|
|
const queue = [];
|
|
const resume = () => {
|
|
if (!resolvePaused)
|
|
return;
|
|
resolvePaused();
|
|
resolvePaused = null;
|
|
paused = Promise.resolve();
|
|
};
|
|
const pause = () => {
|
|
if (resolvePaused)
|
|
return;
|
|
paused = new Promise((resolve) => resolvePaused = resolve);
|
|
};
|
|
let stream = null;
|
|
const pushResults = (values) => {
|
|
if (values && typeof values.next == "function") {
|
|
queue.push(values);
|
|
return;
|
|
}
|
|
queue.push(values[Symbol.iterator]());
|
|
};
|
|
const pump = async () => {
|
|
while (queue.length) {
|
|
await paused;
|
|
const gen = queue[queue.length - 1];
|
|
let result = gen.next();
|
|
if (result && typeof result.then == "function") {
|
|
result = await result;
|
|
}
|
|
if (result.done) {
|
|
queue.pop();
|
|
continue;
|
|
}
|
|
let value = result.value;
|
|
if (value && typeof value.then == "function") {
|
|
value = await value;
|
|
}
|
|
await sanitize(value);
|
|
}
|
|
};
|
|
const sanitize = async (value) => {
|
|
if (value === undefined || value === null || value === defs.none)
|
|
return;
|
|
if (value === defs.stop)
|
|
throw new defs.Stop;
|
|
if (defs.isMany(value)) {
|
|
pushResults(defs.getManyValues(value));
|
|
return pump();
|
|
}
|
|
if (defs.isFinalValue(value)) {
|
|
value = defs.getFinalValue(value);
|
|
return processValue(value);
|
|
}
|
|
if (!stream.push(value)) {
|
|
pause();
|
|
}
|
|
};
|
|
const processChunk = async (chunk, encoding) => {
|
|
try {
|
|
const value = fn(chunk, encoding);
|
|
await processValue(value);
|
|
} catch (error) {
|
|
if (error instanceof defs.Stop) {
|
|
stream.push(null);
|
|
stream.destroy();
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
};
|
|
const processValue = async (value) => {
|
|
if (value && typeof value.then == "function") {
|
|
return value.then((value2) => processValue(value2));
|
|
}
|
|
if (value && typeof value.next == "function") {
|
|
pushResults(value);
|
|
return pump();
|
|
}
|
|
return sanitize(value);
|
|
};
|
|
stream = new Duplex(Object.assign({ writableObjectMode: true, readableObjectMode: true }, options2, {
|
|
write(chunk, encoding, callback) {
|
|
processChunk(chunk, encoding).then(() => callback(null), (error) => callback(error));
|
|
},
|
|
final(callback) {
|
|
if (!defs.isFlushable(fn)) {
|
|
stream.push(null);
|
|
callback(null);
|
|
return;
|
|
}
|
|
processChunk(defs.none, null).then(() => (stream.push(null), callback(null)), (error) => callback(error));
|
|
},
|
|
read() {
|
|
resume();
|
|
}
|
|
}));
|
|
return stream;
|
|
};
|
|
module.exports = asStream;
|
|
});
|
|
|
|
// ../util/node_modules/stream-chain/src/index.js
|
|
var require_src = __commonJS((exports, module) => {
|
|
var { Readable, Writable, Duplex } = __require("stream");
|
|
var defs = require_defs();
|
|
var gen = require_gen();
|
|
var asStream = require_asStream();
|
|
var isReadableNodeStream = (obj) => obj && typeof obj.pipe === "function" && typeof obj.on === "function" && (!obj._writableState || (typeof obj._readableState === "object" ? obj._readableState.readable : null) !== false) && (!obj._writableState || obj._readableState);
|
|
var isWritableNodeStream = (obj) => obj && typeof obj.write === "function" && typeof obj.on === "function" && (!obj._readableState || (typeof obj._writableState === "object" ? obj._writableState.writable : null) !== false);
|
|
var isDuplexNodeStream = (obj) => obj && typeof obj.pipe === "function" && obj._readableState && typeof obj.on === "function" && typeof obj.write === "function";
|
|
var isReadableWebStream = (obj) => obj && globalThis.ReadableStream && obj instanceof globalThis.ReadableStream;
|
|
var isWritableWebStream = (obj) => obj && globalThis.WritableStream && obj instanceof globalThis.WritableStream;
|
|
var isDuplexWebStream = (obj) => obj && globalThis.ReadableStream && obj.readable instanceof globalThis.ReadableStream && globalThis.WritableStream && obj.writable instanceof globalThis.WritableStream;
|
|
var groupFunctions = (output, fn, index2, fns) => {
|
|
if (isDuplexNodeStream(fn) || !index2 && isReadableNodeStream(fn) || index2 === fns.length - 1 && isWritableNodeStream(fn)) {
|
|
output.push(fn);
|
|
return output;
|
|
}
|
|
if (isDuplexWebStream(fn)) {
|
|
output.push(Duplex.fromWeb(fn, { objectMode: true }));
|
|
return output;
|
|
}
|
|
if (!index2 && isReadableWebStream(fn)) {
|
|
output.push(Readable.fromWeb(fn, { objectMode: true }));
|
|
return output;
|
|
}
|
|
if (index2 === fns.length - 1 && isWritableWebStream(fn)) {
|
|
output.push(Writable.fromWeb(fn, { objectMode: true }));
|
|
return output;
|
|
}
|
|
if (typeof fn != "function")
|
|
throw TypeError("Item #" + index2 + " is not a proper stream, nor a function.");
|
|
if (!output.length)
|
|
output.push([]);
|
|
const last = output[output.length - 1];
|
|
if (Array.isArray(last)) {
|
|
last.push(fn);
|
|
} else {
|
|
output.push([fn]);
|
|
}
|
|
return output;
|
|
};
|
|
var produceStreams = (item) => {
|
|
if (Array.isArray(item)) {
|
|
if (!item.length)
|
|
return null;
|
|
if (item.length == 1)
|
|
return item[0] && chain.asStream(item[0]);
|
|
return chain.asStream(chain.gen(...item));
|
|
}
|
|
return item;
|
|
};
|
|
var wrapFunctions = (fn, index2, fns) => {
|
|
if (isDuplexNodeStream(fn) || !index2 && isReadableNodeStream(fn) || index2 === fns.length - 1 && isWritableNodeStream(fn)) {
|
|
return fn;
|
|
}
|
|
if (isDuplexWebStream(fn)) {
|
|
return Duplex.fromWeb(fn, { objectMode: true });
|
|
}
|
|
if (!index2 && isReadableWebStream(fn)) {
|
|
return Readable.fromWeb(fn, { objectMode: true });
|
|
}
|
|
if (index2 === fns.length - 1 && isWritableWebStream(fn)) {
|
|
return Writable.fromWeb(fn, { objectMode: true });
|
|
}
|
|
if (typeof fn == "function")
|
|
return chain.asStream(fn);
|
|
throw TypeError("Item #" + index2 + " is not a proper stream, nor a function.");
|
|
};
|
|
var write = (input, chunk, encoding, callback) => {
|
|
let error = null;
|
|
try {
|
|
input.write(chunk, encoding, (e) => callback(e || error));
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
};
|
|
var final = (input, callback) => {
|
|
let error = null;
|
|
try {
|
|
input.end(null, null, (e) => callback(e || error));
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
};
|
|
var read = (output) => {
|
|
output.resume();
|
|
};
|
|
var chain = (fns, options2) => {
|
|
if (!Array.isArray(fns) || !fns.length) {
|
|
throw TypeError("Chain's first argument should be a non-empty array.");
|
|
}
|
|
fns = fns.flat(Infinity).filter((fn) => fn);
|
|
const streams = (options2 && options2.noGrouping ? fns.map(wrapFunctions) : fns.map((fn) => defs.isFunctionList(fn) ? defs.getFunctionList(fn) : fn).flat(Infinity).reduce(groupFunctions, []).map(produceStreams)).filter((s) => s), input = streams[0], output = streams.reduce((output2, item) => output2 && output2.pipe(item) || item);
|
|
let stream = null;
|
|
let writeMethod = (chunk, encoding, callback) => write(input, chunk, encoding, callback), finalMethod = (callback) => final(input, callback), readMethod = () => read(output);
|
|
if (!isWritableNodeStream(input)) {
|
|
writeMethod = (_1, _2, callback) => callback(null);
|
|
finalMethod = (callback) => callback(null);
|
|
input.on("end", () => stream.end());
|
|
}
|
|
if (isReadableNodeStream(output)) {
|
|
output.on("data", (chunk) => !stream.push(chunk) && output.pause());
|
|
output.on("end", () => stream.push(null));
|
|
} else {
|
|
readMethod = () => {};
|
|
output.on("finish", () => stream.push(null));
|
|
}
|
|
stream = new Duplex(Object.assign({ writableObjectMode: true, readableObjectMode: true }, options2, {
|
|
readable: isReadableNodeStream(output),
|
|
writable: isWritableNodeStream(input),
|
|
write: writeMethod,
|
|
final: finalMethod,
|
|
read: readMethod
|
|
}));
|
|
stream.streams = streams;
|
|
stream.input = input;
|
|
stream.output = output;
|
|
if (!isReadableNodeStream(output)) {
|
|
stream.resume();
|
|
}
|
|
if (!options2 || !options2.skipEvents) {
|
|
streams.forEach((item) => item.on("error", (error) => stream.emit("error", error)));
|
|
}
|
|
return stream;
|
|
};
|
|
var dataSource = (fn) => {
|
|
if (typeof fn == "function")
|
|
return fn;
|
|
if (fn) {
|
|
if (typeof fn[Symbol.asyncIterator] == "function")
|
|
return fn[Symbol.asyncIterator].bind(fn);
|
|
if (typeof fn[Symbol.iterator] == "function")
|
|
return fn[Symbol.iterator].bind(fn);
|
|
}
|
|
throw new TypeError("The argument should be a function or an iterable object.");
|
|
};
|
|
module.exports = chain;
|
|
module.exports.none = defs.none;
|
|
module.exports.stop = defs.stop;
|
|
module.exports.Stop = defs.Stop;
|
|
module.exports.finalSymbol = defs.finalSymbol;
|
|
module.exports.finalValue = defs.finalValue;
|
|
module.exports.final = defs.final;
|
|
module.exports.isFinalValue = defs.isFinalValue;
|
|
module.exports.getFinalValue = defs.getFinalValue;
|
|
module.exports.manySymbol = defs.manySymbol;
|
|
module.exports.many = defs.many;
|
|
module.exports.isMany = defs.isMany;
|
|
module.exports.getManyValues = defs.getManyValues;
|
|
module.exports.getFunctionList = defs.getFunctionList;
|
|
module.exports.flushSymbol = defs.flushSymbol;
|
|
module.exports.flushable = defs.flushable;
|
|
module.exports.isFlushable = defs.isFlushable;
|
|
module.exports.fListSymbol = defs.fListSymbol;
|
|
module.exports.isFunctionList = defs.isFunctionList;
|
|
module.exports.getFunctionList = defs.getFunctionList;
|
|
module.exports.setFunctionList = defs.setFunctionList;
|
|
module.exports.clearFunctionList = defs.clearFunctionList;
|
|
module.exports.toMany = defs.toMany;
|
|
module.exports.normalizeMany = defs.normalizeMany;
|
|
module.exports.combineMany = defs.combineMany;
|
|
module.exports.combineManyMut = defs.combineManyMut;
|
|
module.exports.chain = chain;
|
|
module.exports.chainUnchecked = chain;
|
|
module.exports.gen = gen;
|
|
module.exports.asStream = asStream;
|
|
module.exports.dataSource = dataSource;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/utils/Utf8Stream.js
|
|
var require_Utf8Stream = __commonJS((exports, module) => {
|
|
var { Transform } = __require("stream");
|
|
var { StringDecoder } = __require("string_decoder");
|
|
|
|
class Utf8Stream extends Transform {
|
|
constructor(options2) {
|
|
super(Object.assign({}, options2, { writableObjectMode: false }));
|
|
this._buffer = "";
|
|
}
|
|
_transform(chunk, encoding, callback) {
|
|
if (typeof chunk == "string") {
|
|
this._transform = this._transformString;
|
|
} else {
|
|
this._stringDecoder = new StringDecoder;
|
|
this._transform = this._transformBuffer;
|
|
}
|
|
this._transform(chunk, encoding, callback);
|
|
}
|
|
_transformBuffer(chunk, _, callback) {
|
|
this._buffer += this._stringDecoder.write(chunk);
|
|
this._processBuffer(callback);
|
|
}
|
|
_transformString(chunk, _, callback) {
|
|
this._buffer += chunk.toString();
|
|
this._processBuffer(callback);
|
|
}
|
|
_processBuffer(callback) {
|
|
if (this._buffer) {
|
|
this.push(this._buffer, "utf8");
|
|
this._buffer = "";
|
|
}
|
|
callback(null);
|
|
}
|
|
_flushInput() {
|
|
if (this._stringDecoder) {
|
|
this._buffer += this._stringDecoder.end();
|
|
}
|
|
}
|
|
_flush(callback) {
|
|
this._flushInput();
|
|
this._processBuffer(callback);
|
|
}
|
|
}
|
|
module.exports = Utf8Stream;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/Parser.js
|
|
var require_Parser = __commonJS((exports, module) => {
|
|
var Utf8Stream = require_Utf8Stream();
|
|
var patterns = {
|
|
value1: /^(?:[\"\{\[\]\-\d]|true\b|false\b|null\b|\s{1,256})/,
|
|
string: /^(?:[^\x00-\x1f\"\\]{1,256}|\\[bfnrt\"\\\/]|\\u[\da-fA-F]{4}|\")/,
|
|
key1: /^(?:[\"\}]|\s{1,256})/,
|
|
colon: /^(?:\:|\s{1,256})/,
|
|
comma: /^(?:[\,\]\}]|\s{1,256})/,
|
|
ws: /^\s{1,256}/,
|
|
numberStart: /^\d/,
|
|
numberDigit: /^\d{0,256}/,
|
|
numberFraction: /^[\.eE]/,
|
|
numberExponent: /^[eE]/,
|
|
numberExpSign: /^[-+]/
|
|
};
|
|
var MAX_PATTERN_SIZE = 16;
|
|
var noSticky = true;
|
|
try {
|
|
new RegExp(".", "y");
|
|
noSticky = false;
|
|
} catch (e) {}
|
|
!noSticky && Object.keys(patterns).forEach((key) => {
|
|
let src = patterns[key].source.slice(1);
|
|
if (src.slice(0, 3) === "(?:" && src.slice(-1) === ")") {
|
|
src = src.slice(3, -1);
|
|
}
|
|
patterns[key] = new RegExp(src, "y");
|
|
});
|
|
patterns.numberFracStart = patterns.numberExpStart = patterns.numberStart;
|
|
patterns.numberFracDigit = patterns.numberExpDigit = patterns.numberDigit;
|
|
var values = { true: true, false: false, null: null };
|
|
var expected = { object: "objectStop", array: "arrayStop", "": "done" };
|
|
var fromHex = (s) => String.fromCharCode(parseInt(s.slice(2), 16));
|
|
var codes = { b: "\b", f: "\f", n: `
|
|
`, r: "\r", t: "\t", '"': '"', "\\": "\\", "/": "/" };
|
|
|
|
class Parser extends Utf8Stream {
|
|
static make(options2) {
|
|
return new Parser(options2);
|
|
}
|
|
constructor(options2) {
|
|
super(Object.assign({}, options2, { readableObjectMode: true }));
|
|
this._packKeys = this._packStrings = this._packNumbers = this._streamKeys = this._streamStrings = this._streamNumbers = true;
|
|
if (options2) {
|
|
"packValues" in options2 && (this._packKeys = this._packStrings = this._packNumbers = options2.packValues);
|
|
"packKeys" in options2 && (this._packKeys = options2.packKeys);
|
|
"packStrings" in options2 && (this._packStrings = options2.packStrings);
|
|
"packNumbers" in options2 && (this._packNumbers = options2.packNumbers);
|
|
"streamValues" in options2 && (this._streamKeys = this._streamStrings = this._streamNumbers = options2.streamValues);
|
|
"streamKeys" in options2 && (this._streamKeys = options2.streamKeys);
|
|
"streamStrings" in options2 && (this._streamStrings = options2.streamStrings);
|
|
"streamNumbers" in options2 && (this._streamNumbers = options2.streamNumbers);
|
|
this._jsonStreaming = options2.jsonStreaming;
|
|
}
|
|
!this._packKeys && (this._streamKeys = true);
|
|
!this._packStrings && (this._streamStrings = true);
|
|
!this._packNumbers && (this._streamNumbers = true);
|
|
this._done = false;
|
|
this._expect = this._jsonStreaming ? "done" : "value";
|
|
this._stack = [];
|
|
this._parent = "";
|
|
this._open_number = false;
|
|
this._accumulator = "";
|
|
}
|
|
_flush(callback) {
|
|
this._done = true;
|
|
super._flush((error) => {
|
|
if (error)
|
|
return callback(error);
|
|
if (this._open_number) {
|
|
if (this._streamNumbers) {
|
|
this.push({ name: "endNumber" });
|
|
}
|
|
this._open_number = false;
|
|
if (this._packNumbers) {
|
|
this.push({ name: "numberValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
}
|
|
callback(null);
|
|
});
|
|
}
|
|
_processBuffer(callback) {
|
|
let match, value, index2 = 0;
|
|
main:
|
|
for (;; ) {
|
|
switch (this._expect) {
|
|
case "value1":
|
|
case "value":
|
|
patterns.value1.lastIndex = index2;
|
|
match = patterns.value1.exec(this._buffer);
|
|
if (!match) {
|
|
if (this._done || index2 + MAX_PATTERN_SIZE < this._buffer.length) {
|
|
if (index2 < this._buffer.length)
|
|
return callback(new Error("Parser cannot parse input: expected a value"));
|
|
return callback(new Error("Parser has expected a value"));
|
|
}
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
switch (value) {
|
|
case '"':
|
|
this._streamStrings && this.push({ name: "startString" });
|
|
this._expect = "string";
|
|
break;
|
|
case "{":
|
|
this.push({ name: "startObject" });
|
|
this._stack.push(this._parent);
|
|
this._parent = "object";
|
|
this._expect = "key1";
|
|
break;
|
|
case "[":
|
|
this.push({ name: "startArray" });
|
|
this._stack.push(this._parent);
|
|
this._parent = "array";
|
|
this._expect = "value1";
|
|
break;
|
|
case "]":
|
|
if (this._expect !== "value1")
|
|
return callback(new Error("Parser cannot parse input: unexpected token ']'"));
|
|
if (this._open_number) {
|
|
this._streamNumbers && this.push({ name: "endNumber" });
|
|
this._open_number = false;
|
|
if (this._packNumbers) {
|
|
this.push({ name: "numberValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
}
|
|
this.push({ name: "endArray" });
|
|
this._parent = this._stack.pop();
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
case "-":
|
|
this._open_number = true;
|
|
if (this._streamNumbers) {
|
|
this.push({ name: "startNumber" });
|
|
this.push({ name: "numberChunk", value: "-" });
|
|
}
|
|
this._packNumbers && (this._accumulator = "-");
|
|
this._expect = "numberStart";
|
|
break;
|
|
case "0":
|
|
this._open_number = true;
|
|
if (this._streamNumbers) {
|
|
this.push({ name: "startNumber" });
|
|
this.push({ name: "numberChunk", value: "0" });
|
|
}
|
|
this._packNumbers && (this._accumulator = "0");
|
|
this._expect = "numberFraction";
|
|
break;
|
|
case "1":
|
|
case "2":
|
|
case "3":
|
|
case "4":
|
|
case "5":
|
|
case "6":
|
|
case "7":
|
|
case "8":
|
|
case "9":
|
|
this._open_number = true;
|
|
if (this._streamNumbers) {
|
|
this.push({ name: "startNumber" });
|
|
this.push({ name: "numberChunk", value });
|
|
}
|
|
this._packNumbers && (this._accumulator = value);
|
|
this._expect = "numberDigit";
|
|
break;
|
|
case "true":
|
|
case "false":
|
|
case "null":
|
|
if (this._buffer.length - index2 === value.length && !this._done)
|
|
break main;
|
|
this.push({ name: value + "Value", value: values[value] });
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "keyVal":
|
|
case "string":
|
|
patterns.string.lastIndex = index2;
|
|
match = patterns.string.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length && (this._done || this._buffer.length - index2 >= 6))
|
|
return callback(new Error("Parser cannot parse input: escaped characters"));
|
|
if (this._done)
|
|
return callback(new Error("Parser has expected a string value"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
if (value === '"') {
|
|
if (this._expect === "keyVal") {
|
|
this._streamKeys && this.push({ name: "endKey" });
|
|
if (this._packKeys) {
|
|
this.push({ name: "keyValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
this._expect = "colon";
|
|
} else {
|
|
this._streamStrings && this.push({ name: "endString" });
|
|
if (this._packStrings) {
|
|
this.push({ name: "stringValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
this._expect = expected[this._parent];
|
|
}
|
|
} else if (value.length > 1 && value.charAt(0) === "\\") {
|
|
const t = value.length == 2 ? codes[value.charAt(1)] : fromHex(value);
|
|
if (this._expect === "keyVal" ? this._streamKeys : this._streamStrings) {
|
|
this.push({ name: "stringChunk", value: t });
|
|
}
|
|
if (this._expect === "keyVal" ? this._packKeys : this._packStrings) {
|
|
this._accumulator += t;
|
|
}
|
|
} else {
|
|
if (this._expect === "keyVal" ? this._streamKeys : this._streamStrings) {
|
|
this.push({ name: "stringChunk", value });
|
|
}
|
|
if (this._expect === "keyVal" ? this._packKeys : this._packStrings) {
|
|
this._accumulator += value;
|
|
}
|
|
}
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "key1":
|
|
case "key":
|
|
patterns.key1.lastIndex = index2;
|
|
match = patterns.key1.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected an object key"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
if (value === '"') {
|
|
this._streamKeys && this.push({ name: "startKey" });
|
|
this._expect = "keyVal";
|
|
} else if (value === "}") {
|
|
if (this._expect !== "key1")
|
|
return callback(new Error("Parser cannot parse input: unexpected token '}'"));
|
|
this.push({ name: "endObject" });
|
|
this._parent = this._stack.pop();
|
|
this._expect = expected[this._parent];
|
|
}
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "colon":
|
|
patterns.colon.lastIndex = index2;
|
|
match = patterns.colon.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected ':'"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
value === ":" && (this._expect = "value");
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "arrayStop":
|
|
case "objectStop":
|
|
patterns.comma.lastIndex = index2;
|
|
match = patterns.comma.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected ','"));
|
|
break main;
|
|
}
|
|
if (this._open_number) {
|
|
this._streamNumbers && this.push({ name: "endNumber" });
|
|
this._open_number = false;
|
|
if (this._packNumbers) {
|
|
this.push({ name: "numberValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
}
|
|
value = match[0];
|
|
if (value === ",") {
|
|
this._expect = this._expect === "arrayStop" ? "value" : "key";
|
|
} else if (value === "}" || value === "]") {
|
|
if (value === "}" ? this._expect === "arrayStop" : this._expect !== "arrayStop") {
|
|
return callback(new Error("Parser cannot parse input: expected '" + (this._expect === "arrayStop" ? "]" : "}") + "'"));
|
|
}
|
|
this.push({ name: value === "}" ? "endObject" : "endArray" });
|
|
this._parent = this._stack.pop();
|
|
this._expect = expected[this._parent];
|
|
}
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberStart":
|
|
patterns.numberStart.lastIndex = index2;
|
|
match = patterns.numberStart.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected a starting digit"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = value === "0" ? "numberFraction" : "numberDigit";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberDigit":
|
|
patterns.numberDigit.lastIndex = index2;
|
|
match = patterns.numberDigit.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected a digit"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
if (value) {
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
} else {
|
|
if (index2 < this._buffer.length) {
|
|
this._expect = "numberFraction";
|
|
break;
|
|
}
|
|
if (this._done) {
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
break main;
|
|
}
|
|
break;
|
|
case "numberFraction":
|
|
patterns.numberFraction.lastIndex = index2;
|
|
match = patterns.numberFraction.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done) {
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = value === "." ? "numberFracStart" : "numberExpSign";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberFracStart":
|
|
patterns.numberFracStart.lastIndex = index2;
|
|
match = patterns.numberFracStart.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected a fractional part of a number"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = "numberFracDigit";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberFracDigit":
|
|
patterns.numberFracDigit.lastIndex = index2;
|
|
match = patterns.numberFracDigit.exec(this._buffer);
|
|
value = match[0];
|
|
if (value) {
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
} else {
|
|
if (index2 < this._buffer.length) {
|
|
this._expect = "numberExponent";
|
|
break;
|
|
}
|
|
if (this._done) {
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
break main;
|
|
}
|
|
break;
|
|
case "numberExponent":
|
|
patterns.numberExponent.lastIndex = index2;
|
|
match = patterns.numberExponent.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length) {
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
if (this._done) {
|
|
this._expect = "done";
|
|
break;
|
|
}
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = "numberExpSign";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberExpSign":
|
|
patterns.numberExpSign.lastIndex = index2;
|
|
match = patterns.numberExpSign.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length) {
|
|
this._expect = "numberExpStart";
|
|
break;
|
|
}
|
|
if (this._done)
|
|
return callback(new Error("Parser has expected an exponent value of a number"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = "numberExpStart";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberExpStart":
|
|
patterns.numberExpStart.lastIndex = index2;
|
|
match = patterns.numberExpStart.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length || this._done)
|
|
return callback(new Error("Parser cannot parse input: expected an exponent part of a number"));
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
this._expect = "numberExpDigit";
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
case "numberExpDigit":
|
|
patterns.numberExpDigit.lastIndex = index2;
|
|
match = patterns.numberExpDigit.exec(this._buffer);
|
|
value = match[0];
|
|
if (value) {
|
|
this._streamNumbers && this.push({ name: "numberChunk", value });
|
|
this._packNumbers && (this._accumulator += value);
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
} else {
|
|
if (index2 < this._buffer.length || this._done) {
|
|
this._expect = expected[this._parent];
|
|
break;
|
|
}
|
|
break main;
|
|
}
|
|
break;
|
|
case "done":
|
|
patterns.ws.lastIndex = index2;
|
|
match = patterns.ws.exec(this._buffer);
|
|
if (!match) {
|
|
if (index2 < this._buffer.length) {
|
|
if (this._jsonStreaming) {
|
|
this._expect = "value";
|
|
break;
|
|
}
|
|
return callback(new Error("Parser cannot parse input: unexpected characters"));
|
|
}
|
|
break main;
|
|
}
|
|
value = match[0];
|
|
if (this._open_number) {
|
|
this._streamNumbers && this.push({ name: "endNumber" });
|
|
this._open_number = false;
|
|
if (this._packNumbers) {
|
|
this.push({ name: "numberValue", value: this._accumulator });
|
|
this._accumulator = "";
|
|
}
|
|
}
|
|
if (noSticky) {
|
|
this._buffer = this._buffer.slice(value.length);
|
|
} else {
|
|
index2 += value.length;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
!noSticky && (this._buffer = this._buffer.slice(index2));
|
|
callback(null);
|
|
}
|
|
}
|
|
Parser.parser = Parser.make;
|
|
Parser.make.Constructor = Parser;
|
|
module.exports = Parser;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/utils/emit.js
|
|
var require_emit = __commonJS((exports, module) => {
|
|
var emit = (stream) => stream.on("data", (item) => stream.emit(item.name, item.value));
|
|
module.exports = emit;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/index.js
|
|
var require_stream_json = __commonJS((exports, module) => {
|
|
var Parser = require_Parser();
|
|
var emit = require_emit();
|
|
var make = (options2) => emit(new Parser(options2));
|
|
make.Parser = Parser;
|
|
make.parser = Parser.parser;
|
|
module.exports = make;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/Assembler.js
|
|
var require_Assembler = __commonJS((exports, module) => {
|
|
var EventEmitter = __require("events");
|
|
var startObject = (Ctr) => function() {
|
|
if (this.done) {
|
|
this.done = false;
|
|
} else {
|
|
this.stack.push(this.current, this.key);
|
|
}
|
|
this.current = new Ctr;
|
|
this.key = null;
|
|
};
|
|
|
|
class Assembler extends EventEmitter {
|
|
static connectTo(stream, options2) {
|
|
return new Assembler(options2).connectTo(stream);
|
|
}
|
|
constructor(options2) {
|
|
super();
|
|
this.stack = [];
|
|
this.current = this.key = null;
|
|
this.done = true;
|
|
if (options2) {
|
|
this.reviver = typeof options2.reviver == "function" && options2.reviver;
|
|
if (this.reviver) {
|
|
this.stringValue = this._saveValue = this._saveValueWithReviver;
|
|
}
|
|
if (options2.numberAsString) {
|
|
this.numberValue = this.stringValue;
|
|
}
|
|
}
|
|
}
|
|
connectTo(stream) {
|
|
stream.on("data", (chunk) => {
|
|
if (this[chunk.name]) {
|
|
this[chunk.name](chunk.value);
|
|
if (this.done)
|
|
this.emit("done", this);
|
|
}
|
|
});
|
|
return this;
|
|
}
|
|
get depth() {
|
|
return (this.stack.length >> 1) + (this.done ? 0 : 1);
|
|
}
|
|
get path() {
|
|
const path = [];
|
|
for (let i = 0;i < this.stack.length; i += 2) {
|
|
const key = this.stack[i + 1];
|
|
path.push(key === null ? this.stack[i].length : key);
|
|
}
|
|
return path;
|
|
}
|
|
dropToLevel(level) {
|
|
if (level < this.depth) {
|
|
if (level) {
|
|
const index2 = level - 1 << 1;
|
|
this.current = this.stack[index2];
|
|
this.key = this.stack[index2 + 1];
|
|
this.stack.splice(index2);
|
|
} else {
|
|
this.stack = [];
|
|
this.current = this.key = null;
|
|
this.done = true;
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
consume(chunk) {
|
|
this[chunk.name] && this[chunk.name](chunk.value);
|
|
return this;
|
|
}
|
|
keyValue(value) {
|
|
this.key = value;
|
|
}
|
|
numberValue(value) {
|
|
this._saveValue(parseFloat(value));
|
|
}
|
|
nullValue() {
|
|
this._saveValue(null);
|
|
}
|
|
trueValue() {
|
|
this._saveValue(true);
|
|
}
|
|
falseValue() {
|
|
this._saveValue(false);
|
|
}
|
|
endObject() {
|
|
if (this.stack.length) {
|
|
const value = this.current;
|
|
this.key = this.stack.pop();
|
|
this.current = this.stack.pop();
|
|
this._saveValue(value);
|
|
} else {
|
|
this.done = true;
|
|
}
|
|
}
|
|
_saveValue(value) {
|
|
if (this.done) {
|
|
this.current = value;
|
|
} else {
|
|
if (this.current instanceof Array) {
|
|
this.current.push(value);
|
|
} else {
|
|
this.current[this.key] = value;
|
|
this.key = null;
|
|
}
|
|
}
|
|
}
|
|
_saveValueWithReviver(value) {
|
|
if (this.done) {
|
|
this.current = this.reviver("", value);
|
|
} else {
|
|
if (this.current instanceof Array) {
|
|
value = this.reviver("" + this.current.length, value);
|
|
this.current.push(value);
|
|
if (value === undefined) {
|
|
delete this.current[this.current.length - 1];
|
|
}
|
|
} else {
|
|
value = this.reviver(this.key, value);
|
|
if (value !== undefined) {
|
|
this.current[this.key] = value;
|
|
}
|
|
this.key = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Assembler.prototype.stringValue = Assembler.prototype._saveValue;
|
|
Assembler.prototype.startObject = startObject(Object);
|
|
Assembler.prototype.startArray = startObject(Array);
|
|
Assembler.prototype.endArray = Assembler.prototype.endObject;
|
|
module.exports = Assembler;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/streamers/StreamBase.js
|
|
var require_StreamBase = __commonJS((exports, module) => {
|
|
var { Transform } = __require("stream");
|
|
var Assembler = require_Assembler();
|
|
|
|
class Counter {
|
|
constructor(initialDepth) {
|
|
this.depth = initialDepth;
|
|
}
|
|
startObject() {
|
|
++this.depth;
|
|
}
|
|
endObject() {
|
|
--this.depth;
|
|
}
|
|
startArray() {
|
|
++this.depth;
|
|
}
|
|
endArray() {
|
|
--this.depth;
|
|
}
|
|
}
|
|
|
|
class StreamBase extends Transform {
|
|
constructor(options2) {
|
|
super(Object.assign({}, options2, { writableObjectMode: true, readableObjectMode: true }));
|
|
if (options2) {
|
|
this.objectFilter = options2.objectFilter;
|
|
this.includeUndecided = options2.includeUndecided;
|
|
}
|
|
if (typeof this.objectFilter != "function") {
|
|
this._filter = this._transform;
|
|
}
|
|
this._transform = this._wait || this._filter;
|
|
this._assembler = new Assembler(options2);
|
|
}
|
|
_transform(chunk, encoding, callback) {
|
|
if (this._assembler[chunk.name]) {
|
|
this._assembler[chunk.name](chunk.value);
|
|
if (this._assembler.depth === this._level) {
|
|
this._push();
|
|
}
|
|
}
|
|
callback(null);
|
|
}
|
|
_filter(chunk, encoding, callback) {
|
|
if (this._assembler[chunk.name]) {
|
|
this._assembler[chunk.name](chunk.value);
|
|
const result = this.objectFilter(this._assembler);
|
|
if (result) {
|
|
if (this._assembler.depth === this._level) {
|
|
this._push();
|
|
this._transform = this._filter;
|
|
}
|
|
this._transform = this._accept;
|
|
return callback(null);
|
|
}
|
|
if (result === false) {
|
|
this._saved_assembler = this._assembler;
|
|
this._assembler = new Counter(this._saved_assembler.depth);
|
|
this._saved_assembler.dropToLevel(this._level);
|
|
if (this._assembler.depth === this._level) {
|
|
this._assembler = this._saved_assembler;
|
|
this._transform = this._filter;
|
|
}
|
|
this._transform = this._reject;
|
|
return callback(null);
|
|
}
|
|
if (this._assembler.depth === this._level) {
|
|
this._push(!this.includeUndecided);
|
|
}
|
|
}
|
|
callback(null);
|
|
}
|
|
_accept(chunk, encoding, callback) {
|
|
if (this._assembler[chunk.name]) {
|
|
this._assembler[chunk.name](chunk.value);
|
|
if (this._assembler.depth === this._level) {
|
|
this._push();
|
|
this._transform = this._filter;
|
|
}
|
|
}
|
|
callback(null);
|
|
}
|
|
_reject(chunk, encoding, callback) {
|
|
if (this._assembler[chunk.name]) {
|
|
this._assembler[chunk.name](chunk.value);
|
|
if (this._assembler.depth === this._level) {
|
|
this._assembler = this._saved_assembler;
|
|
this._transform = this._filter;
|
|
}
|
|
}
|
|
callback(null);
|
|
}
|
|
}
|
|
module.exports = StreamBase;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/node_modules/stream-chain/index.js
|
|
var require_stream_chain = __commonJS((exports, module) => {
|
|
var { Readable, Writable, Duplex, Transform } = __require("stream");
|
|
var none = Symbol.for("object-stream.none");
|
|
var finalSymbol = Symbol.for("object-stream.final");
|
|
var manySymbol = Symbol.for("object-stream.many");
|
|
var final = (value) => ({ [finalSymbol]: value });
|
|
var many = (values) => ({ [manySymbol]: values });
|
|
var isFinal = (o) => o && typeof o == "object" && (finalSymbol in o);
|
|
var isMany = (o) => o && typeof o == "object" && (manySymbol in o);
|
|
var getFinalValue = (o) => o[finalSymbol];
|
|
var getManyValues = (o) => o[manySymbol];
|
|
var runAsyncGenerator = async (gen, stream) => {
|
|
for (;; ) {
|
|
let data = gen.next();
|
|
if (data && typeof data.then == "function") {
|
|
data = await data;
|
|
}
|
|
if (data.done)
|
|
break;
|
|
let value = data.value;
|
|
if (value && typeof value.then == "function") {
|
|
value = await value;
|
|
}
|
|
Chain.sanitize(value, stream);
|
|
}
|
|
};
|
|
var wrapFunction = (fn) => new Transform({
|
|
writableObjectMode: true,
|
|
readableObjectMode: true,
|
|
transform(chunk, encoding, callback) {
|
|
try {
|
|
const result = fn.call(this, chunk, encoding);
|
|
if (result && typeof result.then == "function") {
|
|
result.then((result2) => (Chain.sanitize(result2, this), callback(null)), (error) => callback(error));
|
|
return;
|
|
}
|
|
if (result && typeof result.next == "function") {
|
|
runAsyncGenerator(result, this).then(() => callback(null), (error) => callback(error));
|
|
return;
|
|
}
|
|
Chain.sanitize(result, this);
|
|
callback(null);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
}
|
|
});
|
|
var wrapArray = (fns) => new Transform({
|
|
writableObjectMode: true,
|
|
readableObjectMode: true,
|
|
transform(chunk, encoding, callback) {
|
|
try {
|
|
let value = chunk;
|
|
for (let i = 0;i < fns.length; ++i) {
|
|
const result = fns[i].call(this, value, encoding);
|
|
if (result === Chain.none) {
|
|
callback(null);
|
|
return;
|
|
}
|
|
if (Chain.isFinal(result)) {
|
|
value = Chain.getFinalValue(result);
|
|
break;
|
|
}
|
|
value = result;
|
|
}
|
|
Chain.sanitize(value, this);
|
|
callback(null);
|
|
} catch (error) {
|
|
callback(error);
|
|
}
|
|
}
|
|
});
|
|
var isReadableNodeStream = (obj) => obj && typeof obj.pipe === "function" && typeof obj.on === "function" && (!obj._writableState || (typeof obj._readableState === "object" ? obj._readableState.readable : null) !== false) && (!obj._writableState || obj._readableState);
|
|
var isWritableNodeStream = (obj) => obj && typeof obj.write === "function" && typeof obj.on === "function" && (!obj._readableState || (typeof obj._writableState === "object" ? obj._writableState.writable : null) !== false);
|
|
var isDuplexNodeStream = (obj) => obj && typeof obj.pipe === "function" && obj._readableState && typeof obj.on === "function" && typeof obj.write === "function";
|
|
|
|
class Chain extends Duplex {
|
|
constructor(fns, options2) {
|
|
super(options2 || { writableObjectMode: true, readableObjectMode: true });
|
|
if (!(fns instanceof Array) || !fns.length) {
|
|
throw Error("Chain's argument should be a non-empty array.");
|
|
}
|
|
this.streams = fns.filter((fn) => fn).map((fn, index2, fns2) => {
|
|
if (typeof fn === "function" || fn instanceof Array)
|
|
return Chain.convertToTransform(fn);
|
|
if (isDuplexNodeStream(fn) || !index2 && isReadableNodeStream(fn) || index2 === fns2.length - 1 && isWritableNodeStream(fn)) {
|
|
return fn;
|
|
}
|
|
throw Error("Arguments should be functions, arrays or streams.");
|
|
}).filter((s) => s);
|
|
this.input = this.streams[0];
|
|
this.output = this.streams.reduce((output, stream) => output && output.pipe(stream) || stream);
|
|
if (!isWritableNodeStream(this.input)) {
|
|
this._write = (_1, _2, callback) => callback(null);
|
|
this._final = (callback) => callback(null);
|
|
this.input.on("end", () => this.end());
|
|
}
|
|
if (isReadableNodeStream(this.output)) {
|
|
this.output.on("data", (chunk) => !this.push(chunk) && this.output.pause());
|
|
this.output.on("end", () => this.push(null));
|
|
} else {
|
|
this._read = () => {};
|
|
this.resume();
|
|
this.output.on("finish", () => this.push(null));
|
|
}
|
|
if (!options2 || !options2.skipEvents) {
|
|
this.streams.forEach((stream) => stream.on("error", (error) => this.emit("error", error)));
|
|
}
|
|
}
|
|
_write(chunk, encoding, callback) {
|
|
let error = null;
|
|
try {
|
|
this.input.write(chunk, encoding, (e) => callback(e || error));
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
}
|
|
_final(callback) {
|
|
let error = null;
|
|
try {
|
|
this.input.end(null, null, (e) => callback(e || error));
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
}
|
|
_read() {
|
|
this.output.resume();
|
|
}
|
|
static make(fns, options2) {
|
|
return new Chain(fns, options2);
|
|
}
|
|
static sanitize(result, stream) {
|
|
if (Chain.isFinal(result)) {
|
|
result = Chain.getFinalValue(result);
|
|
} else if (Chain.isMany(result)) {
|
|
result = Chain.getManyValues(result);
|
|
}
|
|
if (result !== undefined && result !== null && result !== Chain.none) {
|
|
if (result instanceof Array) {
|
|
result.forEach((value) => value !== undefined && value !== null && stream.push(value));
|
|
} else {
|
|
stream.push(result);
|
|
}
|
|
}
|
|
}
|
|
static convertToTransform(fn) {
|
|
if (typeof fn === "function")
|
|
return wrapFunction(fn);
|
|
if (fn instanceof Array)
|
|
return fn.length ? wrapArray(fn) : null;
|
|
return null;
|
|
}
|
|
}
|
|
Chain.none = none;
|
|
Chain.final = final;
|
|
Chain.isFinal = isFinal;
|
|
Chain.getFinalValue = getFinalValue;
|
|
Chain.many = many;
|
|
Chain.isMany = isMany;
|
|
Chain.getManyValues = getManyValues;
|
|
Chain.chain = Chain.make;
|
|
Chain.make.Constructor = Chain;
|
|
module.exports = Chain;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/utils/withParser.js
|
|
var require_withParser = __commonJS((exports, module) => {
|
|
var { chain } = require_stream_chain();
|
|
var Parser = require_Parser();
|
|
var withParser = (fn, options2) => chain([new Parser(options2), fn(options2)], Object.assign({}, options2, { writableObjectMode: false, readableObjectMode: true }));
|
|
module.exports = withParser;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/streamers/StreamArray.js
|
|
var require_StreamArray = __commonJS((exports, module) => {
|
|
var StreamBase = require_StreamBase();
|
|
var withParser = require_withParser();
|
|
|
|
class StreamArray extends StreamBase {
|
|
static make(options2) {
|
|
return new StreamArray(options2);
|
|
}
|
|
static withParser(options2) {
|
|
return withParser(StreamArray.make, options2);
|
|
}
|
|
constructor(options2) {
|
|
super(options2);
|
|
this._level = 1;
|
|
this._counter = 0;
|
|
}
|
|
_wait(chunk, _, callback) {
|
|
if (chunk.name !== "startArray") {
|
|
return callback(new Error("Top-level object should be an array."));
|
|
}
|
|
this._transform = this._filter;
|
|
return this._transform(chunk, _, callback);
|
|
}
|
|
_push(discard) {
|
|
if (this._assembler.current.length) {
|
|
if (discard) {
|
|
++this._counter;
|
|
this._assembler.current.pop();
|
|
} else {
|
|
this.push({ key: this._counter++, value: this._assembler.current.pop() });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
StreamArray.streamArray = StreamArray.make;
|
|
StreamArray.make.Constructor = StreamArray;
|
|
module.exports = StreamArray;
|
|
});
|
|
|
|
// ../util/node_modules/stream-json/streamers/StreamObject.js
|
|
var require_StreamObject = __commonJS((exports, module) => {
|
|
var StreamBase = require_StreamBase();
|
|
var withParser = require_withParser();
|
|
|
|
class StreamObject extends StreamBase {
|
|
static make(options2) {
|
|
return new StreamObject(options2);
|
|
}
|
|
static withParser(options2) {
|
|
return withParser(StreamObject.make, options2);
|
|
}
|
|
constructor(options2) {
|
|
super(options2);
|
|
this._level = 1;
|
|
this._lastKey = null;
|
|
}
|
|
_wait(chunk, _, callback) {
|
|
if (chunk.name !== "startObject") {
|
|
return callback(new Error("Top-level object should be an object."));
|
|
}
|
|
this._transform = this._filter;
|
|
return this._transform(chunk, _, callback);
|
|
}
|
|
_push(discard) {
|
|
if (this._lastKey === null) {
|
|
this._lastKey = this._assembler.key;
|
|
} else {
|
|
!discard && this.push({ key: this._lastKey, value: this._assembler.current[this._lastKey] });
|
|
this._assembler.current = {};
|
|
this._lastKey = null;
|
|
}
|
|
}
|
|
}
|
|
StreamObject.streamObject = StreamObject.make;
|
|
StreamObject.make.Constructor = StreamObject;
|
|
module.exports = StreamObject;
|
|
});
|
|
|
|
// ../util/node_modules/clone/clone.js
|
|
var require_clone = __commonJS((exports, module) => {
|
|
var clone = function() {
|
|
function _instanceof(obj, type) {
|
|
return type != null && obj instanceof type;
|
|
}
|
|
var nativeMap;
|
|
try {
|
|
nativeMap = Map;
|
|
} catch (_) {
|
|
nativeMap = function() {};
|
|
}
|
|
var nativeSet;
|
|
try {
|
|
nativeSet = Set;
|
|
} catch (_) {
|
|
nativeSet = function() {};
|
|
}
|
|
var nativePromise;
|
|
try {
|
|
nativePromise = Promise;
|
|
} catch (_) {
|
|
nativePromise = function() {};
|
|
}
|
|
function clone2(parent, circular, depth, prototype, includeNonEnumerable) {
|
|
if (typeof circular === "object") {
|
|
depth = circular.depth;
|
|
prototype = circular.prototype;
|
|
includeNonEnumerable = circular.includeNonEnumerable;
|
|
circular = circular.circular;
|
|
}
|
|
var allParents = [];
|
|
var allChildren = [];
|
|
var useBuffer = typeof Buffer != "undefined";
|
|
if (typeof circular == "undefined")
|
|
circular = true;
|
|
if (typeof depth == "undefined")
|
|
depth = Infinity;
|
|
function _clone(parent2, depth2) {
|
|
if (parent2 === null)
|
|
return null;
|
|
if (depth2 === 0)
|
|
return parent2;
|
|
var child;
|
|
var proto;
|
|
if (typeof parent2 != "object") {
|
|
return parent2;
|
|
}
|
|
if (_instanceof(parent2, nativeMap)) {
|
|
child = new nativeMap;
|
|
} else if (_instanceof(parent2, nativeSet)) {
|
|
child = new nativeSet;
|
|
} else if (_instanceof(parent2, nativePromise)) {
|
|
child = new nativePromise(function(resolve, reject) {
|
|
parent2.then(function(value) {
|
|
resolve(_clone(value, depth2 - 1));
|
|
}, function(err) {
|
|
reject(_clone(err, depth2 - 1));
|
|
});
|
|
});
|
|
} else if (clone2.__isArray(parent2)) {
|
|
child = [];
|
|
} else if (clone2.__isRegExp(parent2)) {
|
|
child = new RegExp(parent2.source, __getRegExpFlags(parent2));
|
|
if (parent2.lastIndex)
|
|
child.lastIndex = parent2.lastIndex;
|
|
} else if (clone2.__isDate(parent2)) {
|
|
child = new Date(parent2.getTime());
|
|
} else if (useBuffer && Buffer.isBuffer(parent2)) {
|
|
if (Buffer.allocUnsafe) {
|
|
child = Buffer.allocUnsafe(parent2.length);
|
|
} else {
|
|
child = new Buffer(parent2.length);
|
|
}
|
|
parent2.copy(child);
|
|
return child;
|
|
} else if (_instanceof(parent2, Error)) {
|
|
child = Object.create(parent2);
|
|
} else {
|
|
if (typeof prototype == "undefined") {
|
|
proto = Object.getPrototypeOf(parent2);
|
|
child = Object.create(proto);
|
|
} else {
|
|
child = Object.create(prototype);
|
|
proto = prototype;
|
|
}
|
|
}
|
|
if (circular) {
|
|
var index2 = allParents.indexOf(parent2);
|
|
if (index2 != -1) {
|
|
return allChildren[index2];
|
|
}
|
|
allParents.push(parent2);
|
|
allChildren.push(child);
|
|
}
|
|
if (_instanceof(parent2, nativeMap)) {
|
|
parent2.forEach(function(value, key) {
|
|
var keyChild = _clone(key, depth2 - 1);
|
|
var valueChild = _clone(value, depth2 - 1);
|
|
child.set(keyChild, valueChild);
|
|
});
|
|
}
|
|
if (_instanceof(parent2, nativeSet)) {
|
|
parent2.forEach(function(value) {
|
|
var entryChild = _clone(value, depth2 - 1);
|
|
child.add(entryChild);
|
|
});
|
|
}
|
|
for (var i in parent2) {
|
|
var attrs;
|
|
if (proto) {
|
|
attrs = Object.getOwnPropertyDescriptor(proto, i);
|
|
}
|
|
if (attrs && attrs.set == null) {
|
|
continue;
|
|
}
|
|
child[i] = _clone(parent2[i], depth2 - 1);
|
|
}
|
|
if (Object.getOwnPropertySymbols) {
|
|
var symbols = Object.getOwnPropertySymbols(parent2);
|
|
for (var i = 0;i < symbols.length; i++) {
|
|
var symbol = symbols[i];
|
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, symbol);
|
|
if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
|
|
continue;
|
|
}
|
|
child[symbol] = _clone(parent2[symbol], depth2 - 1);
|
|
if (!descriptor.enumerable) {
|
|
Object.defineProperty(child, symbol, {
|
|
enumerable: false
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (includeNonEnumerable) {
|
|
var allPropertyNames = Object.getOwnPropertyNames(parent2);
|
|
for (var i = 0;i < allPropertyNames.length; i++) {
|
|
var propertyName = allPropertyNames[i];
|
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, propertyName);
|
|
if (descriptor && descriptor.enumerable) {
|
|
continue;
|
|
}
|
|
child[propertyName] = _clone(parent2[propertyName], depth2 - 1);
|
|
Object.defineProperty(child, propertyName, {
|
|
enumerable: false
|
|
});
|
|
}
|
|
}
|
|
return child;
|
|
}
|
|
return _clone(parent, depth);
|
|
}
|
|
clone2.clonePrototype = function clonePrototype(parent) {
|
|
if (parent === null)
|
|
return null;
|
|
var c = function() {};
|
|
c.prototype = parent;
|
|
return new c;
|
|
};
|
|
function __objToStr(o) {
|
|
return Object.prototype.toString.call(o);
|
|
}
|
|
clone2.__objToStr = __objToStr;
|
|
function __isDate(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object Date]";
|
|
}
|
|
clone2.__isDate = __isDate;
|
|
function __isArray(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object Array]";
|
|
}
|
|
clone2.__isArray = __isArray;
|
|
function __isRegExp(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object RegExp]";
|
|
}
|
|
clone2.__isRegExp = __isRegExp;
|
|
function __getRegExpFlags(re) {
|
|
var flags = "";
|
|
if (re.global)
|
|
flags += "g";
|
|
if (re.ignoreCase)
|
|
flags += "i";
|
|
if (re.multiline)
|
|
flags += "m";
|
|
return flags;
|
|
}
|
|
clone2.__getRegExpFlags = __getRegExpFlags;
|
|
return clone2;
|
|
}();
|
|
if (typeof module === "object" && module.exports) {
|
|
module.exports = clone;
|
|
}
|
|
});
|
|
|
|
// ../util/node_modules/node-cache/lib/node_cache.js
|
|
var require_node_cache = __commonJS((exports, module) => {
|
|
(function() {
|
|
var EventEmitter, NodeCache, clone, splice = [].splice, boundMethodCheck = function(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new Error("Bound instance method accessed before binding");
|
|
}
|
|
}, indexOf = [].indexOf;
|
|
clone = require_clone();
|
|
EventEmitter = __require("events").EventEmitter;
|
|
module.exports = NodeCache = function() {
|
|
|
|
class NodeCache2 extends EventEmitter {
|
|
constructor(options2 = {}) {
|
|
super();
|
|
this.get = this.get.bind(this);
|
|
this.mget = this.mget.bind(this);
|
|
this.set = this.set.bind(this);
|
|
this.mset = this.mset.bind(this);
|
|
this.del = this.del.bind(this);
|
|
this.take = this.take.bind(this);
|
|
this.ttl = this.ttl.bind(this);
|
|
this.getTtl = this.getTtl.bind(this);
|
|
this.keys = this.keys.bind(this);
|
|
this.has = this.has.bind(this);
|
|
this.getStats = this.getStats.bind(this);
|
|
this.flushAll = this.flushAll.bind(this);
|
|
this.flushStats = this.flushStats.bind(this);
|
|
this.close = this.close.bind(this);
|
|
this._checkData = this._checkData.bind(this);
|
|
this._check = this._check.bind(this);
|
|
this._isInvalidKey = this._isInvalidKey.bind(this);
|
|
this._wrap = this._wrap.bind(this);
|
|
this._getValLength = this._getValLength.bind(this);
|
|
this._error = this._error.bind(this);
|
|
this._initErrors = this._initErrors.bind(this);
|
|
this.options = options2;
|
|
this._initErrors();
|
|
this.data = {};
|
|
this.options = Object.assign({
|
|
forceString: false,
|
|
objectValueSize: 80,
|
|
promiseValueSize: 80,
|
|
arrayValueSize: 40,
|
|
stdTTL: 0,
|
|
checkperiod: 600,
|
|
useClones: true,
|
|
deleteOnExpire: true,
|
|
enableLegacyCallbacks: false,
|
|
maxKeys: -1
|
|
}, this.options);
|
|
if (this.options.enableLegacyCallbacks) {
|
|
console.warn("WARNING! node-cache legacy callback support will drop in v6.x");
|
|
["get", "mget", "set", "del", "ttl", "getTtl", "keys", "has"].forEach((methodKey) => {
|
|
var oldMethod;
|
|
oldMethod = this[methodKey];
|
|
this[methodKey] = function(...args) {
|
|
var cb, err, ref, res;
|
|
ref = args, [...args] = ref, [cb] = splice.call(args, -1);
|
|
if (typeof cb === "function") {
|
|
try {
|
|
res = oldMethod(...args);
|
|
cb(null, res);
|
|
} catch (error1) {
|
|
err = error1;
|
|
cb(err);
|
|
}
|
|
} else {
|
|
return oldMethod(...args, cb);
|
|
}
|
|
};
|
|
});
|
|
}
|
|
this.stats = {
|
|
hits: 0,
|
|
misses: 0,
|
|
keys: 0,
|
|
ksize: 0,
|
|
vsize: 0
|
|
};
|
|
this.validKeyTypes = ["string", "number"];
|
|
this._checkData();
|
|
return;
|
|
}
|
|
get(key) {
|
|
var _ret, err;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
if (this.data[key] != null && this._check(key, this.data[key])) {
|
|
this.stats.hits++;
|
|
_ret = this._unwrap(this.data[key]);
|
|
return _ret;
|
|
} else {
|
|
this.stats.misses++;
|
|
return;
|
|
}
|
|
}
|
|
mget(keys) {
|
|
var _err, err, i, key, len, oRet;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (!Array.isArray(keys)) {
|
|
_err = this._error("EKEYSTYPE");
|
|
throw _err;
|
|
}
|
|
oRet = {};
|
|
for (i = 0, len = keys.length;i < len; i++) {
|
|
key = keys[i];
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
if (this.data[key] != null && this._check(key, this.data[key])) {
|
|
this.stats.hits++;
|
|
oRet[key] = this._unwrap(this.data[key]);
|
|
} else {
|
|
this.stats.misses++;
|
|
}
|
|
}
|
|
return oRet;
|
|
}
|
|
set(key, value, ttl) {
|
|
var _err, err, existent;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (this.options.maxKeys > -1 && this.stats.keys >= this.options.maxKeys) {
|
|
_err = this._error("ECACHEFULL");
|
|
throw _err;
|
|
}
|
|
if (this.options.forceString && false === "string") {
|
|
value = JSON.stringify(value);
|
|
}
|
|
if (ttl == null) {
|
|
ttl = this.options.stdTTL;
|
|
}
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
existent = false;
|
|
if (this.data[key]) {
|
|
existent = true;
|
|
this.stats.vsize -= this._getValLength(this._unwrap(this.data[key], false));
|
|
}
|
|
this.data[key] = this._wrap(value, ttl);
|
|
this.stats.vsize += this._getValLength(value);
|
|
if (!existent) {
|
|
this.stats.ksize += this._getKeyLength(key);
|
|
this.stats.keys++;
|
|
}
|
|
this.emit("set", key, value);
|
|
return true;
|
|
}
|
|
mset(keyValueSet) {
|
|
var _err, err, i, j, key, keyValuePair, len, len1, ttl, val;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (this.options.maxKeys > -1 && this.stats.keys + keyValueSet.length >= this.options.maxKeys) {
|
|
_err = this._error("ECACHEFULL");
|
|
throw _err;
|
|
}
|
|
for (i = 0, len = keyValueSet.length;i < len; i++) {
|
|
keyValuePair = keyValueSet[i];
|
|
({ key, val, ttl } = keyValuePair);
|
|
if (ttl && typeof ttl !== "number") {
|
|
_err = this._error("ETTLTYPE");
|
|
throw _err;
|
|
}
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
}
|
|
for (j = 0, len1 = keyValueSet.length;j < len1; j++) {
|
|
keyValuePair = keyValueSet[j];
|
|
({ key, val, ttl } = keyValuePair);
|
|
this.set(key, val, ttl);
|
|
}
|
|
return true;
|
|
}
|
|
del(keys) {
|
|
var delCount, err, i, key, len, oldVal;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (!Array.isArray(keys)) {
|
|
keys = [keys];
|
|
}
|
|
delCount = 0;
|
|
for (i = 0, len = keys.length;i < len; i++) {
|
|
key = keys[i];
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
if (this.data[key] != null) {
|
|
this.stats.vsize -= this._getValLength(this._unwrap(this.data[key], false));
|
|
this.stats.ksize -= this._getKeyLength(key);
|
|
this.stats.keys--;
|
|
delCount++;
|
|
oldVal = this.data[key];
|
|
delete this.data[key];
|
|
this.emit("del", key, oldVal.v);
|
|
}
|
|
}
|
|
return delCount;
|
|
}
|
|
take(key) {
|
|
var _ret;
|
|
boundMethodCheck(this, NodeCache2);
|
|
_ret = this.get(key);
|
|
if (_ret != null) {
|
|
this.del(key);
|
|
}
|
|
return _ret;
|
|
}
|
|
ttl(key, ttl) {
|
|
var err;
|
|
boundMethodCheck(this, NodeCache2);
|
|
ttl || (ttl = this.options.stdTTL);
|
|
if (!key) {
|
|
return false;
|
|
}
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
if (this.data[key] != null && this._check(key, this.data[key])) {
|
|
if (ttl >= 0) {
|
|
this.data[key] = this._wrap(this.data[key].v, ttl, false);
|
|
} else {
|
|
this.del(key);
|
|
}
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
getTtl(key) {
|
|
var _ttl, err;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (!key) {
|
|
return;
|
|
}
|
|
if ((err = this._isInvalidKey(key)) != null) {
|
|
throw err;
|
|
}
|
|
if (this.data[key] != null && this._check(key, this.data[key])) {
|
|
_ttl = this.data[key].t;
|
|
return _ttl;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
keys() {
|
|
var _keys;
|
|
boundMethodCheck(this, NodeCache2);
|
|
_keys = Object.keys(this.data);
|
|
return _keys;
|
|
}
|
|
has(key) {
|
|
var _exists;
|
|
boundMethodCheck(this, NodeCache2);
|
|
_exists = this.data[key] != null && this._check(key, this.data[key]);
|
|
return _exists;
|
|
}
|
|
getStats() {
|
|
boundMethodCheck(this, NodeCache2);
|
|
return this.stats;
|
|
}
|
|
flushAll(_startPeriod = true) {
|
|
boundMethodCheck(this, NodeCache2);
|
|
this.data = {};
|
|
this.stats = {
|
|
hits: 0,
|
|
misses: 0,
|
|
keys: 0,
|
|
ksize: 0,
|
|
vsize: 0
|
|
};
|
|
this._killCheckPeriod();
|
|
this._checkData(_startPeriod);
|
|
this.emit("flush");
|
|
}
|
|
flushStats() {
|
|
boundMethodCheck(this, NodeCache2);
|
|
this.stats = {
|
|
hits: 0,
|
|
misses: 0,
|
|
keys: 0,
|
|
ksize: 0,
|
|
vsize: 0
|
|
};
|
|
this.emit("flush_stats");
|
|
}
|
|
close() {
|
|
boundMethodCheck(this, NodeCache2);
|
|
this._killCheckPeriod();
|
|
}
|
|
_checkData(startPeriod = true) {
|
|
var key, ref, value;
|
|
boundMethodCheck(this, NodeCache2);
|
|
ref = this.data;
|
|
for (key in ref) {
|
|
value = ref[key];
|
|
this._check(key, value);
|
|
}
|
|
if (startPeriod && this.options.checkperiod > 0) {
|
|
this.checkTimeout = setTimeout(this._checkData, this.options.checkperiod * 1000, startPeriod);
|
|
if (this.checkTimeout != null && this.checkTimeout.unref != null) {
|
|
this.checkTimeout.unref();
|
|
}
|
|
}
|
|
}
|
|
_killCheckPeriod() {
|
|
if (this.checkTimeout != null) {
|
|
return clearTimeout(this.checkTimeout);
|
|
}
|
|
}
|
|
_check(key, data) {
|
|
var _retval;
|
|
boundMethodCheck(this, NodeCache2);
|
|
_retval = true;
|
|
if (data.t !== 0 && data.t < Date.now()) {
|
|
if (this.options.deleteOnExpire) {
|
|
_retval = false;
|
|
this.del(key);
|
|
}
|
|
this.emit("expired", key, this._unwrap(data));
|
|
}
|
|
return _retval;
|
|
}
|
|
_isInvalidKey(key) {
|
|
var ref;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (ref = typeof key, indexOf.call(this.validKeyTypes, ref) < 0) {
|
|
return this._error("EKEYTYPE", {
|
|
type: typeof key
|
|
});
|
|
}
|
|
}
|
|
_wrap(value, ttl, asClone = true) {
|
|
var livetime, now, oReturn, ttlMultiplicator;
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (!this.options.useClones) {
|
|
asClone = false;
|
|
}
|
|
now = Date.now();
|
|
livetime = 0;
|
|
ttlMultiplicator = 1000;
|
|
if (ttl === 0) {
|
|
livetime = 0;
|
|
} else if (ttl) {
|
|
livetime = now + ttl * ttlMultiplicator;
|
|
} else {
|
|
if (this.options.stdTTL === 0) {
|
|
livetime = this.options.stdTTL;
|
|
} else {
|
|
livetime = now + this.options.stdTTL * ttlMultiplicator;
|
|
}
|
|
}
|
|
return oReturn = {
|
|
t: livetime,
|
|
v: asClone ? clone(value) : value
|
|
};
|
|
}
|
|
_unwrap(value, asClone = true) {
|
|
if (!this.options.useClones) {
|
|
asClone = false;
|
|
}
|
|
if (value.v != null) {
|
|
if (asClone) {
|
|
return clone(value.v);
|
|
} else {
|
|
return value.v;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
_getKeyLength(key) {
|
|
return key.toString().length;
|
|
}
|
|
_getValLength(value) {
|
|
boundMethodCheck(this, NodeCache2);
|
|
if (typeof value === "string") {
|
|
return value.length;
|
|
} else if (this.options.forceString) {
|
|
return JSON.stringify(value).length;
|
|
} else if (Array.isArray(value)) {
|
|
return this.options.arrayValueSize * value.length;
|
|
} else if (typeof value === "number") {
|
|
return 8;
|
|
} else if (typeof (value != null ? value.then : undefined) === "function") {
|
|
return this.options.promiseValueSize;
|
|
} else if (typeof Buffer !== "undefined" && Buffer !== null ? Buffer.isBuffer(value) : undefined) {
|
|
return value.length;
|
|
} else if (value != null && typeof value === "object") {
|
|
return this.options.objectValueSize * Object.keys(value).length;
|
|
} else if (typeof value === "boolean") {
|
|
return 8;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
_error(type, data = {}) {
|
|
var error;
|
|
boundMethodCheck(this, NodeCache2);
|
|
error = new Error;
|
|
error.name = type;
|
|
error.errorcode = type;
|
|
error.message = this.ERRORS[type] != null ? this.ERRORS[type](data) : "-";
|
|
error.data = data;
|
|
return error;
|
|
}
|
|
_initErrors() {
|
|
var _errMsg, _errT, ref;
|
|
boundMethodCheck(this, NodeCache2);
|
|
this.ERRORS = {};
|
|
ref = this._ERRORS;
|
|
for (_errT in ref) {
|
|
_errMsg = ref[_errT];
|
|
this.ERRORS[_errT] = this.createErrorMessage(_errMsg);
|
|
}
|
|
}
|
|
createErrorMessage(errMsg) {
|
|
return function(args) {
|
|
return errMsg.replace("__key", args.type);
|
|
};
|
|
}
|
|
}
|
|
NodeCache2.prototype._ERRORS = {
|
|
ENOTFOUND: "Key `__key` not found",
|
|
ECACHEFULL: "Cache max keys amount exceeded",
|
|
EKEYTYPE: "The key argument has to be of type `string` or `number`. Found: `__key`",
|
|
EKEYSTYPE: "The keys argument has to be an array.",
|
|
ETTLTYPE: "The ttl argument has to be a number."
|
|
};
|
|
return NodeCache2;
|
|
}.call(this);
|
|
}).call(exports);
|
|
});
|
|
|
|
// ../util/node_modules/node-cache/index.js
|
|
var require_node_cache2 = __commonJS((exports, module) => {
|
|
(function() {
|
|
var exports2;
|
|
exports2 = module.exports = require_node_cache();
|
|
exports2.version = "5.1.2";
|
|
}).call(exports);
|
|
});
|
|
|
|
// ../eve/dist/_virtual/rolldown_runtime.js
|
|
var __defProp2 = Object.defineProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp2(target, name, {
|
|
get: all[name],
|
|
enumerable: true
|
|
});
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/entity.js
|
|
var entityKind = Symbol.for("drizzle:entityKind");
|
|
var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
|
|
function is(value, type) {
|
|
if (!value || typeof value !== "object") {
|
|
return false;
|
|
}
|
|
if (value instanceof type) {
|
|
return true;
|
|
}
|
|
if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
|
|
throw new Error(`Class "${type.name ?? "<unknown>"}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
|
|
}
|
|
let cls = Object.getPrototypeOf(value).constructor;
|
|
if (cls) {
|
|
while (cls) {
|
|
if (entityKind in cls && cls[entityKind] === type[entityKind]) {
|
|
return true;
|
|
}
|
|
cls = Object.getPrototypeOf(cls);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/column.js
|
|
class Column {
|
|
constructor(table, config) {
|
|
this.table = table;
|
|
this.config = config;
|
|
this.name = config.name;
|
|
this.keyAsName = config.keyAsName;
|
|
this.notNull = config.notNull;
|
|
this.default = config.default;
|
|
this.defaultFn = config.defaultFn;
|
|
this.onUpdateFn = config.onUpdateFn;
|
|
this.hasDefault = config.hasDefault;
|
|
this.primary = config.primaryKey;
|
|
this.isUnique = config.isUnique;
|
|
this.uniqueName = config.uniqueName;
|
|
this.uniqueType = config.uniqueType;
|
|
this.dataType = config.dataType;
|
|
this.columnType = config.columnType;
|
|
this.generated = config.generated;
|
|
this.generatedIdentity = config.generatedIdentity;
|
|
}
|
|
static [entityKind] = "Column";
|
|
name;
|
|
keyAsName;
|
|
primary;
|
|
notNull;
|
|
default;
|
|
defaultFn;
|
|
onUpdateFn;
|
|
hasDefault;
|
|
isUnique;
|
|
uniqueName;
|
|
uniqueType;
|
|
dataType;
|
|
columnType;
|
|
enumValues = undefined;
|
|
generated = undefined;
|
|
generatedIdentity = undefined;
|
|
config;
|
|
mapFromDriverValue(value) {
|
|
return value;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return value;
|
|
}
|
|
shouldDisableInsert() {
|
|
return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/column-builder.js
|
|
class ColumnBuilder {
|
|
static [entityKind] = "ColumnBuilder";
|
|
config;
|
|
constructor(name, dataType, columnType) {
|
|
this.config = {
|
|
name,
|
|
keyAsName: name === "",
|
|
notNull: false,
|
|
default: undefined,
|
|
hasDefault: false,
|
|
primaryKey: false,
|
|
isUnique: false,
|
|
uniqueName: undefined,
|
|
uniqueType: undefined,
|
|
dataType,
|
|
columnType,
|
|
generated: undefined
|
|
};
|
|
}
|
|
$type() {
|
|
return this;
|
|
}
|
|
notNull() {
|
|
this.config.notNull = true;
|
|
return this;
|
|
}
|
|
default(value) {
|
|
this.config.default = value;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$defaultFn(fn) {
|
|
this.config.defaultFn = fn;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$default = this.$defaultFn;
|
|
$onUpdateFn(fn) {
|
|
this.config.onUpdateFn = fn;
|
|
this.config.hasDefault = true;
|
|
return this;
|
|
}
|
|
$onUpdate = this.$onUpdateFn;
|
|
primaryKey() {
|
|
this.config.primaryKey = true;
|
|
this.config.notNull = true;
|
|
return this;
|
|
}
|
|
setName(name) {
|
|
if (this.config.name !== "")
|
|
return;
|
|
this.config.name = name;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/table.utils.js
|
|
var TableName = Symbol.for("drizzle:Name");
|
|
|
|
// ../eve/node_modules/drizzle-orm/tracing-utils.js
|
|
function iife(fn, ...args) {
|
|
return fn(...args);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
|
|
function uniqueKeyName(table, columns) {
|
|
return `${table[TableName]}_${columns.join("_")}_unique`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
|
|
class PgColumn extends Column {
|
|
constructor(table, config) {
|
|
if (!config.uniqueName) {
|
|
config.uniqueName = uniqueKeyName(table, [config.name]);
|
|
}
|
|
super(table, config);
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "PgColumn";
|
|
}
|
|
|
|
class ExtraConfigColumn extends PgColumn {
|
|
static [entityKind] = "ExtraConfigColumn";
|
|
getSQLType() {
|
|
return this.getSQLType();
|
|
}
|
|
indexConfig = {
|
|
order: this.config.order ?? "asc",
|
|
nulls: this.config.nulls ?? "last",
|
|
opClass: this.config.opClass
|
|
};
|
|
defaultConfig = {
|
|
order: "asc",
|
|
nulls: "last",
|
|
opClass: undefined
|
|
};
|
|
asc() {
|
|
this.indexConfig.order = "asc";
|
|
return this;
|
|
}
|
|
desc() {
|
|
this.indexConfig.order = "desc";
|
|
return this;
|
|
}
|
|
nullsFirst() {
|
|
this.indexConfig.nulls = "first";
|
|
return this;
|
|
}
|
|
nullsLast() {
|
|
this.indexConfig.nulls = "last";
|
|
return this;
|
|
}
|
|
op(opClass) {
|
|
this.indexConfig.opClass = opClass;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
|
|
class PgEnumObjectColumn extends PgColumn {
|
|
static [entityKind] = "PgEnumObjectColumn";
|
|
enum;
|
|
enumValues = this.config.enum.enumValues;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.enum = config.enum;
|
|
}
|
|
getSQLType() {
|
|
return this.enum.enumName;
|
|
}
|
|
}
|
|
var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
|
|
function isPgEnum(obj) {
|
|
return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
|
|
}
|
|
class PgEnumColumn extends PgColumn {
|
|
static [entityKind] = "PgEnumColumn";
|
|
enum = this.config.enum;
|
|
enumValues = this.config.enum.enumValues;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.enum = config.enum;
|
|
}
|
|
getSQLType() {
|
|
return this.enum.enumName;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/subquery.js
|
|
class Subquery {
|
|
static [entityKind] = "Subquery";
|
|
constructor(sql, fields, alias, isWith = false, usedTables = []) {
|
|
this._ = {
|
|
brand: "Subquery",
|
|
sql,
|
|
selectedFields: fields,
|
|
alias,
|
|
isWith,
|
|
usedTables
|
|
};
|
|
}
|
|
}
|
|
|
|
class WithSubquery extends Subquery {
|
|
static [entityKind] = "WithSubquery";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/version.js
|
|
var version = "0.44.5";
|
|
|
|
// ../eve/node_modules/drizzle-orm/tracing.js
|
|
var otel;
|
|
var rawTracer;
|
|
var tracer = {
|
|
startActiveSpan(name, fn) {
|
|
if (!otel) {
|
|
return fn();
|
|
}
|
|
if (!rawTracer) {
|
|
rawTracer = otel.trace.getTracer("drizzle-orm", version);
|
|
}
|
|
return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
|
|
try {
|
|
return fn(span);
|
|
} catch (e) {
|
|
span.setStatus({
|
|
code: otel2.SpanStatusCode.ERROR,
|
|
message: e instanceof Error ? e.message : "Unknown error"
|
|
});
|
|
throw e;
|
|
} finally {
|
|
span.end();
|
|
}
|
|
}), otel, rawTracer);
|
|
}
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/view-common.js
|
|
var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
|
|
|
|
// ../eve/node_modules/drizzle-orm/table.js
|
|
var Schema = Symbol.for("drizzle:Schema");
|
|
var Columns = Symbol.for("drizzle:Columns");
|
|
var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
|
|
var OriginalName = Symbol.for("drizzle:OriginalName");
|
|
var BaseName = Symbol.for("drizzle:BaseName");
|
|
var IsAlias = Symbol.for("drizzle:IsAlias");
|
|
var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
|
|
var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
|
|
|
|
class Table {
|
|
static [entityKind] = "Table";
|
|
static Symbol = {
|
|
Name: TableName,
|
|
Schema,
|
|
OriginalName,
|
|
Columns,
|
|
ExtraConfigColumns,
|
|
BaseName,
|
|
IsAlias,
|
|
ExtraConfigBuilder
|
|
};
|
|
[TableName];
|
|
[OriginalName];
|
|
[Schema];
|
|
[Columns];
|
|
[ExtraConfigColumns];
|
|
[BaseName];
|
|
[IsAlias] = false;
|
|
[IsDrizzleTable] = true;
|
|
[ExtraConfigBuilder] = undefined;
|
|
constructor(name, schema, baseName) {
|
|
this[TableName] = this[OriginalName] = name;
|
|
this[Schema] = schema;
|
|
this[BaseName] = baseName;
|
|
}
|
|
}
|
|
function getTableName(table) {
|
|
return table[TableName];
|
|
}
|
|
function getTableUniqueName(table) {
|
|
return `${table[Schema] ?? "public"}.${table[TableName]}`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/sql.js
|
|
function isSQLWrapper(value) {
|
|
return value !== null && value !== undefined && typeof value.getSQL === "function";
|
|
}
|
|
function mergeQueries(queries) {
|
|
const result = { sql: "", params: [] };
|
|
for (const query of queries) {
|
|
result.sql += query.sql;
|
|
result.params.push(...query.params);
|
|
if (query.typings?.length) {
|
|
if (!result.typings) {
|
|
result.typings = [];
|
|
}
|
|
result.typings.push(...query.typings);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
class StringChunk {
|
|
static [entityKind] = "StringChunk";
|
|
value;
|
|
constructor(value) {
|
|
this.value = Array.isArray(value) ? value : [value];
|
|
}
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
|
|
class SQL {
|
|
constructor(queryChunks) {
|
|
this.queryChunks = queryChunks;
|
|
for (const chunk of queryChunks) {
|
|
if (is(chunk, Table)) {
|
|
const schemaName = chunk[Table.Symbol.Schema];
|
|
this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
|
|
}
|
|
}
|
|
}
|
|
static [entityKind] = "SQL";
|
|
decoder = noopDecoder;
|
|
shouldInlineParams = false;
|
|
usedTables = [];
|
|
append(query) {
|
|
this.queryChunks.push(...query.queryChunks);
|
|
return this;
|
|
}
|
|
toQuery(config) {
|
|
return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
|
|
const query = this.buildQueryFromSourceParams(this.queryChunks, config);
|
|
span?.setAttributes({
|
|
"drizzle.query.text": query.sql,
|
|
"drizzle.query.params": JSON.stringify(query.params)
|
|
});
|
|
return query;
|
|
});
|
|
}
|
|
buildQueryFromSourceParams(chunks, _config) {
|
|
const config = Object.assign({}, _config, {
|
|
inlineParams: _config.inlineParams || this.shouldInlineParams,
|
|
paramStartIndex: _config.paramStartIndex || { value: 0 }
|
|
});
|
|
const {
|
|
casing,
|
|
escapeName,
|
|
escapeParam,
|
|
prepareTyping,
|
|
inlineParams,
|
|
paramStartIndex
|
|
} = config;
|
|
return mergeQueries(chunks.map((chunk) => {
|
|
if (is(chunk, StringChunk)) {
|
|
return { sql: chunk.value.join(""), params: [] };
|
|
}
|
|
if (is(chunk, Name)) {
|
|
return { sql: escapeName(chunk.value), params: [] };
|
|
}
|
|
if (chunk === undefined) {
|
|
return { sql: "", params: [] };
|
|
}
|
|
if (Array.isArray(chunk)) {
|
|
const result = [new StringChunk("(")];
|
|
for (const [i, p] of chunk.entries()) {
|
|
result.push(p);
|
|
if (i < chunk.length - 1) {
|
|
result.push(new StringChunk(", "));
|
|
}
|
|
}
|
|
result.push(new StringChunk(")"));
|
|
return this.buildQueryFromSourceParams(result, config);
|
|
}
|
|
if (is(chunk, SQL)) {
|
|
return this.buildQueryFromSourceParams(chunk.queryChunks, {
|
|
...config,
|
|
inlineParams: inlineParams || chunk.shouldInlineParams
|
|
});
|
|
}
|
|
if (is(chunk, Table)) {
|
|
const schemaName = chunk[Table.Symbol.Schema];
|
|
const tableName = chunk[Table.Symbol.Name];
|
|
return {
|
|
sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, Column)) {
|
|
const columnName = casing.getColumnCasing(chunk);
|
|
if (_config.invokeSource === "indexes") {
|
|
return { sql: escapeName(columnName), params: [] };
|
|
}
|
|
const schemaName = chunk.table[Table.Symbol.Schema];
|
|
return {
|
|
sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, View)) {
|
|
const schemaName = chunk[ViewBaseConfig].schema;
|
|
const viewName = chunk[ViewBaseConfig].name;
|
|
return {
|
|
sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
|
|
params: []
|
|
};
|
|
}
|
|
if (is(chunk, Param)) {
|
|
if (is(chunk.value, Placeholder)) {
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}
|
|
const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
|
|
if (is(mappedValue, SQL)) {
|
|
return this.buildQueryFromSourceParams([mappedValue], config);
|
|
}
|
|
if (inlineParams) {
|
|
return { sql: this.mapInlineParam(mappedValue, config), params: [] };
|
|
}
|
|
let typings = ["none"];
|
|
if (prepareTyping) {
|
|
typings = [prepareTyping(chunk.encoder)];
|
|
}
|
|
return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
|
|
}
|
|
if (is(chunk, Placeholder)) {
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}
|
|
if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
|
|
return { sql: escapeName(chunk.fieldAlias), params: [] };
|
|
}
|
|
if (is(chunk, Subquery)) {
|
|
if (chunk._.isWith) {
|
|
return { sql: escapeName(chunk._.alias), params: [] };
|
|
}
|
|
return this.buildQueryFromSourceParams([
|
|
new StringChunk("("),
|
|
chunk._.sql,
|
|
new StringChunk(") "),
|
|
new Name(chunk._.alias)
|
|
], config);
|
|
}
|
|
if (isPgEnum(chunk)) {
|
|
if (chunk.schema) {
|
|
return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
|
|
}
|
|
return { sql: escapeName(chunk.enumName), params: [] };
|
|
}
|
|
if (isSQLWrapper(chunk)) {
|
|
if (chunk.shouldOmitSQLParens?.()) {
|
|
return this.buildQueryFromSourceParams([chunk.getSQL()], config);
|
|
}
|
|
return this.buildQueryFromSourceParams([
|
|
new StringChunk("("),
|
|
chunk.getSQL(),
|
|
new StringChunk(")")
|
|
], config);
|
|
}
|
|
if (inlineParams) {
|
|
return { sql: this.mapInlineParam(chunk, config), params: [] };
|
|
}
|
|
return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
|
|
}));
|
|
}
|
|
mapInlineParam(chunk, { escapeString }) {
|
|
if (chunk === null) {
|
|
return "null";
|
|
}
|
|
if (typeof chunk === "number" || typeof chunk === "boolean") {
|
|
return chunk.toString();
|
|
}
|
|
if (typeof chunk === "string") {
|
|
return escapeString(chunk);
|
|
}
|
|
if (typeof chunk === "object") {
|
|
const mappedValueAsString = chunk.toString();
|
|
if (mappedValueAsString === "[object Object]") {
|
|
return escapeString(JSON.stringify(chunk));
|
|
}
|
|
return escapeString(mappedValueAsString);
|
|
}
|
|
throw new Error("Unexpected param value: " + chunk);
|
|
}
|
|
getSQL() {
|
|
return this;
|
|
}
|
|
as(alias) {
|
|
if (alias === undefined) {
|
|
return this;
|
|
}
|
|
return new SQL.Aliased(this, alias);
|
|
}
|
|
mapWith(decoder) {
|
|
this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
|
|
return this;
|
|
}
|
|
inlineParams() {
|
|
this.shouldInlineParams = true;
|
|
return this;
|
|
}
|
|
if(condition) {
|
|
return condition ? this : undefined;
|
|
}
|
|
}
|
|
|
|
class Name {
|
|
constructor(value) {
|
|
this.value = value;
|
|
}
|
|
static [entityKind] = "Name";
|
|
brand;
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function isDriverValueEncoder(value) {
|
|
return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
|
|
}
|
|
var noopDecoder = {
|
|
mapFromDriverValue: (value) => value
|
|
};
|
|
var noopEncoder = {
|
|
mapToDriverValue: (value) => value
|
|
};
|
|
var noopMapper = {
|
|
...noopDecoder,
|
|
...noopEncoder
|
|
};
|
|
|
|
class Param {
|
|
constructor(value, encoder = noopEncoder) {
|
|
this.value = value;
|
|
this.encoder = encoder;
|
|
}
|
|
static [entityKind] = "Param";
|
|
brand;
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function sql(strings, ...params) {
|
|
const queryChunks = [];
|
|
if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
|
|
queryChunks.push(new StringChunk(strings[0]));
|
|
}
|
|
for (const [paramIndex, param2] of params.entries()) {
|
|
queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
|
|
}
|
|
return new SQL(queryChunks);
|
|
}
|
|
((sql2) => {
|
|
function empty() {
|
|
return new SQL([]);
|
|
}
|
|
sql2.empty = empty;
|
|
function fromList(list) {
|
|
return new SQL(list);
|
|
}
|
|
sql2.fromList = fromList;
|
|
function raw(str) {
|
|
return new SQL([new StringChunk(str)]);
|
|
}
|
|
sql2.raw = raw;
|
|
function join(chunks, separator) {
|
|
const result = [];
|
|
for (const [i, chunk] of chunks.entries()) {
|
|
if (i > 0 && separator !== undefined) {
|
|
result.push(separator);
|
|
}
|
|
result.push(chunk);
|
|
}
|
|
return new SQL(result);
|
|
}
|
|
sql2.join = join;
|
|
function identifier(value) {
|
|
return new Name(value);
|
|
}
|
|
sql2.identifier = identifier;
|
|
function placeholder2(name2) {
|
|
return new Placeholder(name2);
|
|
}
|
|
sql2.placeholder = placeholder2;
|
|
function param2(value, encoder) {
|
|
return new Param(value, encoder);
|
|
}
|
|
sql2.param = param2;
|
|
})(sql || (sql = {}));
|
|
((SQL2) => {
|
|
|
|
class Aliased {
|
|
constructor(sql2, fieldAlias) {
|
|
this.sql = sql2;
|
|
this.fieldAlias = fieldAlias;
|
|
}
|
|
static [entityKind] = "SQL.Aliased";
|
|
isSelectionField = false;
|
|
getSQL() {
|
|
return this.sql;
|
|
}
|
|
clone() {
|
|
return new Aliased(this.sql, this.fieldAlias);
|
|
}
|
|
}
|
|
SQL2.Aliased = Aliased;
|
|
})(SQL || (SQL = {}));
|
|
|
|
class Placeholder {
|
|
constructor(name2) {
|
|
this.name = name2;
|
|
}
|
|
static [entityKind] = "Placeholder";
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
function fillPlaceholders(params, values) {
|
|
return params.map((p) => {
|
|
if (is(p, Placeholder)) {
|
|
if (!(p.name in values)) {
|
|
throw new Error(`No value for placeholder "${p.name}" was provided`);
|
|
}
|
|
return values[p.name];
|
|
}
|
|
if (is(p, Param) && is(p.value, Placeholder)) {
|
|
if (!(p.value.name in values)) {
|
|
throw new Error(`No value for placeholder "${p.value.name}" was provided`);
|
|
}
|
|
return p.encoder.mapToDriverValue(values[p.value.name]);
|
|
}
|
|
return p;
|
|
});
|
|
}
|
|
var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
|
|
|
|
class View {
|
|
static [entityKind] = "View";
|
|
[ViewBaseConfig];
|
|
[IsDrizzleView] = true;
|
|
constructor({ name: name2, schema, selectedFields, query }) {
|
|
this[ViewBaseConfig] = {
|
|
name: name2,
|
|
originalName: name2,
|
|
schema,
|
|
selectedFields,
|
|
query,
|
|
isExisting: !query,
|
|
isAlias: false
|
|
};
|
|
}
|
|
getSQL() {
|
|
return new SQL([this]);
|
|
}
|
|
}
|
|
Column.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
Table.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
Subquery.prototype.getSQL = function() {
|
|
return new SQL([this]);
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/alias.js
|
|
class ColumnAliasProxyHandler {
|
|
constructor(table) {
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "ColumnAliasProxyHandler";
|
|
get(columnObj, prop) {
|
|
if (prop === "table") {
|
|
return this.table;
|
|
}
|
|
return columnObj[prop];
|
|
}
|
|
}
|
|
|
|
class TableAliasProxyHandler {
|
|
constructor(alias, replaceOriginalName) {
|
|
this.alias = alias;
|
|
this.replaceOriginalName = replaceOriginalName;
|
|
}
|
|
static [entityKind] = "TableAliasProxyHandler";
|
|
get(target, prop) {
|
|
if (prop === Table.Symbol.IsAlias) {
|
|
return true;
|
|
}
|
|
if (prop === Table.Symbol.Name) {
|
|
return this.alias;
|
|
}
|
|
if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
|
|
return this.alias;
|
|
}
|
|
if (prop === ViewBaseConfig) {
|
|
return {
|
|
...target[ViewBaseConfig],
|
|
name: this.alias,
|
|
isAlias: true
|
|
};
|
|
}
|
|
if (prop === Table.Symbol.Columns) {
|
|
const columns = target[Table.Symbol.Columns];
|
|
if (!columns) {
|
|
return columns;
|
|
}
|
|
const proxiedColumns = {};
|
|
Object.keys(columns).map((key) => {
|
|
proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
});
|
|
return proxiedColumns;
|
|
}
|
|
const value = target[prop];
|
|
if (is(value, Column)) {
|
|
return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
function aliasedTable(table, tableAlias) {
|
|
return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
|
|
}
|
|
function aliasedTableColumn(column, tableAlias) {
|
|
return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
|
|
}
|
|
function mapColumnsInAliasedSQLToAlias(query, alias) {
|
|
return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
|
|
}
|
|
function mapColumnsInSQLToAlias(query, alias) {
|
|
return sql.join(query.queryChunks.map((c) => {
|
|
if (is(c, Column)) {
|
|
return aliasedTableColumn(c, alias);
|
|
}
|
|
if (is(c, SQL)) {
|
|
return mapColumnsInSQLToAlias(c, alias);
|
|
}
|
|
if (is(c, SQL.Aliased)) {
|
|
return mapColumnsInAliasedSQLToAlias(c, alias);
|
|
}
|
|
return c;
|
|
}));
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/utils.js
|
|
function mapResultRow(columns, row, joinsNotNullableMap) {
|
|
const nullifyMap = {};
|
|
const result = columns.reduce((result2, { path, field }, columnIndex) => {
|
|
let decoder;
|
|
if (is(field, Column)) {
|
|
decoder = field;
|
|
} else if (is(field, SQL)) {
|
|
decoder = field.decoder;
|
|
} else {
|
|
decoder = field.sql.decoder;
|
|
}
|
|
let node = result2;
|
|
for (const [pathChunkIndex, pathChunk] of path.entries()) {
|
|
if (pathChunkIndex < path.length - 1) {
|
|
if (!(pathChunk in node)) {
|
|
node[pathChunk] = {};
|
|
}
|
|
node = node[pathChunk];
|
|
} else {
|
|
const rawValue = row[columnIndex];
|
|
const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
|
|
if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
|
|
const objectName = path[0];
|
|
if (!(objectName in nullifyMap)) {
|
|
nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
|
|
} else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
|
|
nullifyMap[objectName] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result2;
|
|
}, {});
|
|
if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
|
|
for (const [objectName, tableName] of Object.entries(nullifyMap)) {
|
|
if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
|
|
result[objectName] = null;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function orderSelectedFields(fields, pathPrefix) {
|
|
return Object.entries(fields).reduce((result, [name, field]) => {
|
|
if (typeof name !== "string") {
|
|
return result;
|
|
}
|
|
const newPath = pathPrefix ? [...pathPrefix, name] : [name];
|
|
if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
|
|
result.push({ path: newPath, field });
|
|
} else if (is(field, Table)) {
|
|
result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
|
|
} else {
|
|
result.push(...orderSelectedFields(field, newPath));
|
|
}
|
|
return result;
|
|
}, []);
|
|
}
|
|
function haveSameKeys(left, right) {
|
|
const leftKeys = Object.keys(left);
|
|
const rightKeys = Object.keys(right);
|
|
if (leftKeys.length !== rightKeys.length) {
|
|
return false;
|
|
}
|
|
for (const [index, key] of leftKeys.entries()) {
|
|
if (key !== rightKeys[index]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function mapUpdateSet(table, values) {
|
|
const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
|
|
if (is(value, SQL) || is(value, Column)) {
|
|
return [key, value];
|
|
} else {
|
|
return [key, new Param(value, table[Table.Symbol.Columns][key])];
|
|
}
|
|
});
|
|
if (entries.length === 0) {
|
|
throw new Error("No values to set");
|
|
}
|
|
return Object.fromEntries(entries);
|
|
}
|
|
function applyMixins(baseClass, extendedClasses) {
|
|
for (const extendedClass of extendedClasses) {
|
|
for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
|
|
if (name === "constructor")
|
|
continue;
|
|
Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
|
|
}
|
|
}
|
|
}
|
|
function getTableColumns(table) {
|
|
return table[Table.Symbol.Columns];
|
|
}
|
|
function getTableLikeName(table) {
|
|
return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
|
|
}
|
|
function getColumnNameAndConfig(a, b) {
|
|
return {
|
|
name: typeof a === "string" && a.length > 0 ? a : "",
|
|
config: typeof a === "object" ? a : b
|
|
};
|
|
}
|
|
function isConfig(data) {
|
|
if (typeof data !== "object" || data === null)
|
|
return false;
|
|
if (data.constructor.name !== "Object")
|
|
return false;
|
|
if ("logger" in data) {
|
|
const type = typeof data["logger"];
|
|
if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("schema" in data) {
|
|
const type = typeof data["schema"];
|
|
if (type !== "object" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("casing" in data) {
|
|
const type = typeof data["casing"];
|
|
if (type !== "string" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("mode" in data) {
|
|
if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("connection" in data) {
|
|
const type = typeof data["connection"];
|
|
if (type !== "string" && type !== "object" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if ("client" in data) {
|
|
const type = typeof data["client"];
|
|
if (type !== "object" && type !== "function" && type !== "undefined")
|
|
return false;
|
|
return true;
|
|
}
|
|
if (Object.keys(data).length === 0)
|
|
return true;
|
|
return false;
|
|
}
|
|
var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
|
|
class ForeignKeyBuilder {
|
|
static [entityKind] = "SQLiteForeignKeyBuilder";
|
|
reference;
|
|
_onUpdate;
|
|
_onDelete;
|
|
constructor(config, actions) {
|
|
this.reference = () => {
|
|
const { name, columns, foreignColumns } = config();
|
|
return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
|
|
};
|
|
if (actions) {
|
|
this._onUpdate = actions.onUpdate;
|
|
this._onDelete = actions.onDelete;
|
|
}
|
|
}
|
|
onUpdate(action) {
|
|
this._onUpdate = action;
|
|
return this;
|
|
}
|
|
onDelete(action) {
|
|
this._onDelete = action;
|
|
return this;
|
|
}
|
|
build(table) {
|
|
return new ForeignKey(table, this);
|
|
}
|
|
}
|
|
|
|
class ForeignKey {
|
|
constructor(table, builder) {
|
|
this.table = table;
|
|
this.reference = builder.reference;
|
|
this.onUpdate = builder._onUpdate;
|
|
this.onDelete = builder._onDelete;
|
|
}
|
|
static [entityKind] = "SQLiteForeignKey";
|
|
reference;
|
|
onUpdate;
|
|
onDelete;
|
|
getName() {
|
|
const { name, columns, foreignColumns } = this.reference();
|
|
const columnNames = columns.map((column) => column.name);
|
|
const foreignColumnNames = foreignColumns.map((column) => column.name);
|
|
const chunks = [
|
|
this.table[TableName],
|
|
...columnNames,
|
|
foreignColumns[0].table[TableName],
|
|
...foreignColumnNames
|
|
];
|
|
return name ?? `${chunks.join("_")}_fk`;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
|
|
function uniqueKeyName2(table, columns) {
|
|
return `${table[TableName]}_${columns.join("_")}_unique`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
|
|
class SQLiteColumnBuilder extends ColumnBuilder {
|
|
static [entityKind] = "SQLiteColumnBuilder";
|
|
foreignKeyConfigs = [];
|
|
references(ref, actions = {}) {
|
|
this.foreignKeyConfigs.push({ ref, actions });
|
|
return this;
|
|
}
|
|
unique(name) {
|
|
this.config.isUnique = true;
|
|
this.config.uniqueName = name;
|
|
return this;
|
|
}
|
|
generatedAlwaysAs(as, config) {
|
|
this.config.generated = {
|
|
as,
|
|
type: "always",
|
|
mode: config?.mode ?? "virtual"
|
|
};
|
|
return this;
|
|
}
|
|
buildForeignKeys(column, table) {
|
|
return this.foreignKeyConfigs.map(({ ref, actions }) => {
|
|
return ((ref2, actions2) => {
|
|
const builder = new ForeignKeyBuilder(() => {
|
|
const foreignColumn = ref2();
|
|
return { columns: [column], foreignColumns: [foreignColumn] };
|
|
});
|
|
if (actions2.onUpdate) {
|
|
builder.onUpdate(actions2.onUpdate);
|
|
}
|
|
if (actions2.onDelete) {
|
|
builder.onDelete(actions2.onDelete);
|
|
}
|
|
return builder.build(table);
|
|
})(ref, actions);
|
|
});
|
|
}
|
|
}
|
|
|
|
class SQLiteColumn extends Column {
|
|
constructor(table, config) {
|
|
if (!config.uniqueName) {
|
|
config.uniqueName = uniqueKeyName2(table, [config.name]);
|
|
}
|
|
super(table, config);
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "SQLiteColumn";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
|
|
class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBigIntBuilder";
|
|
constructor(name) {
|
|
super(name, "bigint", "SQLiteBigInt");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBigInt(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBigInt extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBigInt";
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
if (typeof Buffer !== "undefined" && Buffer.from) {
|
|
const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
|
|
return BigInt(buf.toString("utf8"));
|
|
}
|
|
return BigInt(textDecoder.decode(value));
|
|
}
|
|
mapToDriverValue(value) {
|
|
return Buffer.from(value.toString());
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBlobJsonBuilder";
|
|
constructor(name) {
|
|
super(name, "json", "SQLiteBlobJson");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBlobJson(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobJson extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBlobJson";
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
if (typeof Buffer !== "undefined" && Buffer.from) {
|
|
const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
|
|
return JSON.parse(buf.toString("utf8"));
|
|
}
|
|
return JSON.parse(textDecoder.decode(value));
|
|
}
|
|
mapToDriverValue(value) {
|
|
return Buffer.from(JSON.stringify(value));
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBlobBufferBuilder";
|
|
constructor(name) {
|
|
super(name, "buffer", "SQLiteBlobBuffer");
|
|
}
|
|
build(table) {
|
|
return new SQLiteBlobBuffer(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBlobBuffer extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBlobBuffer";
|
|
mapFromDriverValue(value) {
|
|
if (Buffer.isBuffer(value)) {
|
|
return value;
|
|
}
|
|
return Buffer.from(value);
|
|
}
|
|
getSQLType() {
|
|
return "blob";
|
|
}
|
|
}
|
|
function blob(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config?.mode === "json") {
|
|
return new SQLiteBlobJsonBuilder(name);
|
|
}
|
|
if (config?.mode === "bigint") {
|
|
return new SQLiteBigIntBuilder(name);
|
|
}
|
|
return new SQLiteBlobBufferBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
|
|
class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteCustomColumnBuilder";
|
|
constructor(name, fieldConfig, customTypeParams) {
|
|
super(name, "custom", "SQLiteCustomColumn");
|
|
this.config.fieldConfig = fieldConfig;
|
|
this.config.customTypeParams = customTypeParams;
|
|
}
|
|
build(table) {
|
|
return new SQLiteCustomColumn(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteCustomColumn extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteCustomColumn";
|
|
sqlName;
|
|
mapTo;
|
|
mapFrom;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
|
|
this.mapTo = config.customTypeParams.toDriver;
|
|
this.mapFrom = config.customTypeParams.fromDriver;
|
|
}
|
|
getSQLType() {
|
|
return this.sqlName;
|
|
}
|
|
mapFromDriverValue(value) {
|
|
return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return typeof this.mapTo === "function" ? this.mapTo(value) : value;
|
|
}
|
|
}
|
|
function customType(customTypeParams) {
|
|
return (a, b) => {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
|
|
};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
|
|
class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteBaseIntegerBuilder";
|
|
constructor(name, dataType, columnType) {
|
|
super(name, dataType, columnType);
|
|
this.config.autoIncrement = false;
|
|
}
|
|
primaryKey(config) {
|
|
if (config?.autoIncrement) {
|
|
this.config.autoIncrement = true;
|
|
}
|
|
this.config.hasDefault = true;
|
|
return super.primaryKey();
|
|
}
|
|
}
|
|
|
|
class SQLiteBaseInteger extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteBaseInteger";
|
|
autoIncrement = this.config.autoIncrement;
|
|
getSQLType() {
|
|
return "integer";
|
|
}
|
|
}
|
|
|
|
class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteIntegerBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteInteger");
|
|
}
|
|
build(table) {
|
|
return new SQLiteInteger(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteInteger extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteInteger";
|
|
}
|
|
|
|
class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteTimestampBuilder";
|
|
constructor(name, mode) {
|
|
super(name, "date", "SQLiteTimestamp");
|
|
this.config.mode = mode;
|
|
}
|
|
defaultNow() {
|
|
return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
|
|
}
|
|
build(table) {
|
|
return new SQLiteTimestamp(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteTimestamp extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteTimestamp";
|
|
mode = this.config.mode;
|
|
mapFromDriverValue(value) {
|
|
if (this.config.mode === "timestamp") {
|
|
return new Date(value * 1000);
|
|
}
|
|
return new Date(value);
|
|
}
|
|
mapToDriverValue(value) {
|
|
const unix = value.getTime();
|
|
if (this.config.mode === "timestamp") {
|
|
return Math.floor(unix / 1000);
|
|
}
|
|
return unix;
|
|
}
|
|
}
|
|
|
|
class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
|
|
static [entityKind] = "SQLiteBooleanBuilder";
|
|
constructor(name, mode) {
|
|
super(name, "boolean", "SQLiteBoolean");
|
|
this.config.mode = mode;
|
|
}
|
|
build(table) {
|
|
return new SQLiteBoolean(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteBoolean extends SQLiteBaseInteger {
|
|
static [entityKind] = "SQLiteBoolean";
|
|
mode = this.config.mode;
|
|
mapFromDriverValue(value) {
|
|
return Number(value) === 1;
|
|
}
|
|
mapToDriverValue(value) {
|
|
return value ? 1 : 0;
|
|
}
|
|
}
|
|
function integer(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
|
|
return new SQLiteTimestampBuilder(name, config.mode);
|
|
}
|
|
if (config?.mode === "boolean") {
|
|
return new SQLiteBooleanBuilder(name, config.mode);
|
|
}
|
|
return new SQLiteIntegerBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
|
|
class SQLiteNumericBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericBuilder";
|
|
constructor(name) {
|
|
super(name, "string", "SQLiteNumeric");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumeric(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumeric extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumeric";
|
|
mapFromDriverValue(value) {
|
|
if (typeof value === "string")
|
|
return value;
|
|
return String(value);
|
|
}
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericNumberBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteNumericNumber");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumericNumber(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericNumber extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumericNumber";
|
|
mapFromDriverValue(value) {
|
|
if (typeof value === "number")
|
|
return value;
|
|
return Number(value);
|
|
}
|
|
mapToDriverValue = String;
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteNumericBigIntBuilder";
|
|
constructor(name) {
|
|
super(name, "bigint", "SQLiteNumericBigInt");
|
|
}
|
|
build(table) {
|
|
return new SQLiteNumericBigInt(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteNumericBigInt extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteNumericBigInt";
|
|
mapFromDriverValue = BigInt;
|
|
mapToDriverValue = String;
|
|
getSQLType() {
|
|
return "numeric";
|
|
}
|
|
}
|
|
function numeric(a, b) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
const mode = config?.mode;
|
|
return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
|
|
class SQLiteRealBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteRealBuilder";
|
|
constructor(name) {
|
|
super(name, "number", "SQLiteReal");
|
|
}
|
|
build(table) {
|
|
return new SQLiteReal(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteReal extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteReal";
|
|
getSQLType() {
|
|
return "real";
|
|
}
|
|
}
|
|
function real(name) {
|
|
return new SQLiteRealBuilder(name ?? "");
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
|
|
class SQLiteTextBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteTextBuilder";
|
|
constructor(name, config) {
|
|
super(name, "string", "SQLiteText");
|
|
this.config.enumValues = config.enum;
|
|
this.config.length = config.length;
|
|
}
|
|
build(table) {
|
|
return new SQLiteText(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteText extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteText";
|
|
enumValues = this.config.enumValues;
|
|
length = this.config.length;
|
|
constructor(table, config) {
|
|
super(table, config);
|
|
}
|
|
getSQLType() {
|
|
return `text${this.config.length ? `(${this.config.length})` : ""}`;
|
|
}
|
|
}
|
|
|
|
class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
|
|
static [entityKind] = "SQLiteTextJsonBuilder";
|
|
constructor(name) {
|
|
super(name, "json", "SQLiteTextJson");
|
|
}
|
|
build(table) {
|
|
return new SQLiteTextJson(table, this.config);
|
|
}
|
|
}
|
|
|
|
class SQLiteTextJson extends SQLiteColumn {
|
|
static [entityKind] = "SQLiteTextJson";
|
|
getSQLType() {
|
|
return "text";
|
|
}
|
|
mapFromDriverValue(value) {
|
|
return JSON.parse(value);
|
|
}
|
|
mapToDriverValue(value) {
|
|
return JSON.stringify(value);
|
|
}
|
|
}
|
|
function text(a, b = {}) {
|
|
const { name, config } = getColumnNameAndConfig(a, b);
|
|
if (config.mode === "json") {
|
|
return new SQLiteTextJsonBuilder(name);
|
|
}
|
|
return new SQLiteTextBuilder(name, config);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/selection-proxy.js
|
|
class SelectionProxyHandler {
|
|
static [entityKind] = "SelectionProxyHandler";
|
|
config;
|
|
constructor(config) {
|
|
this.config = { ...config };
|
|
}
|
|
get(subquery, prop) {
|
|
if (prop === "_") {
|
|
return {
|
|
...subquery["_"],
|
|
selectedFields: new Proxy(subquery._.selectedFields, this)
|
|
};
|
|
}
|
|
if (prop === ViewBaseConfig) {
|
|
return {
|
|
...subquery[ViewBaseConfig],
|
|
selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
|
|
};
|
|
}
|
|
if (typeof prop === "symbol") {
|
|
return subquery[prop];
|
|
}
|
|
const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
|
|
const value = columns[prop];
|
|
if (is(value, SQL.Aliased)) {
|
|
if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
|
|
return value.sql;
|
|
}
|
|
const newValue = value.clone();
|
|
newValue.isSelectionField = true;
|
|
return newValue;
|
|
}
|
|
if (is(value, SQL)) {
|
|
if (this.config.sqlBehavior === "sql") {
|
|
return value;
|
|
}
|
|
throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
|
|
}
|
|
if (is(value, Column)) {
|
|
if (this.config.alias) {
|
|
return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
|
|
}
|
|
return value;
|
|
}
|
|
if (typeof value !== "object" || value === null) {
|
|
return value;
|
|
}
|
|
return new Proxy(value, new SelectionProxyHandler(this.config));
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/query-promise.js
|
|
class QueryPromise {
|
|
static [entityKind] = "QueryPromise";
|
|
[Symbol.toStringTag] = "QueryPromise";
|
|
catch(onRejected) {
|
|
return this.then(undefined, onRejected);
|
|
}
|
|
finally(onFinally) {
|
|
return this.then((value) => {
|
|
onFinally?.();
|
|
return value;
|
|
}, (reason) => {
|
|
onFinally?.();
|
|
throw reason;
|
|
});
|
|
}
|
|
then(onFulfilled, onRejected) {
|
|
return this.execute().then(onFulfilled, onRejected);
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
|
|
function getSQLiteColumnBuilders() {
|
|
return {
|
|
blob,
|
|
customType,
|
|
integer,
|
|
numeric,
|
|
real,
|
|
text
|
|
};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
|
|
var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
|
|
|
|
class SQLiteTable extends Table {
|
|
static [entityKind] = "SQLiteTable";
|
|
static Symbol = Object.assign({}, Table.Symbol, {
|
|
InlineForeignKeys
|
|
});
|
|
[Table.Symbol.Columns];
|
|
[InlineForeignKeys] = [];
|
|
[Table.Symbol.ExtraConfigBuilder] = undefined;
|
|
}
|
|
function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
|
|
const rawTable = new SQLiteTable(name, schema, baseName);
|
|
const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
|
|
const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
|
|
const colBuilder = colBuilderBase;
|
|
colBuilder.setName(name2);
|
|
const column = colBuilder.build(rawTable);
|
|
rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
|
|
return [name2, column];
|
|
}));
|
|
const table = Object.assign(rawTable, builtColumns);
|
|
table[Table.Symbol.Columns] = builtColumns;
|
|
table[Table.Symbol.ExtraConfigColumns] = builtColumns;
|
|
if (extraConfig) {
|
|
table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
|
|
}
|
|
return table;
|
|
}
|
|
var sqliteTable = (name, columns, extraConfig) => {
|
|
return sqliteTableBase(name, columns, extraConfig);
|
|
};
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
|
|
class IndexBuilderOn {
|
|
constructor(name, unique) {
|
|
this.name = name;
|
|
this.unique = unique;
|
|
}
|
|
static [entityKind] = "SQLiteIndexBuilderOn";
|
|
on(...columns) {
|
|
return new IndexBuilder(this.name, columns, this.unique);
|
|
}
|
|
}
|
|
|
|
class IndexBuilder {
|
|
static [entityKind] = "SQLiteIndexBuilder";
|
|
config;
|
|
constructor(name, columns, unique) {
|
|
this.config = {
|
|
name,
|
|
columns,
|
|
unique,
|
|
where: undefined
|
|
};
|
|
}
|
|
where(condition) {
|
|
this.config.where = condition;
|
|
return this;
|
|
}
|
|
build(table) {
|
|
return new Index(this.config, table);
|
|
}
|
|
}
|
|
|
|
class Index {
|
|
static [entityKind] = "SQLiteIndex";
|
|
config;
|
|
constructor(config, table) {
|
|
this.config = { ...config, table };
|
|
}
|
|
}
|
|
function index(name) {
|
|
return new IndexBuilderOn(name, false);
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
|
|
function extractUsedTable(table) {
|
|
if (is(table, SQLiteTable)) {
|
|
return [`${table[Table.Symbol.BaseName]}`];
|
|
}
|
|
if (is(table, Subquery)) {
|
|
return table._.usedTables ?? [];
|
|
}
|
|
if (is(table, SQL)) {
|
|
return table.usedTables ?? [];
|
|
}
|
|
return [];
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
|
|
class SQLiteDeleteBase extends QueryPromise {
|
|
constructor(table, session, dialect, withList) {
|
|
super();
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { table, withList };
|
|
}
|
|
static [entityKind] = "SQLiteDelete";
|
|
config;
|
|
where(where) {
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
this.config.orderBy = orderByArray;
|
|
} else {
|
|
const orderByArray = columns;
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
this.config.limit = limit;
|
|
return this;
|
|
}
|
|
returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildDeleteQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "delete",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute(placeholderValues) {
|
|
return this._prepare().execute(placeholderValues);
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/casing.js
|
|
function toSnakeCase(input) {
|
|
const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
|
|
return words.map((word) => word.toLowerCase()).join("_");
|
|
}
|
|
function toCamelCase(input) {
|
|
const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
|
|
return words.reduce((acc, word, i) => {
|
|
const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
|
|
return acc + formattedWord;
|
|
}, "");
|
|
}
|
|
function noopCase(input) {
|
|
return input;
|
|
}
|
|
|
|
class CasingCache {
|
|
static [entityKind] = "CasingCache";
|
|
cache = {};
|
|
cachedTables = {};
|
|
convert;
|
|
constructor(casing) {
|
|
this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
|
|
}
|
|
getColumnCasing(column) {
|
|
if (!column.keyAsName)
|
|
return column.name;
|
|
const schema = column.table[Table.Symbol.Schema] ?? "public";
|
|
const tableName = column.table[Table.Symbol.OriginalName];
|
|
const key = `${schema}.${tableName}.${column.name}`;
|
|
if (!this.cache[key]) {
|
|
this.cacheTable(column.table);
|
|
}
|
|
return this.cache[key];
|
|
}
|
|
cacheTable(table) {
|
|
const schema = table[Table.Symbol.Schema] ?? "public";
|
|
const tableName = table[Table.Symbol.OriginalName];
|
|
const tableKey = `${schema}.${tableName}`;
|
|
if (!this.cachedTables[tableKey]) {
|
|
for (const column of Object.values(table[Table.Symbol.Columns])) {
|
|
const columnKey = `${tableKey}.${column.name}`;
|
|
this.cache[columnKey] = this.convert(column.name);
|
|
}
|
|
this.cachedTables[tableKey] = true;
|
|
}
|
|
}
|
|
clearCache() {
|
|
this.cache = {};
|
|
this.cachedTables = {};
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/errors.js
|
|
class DrizzleError extends Error {
|
|
static [entityKind] = "DrizzleError";
|
|
constructor({ message, cause }) {
|
|
super(message);
|
|
this.name = "DrizzleError";
|
|
this.cause = cause;
|
|
}
|
|
}
|
|
|
|
class DrizzleQueryError extends Error {
|
|
constructor(query, params, cause) {
|
|
super(`Failed query: ${query}
|
|
params: ${params}`);
|
|
this.query = query;
|
|
this.params = params;
|
|
this.cause = cause;
|
|
Error.captureStackTrace(this, DrizzleQueryError);
|
|
if (cause)
|
|
this.cause = cause;
|
|
}
|
|
}
|
|
|
|
class TransactionRollbackError extends DrizzleError {
|
|
static [entityKind] = "TransactionRollbackError";
|
|
constructor() {
|
|
super({ message: "Rollback" });
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/table.js
|
|
var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
|
|
var EnableRLS = Symbol.for("drizzle:EnableRLS");
|
|
|
|
class PgTable extends Table {
|
|
static [entityKind] = "PgTable";
|
|
static Symbol = Object.assign({}, Table.Symbol, {
|
|
InlineForeignKeys: InlineForeignKeys2,
|
|
EnableRLS
|
|
});
|
|
[InlineForeignKeys2] = [];
|
|
[EnableRLS] = false;
|
|
[Table.Symbol.ExtraConfigBuilder] = undefined;
|
|
[Table.Symbol.ExtraConfigColumns] = {};
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
|
|
class PrimaryKeyBuilder {
|
|
static [entityKind] = "PgPrimaryKeyBuilder";
|
|
columns;
|
|
name;
|
|
constructor(columns, name) {
|
|
this.columns = columns;
|
|
this.name = name;
|
|
}
|
|
build(table) {
|
|
return new PrimaryKey(table, this.columns, this.name);
|
|
}
|
|
}
|
|
|
|
class PrimaryKey {
|
|
constructor(table, columns, name) {
|
|
this.table = table;
|
|
this.columns = columns;
|
|
this.name = name;
|
|
}
|
|
static [entityKind] = "PgPrimaryKey";
|
|
columns;
|
|
name;
|
|
getName() {
|
|
return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
|
|
function bindIfParam(value, column) {
|
|
if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
|
|
return new Param(value, column);
|
|
}
|
|
return value;
|
|
}
|
|
var eq = (left, right) => {
|
|
return sql`${left} = ${bindIfParam(right, left)}`;
|
|
};
|
|
var ne = (left, right) => {
|
|
return sql`${left} <> ${bindIfParam(right, left)}`;
|
|
};
|
|
function and(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter((c) => c !== undefined);
|
|
if (conditions.length === 0) {
|
|
return;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" and ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function or(...unfilteredConditions) {
|
|
const conditions = unfilteredConditions.filter((c) => c !== undefined);
|
|
if (conditions.length === 0) {
|
|
return;
|
|
}
|
|
if (conditions.length === 1) {
|
|
return new SQL(conditions);
|
|
}
|
|
return new SQL([
|
|
new StringChunk("("),
|
|
sql.join(conditions, new StringChunk(" or ")),
|
|
new StringChunk(")")
|
|
]);
|
|
}
|
|
function not(condition) {
|
|
return sql`not ${condition}`;
|
|
}
|
|
var gt = (left, right) => {
|
|
return sql`${left} > ${bindIfParam(right, left)}`;
|
|
};
|
|
var gte = (left, right) => {
|
|
return sql`${left} >= ${bindIfParam(right, left)}`;
|
|
};
|
|
var lt = (left, right) => {
|
|
return sql`${left} < ${bindIfParam(right, left)}`;
|
|
};
|
|
var lte = (left, right) => {
|
|
return sql`${left} <= ${bindIfParam(right, left)}`;
|
|
};
|
|
function inArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`false`;
|
|
}
|
|
return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} in ${bindIfParam(values, column)}`;
|
|
}
|
|
function notInArray(column, values) {
|
|
if (Array.isArray(values)) {
|
|
if (values.length === 0) {
|
|
return sql`true`;
|
|
}
|
|
return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
|
|
}
|
|
return sql`${column} not in ${bindIfParam(values, column)}`;
|
|
}
|
|
function isNull(value) {
|
|
return sql`${value} is null`;
|
|
}
|
|
function isNotNull(value) {
|
|
return sql`${value} is not null`;
|
|
}
|
|
function exists(subquery) {
|
|
return sql`exists ${subquery}`;
|
|
}
|
|
function notExists(subquery) {
|
|
return sql`not exists ${subquery}`;
|
|
}
|
|
function between(column, min, max) {
|
|
return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
|
|
}
|
|
function notBetween(column, min, max) {
|
|
return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
|
|
}
|
|
function like(column, value) {
|
|
return sql`${column} like ${value}`;
|
|
}
|
|
function notLike(column, value) {
|
|
return sql`${column} not like ${value}`;
|
|
}
|
|
function ilike(column, value) {
|
|
return sql`${column} ilike ${value}`;
|
|
}
|
|
function notIlike(column, value) {
|
|
return sql`${column} not ilike ${value}`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
|
|
function asc(column) {
|
|
return sql`${column} asc`;
|
|
}
|
|
function desc(column) {
|
|
return sql`${column} desc`;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/relations.js
|
|
class Relation {
|
|
constructor(sourceTable, referencedTable, relationName) {
|
|
this.sourceTable = sourceTable;
|
|
this.referencedTable = referencedTable;
|
|
this.relationName = relationName;
|
|
this.referencedTableName = referencedTable[Table.Symbol.Name];
|
|
}
|
|
static [entityKind] = "Relation";
|
|
referencedTableName;
|
|
fieldName;
|
|
}
|
|
|
|
class Relations {
|
|
constructor(table, config) {
|
|
this.table = table;
|
|
this.config = config;
|
|
}
|
|
static [entityKind] = "Relations";
|
|
}
|
|
|
|
class One extends Relation {
|
|
constructor(sourceTable, referencedTable, config, isNullable) {
|
|
super(sourceTable, referencedTable, config?.relationName);
|
|
this.config = config;
|
|
this.isNullable = isNullable;
|
|
}
|
|
static [entityKind] = "One";
|
|
withFieldName(fieldName) {
|
|
const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
|
|
relation.fieldName = fieldName;
|
|
return relation;
|
|
}
|
|
}
|
|
|
|
class Many extends Relation {
|
|
constructor(sourceTable, referencedTable, config) {
|
|
super(sourceTable, referencedTable, config?.relationName);
|
|
this.config = config;
|
|
}
|
|
static [entityKind] = "Many";
|
|
withFieldName(fieldName) {
|
|
const relation = new Many(this.sourceTable, this.referencedTable, this.config);
|
|
relation.fieldName = fieldName;
|
|
return relation;
|
|
}
|
|
}
|
|
function getOperators() {
|
|
return {
|
|
and,
|
|
between,
|
|
eq,
|
|
exists,
|
|
gt,
|
|
gte,
|
|
ilike,
|
|
inArray,
|
|
isNull,
|
|
isNotNull,
|
|
like,
|
|
lt,
|
|
lte,
|
|
ne,
|
|
not,
|
|
notBetween,
|
|
notExists,
|
|
notLike,
|
|
notIlike,
|
|
notInArray,
|
|
or,
|
|
sql
|
|
};
|
|
}
|
|
function getOrderByOperators() {
|
|
return {
|
|
sql,
|
|
asc,
|
|
desc
|
|
};
|
|
}
|
|
function extractTablesRelationalConfig(schema, configHelpers) {
|
|
if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
|
|
schema = schema["default"];
|
|
}
|
|
const tableNamesMap = {};
|
|
const relationsBuffer = {};
|
|
const tablesConfig = {};
|
|
for (const [key, value] of Object.entries(schema)) {
|
|
if (is(value, Table)) {
|
|
const dbName = getTableUniqueName(value);
|
|
const bufferedRelations = relationsBuffer[dbName];
|
|
tableNamesMap[dbName] = key;
|
|
tablesConfig[key] = {
|
|
tsName: key,
|
|
dbName: value[Table.Symbol.Name],
|
|
schema: value[Table.Symbol.Schema],
|
|
columns: value[Table.Symbol.Columns],
|
|
relations: bufferedRelations?.relations ?? {},
|
|
primaryKey: bufferedRelations?.primaryKey ?? []
|
|
};
|
|
for (const column of Object.values(value[Table.Symbol.Columns])) {
|
|
if (column.primary) {
|
|
tablesConfig[key].primaryKey.push(column);
|
|
}
|
|
}
|
|
const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
|
|
if (extraConfig) {
|
|
for (const configEntry of Object.values(extraConfig)) {
|
|
if (is(configEntry, PrimaryKeyBuilder)) {
|
|
tablesConfig[key].primaryKey.push(...configEntry.columns);
|
|
}
|
|
}
|
|
}
|
|
} else if (is(value, Relations)) {
|
|
const dbName = getTableUniqueName(value.table);
|
|
const tableName = tableNamesMap[dbName];
|
|
const relations2 = value.config(configHelpers(value.table));
|
|
let primaryKey;
|
|
for (const [relationName, relation] of Object.entries(relations2)) {
|
|
if (tableName) {
|
|
const tableConfig = tablesConfig[tableName];
|
|
tableConfig.relations[relationName] = relation;
|
|
if (primaryKey) {
|
|
tableConfig.primaryKey.push(...primaryKey);
|
|
}
|
|
} else {
|
|
if (!(dbName in relationsBuffer)) {
|
|
relationsBuffer[dbName] = {
|
|
relations: {},
|
|
primaryKey
|
|
};
|
|
}
|
|
relationsBuffer[dbName].relations[relationName] = relation;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return { tables: tablesConfig, tableNamesMap };
|
|
}
|
|
function relations(table, relations2) {
|
|
return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
|
|
key,
|
|
value.withFieldName(key)
|
|
])));
|
|
}
|
|
function createOne(sourceTable) {
|
|
return function one(table, config) {
|
|
return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
|
|
};
|
|
}
|
|
function createMany(sourceTable) {
|
|
return function many(referencedTable, config) {
|
|
return new Many(sourceTable, referencedTable, config);
|
|
};
|
|
}
|
|
function normalizeRelation(schema, tableNamesMap, relation) {
|
|
if (is(relation, One) && relation.config) {
|
|
return {
|
|
fields: relation.config.fields,
|
|
references: relation.config.references
|
|
};
|
|
}
|
|
const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
|
|
if (!referencedTableTsName) {
|
|
throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
|
|
}
|
|
const referencedTableConfig = schema[referencedTableTsName];
|
|
if (!referencedTableConfig) {
|
|
throw new Error(`Table "${referencedTableTsName}" not found in schema`);
|
|
}
|
|
const sourceTable = relation.sourceTable;
|
|
const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
|
|
if (!sourceTableTsName) {
|
|
throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
|
|
}
|
|
const reverseRelations = [];
|
|
for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
|
|
if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
|
|
reverseRelations.push(referencedTableRelation);
|
|
}
|
|
}
|
|
if (reverseRelations.length > 1) {
|
|
throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
|
|
}
|
|
if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
|
|
return {
|
|
fields: reverseRelations[0].config.references,
|
|
references: reverseRelations[0].config.fields
|
|
};
|
|
}
|
|
throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
|
|
}
|
|
function createTableRelationsHelpers(sourceTable) {
|
|
return {
|
|
one: createOne(sourceTable),
|
|
many: createMany(sourceTable)
|
|
};
|
|
}
|
|
function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
|
|
const result = {};
|
|
for (const [
|
|
selectionItemIndex,
|
|
selectionItem
|
|
] of buildQueryResultSelection.entries()) {
|
|
if (selectionItem.isJson) {
|
|
const relation = tableConfig.relations[selectionItem.tsKey];
|
|
const rawSubRows = row[selectionItemIndex];
|
|
const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
|
|
result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
|
|
} else {
|
|
const value = mapColumnValue(row[selectionItemIndex]);
|
|
const field = selectionItem.field;
|
|
let decoder;
|
|
if (is(field, Column)) {
|
|
decoder = field;
|
|
} else if (is(field, SQL)) {
|
|
decoder = field.decoder;
|
|
} else {
|
|
decoder = field.sql.decoder;
|
|
}
|
|
result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
|
|
class SQLiteViewBase extends View {
|
|
static [entityKind] = "SQLiteViewBase";
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
|
|
class SQLiteDialect {
|
|
static [entityKind] = "SQLiteDialect";
|
|
casing;
|
|
constructor(config) {
|
|
this.casing = new CasingCache(config?.casing);
|
|
}
|
|
escapeName(name) {
|
|
return `"${name}"`;
|
|
}
|
|
escapeParam(_num) {
|
|
return "?";
|
|
}
|
|
escapeString(str) {
|
|
return `'${str.replace(/'/g, "''")}'`;
|
|
}
|
|
buildWithCTE(queries) {
|
|
if (!queries?.length)
|
|
return;
|
|
const withSqlChunks = [sql`with `];
|
|
for (const [i, w] of queries.entries()) {
|
|
withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
|
|
if (i < queries.length - 1) {
|
|
withSqlChunks.push(sql`, `);
|
|
}
|
|
}
|
|
withSqlChunks.push(sql` `);
|
|
return sql.join(withSqlChunks);
|
|
}
|
|
buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
|
|
const withSql = this.buildWithCTE(withList);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
|
|
}
|
|
buildUpdateSet(table, set) {
|
|
const tableColumns = table[Table.Symbol.Columns];
|
|
const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
|
|
const setSize = columnNames.length;
|
|
return sql.join(columnNames.flatMap((colName, i) => {
|
|
const col = tableColumns[colName];
|
|
const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
|
|
const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
|
|
if (i < setSize - 1) {
|
|
return [res, sql.raw(", ")];
|
|
}
|
|
return [res];
|
|
}));
|
|
}
|
|
buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
|
|
const withSql = this.buildWithCTE(withList);
|
|
const setSql = this.buildUpdateSet(table, set);
|
|
const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
|
|
const joinsSql = this.buildJoins(joins);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
|
|
}
|
|
buildSelection(fields, { isSingleTable = false } = {}) {
|
|
const columnsLen = fields.length;
|
|
const chunks = fields.flatMap(({ field }, i) => {
|
|
const chunk = [];
|
|
if (is(field, SQL.Aliased) && field.isSelectionField) {
|
|
chunk.push(sql.identifier(field.fieldAlias));
|
|
} else if (is(field, SQL.Aliased) || is(field, SQL)) {
|
|
const query = is(field, SQL.Aliased) ? field.sql : field;
|
|
if (isSingleTable) {
|
|
chunk.push(new SQL(query.queryChunks.map((c) => {
|
|
if (is(c, Column)) {
|
|
return sql.identifier(this.casing.getColumnCasing(c));
|
|
}
|
|
return c;
|
|
})));
|
|
} else {
|
|
chunk.push(query);
|
|
}
|
|
if (is(field, SQL.Aliased)) {
|
|
chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
|
|
}
|
|
} else if (is(field, Column)) {
|
|
const tableName = field.table[Table.Symbol.Name];
|
|
if (field.columnType === "SQLiteNumericBigInt") {
|
|
if (isSingleTable) {
|
|
chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
|
|
} else {
|
|
chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
|
|
}
|
|
} else {
|
|
if (isSingleTable) {
|
|
chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
|
|
} else {
|
|
chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
|
|
}
|
|
}
|
|
}
|
|
if (i < columnsLen - 1) {
|
|
chunk.push(sql`, `);
|
|
}
|
|
return chunk;
|
|
});
|
|
return sql.join(chunks);
|
|
}
|
|
buildJoins(joins) {
|
|
if (!joins || joins.length === 0) {
|
|
return;
|
|
}
|
|
const joinsArray = [];
|
|
if (joins) {
|
|
for (const [index2, joinMeta] of joins.entries()) {
|
|
if (index2 === 0) {
|
|
joinsArray.push(sql` `);
|
|
}
|
|
const table = joinMeta.table;
|
|
const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
|
|
if (is(table, SQLiteTable)) {
|
|
const tableName = table[SQLiteTable.Symbol.Name];
|
|
const tableSchema = table[SQLiteTable.Symbol.Schema];
|
|
const origTableName = table[SQLiteTable.Symbol.OriginalName];
|
|
const alias = tableName === origTableName ? undefined : joinMeta.alias;
|
|
joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
|
|
} else {
|
|
joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
|
|
}
|
|
if (index2 < joins.length - 1) {
|
|
joinsArray.push(sql` `);
|
|
}
|
|
}
|
|
}
|
|
return sql.join(joinsArray);
|
|
}
|
|
buildLimit(limit) {
|
|
return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
|
|
}
|
|
buildOrderBy(orderBy) {
|
|
const orderByList = [];
|
|
if (orderBy) {
|
|
for (const [index2, orderByValue] of orderBy.entries()) {
|
|
orderByList.push(orderByValue);
|
|
if (index2 < orderBy.length - 1) {
|
|
orderByList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
|
|
}
|
|
buildFromTable(table) {
|
|
if (is(table, Table) && table[Table.Symbol.IsAlias]) {
|
|
return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
|
|
}
|
|
return table;
|
|
}
|
|
buildSelectQuery({
|
|
withList,
|
|
fields,
|
|
fieldsFlat,
|
|
where,
|
|
having,
|
|
table,
|
|
joins,
|
|
orderBy,
|
|
groupBy,
|
|
limit,
|
|
offset,
|
|
distinct,
|
|
setOperators
|
|
}) {
|
|
const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
|
|
for (const f of fieldsList) {
|
|
if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
|
|
const tableName = getTableName(f.field.table);
|
|
throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
|
|
}
|
|
}
|
|
const isSingleTable = !joins || joins.length === 0;
|
|
const withSql = this.buildWithCTE(withList);
|
|
const distinctSql = distinct ? sql` distinct` : undefined;
|
|
const selection = this.buildSelection(fieldsList, { isSingleTable });
|
|
const tableSql = this.buildFromTable(table);
|
|
const joinsSql = this.buildJoins(joins);
|
|
const whereSql = where ? sql` where ${where}` : undefined;
|
|
const havingSql = having ? sql` having ${having}` : undefined;
|
|
const groupByList = [];
|
|
if (groupBy) {
|
|
for (const [index2, groupByValue] of groupBy.entries()) {
|
|
groupByList.push(groupByValue);
|
|
if (index2 < groupBy.length - 1) {
|
|
groupByList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
|
|
const orderBySql = this.buildOrderBy(orderBy);
|
|
const limitSql = this.buildLimit(limit);
|
|
const offsetSql = offset ? sql` offset ${offset}` : undefined;
|
|
const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
|
|
if (setOperators.length > 0) {
|
|
return this.buildSetOperations(finalQuery, setOperators);
|
|
}
|
|
return finalQuery;
|
|
}
|
|
buildSetOperations(leftSelect, setOperators) {
|
|
const [setOperator, ...rest] = setOperators;
|
|
if (!setOperator) {
|
|
throw new Error("Cannot pass undefined values to any set operator");
|
|
}
|
|
if (rest.length === 0) {
|
|
return this.buildSetOperationQuery({ leftSelect, setOperator });
|
|
}
|
|
return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
|
|
}
|
|
buildSetOperationQuery({
|
|
leftSelect,
|
|
setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
|
|
}) {
|
|
const leftChunk = sql`${leftSelect.getSQL()} `;
|
|
const rightChunk = sql`${rightSelect.getSQL()}`;
|
|
let orderBySql;
|
|
if (orderBy && orderBy.length > 0) {
|
|
const orderByValues = [];
|
|
for (const singleOrderBy of orderBy) {
|
|
if (is(singleOrderBy, SQLiteColumn)) {
|
|
orderByValues.push(sql.identifier(singleOrderBy.name));
|
|
} else if (is(singleOrderBy, SQL)) {
|
|
for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
|
|
const chunk = singleOrderBy.queryChunks[i];
|
|
if (is(chunk, SQLiteColumn)) {
|
|
singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
|
|
}
|
|
}
|
|
orderByValues.push(sql`${singleOrderBy}`);
|
|
} else {
|
|
orderByValues.push(sql`${singleOrderBy}`);
|
|
}
|
|
}
|
|
orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
|
|
}
|
|
const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
|
|
const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
|
|
const offsetSql = offset ? sql` offset ${offset}` : undefined;
|
|
return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
|
|
}
|
|
buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
|
|
const valuesSqlList = [];
|
|
const columns = table[Table.Symbol.Columns];
|
|
const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
|
|
const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
|
|
if (select) {
|
|
const select2 = valuesOrSelect;
|
|
if (is(select2, SQL)) {
|
|
valuesSqlList.push(select2);
|
|
} else {
|
|
valuesSqlList.push(select2.getSQL());
|
|
}
|
|
} else {
|
|
const values = valuesOrSelect;
|
|
valuesSqlList.push(sql.raw("values "));
|
|
for (const [valueIndex, value] of values.entries()) {
|
|
const valueList = [];
|
|
for (const [fieldName, col] of colEntries) {
|
|
const colValue = value[fieldName];
|
|
if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
|
|
let defaultValue;
|
|
if (col.default !== null && col.default !== undefined) {
|
|
defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
|
|
} else if (col.defaultFn !== undefined) {
|
|
const defaultFnResult = col.defaultFn();
|
|
defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
|
|
} else if (!col.default && col.onUpdateFn !== undefined) {
|
|
const onUpdateFnResult = col.onUpdateFn();
|
|
defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
|
|
} else {
|
|
defaultValue = sql`null`;
|
|
}
|
|
valueList.push(defaultValue);
|
|
} else {
|
|
valueList.push(colValue);
|
|
}
|
|
}
|
|
valuesSqlList.push(valueList);
|
|
if (valueIndex < values.length - 1) {
|
|
valuesSqlList.push(sql`, `);
|
|
}
|
|
}
|
|
}
|
|
const withSql = this.buildWithCTE(withList);
|
|
const valuesSql = sql.join(valuesSqlList);
|
|
const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
|
|
const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
|
|
return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
|
|
}
|
|
sqlToQuery(sql2, invokeSource) {
|
|
return sql2.toQuery({
|
|
casing: this.casing,
|
|
escapeName: this.escapeName,
|
|
escapeParam: this.escapeParam,
|
|
escapeString: this.escapeString,
|
|
invokeSource
|
|
});
|
|
}
|
|
buildRelationalQuery({
|
|
fullSchema,
|
|
schema,
|
|
tableNamesMap,
|
|
table,
|
|
tableConfig,
|
|
queryConfig: config,
|
|
tableAlias,
|
|
nestedQueryRelation,
|
|
joinOn
|
|
}) {
|
|
let selection = [];
|
|
let limit, offset, orderBy = [], where;
|
|
const joins = [];
|
|
if (config === true) {
|
|
const selectionEntries = Object.entries(tableConfig.columns);
|
|
selection = selectionEntries.map(([key, value]) => ({
|
|
dbKey: value.name,
|
|
tsKey: key,
|
|
field: aliasedTableColumn(value, tableAlias),
|
|
relationTableTsKey: undefined,
|
|
isJson: false,
|
|
selection: []
|
|
}));
|
|
} else {
|
|
const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
|
|
if (config.where) {
|
|
const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
|
|
where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
|
|
}
|
|
const fieldsSelection = [];
|
|
let selectedColumns = [];
|
|
if (config.columns) {
|
|
let isIncludeMode = false;
|
|
for (const [field, value] of Object.entries(config.columns)) {
|
|
if (value === undefined) {
|
|
continue;
|
|
}
|
|
if (field in tableConfig.columns) {
|
|
if (!isIncludeMode && value === true) {
|
|
isIncludeMode = true;
|
|
}
|
|
selectedColumns.push(field);
|
|
}
|
|
}
|
|
if (selectedColumns.length > 0) {
|
|
selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
|
|
}
|
|
} else {
|
|
selectedColumns = Object.keys(tableConfig.columns);
|
|
}
|
|
for (const field of selectedColumns) {
|
|
const column = tableConfig.columns[field];
|
|
fieldsSelection.push({ tsKey: field, value: column });
|
|
}
|
|
let selectedRelations = [];
|
|
if (config.with) {
|
|
selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
|
|
}
|
|
let extras;
|
|
if (config.extras) {
|
|
extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
|
|
for (const [tsKey, value] of Object.entries(extras)) {
|
|
fieldsSelection.push({
|
|
tsKey,
|
|
value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
|
|
});
|
|
}
|
|
}
|
|
for (const { tsKey, value } of fieldsSelection) {
|
|
selection.push({
|
|
dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
|
|
tsKey,
|
|
field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
|
|
relationTableTsKey: undefined,
|
|
isJson: false,
|
|
selection: []
|
|
});
|
|
}
|
|
let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
|
|
if (!Array.isArray(orderByOrig)) {
|
|
orderByOrig = [orderByOrig];
|
|
}
|
|
orderBy = orderByOrig.map((orderByValue) => {
|
|
if (is(orderByValue, Column)) {
|
|
return aliasedTableColumn(orderByValue, tableAlias);
|
|
}
|
|
return mapColumnsInSQLToAlias(orderByValue, tableAlias);
|
|
});
|
|
limit = config.limit;
|
|
offset = config.offset;
|
|
for (const {
|
|
tsKey: selectedRelationTsKey,
|
|
queryConfig: selectedRelationConfigValue,
|
|
relation
|
|
} of selectedRelations) {
|
|
const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
|
|
const relationTableName = getTableUniqueName(relation.referencedTable);
|
|
const relationTableTsName = tableNamesMap[relationTableName];
|
|
const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
|
|
const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
|
|
const builtRelation = this.buildRelationalQuery({
|
|
fullSchema,
|
|
schema,
|
|
tableNamesMap,
|
|
table: fullSchema[relationTableTsName],
|
|
tableConfig: schema[relationTableTsName],
|
|
queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
|
|
tableAlias: relationTableAlias,
|
|
joinOn: joinOn2,
|
|
nestedQueryRelation: relation
|
|
});
|
|
const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
|
|
selection.push({
|
|
dbKey: selectedRelationTsKey,
|
|
tsKey: selectedRelationTsKey,
|
|
field,
|
|
relationTableTsKey: relationTableTsName,
|
|
isJson: true,
|
|
selection: builtRelation.selection
|
|
});
|
|
}
|
|
}
|
|
if (selection.length === 0) {
|
|
throw new DrizzleError({
|
|
message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
|
|
});
|
|
}
|
|
let result;
|
|
where = and(joinOn, where);
|
|
if (nestedQueryRelation) {
|
|
let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
|
|
if (is(nestedQueryRelation, Many)) {
|
|
field = sql`coalesce(json_group_array(${field}), json_array())`;
|
|
}
|
|
const nestedSelection = [{
|
|
dbKey: "data",
|
|
tsKey: "data",
|
|
field: field.as("data"),
|
|
isJson: true,
|
|
relationTableTsKey: tableConfig.tsName,
|
|
selection
|
|
}];
|
|
const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
|
|
if (needsSubquery) {
|
|
result = this.buildSelectQuery({
|
|
table: aliasedTable(table, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: [
|
|
{
|
|
path: [],
|
|
field: sql.raw("*")
|
|
}
|
|
],
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
where = undefined;
|
|
limit = undefined;
|
|
offset = undefined;
|
|
orderBy = undefined;
|
|
} else {
|
|
result = aliasedTable(table, tableAlias);
|
|
}
|
|
result = this.buildSelectQuery({
|
|
table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
|
|
path: [],
|
|
field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
|
|
})),
|
|
joins,
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
} else {
|
|
result = this.buildSelectQuery({
|
|
table: aliasedTable(table, tableAlias),
|
|
fields: {},
|
|
fieldsFlat: selection.map(({ field }) => ({
|
|
path: [],
|
|
field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
|
|
})),
|
|
joins,
|
|
where,
|
|
limit,
|
|
offset,
|
|
orderBy,
|
|
setOperators: []
|
|
});
|
|
}
|
|
return {
|
|
tableTsKey: tableConfig.tsName,
|
|
sql: result,
|
|
selection
|
|
};
|
|
}
|
|
}
|
|
|
|
class SQLiteSyncDialect extends SQLiteDialect {
|
|
static [entityKind] = "SQLiteSyncDialect";
|
|
migrate(migrations, session, config) {
|
|
const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
|
|
const migrationTableCreate = sql`
|
|
CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
|
|
id SERIAL PRIMARY KEY,
|
|
hash text NOT NULL,
|
|
created_at numeric
|
|
)
|
|
`;
|
|
session.run(migrationTableCreate);
|
|
const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
|
|
const lastDbMigration = dbMigrations[0] ?? undefined;
|
|
session.run(sql`BEGIN`);
|
|
try {
|
|
for (const migration of migrations) {
|
|
if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
|
|
for (const stmt of migration.sql) {
|
|
session.run(sql.raw(stmt));
|
|
}
|
|
session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
|
|
}
|
|
}
|
|
session.run(sql`COMMIT`);
|
|
} catch (e) {
|
|
session.run(sql`ROLLBACK`);
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
|
|
class TypedQueryBuilder {
|
|
static [entityKind] = "TypedQueryBuilder";
|
|
getSelectedFields() {
|
|
return this._.selectedFields;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
|
|
class SQLiteSelectBuilder {
|
|
static [entityKind] = "SQLiteSelectBuilder";
|
|
fields;
|
|
session;
|
|
dialect;
|
|
withList;
|
|
distinct;
|
|
constructor(config) {
|
|
this.fields = config.fields;
|
|
this.session = config.session;
|
|
this.dialect = config.dialect;
|
|
this.withList = config.withList;
|
|
this.distinct = config.distinct;
|
|
}
|
|
from(source) {
|
|
const isPartialSelect = !!this.fields;
|
|
let fields;
|
|
if (this.fields) {
|
|
fields = this.fields;
|
|
} else if (is(source, Subquery)) {
|
|
fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
|
|
} else if (is(source, SQLiteViewBase)) {
|
|
fields = source[ViewBaseConfig].selectedFields;
|
|
} else if (is(source, SQL)) {
|
|
fields = {};
|
|
} else {
|
|
fields = getTableColumns(source);
|
|
}
|
|
return new SQLiteSelectBase({
|
|
table: source,
|
|
fields,
|
|
isPartialSelect,
|
|
session: this.session,
|
|
dialect: this.dialect,
|
|
withList: this.withList,
|
|
distinct: this.distinct
|
|
});
|
|
}
|
|
}
|
|
|
|
class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
|
|
static [entityKind] = "SQLiteSelectQueryBuilder";
|
|
_;
|
|
config;
|
|
joinsNotNullableMap;
|
|
tableName;
|
|
isPartialSelect;
|
|
session;
|
|
dialect;
|
|
cacheConfig = undefined;
|
|
usedTables = /* @__PURE__ */ new Set;
|
|
constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
|
|
super();
|
|
this.config = {
|
|
withList,
|
|
table,
|
|
fields: { ...fields },
|
|
distinct,
|
|
setOperators: []
|
|
};
|
|
this.isPartialSelect = isPartialSelect;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this._ = {
|
|
selectedFields: fields,
|
|
config: this.config
|
|
};
|
|
this.tableName = getTableLikeName(table);
|
|
this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
|
|
for (const item of extractUsedTable(table))
|
|
this.usedTables.add(item);
|
|
}
|
|
getUsedTables() {
|
|
return [...this.usedTables];
|
|
}
|
|
createJoin(joinType) {
|
|
return (table, on) => {
|
|
const baseTableName = this.tableName;
|
|
const tableName = getTableLikeName(table);
|
|
for (const item of extractUsedTable(table))
|
|
this.usedTables.add(item);
|
|
if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
|
|
throw new Error(`Alias "${tableName}" is already used in this query`);
|
|
}
|
|
if (!this.isPartialSelect) {
|
|
if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
|
|
this.config.fields = {
|
|
[baseTableName]: this.config.fields
|
|
};
|
|
}
|
|
if (typeof tableName === "string" && !is(table, SQL)) {
|
|
const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
|
|
this.config.fields[tableName] = selection;
|
|
}
|
|
}
|
|
if (typeof on === "function") {
|
|
on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
if (!this.config.joins) {
|
|
this.config.joins = [];
|
|
}
|
|
this.config.joins.push({ on, table, joinType, alias: tableName });
|
|
if (typeof tableName === "string") {
|
|
switch (joinType) {
|
|
case "left": {
|
|
this.joinsNotNullableMap[tableName] = false;
|
|
break;
|
|
}
|
|
case "right": {
|
|
this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
|
|
this.joinsNotNullableMap[tableName] = true;
|
|
break;
|
|
}
|
|
case "cross":
|
|
case "inner": {
|
|
this.joinsNotNullableMap[tableName] = true;
|
|
break;
|
|
}
|
|
case "full": {
|
|
this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
|
|
this.joinsNotNullableMap[tableName] = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
}
|
|
leftJoin = this.createJoin("left");
|
|
rightJoin = this.createJoin("right");
|
|
innerJoin = this.createJoin("inner");
|
|
fullJoin = this.createJoin("full");
|
|
crossJoin = this.createJoin("cross");
|
|
createSetOperator(type, isAll) {
|
|
return (rightSelection) => {
|
|
const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
|
|
if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
|
|
throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
|
|
}
|
|
this.config.setOperators.push({ type, isAll, rightSelect });
|
|
return this;
|
|
};
|
|
}
|
|
union = this.createSetOperator("union", false);
|
|
unionAll = this.createSetOperator("union", true);
|
|
intersect = this.createSetOperator("intersect", false);
|
|
except = this.createSetOperator("except", false);
|
|
addSetOperators(setOperators) {
|
|
this.config.setOperators.push(...setOperators);
|
|
return this;
|
|
}
|
|
where(where) {
|
|
if (typeof where === "function") {
|
|
where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
having(having) {
|
|
if (typeof having === "function") {
|
|
having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.having = having;
|
|
return this;
|
|
}
|
|
groupBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
|
|
} else {
|
|
this.config.groupBy = columns;
|
|
}
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).orderBy = orderByArray;
|
|
} else {
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
} else {
|
|
const orderByArray = columns;
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).orderBy = orderByArray;
|
|
} else {
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).limit = limit;
|
|
} else {
|
|
this.config.limit = limit;
|
|
}
|
|
return this;
|
|
}
|
|
offset(offset) {
|
|
if (this.config.setOperators.length > 0) {
|
|
this.config.setOperators.at(-1).offset = offset;
|
|
} else {
|
|
this.config.offset = offset;
|
|
}
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildSelectQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
as(alias) {
|
|
const usedTables = [];
|
|
usedTables.push(...extractUsedTable(this.config.table));
|
|
if (this.config.joins) {
|
|
for (const it of this.config.joins)
|
|
usedTables.push(...extractUsedTable(it.table));
|
|
}
|
|
return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
}
|
|
getSelectedFields() {
|
|
return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
|
|
static [entityKind] = "SQLiteSelect";
|
|
_prepare(isOneTimeQuery = true) {
|
|
if (!this.session) {
|
|
throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
|
|
}
|
|
const fieldsList = orderSelectedFields(this.config.fields);
|
|
const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
|
|
type: "select",
|
|
tables: [...this.usedTables]
|
|
}, this.cacheConfig);
|
|
query.joinsNotNullableMap = this.joinsNotNullableMap;
|
|
return query;
|
|
}
|
|
$withCache(config) {
|
|
this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
|
|
return this;
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.all();
|
|
}
|
|
}
|
|
applyMixins(SQLiteSelectBase, [QueryPromise]);
|
|
function createSetOperator(type, isAll) {
|
|
return (leftSelect, rightSelect, ...restSelects) => {
|
|
const setOperators = [rightSelect, ...restSelects].map((select) => ({
|
|
type,
|
|
isAll,
|
|
rightSelect: select
|
|
}));
|
|
for (const setOperator of setOperators) {
|
|
if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
|
|
throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
|
|
}
|
|
}
|
|
return leftSelect.addSetOperators(setOperators);
|
|
};
|
|
}
|
|
var getSQLiteSetOperators = () => ({
|
|
union,
|
|
unionAll,
|
|
intersect,
|
|
except
|
|
});
|
|
var union = createSetOperator("union", false);
|
|
var unionAll = createSetOperator("union", true);
|
|
var intersect = createSetOperator("intersect", false);
|
|
var except = createSetOperator("except", false);
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
|
|
class QueryBuilder {
|
|
static [entityKind] = "SQLiteQueryBuilder";
|
|
dialect;
|
|
dialectConfig;
|
|
constructor(dialect) {
|
|
this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
|
|
this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
|
|
}
|
|
$with = (alias, selection) => {
|
|
const queryBuilder = this;
|
|
const as = (qb) => {
|
|
if (typeof qb === "function") {
|
|
qb = qb(queryBuilder);
|
|
}
|
|
return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
};
|
|
return { as };
|
|
};
|
|
with(...queries) {
|
|
const self2 = this;
|
|
function select(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: self2.getDialect(),
|
|
withList: queries
|
|
});
|
|
}
|
|
function selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: self2.getDialect(),
|
|
withList: queries,
|
|
distinct: true
|
|
});
|
|
}
|
|
return { select, selectDistinct };
|
|
}
|
|
select(fields) {
|
|
return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
|
|
}
|
|
selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: undefined,
|
|
dialect: this.getDialect(),
|
|
distinct: true
|
|
});
|
|
}
|
|
getDialect() {
|
|
if (!this.dialect) {
|
|
this.dialect = new SQLiteSyncDialect(this.dialectConfig);
|
|
}
|
|
return this.dialect;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
|
|
class SQLiteInsertBuilder {
|
|
constructor(table, session, dialect, withList) {
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.withList = withList;
|
|
}
|
|
static [entityKind] = "SQLiteInsertBuilder";
|
|
values(values) {
|
|
values = Array.isArray(values) ? values : [values];
|
|
if (values.length === 0) {
|
|
throw new Error("values() must be called with at least one value");
|
|
}
|
|
const mappedValues = values.map((entry) => {
|
|
const result = {};
|
|
const cols = this.table[Table.Symbol.Columns];
|
|
for (const colKey of Object.keys(entry)) {
|
|
const colValue = entry[colKey];
|
|
result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
|
|
}
|
|
return result;
|
|
});
|
|
return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
|
|
}
|
|
select(selectQuery) {
|
|
const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
|
|
if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
|
|
throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
|
|
}
|
|
return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
|
|
}
|
|
}
|
|
|
|
class SQLiteInsertBase extends QueryPromise {
|
|
constructor(table, values, session, dialect, withList, select) {
|
|
super();
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { table, values, withList, select };
|
|
}
|
|
static [entityKind] = "SQLiteInsert";
|
|
config;
|
|
returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
onConflictDoNothing(config = {}) {
|
|
if (!this.config.onConflict)
|
|
this.config.onConflict = [];
|
|
if (config.target === undefined) {
|
|
this.config.onConflict.push(sql` on conflict do nothing`);
|
|
} else {
|
|
const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
|
|
const whereSql = config.where ? sql` where ${config.where}` : sql``;
|
|
this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
|
|
}
|
|
return this;
|
|
}
|
|
onConflictDoUpdate(config) {
|
|
if (config.where && (config.targetWhere || config.setWhere)) {
|
|
throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
|
|
}
|
|
if (!this.config.onConflict)
|
|
this.config.onConflict = [];
|
|
const whereSql = config.where ? sql` where ${config.where}` : undefined;
|
|
const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
|
|
const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
|
|
const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
|
|
const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
|
|
this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildInsertQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "insert",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.config.returning ? this.all() : this.run();
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
|
|
class SQLiteUpdateBuilder {
|
|
constructor(table, session, dialect, withList) {
|
|
this.table = table;
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.withList = withList;
|
|
}
|
|
static [entityKind] = "SQLiteUpdateBuilder";
|
|
set(values) {
|
|
return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
|
|
}
|
|
}
|
|
|
|
class SQLiteUpdateBase extends QueryPromise {
|
|
constructor(table, set, session, dialect, withList) {
|
|
super();
|
|
this.session = session;
|
|
this.dialect = dialect;
|
|
this.config = { set, table, withList, joins: [] };
|
|
}
|
|
static [entityKind] = "SQLiteUpdate";
|
|
config;
|
|
from(source) {
|
|
this.config.from = source;
|
|
return this;
|
|
}
|
|
createJoin(joinType) {
|
|
return (table, on) => {
|
|
const tableName = getTableLikeName(table);
|
|
if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
|
|
throw new Error(`Alias "${tableName}" is already used in this query`);
|
|
}
|
|
if (typeof on === "function") {
|
|
const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
|
|
on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
|
|
}
|
|
this.config.joins.push({ on, table, joinType, alias: tableName });
|
|
return this;
|
|
};
|
|
}
|
|
leftJoin = this.createJoin("left");
|
|
rightJoin = this.createJoin("right");
|
|
innerJoin = this.createJoin("inner");
|
|
fullJoin = this.createJoin("full");
|
|
where(where) {
|
|
this.config.where = where;
|
|
return this;
|
|
}
|
|
orderBy(...columns) {
|
|
if (typeof columns[0] === "function") {
|
|
const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
|
|
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
this.config.orderBy = orderByArray;
|
|
} else {
|
|
const orderByArray = columns;
|
|
this.config.orderBy = orderByArray;
|
|
}
|
|
return this;
|
|
}
|
|
limit(limit) {
|
|
this.config.limit = limit;
|
|
return this;
|
|
}
|
|
returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
|
|
this.config.returning = orderSelectedFields(fields);
|
|
return this;
|
|
}
|
|
getSQL() {
|
|
return this.dialect.buildUpdateQuery(this.config);
|
|
}
|
|
toSQL() {
|
|
const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
|
|
return rest;
|
|
}
|
|
_prepare(isOneTimeQuery = true) {
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
|
|
type: "insert",
|
|
tables: extractUsedTable(this.config.table)
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
run = (placeholderValues) => {
|
|
return this._prepare().run(placeholderValues);
|
|
};
|
|
all = (placeholderValues) => {
|
|
return this._prepare().all(placeholderValues);
|
|
};
|
|
get = (placeholderValues) => {
|
|
return this._prepare().get(placeholderValues);
|
|
};
|
|
values = (placeholderValues) => {
|
|
return this._prepare().values(placeholderValues);
|
|
};
|
|
async execute() {
|
|
return this.config.returning ? this.all() : this.run();
|
|
}
|
|
$dynamic() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
|
|
class SQLiteCountBuilder extends SQL {
|
|
constructor(params) {
|
|
super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
|
|
this.params = params;
|
|
this.session = params.session;
|
|
this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
|
|
}
|
|
sql;
|
|
static [entityKind] = "SQLiteCountBuilderAsync";
|
|
[Symbol.toStringTag] = "SQLiteCountBuilderAsync";
|
|
session;
|
|
static buildEmbeddedCount(source, filters) {
|
|
return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
|
|
}
|
|
static buildCount(source, filters) {
|
|
return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
|
|
}
|
|
then(onfulfilled, onrejected) {
|
|
return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
|
|
}
|
|
catch(onRejected) {
|
|
return this.then(undefined, onRejected);
|
|
}
|
|
finally(onFinally) {
|
|
return this.then((value) => {
|
|
onFinally?.();
|
|
return value;
|
|
}, (reason) => {
|
|
onFinally?.();
|
|
throw reason;
|
|
});
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
|
|
class RelationalQueryBuilder {
|
|
constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
|
|
this.mode = mode;
|
|
this.fullSchema = fullSchema;
|
|
this.schema = schema;
|
|
this.tableNamesMap = tableNamesMap;
|
|
this.table = table;
|
|
this.tableConfig = tableConfig;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
}
|
|
static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
|
|
findMany(config) {
|
|
return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
|
|
}
|
|
findFirst(config) {
|
|
return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
|
|
}
|
|
}
|
|
|
|
class SQLiteRelationalQuery extends QueryPromise {
|
|
constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
|
|
super();
|
|
this.fullSchema = fullSchema;
|
|
this.schema = schema;
|
|
this.tableNamesMap = tableNamesMap;
|
|
this.table = table;
|
|
this.tableConfig = tableConfig;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
this.config = config;
|
|
this.mode = mode;
|
|
}
|
|
static [entityKind] = "SQLiteAsyncRelationalQuery";
|
|
mode;
|
|
getSQL() {
|
|
return this.dialect.buildRelationalQuery({
|
|
fullSchema: this.fullSchema,
|
|
schema: this.schema,
|
|
tableNamesMap: this.tableNamesMap,
|
|
table: this.table,
|
|
tableConfig: this.tableConfig,
|
|
queryConfig: this.config,
|
|
tableAlias: this.tableConfig.tsName
|
|
}).sql;
|
|
}
|
|
_prepare(isOneTimeQuery = false) {
|
|
const { query, builtQuery } = this._toSQL();
|
|
return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
|
|
const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
|
|
if (this.mode === "first") {
|
|
return rows[0];
|
|
}
|
|
return rows;
|
|
});
|
|
}
|
|
prepare() {
|
|
return this._prepare(false);
|
|
}
|
|
_toSQL() {
|
|
const query = this.dialect.buildRelationalQuery({
|
|
fullSchema: this.fullSchema,
|
|
schema: this.schema,
|
|
tableNamesMap: this.tableNamesMap,
|
|
table: this.table,
|
|
tableConfig: this.tableConfig,
|
|
queryConfig: this.config,
|
|
tableAlias: this.tableConfig.tsName
|
|
});
|
|
const builtQuery = this.dialect.sqlToQuery(query.sql);
|
|
return { query, builtQuery };
|
|
}
|
|
toSQL() {
|
|
return this._toSQL().builtQuery;
|
|
}
|
|
executeRaw() {
|
|
if (this.mode === "first") {
|
|
return this._prepare(false).get();
|
|
}
|
|
return this._prepare(false).all();
|
|
}
|
|
async execute() {
|
|
return this.executeRaw();
|
|
}
|
|
}
|
|
|
|
class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
|
|
static [entityKind] = "SQLiteSyncRelationalQuery";
|
|
sync() {
|
|
return this.executeRaw();
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
|
|
class SQLiteRaw extends QueryPromise {
|
|
constructor(execute, getSQL, action, dialect, mapBatchResult) {
|
|
super();
|
|
this.execute = execute;
|
|
this.getSQL = getSQL;
|
|
this.dialect = dialect;
|
|
this.mapBatchResult = mapBatchResult;
|
|
this.config = { action };
|
|
}
|
|
static [entityKind] = "SQLiteRaw";
|
|
config;
|
|
getQuery() {
|
|
return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
|
|
}
|
|
mapResult(result, isFromBatch) {
|
|
return isFromBatch ? this.mapBatchResult(result) : result;
|
|
}
|
|
_prepare() {
|
|
return this;
|
|
}
|
|
isResponseInArrayMode() {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
|
|
class BaseSQLiteDatabase {
|
|
constructor(resultKind, dialect, session, schema) {
|
|
this.resultKind = resultKind;
|
|
this.dialect = dialect;
|
|
this.session = session;
|
|
this._ = schema ? {
|
|
schema: schema.schema,
|
|
fullSchema: schema.fullSchema,
|
|
tableNamesMap: schema.tableNamesMap
|
|
} : {
|
|
schema: undefined,
|
|
fullSchema: {},
|
|
tableNamesMap: {}
|
|
};
|
|
this.query = {};
|
|
const query = this.query;
|
|
if (this._.schema) {
|
|
for (const [tableName, columns] of Object.entries(this._.schema)) {
|
|
query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
|
|
}
|
|
}
|
|
this.$cache = { invalidate: async (_params) => {} };
|
|
}
|
|
static [entityKind] = "BaseSQLiteDatabase";
|
|
query;
|
|
$with = (alias, selection) => {
|
|
const self2 = this;
|
|
const as = (qb) => {
|
|
if (typeof qb === "function") {
|
|
qb = qb(new QueryBuilder(self2.dialect));
|
|
}
|
|
return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
|
|
};
|
|
return { as };
|
|
};
|
|
$count(source, filters) {
|
|
return new SQLiteCountBuilder({ source, filters, session: this.session });
|
|
}
|
|
with(...queries) {
|
|
const self2 = this;
|
|
function select(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: self2.session,
|
|
dialect: self2.dialect,
|
|
withList: queries
|
|
});
|
|
}
|
|
function selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: self2.session,
|
|
dialect: self2.dialect,
|
|
withList: queries,
|
|
distinct: true
|
|
});
|
|
}
|
|
function update(table) {
|
|
return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
|
|
}
|
|
function insert(into) {
|
|
return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
|
|
}
|
|
function delete_(from) {
|
|
return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
|
|
}
|
|
return { select, selectDistinct, update, insert, delete: delete_ };
|
|
}
|
|
select(fields) {
|
|
return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
|
|
}
|
|
selectDistinct(fields) {
|
|
return new SQLiteSelectBuilder({
|
|
fields: fields ?? undefined,
|
|
session: this.session,
|
|
dialect: this.dialect,
|
|
distinct: true
|
|
});
|
|
}
|
|
update(table) {
|
|
return new SQLiteUpdateBuilder(table, this.session, this.dialect);
|
|
}
|
|
$cache;
|
|
insert(into) {
|
|
return new SQLiteInsertBuilder(into, this.session, this.dialect);
|
|
}
|
|
delete(from) {
|
|
return new SQLiteDeleteBase(from, this.session, this.dialect);
|
|
}
|
|
run(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.run(sequel);
|
|
}
|
|
all(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.all(sequel);
|
|
}
|
|
get(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.get(sequel);
|
|
}
|
|
values(query) {
|
|
const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
|
|
if (this.resultKind === "async") {
|
|
return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
|
|
}
|
|
return this.session.values(sequel);
|
|
}
|
|
transaction(transaction, config) {
|
|
return this.session.transaction(transaction, config);
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/cache/core/cache.js
|
|
class Cache {
|
|
static [entityKind] = "Cache";
|
|
}
|
|
|
|
class NoopCache extends Cache {
|
|
strategy() {
|
|
return "all";
|
|
}
|
|
static [entityKind] = "NoopCache";
|
|
async get(_key) {
|
|
return;
|
|
}
|
|
async put(_hashedQuery, _response, _tables, _config) {}
|
|
async onMutate(_params) {}
|
|
}
|
|
async function hashQuery(sql2, params) {
|
|
const dataToHash = `${sql2}-${JSON.stringify(params)}`;
|
|
const encoder = new TextEncoder;
|
|
const data = encoder.encode(dataToHash);
|
|
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
const hashArray = [...new Uint8Array(hashBuffer)];
|
|
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
return hashHex;
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
|
|
class ExecuteResultSync extends QueryPromise {
|
|
constructor(resultCb) {
|
|
super();
|
|
this.resultCb = resultCb;
|
|
}
|
|
static [entityKind] = "ExecuteResultSync";
|
|
async execute() {
|
|
return this.resultCb();
|
|
}
|
|
sync() {
|
|
return this.resultCb();
|
|
}
|
|
}
|
|
|
|
class SQLitePreparedQuery {
|
|
constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
|
|
this.mode = mode;
|
|
this.executeMethod = executeMethod;
|
|
this.query = query;
|
|
this.cache = cache;
|
|
this.queryMetadata = queryMetadata;
|
|
this.cacheConfig = cacheConfig;
|
|
if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
|
|
this.cacheConfig = { enable: true, autoInvalidate: true };
|
|
}
|
|
if (!this.cacheConfig?.enable) {
|
|
this.cacheConfig = undefined;
|
|
}
|
|
}
|
|
static [entityKind] = "PreparedQuery";
|
|
joinsNotNullableMap;
|
|
async queryWithCache(queryString, params, query) {
|
|
if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (this.cacheConfig && !this.cacheConfig.enable) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
|
|
try {
|
|
const [res] = await Promise.all([
|
|
query(),
|
|
this.cache.onMutate({ tables: this.queryMetadata.tables })
|
|
]);
|
|
return res;
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (!this.cacheConfig) {
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
if (this.queryMetadata.type === "select") {
|
|
const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
|
|
if (fromCache === undefined) {
|
|
let result;
|
|
try {
|
|
result = await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
|
|
return result;
|
|
}
|
|
return fromCache;
|
|
}
|
|
try {
|
|
return await query();
|
|
} catch (e) {
|
|
throw new DrizzleQueryError(queryString, params, e);
|
|
}
|
|
}
|
|
getQuery() {
|
|
return this.query;
|
|
}
|
|
mapRunResult(result, _isFromBatch) {
|
|
return result;
|
|
}
|
|
mapAllResult(_result, _isFromBatch) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
mapGetResult(_result, _isFromBatch) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
execute(placeholderValues) {
|
|
if (this.mode === "async") {
|
|
return this[this.executeMethod](placeholderValues);
|
|
}
|
|
return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
|
|
}
|
|
mapResult(response, isFromBatch) {
|
|
switch (this.executeMethod) {
|
|
case "run": {
|
|
return this.mapRunResult(response, isFromBatch);
|
|
}
|
|
case "all": {
|
|
return this.mapAllResult(response, isFromBatch);
|
|
}
|
|
case "get": {
|
|
return this.mapGetResult(response, isFromBatch);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class SQLiteSession {
|
|
constructor(dialect) {
|
|
this.dialect = dialect;
|
|
}
|
|
static [entityKind] = "SQLiteSession";
|
|
prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
|
|
return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
|
|
}
|
|
run(query) {
|
|
const staticQuery = this.dialect.sqlToQuery(query);
|
|
try {
|
|
return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
|
|
} catch (err) {
|
|
throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
|
|
}
|
|
}
|
|
extractRawRunValueFromBatchResult(result) {
|
|
return result;
|
|
}
|
|
all(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
|
|
}
|
|
extractRawAllValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
get(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
|
|
}
|
|
extractRawGetValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
values(query) {
|
|
return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
|
|
}
|
|
async count(sql2) {
|
|
const result = await this.values(sql2);
|
|
return result[0][0];
|
|
}
|
|
extractRawValuesValueFromBatchResult(_result) {
|
|
throw new Error("Not implemented");
|
|
}
|
|
}
|
|
|
|
class SQLiteTransaction extends BaseSQLiteDatabase {
|
|
constructor(resultType, dialect, session, schema, nestedIndex = 0) {
|
|
super(resultType, dialect, session, schema);
|
|
this.schema = schema;
|
|
this.nestedIndex = nestedIndex;
|
|
}
|
|
static [entityKind] = "SQLiteTransaction";
|
|
rollback() {
|
|
throw new TransactionRollbackError;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/logger.js
|
|
class ConsoleLogWriter {
|
|
static [entityKind] = "ConsoleLogWriter";
|
|
write(message) {
|
|
console.log(message);
|
|
}
|
|
}
|
|
|
|
class DefaultLogger {
|
|
static [entityKind] = "DefaultLogger";
|
|
writer;
|
|
constructor(config) {
|
|
this.writer = config?.writer ?? new ConsoleLogWriter;
|
|
}
|
|
logQuery(query, params) {
|
|
const stringifiedParams = params.map((p) => {
|
|
try {
|
|
return JSON.stringify(p);
|
|
} catch {
|
|
return String(p);
|
|
}
|
|
});
|
|
const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
|
|
this.writer.write(`Query: ${query}${paramsStr}`);
|
|
}
|
|
}
|
|
|
|
class NoopLogger {
|
|
static [entityKind] = "NoopLogger";
|
|
logQuery() {}
|
|
}
|
|
|
|
// ../eve/dist/db/schema.js
|
|
var schema_exports = {};
|
|
__export(schema_exports, {
|
|
characters: () => characters,
|
|
charactersRelations: () => charactersRelations,
|
|
miningFleetParticipants: () => miningFleetParticipants,
|
|
miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
|
|
miningFleets: () => miningFleets,
|
|
miningFleetsRelations: () => miningFleetsRelations,
|
|
resumeCommands: () => resumeCommands,
|
|
shared: () => shared,
|
|
users: () => users,
|
|
usersRelations: () => usersRelations
|
|
});
|
|
var shared = {
|
|
createdAt: integer("created_at").notNull(),
|
|
updatedAt: integer("updated_at")
|
|
};
|
|
var users = sqliteTable("users", {
|
|
id: integer().primaryKey().unique().notNull(),
|
|
discordID: text("discord_id").unique().notNull(),
|
|
mainCharacter: integer("main_character"),
|
|
...shared
|
|
}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
|
|
var usersRelations = relations(users, ({ one, many }) => ({
|
|
characters: many(characters),
|
|
main: one(characters, {
|
|
fields: [users.mainCharacter],
|
|
references: [characters.id]
|
|
})
|
|
}));
|
|
var characters = sqliteTable("characters", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
eveID: integer("eve_id").notNull(),
|
|
userID: integer("user_id").notNull(),
|
|
name: text().notNull(),
|
|
accessToken: text("access_token").notNull(),
|
|
expiresAt: integer("expires_at").notNull(),
|
|
refreshToken: text("refresh_token").notNull(),
|
|
...shared
|
|
}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
|
|
var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
|
|
fields: [characters.userID],
|
|
references: [users.id]
|
|
}) }));
|
|
var resumeCommands = sqliteTable("resumecommands", {
|
|
id: text().primaryKey(),
|
|
command: text().notNull(),
|
|
params: text().notNull(),
|
|
context: text().notNull(),
|
|
...shared
|
|
});
|
|
var miningFleets = sqliteTable("mining_fleets", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
name: text("name").notNull(),
|
|
description: text("description"),
|
|
creatorDiscordId: text("creator_discord_id").notNull(),
|
|
startTime: integer("start_time").notNull(),
|
|
endTime: integer("end_time"),
|
|
status: text("status", { enum: [
|
|
"configuring",
|
|
"active",
|
|
"ended",
|
|
"generating_report",
|
|
"completed",
|
|
"failed"
|
|
] }).notNull().default("configuring"),
|
|
taxRate: real("tax_rate").notNull().default(0),
|
|
publicMessageId: text("public_message_id").unique(),
|
|
publicChannelId: text("public_channel_id"),
|
|
reportData: text("report_data"),
|
|
creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
|
|
...shared
|
|
}, (table) => [
|
|
index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
|
|
index("idx_fleet_status").on(table.status),
|
|
index("idx_fleet_public_message_id").on(table.publicMessageId)
|
|
]);
|
|
var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
|
|
characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
|
|
discordId: text("discord_id").notNull(),
|
|
role: text("role", { enum: [
|
|
"miner",
|
|
"security",
|
|
"hauler"
|
|
] }).notNull(),
|
|
joinTime: integer("join_time").notNull(),
|
|
...shared
|
|
}, (table) => [
|
|
index("idx_participant_fleet_id").on(table.fleetId),
|
|
index("idx_participant_character_id").on(table.characterId),
|
|
index("idx_participant_discord_id").on(table.discordId)
|
|
]);
|
|
var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
|
|
var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
|
|
fleet: one(miningFleets, {
|
|
fields: [miningFleetParticipants.fleetId],
|
|
references: [miningFleets.id]
|
|
}),
|
|
character: one(characters, {
|
|
fields: [miningFleetParticipants.characterId],
|
|
references: [characters.id]
|
|
})
|
|
}));
|
|
|
|
// ../eve/dist/esi/options.js
|
|
var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
|
|
var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
|
|
var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
|
|
var USER_AGENT = process.env.ESI_USER_AGENT || "";
|
|
var options = {
|
|
client_id: CLIENT_ID,
|
|
client_secret: CLIENT_SECRET,
|
|
callback_url: CALLBACK_URL,
|
|
user_agent: USER_AGENT
|
|
};
|
|
|
|
// ../eve/node_modules/jwt-decode/build/esm/index.js
|
|
class InvalidTokenError extends Error {
|
|
}
|
|
InvalidTokenError.prototype.name = "InvalidTokenError";
|
|
function b64DecodeUnicode(str) {
|
|
return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
|
|
let code = p.charCodeAt(0).toString(16).toUpperCase();
|
|
if (code.length < 2) {
|
|
code = "0" + code;
|
|
}
|
|
return "%" + code;
|
|
}));
|
|
}
|
|
function base64UrlDecode(str) {
|
|
let output = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
switch (output.length % 4) {
|
|
case 0:
|
|
break;
|
|
case 2:
|
|
output += "==";
|
|
break;
|
|
case 3:
|
|
output += "=";
|
|
break;
|
|
default:
|
|
throw new Error("base64 string is not of the correct length");
|
|
}
|
|
try {
|
|
return b64DecodeUnicode(output);
|
|
} catch (err) {
|
|
return atob(output);
|
|
}
|
|
}
|
|
function jwtDecode(token, options2) {
|
|
if (typeof token !== "string") {
|
|
throw new InvalidTokenError("Invalid token specified: must be a string");
|
|
}
|
|
options2 || (options2 = {});
|
|
const pos = options2.header === true ? 0 : 1;
|
|
const part = token.split(".")[pos];
|
|
if (typeof part !== "string") {
|
|
throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
|
|
}
|
|
let decoded;
|
|
try {
|
|
decoded = base64UrlDecode(part);
|
|
} catch (e) {
|
|
throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
|
|
}
|
|
try {
|
|
return JSON.parse(decoded);
|
|
} catch (e) {
|
|
throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
|
|
}
|
|
}
|
|
// ../eve/node_modules/@oslojs/encoding/dist/base32.js
|
|
var EncodingPadding;
|
|
(function(EncodingPadding2) {
|
|
EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
|
|
EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
|
|
})(EncodingPadding || (EncodingPadding = {}));
|
|
var DecodingPadding;
|
|
(function(DecodingPadding2) {
|
|
DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
|
|
DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
|
|
})(DecodingPadding || (DecodingPadding = {}));
|
|
// ../eve/node_modules/@oslojs/encoding/dist/base64.js
|
|
function encodeBase64urlNoPadding(bytes) {
|
|
return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
|
|
}
|
|
function encodeBase64_internal(bytes, alphabet, padding) {
|
|
let result = "";
|
|
for (let i = 0;i < bytes.byteLength; i += 3) {
|
|
let buffer = 0;
|
|
let bufferBitSize = 0;
|
|
for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
|
|
buffer = buffer << 8 | bytes[i + j];
|
|
bufferBitSize += 8;
|
|
}
|
|
for (let j = 0;j < 4; j++) {
|
|
if (bufferBitSize >= 6) {
|
|
result += alphabet[buffer >> bufferBitSize - 6 & 63];
|
|
bufferBitSize -= 6;
|
|
} else if (bufferBitSize > 0) {
|
|
result += alphabet[buffer << 6 - bufferBitSize & 63];
|
|
bufferBitSize = 0;
|
|
} else if (padding === EncodingPadding2.Include) {
|
|
result += "=";
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
var EncodingPadding2;
|
|
(function(EncodingPadding3) {
|
|
EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
|
|
EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
|
|
})(EncodingPadding2 || (EncodingPadding2 = {}));
|
|
var DecodingPadding2;
|
|
(function(DecodingPadding3) {
|
|
DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
|
|
DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
|
|
})(DecodingPadding2 || (DecodingPadding2 = {}));
|
|
// ../eve/dist/esi/auth.js
|
|
var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
|
|
var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
|
|
var auth_exports = {};
|
|
__export(auth_exports, {
|
|
characterIdFromToken: () => characterIdFromToken,
|
|
createAuthorizationURL: () => createAuthorizationURL,
|
|
refresh: () => refresh,
|
|
validateAuthorizationCode: () => validateAuthorizationCode,
|
|
validateToken: () => validateToken
|
|
});
|
|
function generateState() {
|
|
const randomValues = new Uint8Array(32);
|
|
crypto.getRandomValues(randomValues);
|
|
return encodeBase64urlNoPadding(randomValues);
|
|
}
|
|
async function createAuthorizationURL(scopes = "publicData") {
|
|
const state = generateState();
|
|
const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
|
|
url.searchParams.set("response_type", "code");
|
|
url.searchParams.set("redirect_uri", options.callback_url);
|
|
url.searchParams.set("client_id", options.client_id);
|
|
url.searchParams.set("state", state);
|
|
url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
|
|
return {
|
|
url,
|
|
state
|
|
};
|
|
}
|
|
async function validateAuthorizationCode(code) {
|
|
try {
|
|
const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
|
|
},
|
|
body: new URLSearchParams({
|
|
grant_type: "authorization_code",
|
|
code
|
|
})
|
|
});
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error(`failed to validate EVE authorization code`, error);
|
|
throw `${error}`;
|
|
}
|
|
}
|
|
var eveAuthPublicKey;
|
|
async function validateToken(token) {
|
|
if (!eveAuthPublicKey)
|
|
try {
|
|
const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
|
|
eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
|
|
} catch (err) {
|
|
console.error(`failed to get EVE Auth public keys`, err);
|
|
}
|
|
try {
|
|
const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
|
|
return decoded;
|
|
} catch (err) {
|
|
console.error(`failed to validate EVE token`, err);
|
|
return null;
|
|
}
|
|
}
|
|
async function refresh({ refresh_token }, scopes) {
|
|
const params = {
|
|
grant_type: "refresh_token",
|
|
refresh_token,
|
|
scope: ""
|
|
};
|
|
if (scopes)
|
|
params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
|
|
const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
|
|
},
|
|
body: new URLSearchParams(params)
|
|
});
|
|
return await response.json();
|
|
}
|
|
function characterIdFromToken(token) {
|
|
const payload = jwtDecode(token);
|
|
return parseInt(payload.sub.split(":")[2]);
|
|
}
|
|
|
|
// ../eve/dist/db/models/character.model.js
|
|
var CharacterHelper = class CharacterHelper2 {
|
|
static hasValidToken(character) {
|
|
return /* @__PURE__ */ new Date < character.expiresAt;
|
|
}
|
|
static getScopes(character) {
|
|
const decoded = jwtDecode(character.accessToken);
|
|
return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
|
|
}
|
|
static hasOnlyPublicScope(character) {
|
|
return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
|
|
}
|
|
static getTokens(character) {
|
|
return {
|
|
access_token: character.accessToken,
|
|
refresh_token: character.refreshToken,
|
|
expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
|
|
};
|
|
}
|
|
static hasScope(character, scope) {
|
|
return this.getScopes(character).includes(scope);
|
|
}
|
|
static hasAllScopes(character, scopes) {
|
|
const has = this.getScopes(character);
|
|
return scopes.every((scope) => has.includes(scope));
|
|
}
|
|
static find(id) {
|
|
const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findByUser(user) {
|
|
const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
|
|
return this.createCharacters(result);
|
|
}
|
|
static findByUserAndEveID(userID, eveID) {
|
|
const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findByName(userID, name) {
|
|
const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
|
|
const c = this.createCharacters(result);
|
|
return c ? c[0] : undefined;
|
|
}
|
|
static findAll() {
|
|
const result = db.select().from(characters).all();
|
|
return this.createCharacters(result);
|
|
}
|
|
static create(eveID, name, user, tokens) {
|
|
return this.save({
|
|
eveID,
|
|
userID: user.id,
|
|
accessToken: tokens.access_token,
|
|
expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
|
|
refreshToken: tokens.refresh_token,
|
|
name,
|
|
createdAt: /* @__PURE__ */ new Date
|
|
});
|
|
}
|
|
static createCharacters(query) {
|
|
if (!query)
|
|
return [];
|
|
if (Array.isArray(query))
|
|
return query.map((character) => {
|
|
return {
|
|
id: character.id,
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
accessToken: character.accessToken,
|
|
expiresAt: new Date(character.expiresAt),
|
|
refreshToken: character.refreshToken,
|
|
name: character.name,
|
|
createdAt: new Date(character.createdAt),
|
|
updatedAt: new Date(character.updatedAt)
|
|
};
|
|
});
|
|
else
|
|
return [{
|
|
id: query.id,
|
|
eveID: query.eveID,
|
|
userID: query.userID,
|
|
accessToken: query.accessToken,
|
|
expiresAt: new Date(query.expiresAt),
|
|
refreshToken: query.refreshToken,
|
|
name: query.name,
|
|
createdAt: new Date(query.createdAt),
|
|
updatedAt: new Date(query.updatedAt)
|
|
}];
|
|
}
|
|
static save(character) {
|
|
db.insert(characters).values({
|
|
id: character.id,
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
name: character.name,
|
|
accessToken: character.accessToken,
|
|
expiresAt: character.expiresAt.getTime(),
|
|
refreshToken: character.refreshToken,
|
|
createdAt: Date.now(),
|
|
updatedAt: Date.now()
|
|
}).onConflictDoUpdate({
|
|
target: characters.id,
|
|
set: {
|
|
eveID: character.eveID,
|
|
userID: character.userID,
|
|
name: character.name,
|
|
accessToken: character.accessToken,
|
|
expiresAt: character.expiresAt.getTime(),
|
|
refreshToken: character.refreshToken,
|
|
updatedAt: Date.now()
|
|
}
|
|
}).run();
|
|
return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
|
|
}
|
|
static delete(character) {
|
|
db.delete(characters).where(eq(characters.id, character.id)).run();
|
|
}
|
|
static async refreshTokens(character, scopes) {
|
|
const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
|
|
const decoded = await validateToken(tokens.access_token);
|
|
if (!decoded) {
|
|
console.error(`Failed to validate token for character ${character.eveID}`);
|
|
return character;
|
|
}
|
|
character.accessToken = tokens.access_token;
|
|
character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
|
|
character.refreshToken = tokens.refresh_token;
|
|
this.save(character);
|
|
return character;
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/user.model.js
|
|
var UserHelper = class {
|
|
static find(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByDiscordId(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findAll() {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByCharacterId(id) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static findByCharacterName(name) {
|
|
const result = db.select({
|
|
id: users.id,
|
|
discordID: users.discordID,
|
|
createdAt: users.createdAt,
|
|
updatedAt: users.updatedAt,
|
|
mainCharacterID: users.mainCharacter,
|
|
characterIDsString: sql`json_group_array(characters.id)`
|
|
}).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static createFromQuery(query) {
|
|
if (!query)
|
|
return [];
|
|
if (Array.isArray(query))
|
|
return query.map((user) => {
|
|
return {
|
|
id: user.id,
|
|
discordID: user.discordID,
|
|
createdAt: new Date(user.createdAt),
|
|
updatedAt: new Date(user.updatedAt),
|
|
characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
|
|
mainCharacterID: user.mainCharacterID
|
|
};
|
|
});
|
|
else
|
|
return {
|
|
id: query.id,
|
|
discordID: query.discordID,
|
|
createdAt: new Date(query.createdAt),
|
|
updatedAt: new Date(query.updatedAt),
|
|
characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
|
|
mainCharacterID: query.mainCharacterID
|
|
};
|
|
}
|
|
static create(discordID) {
|
|
this.save({
|
|
discordID,
|
|
createdAt: /* @__PURE__ */ new Date,
|
|
updatedAt: /* @__PURE__ */ new Date
|
|
});
|
|
return this.findByDiscordId(discordID);
|
|
}
|
|
static save(user) {
|
|
db.insert(users).values({
|
|
id: user.id,
|
|
discordID: user.discordID,
|
|
mainCharacter: user.mainCharacterID,
|
|
createdAt: user.createdAt.getTime(),
|
|
updatedAt: user.updatedAt.getTime()
|
|
}).onConflictDoUpdate({
|
|
target: users.id,
|
|
set: {
|
|
discordID: user.discordID,
|
|
mainCharacter: user.mainCharacterID,
|
|
updatedAt: user.updatedAt.getTime()
|
|
}
|
|
}).run();
|
|
return user;
|
|
}
|
|
static delete(user) {
|
|
db.delete(users).where(eq(users.id, user.id)).run();
|
|
}
|
|
static getCharacter(user, index2) {
|
|
if (!user.characterIDs)
|
|
return;
|
|
if (index2 >= user.characterIDs.length)
|
|
return;
|
|
return CharacterHelper.find(user.characterIDs[index2]);
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/resume-command.model.js
|
|
var ResumeCommand = class ResumeCommand2 {
|
|
id;
|
|
command;
|
|
params;
|
|
context;
|
|
created = /* @__PURE__ */ new Date;
|
|
constructor() {
|
|
this.created = /* @__PURE__ */ new Date;
|
|
}
|
|
static find(messageId) {
|
|
const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
|
|
return this.createFromQuery(result);
|
|
}
|
|
static create(messageId, command, params = {}, context = {}) {
|
|
const resume = new ResumeCommand2;
|
|
resume.id = messageId;
|
|
resume.command = command;
|
|
resume.params = JSON.stringify(params);
|
|
resume.context = JSON.stringify(context);
|
|
return resume;
|
|
}
|
|
static createFromQuery(query) {
|
|
if (!query)
|
|
return null;
|
|
const resume = new ResumeCommand2;
|
|
resume.id = query.id;
|
|
resume.command = query.command;
|
|
resume.params = query.params;
|
|
resume.context = query.context;
|
|
resume.created = query.created;
|
|
return resume;
|
|
}
|
|
save() {
|
|
db.insert(resumeCommands).values({
|
|
id: this.id,
|
|
command: this.command,
|
|
params: this.params,
|
|
context: this.context,
|
|
createdAt: this.created.getTime()
|
|
}).onConflictDoUpdate({
|
|
target: resumeCommands.id,
|
|
set: {
|
|
command: this.command,
|
|
params: this.params,
|
|
context: this.context
|
|
}
|
|
}).run();
|
|
return this;
|
|
}
|
|
delete() {
|
|
db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
|
|
}
|
|
static delete(messageId) {
|
|
db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
|
|
}
|
|
};
|
|
|
|
// ../eve/dist/db/models/index.js
|
|
var models_exports = {};
|
|
__export(models_exports, {
|
|
CharacterHelper: () => CharacterHelper,
|
|
ResumeCommand: () => ResumeCommand,
|
|
UserHelper: () => UserHelper
|
|
});
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
|
|
import { Database } from "bun:sqlite";
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
|
|
class SQLiteBunSession extends SQLiteSession {
|
|
constructor(client, dialect, schema, options2 = {}) {
|
|
super(dialect);
|
|
this.client = client;
|
|
this.schema = schema;
|
|
this.logger = options2.logger ?? new NoopLogger;
|
|
}
|
|
static [entityKind] = "SQLiteBunSession";
|
|
logger;
|
|
exec(query) {
|
|
this.client.exec(query);
|
|
}
|
|
prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
|
|
const stmt = this.client.prepare(query.sql);
|
|
return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
|
|
}
|
|
transaction(transaction, config = {}) {
|
|
const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
|
|
let result;
|
|
const nativeTx = this.client.transaction(() => {
|
|
result = transaction(tx);
|
|
});
|
|
nativeTx[config.behavior ?? "deferred"]();
|
|
return result;
|
|
}
|
|
}
|
|
|
|
class SQLiteBunTransaction extends SQLiteTransaction {
|
|
static [entityKind] = "SQLiteBunTransaction";
|
|
transaction(transaction) {
|
|
const savepointName = `sp${this.nestedIndex}`;
|
|
const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
|
|
this.session.run(sql.raw(`savepoint ${savepointName}`));
|
|
try {
|
|
const result = transaction(tx);
|
|
this.session.run(sql.raw(`release savepoint ${savepointName}`));
|
|
return result;
|
|
} catch (err) {
|
|
this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
class PreparedQuery extends SQLitePreparedQuery {
|
|
constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
|
|
super("sync", executeMethod, query);
|
|
this.stmt = stmt;
|
|
this.logger = logger;
|
|
this.fields = fields;
|
|
this._isResponseInArrayMode = _isResponseInArrayMode;
|
|
this.customResultMapper = customResultMapper;
|
|
}
|
|
static [entityKind] = "SQLiteBunPreparedQuery";
|
|
run(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
return this.stmt.run(...params);
|
|
}
|
|
all(placeholderValues) {
|
|
const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
|
|
if (!fields && !customResultMapper) {
|
|
const params = fillPlaceholders(query.params, placeholderValues ?? {});
|
|
logger.logQuery(query.sql, params);
|
|
return stmt.all(...params);
|
|
}
|
|
const rows = this.values(placeholderValues);
|
|
if (customResultMapper) {
|
|
return customResultMapper(rows);
|
|
}
|
|
return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
|
|
}
|
|
get(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
const row = this.stmt.values(...params)[0];
|
|
if (!row) {
|
|
return;
|
|
}
|
|
const { fields, joinsNotNullableMap, customResultMapper } = this;
|
|
if (!fields && !customResultMapper) {
|
|
return row;
|
|
}
|
|
if (customResultMapper) {
|
|
return customResultMapper([row]);
|
|
}
|
|
return mapResultRow(fields, row, joinsNotNullableMap);
|
|
}
|
|
values(placeholderValues) {
|
|
const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
|
|
this.logger.logQuery(this.query.sql, params);
|
|
return this.stmt.values(...params);
|
|
}
|
|
isResponseInArrayMode() {
|
|
return this._isResponseInArrayMode;
|
|
}
|
|
}
|
|
|
|
// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
|
|
class BunSQLiteDatabase extends BaseSQLiteDatabase {
|
|
static [entityKind] = "BunSQLiteDatabase";
|
|
}
|
|
function construct(client, config = {}) {
|
|
const dialect = new SQLiteSyncDialect({ casing: config.casing });
|
|
let logger;
|
|
if (config.logger === true) {
|
|
logger = new DefaultLogger;
|
|
} else if (config.logger !== false) {
|
|
logger = config.logger;
|
|
}
|
|
let schema;
|
|
if (config.schema) {
|
|
const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
|
|
schema = {
|
|
fullSchema: config.schema,
|
|
schema: tablesConfig.tables,
|
|
tableNamesMap: tablesConfig.tableNamesMap
|
|
};
|
|
}
|
|
const session = new SQLiteBunSession(client, dialect, schema, { logger });
|
|
const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
|
|
db2.$client = client;
|
|
return db2;
|
|
}
|
|
function drizzle(...params) {
|
|
if (params[0] === undefined || typeof params[0] === "string") {
|
|
const instance = params[0] === undefined ? new Database : new Database(params[0]);
|
|
return construct(instance, params[1]);
|
|
}
|
|
if (isConfig(params[0])) {
|
|
const { connection, client, ...drizzleConfig } = params[0];
|
|
if (client)
|
|
return construct(client, drizzleConfig);
|
|
if (typeof connection === "object") {
|
|
const { source, ...opts } = connection;
|
|
const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
|
|
const instance2 = new Database(source, options2);
|
|
return construct(instance2, drizzleConfig);
|
|
}
|
|
const instance = new Database(connection);
|
|
return construct(instance, drizzleConfig);
|
|
}
|
|
return construct(params[0], params[1]);
|
|
}
|
|
((drizzle2) => {
|
|
function mock(config) {
|
|
return construct({}, config);
|
|
}
|
|
drizzle2.mock = mock;
|
|
})(drizzle || (drizzle = {}));
|
|
|
|
// ../eve/dist/db/index.js
|
|
import { Database as Database2 } from "bun:sqlite";
|
|
import { join } from "path";
|
|
var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
|
|
console.log("Using DB_PATH:", DB_PATH);
|
|
var sqlite = new Database2(DB_PATH);
|
|
var db = drizzle(sqlite, { schema: {
|
|
users,
|
|
characters,
|
|
resumeCommands,
|
|
miningFleets,
|
|
miningFleetParticipants
|
|
} });
|
|
|
|
// ../eve/dist/esi/scopes.js
|
|
var ESI_LATEST_URL = "https://esi.evetech.net/latest";
|
|
function joinScopes(...scopes) {
|
|
return scopes.join(" ");
|
|
}
|
|
var SCOPES = /* @__PURE__ */ function(SCOPES$1) {
|
|
SCOPES$1["PUBLIC_DATA"] = "publicData";
|
|
SCOPES$1["CALENDAR_RESPOND_CALENDAR_EVENTS"] = "esi-calendar.respond_calendar_events.v1";
|
|
SCOPES$1["CALENDAR_READ_CALENDAR_EVENTS"] = "esi-calendar.read_calendar_events.v1";
|
|
SCOPES$1["LOCATION_READ_LOCATION"] = "esi-location.read_location.v1";
|
|
SCOPES$1["LOCATION_READ_SHIP_TYPE"] = "esi-location.read_ship_type.v1";
|
|
SCOPES$1["MAIL_ORGANIZE_MAIL"] = "esi-mail.organize_mail.v1";
|
|
SCOPES$1["MAIL_READ_MAIL"] = "esi-mail.read_mail.v1";
|
|
SCOPES$1["MAIL_SEND_MAIL"] = "esi-mail.send_mail.v1";
|
|
SCOPES$1["SKILLS_READ_SKILLS"] = "esi-skills.read_skills.v1";
|
|
SCOPES$1["SKILLS_READ_SKILLQUEUE"] = "esi-skills.read_skillqueue.v1";
|
|
SCOPES$1["WALLET_READ_CHARACTER_WALLET"] = "esi-wallet.read_character_wallet.v1";
|
|
SCOPES$1["WALLET_READ_CORPORATION_WALLET"] = "esi-wallet.read_corporation_wallet.v1";
|
|
SCOPES$1["SEARCH_SEARCH_STRUCTURES"] = "esi-search.search_structures.v1";
|
|
SCOPES$1["CLONES_READ_CLONES"] = "esi-clones.read_clones.v1";
|
|
SCOPES$1["CHARACTERS_READ_CONTACTS"] = "esi-characters.read_contacts.v1";
|
|
SCOPES$1["UNIVERSE_READ_STRUCTURES"] = "esi-universe.read_structures.v1";
|
|
SCOPES$1["KILLMAILS_READ_KILLMAILS"] = "esi-killmails.read_killmails.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CORPORATION_MEMBERSHIP"] = "esi-corporations.read_corporation_membership.v1";
|
|
SCOPES$1["ASSETS_READ_ASSETS"] = "esi-assets.read_assets.v1";
|
|
SCOPES$1["PLANETS_MANAGE_PLANETS"] = "esi-planets.manage_planets.v1";
|
|
SCOPES$1["FLEETS_READ_FLEET"] = "esi-fleets.read_fleet.v1";
|
|
SCOPES$1["FLEETS_WRITE_FLEET"] = "esi-fleets.write_fleet.v1";
|
|
SCOPES$1["UI_OPEN_WINDOW"] = "esi-ui.open_window.v1";
|
|
SCOPES$1["UI_WRITE_WAYPOINT"] = "esi-ui.write_waypoint.v1";
|
|
SCOPES$1["CHARACTERS_WRITE_CONTACTS"] = "esi-characters.write_contacts.v1";
|
|
SCOPES$1["FITTINGS_READ_FITTINGS"] = "esi-fittings.read_fittings.v1";
|
|
SCOPES$1["FITTINGS_WRITE_FITTINGS"] = "esi-fittings.write_fittings.v1";
|
|
SCOPES$1["MARKETS_STRUCTURE_MARKETS"] = "esi-markets.structure_markets.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STRUCTURES"] = "esi-corporations.read_structures.v1";
|
|
SCOPES$1["CHARACTERS_READ_LOYALTY"] = "esi-characters.read_loyalty.v1";
|
|
SCOPES$1["CHARACTERS_READ_OPPORTUNITIES"] = "esi-characters.read_opportunities.v1";
|
|
SCOPES$1["CHARACTERS_READ_CHAT_CHANNELS"] = "esi-characters.read_chat_channels.v1";
|
|
SCOPES$1["CHARACTERS_READ_MEDALS"] = "esi-characters.read_medals.v1";
|
|
SCOPES$1["CHARACTERS_READ_STANDINGS"] = "esi-characters.read_standings.v1";
|
|
SCOPES$1["CHARACTERS_READ_AGENTS_RESEARCH"] = "esi-characters.read_agents_research.v1";
|
|
SCOPES$1["INDUSTRY_READ_CHARACTER_JOBS"] = "esi-industry.read_character_jobs.v1";
|
|
SCOPES$1["MARKETS_READ_CHARACTER_ORDERS"] = "esi-markets.read_character_orders.v1";
|
|
SCOPES$1["CHARACTERS_READ_BLUEPRINTS"] = "esi-characters.read_blueprints.v1";
|
|
SCOPES$1["CHARACTERS_READ_CORPORATION_ROLES"] = "esi-characters.read_corporation_roles.v1";
|
|
SCOPES$1["LOCATION_READ_ONLINE"] = "esi-location.read_online.v1";
|
|
SCOPES$1["CONTRACTS_READ_CHARACTER_CONTRACTS"] = "esi-contracts.read_character_contracts.v1";
|
|
SCOPES$1["CLONES_READ_IMPLANTS"] = "esi-clones.read_implants.v1";
|
|
SCOPES$1["CHARACTERS_READ_FATIGUE"] = "esi-characters.read_fatigue.v1";
|
|
SCOPES$1["KILLMAILS_READ_CORPORATION_KILLMAILS"] = "esi-killmails.read_corporation_killmails.v1";
|
|
SCOPES$1["CORPORATIONS_TRACK_MEMBERS"] = "esi-corporations.track_members.v1";
|
|
SCOPES$1["WALLET_READ_CORPORATION_WALLETS"] = "esi-wallet.read_corporation_wallets.v1";
|
|
SCOPES$1["CHARACTERS_READ_NOTIFICATIONS"] = "esi-characters.read_notifications.v1";
|
|
SCOPES$1["CORPORATIONS_READ_DIVISIONS"] = "esi-corporations.read_divisions.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CONTACTS"] = "esi-corporations.read_contacts.v1";
|
|
SCOPES$1["ASSETS_READ_CORPORATION_ASSETS"] = "esi-assets.read_corporation_assets.v1";
|
|
SCOPES$1["CORPORATIONS_READ_TITLES"] = "esi-corporations.read_titles.v1";
|
|
SCOPES$1["CORPORATIONS_READ_BLUEPRINTS"] = "esi-corporations.read_blueprints.v1";
|
|
SCOPES$1["CONTRACTS_READ_CORPORATION_CONTRACTS"] = "esi-contracts.read_corporation_contracts.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STANDINGS"] = "esi-corporations.read_standings.v1";
|
|
SCOPES$1["CORPORATIONS_READ_STARBASES"] = "esi-corporations.read_starbases.v1";
|
|
SCOPES$1["INDUSTRY_READ_CORPORATION_JOBS"] = "esi-industry.read_corporation_jobs.v1";
|
|
SCOPES$1["MARKETS_READ_CORPORATION_ORDERS"] = "esi-markets.read_corporation_orders.v1";
|
|
SCOPES$1["CORPORATIONS_READ_CONTAINER_LOGS"] = "esi-corporations.read_container_logs.v1";
|
|
SCOPES$1["INDUSTRY_READ_CHARACTER_MINING"] = "esi-industry.read_character_mining.v1";
|
|
SCOPES$1["INDUSTRY_READ_CORPORATION_MINING"] = "esi-industry.read_corporation_mining.v1";
|
|
SCOPES$1["PLANETS_READ_CUSTOMS_OFFICES"] = "esi-planets.read_customs_offices.v1";
|
|
SCOPES$1["CORPORATIONS_READ_FACILITIES"] = "esi-corporations.read_facilities.v1";
|
|
SCOPES$1["CORPORATIONS_READ_MEDALS"] = "esi-corporations.read_medals.v1";
|
|
SCOPES$1["CHARACTERS_READ_TITLES"] = "esi-characters.read_titles.v1";
|
|
SCOPES$1["ALLIANCES_READ_CONTACTS"] = "esi-alliances.read_contacts.v1";
|
|
SCOPES$1["CHARACTERS_READ_FW_STATS"] = "esi-characters.read_fw_stats.v1";
|
|
SCOPES$1["CORPORATIONS_READ_FW_STATS"] = "esi-corporations.read_fw_stats.v1";
|
|
return SCOPES$1;
|
|
}({});
|
|
|
|
// ../eve/dist/esi/fetch.js
|
|
var cache = /* @__PURE__ */ new Map;
|
|
function cleanCache() {
|
|
const now = Date.now();
|
|
for (const [key, value] of cache)
|
|
if (value.expires < now)
|
|
cache.delete(key);
|
|
}
|
|
setInterval(cleanCache, 1000 * 60 * 15);
|
|
var defaultCacheDuration = 1000 * 60 * 30;
|
|
async function esiFetch(path, character, { method = "GET", body, noCache = false, cacheDuration = defaultCacheDuration } = {}) {
|
|
try {
|
|
const headers = {
|
|
"User-Agent": options.user_agent,
|
|
Accept: "application/json"
|
|
};
|
|
if (character) {
|
|
if (!CharacterHelper.hasValidToken(character)) {
|
|
await CharacterHelper.refreshTokens(character);
|
|
if (!CharacterHelper.hasValidToken(character))
|
|
throw new Error(`Failed to refresh token for character: ${character.eveID}`);
|
|
}
|
|
headers["Authorization"] = `Bearer ${character.accessToken}`;
|
|
}
|
|
const init = {
|
|
headers,
|
|
method: method || "GET",
|
|
body: body || undefined
|
|
};
|
|
const url = new URL(`${ESI_LATEST_URL}${path.startsWith("/") ? path : "/" + path}`);
|
|
url.searchParams.set("datasource", "tranquility");
|
|
if (!noCache && init.method === "GET") {
|
|
const cached = cache.get(url.href);
|
|
if (cached && cached?.expires > Date.now())
|
|
return cached.data;
|
|
}
|
|
const res = await fetch(url, init);
|
|
const data = await res.json();
|
|
if (!res.ok) {
|
|
console.error(`ESI request failure at ${path} | ${res.status}:${res.statusText} => ${JSON.stringify(data)}`);
|
|
return null;
|
|
}
|
|
if (init.method === "GET")
|
|
cache.set(url.href, {
|
|
expires: Math.max(res.headers.get("expires") && new Date(Number(res.headers.get("expires") || "")).getTime() || 0, Date.now() + cacheDuration),
|
|
data
|
|
});
|
|
return data;
|
|
} catch (err) {
|
|
console.error(`ESI request failure at ${path} | ${JSON.stringify(err)}`, err);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// ../eve/dist/esi/character.js
|
|
var character_exports = {};
|
|
__export(character_exports, {
|
|
getCharacterAffiliations: () => getCharacterAffiliations,
|
|
getCharacterAgentResearch: () => getCharacterAgentResearch,
|
|
getCharacterAssetLocations: () => getCharacterAssetLocations,
|
|
getCharacterAssetNames: () => getCharacterAssetNames,
|
|
getCharacterAssets: () => getCharacterAssets,
|
|
getCharacterBlueprints: () => getCharacterBlueprints,
|
|
getCharacterClones: () => getCharacterClones,
|
|
getCharacterContactNotifications: () => getCharacterContactNotifications,
|
|
getCharacterCorporationHistory: () => getCharacterCorporationHistory,
|
|
getCharacterCurrentShip: () => getCharacterCurrentShip,
|
|
getCharacterImplants: () => getCharacterImplants,
|
|
getCharacterJumpFatigue: () => getCharacterJumpFatigue,
|
|
getCharacterLocation: () => getCharacterLocation,
|
|
getCharacterMedals: () => getCharacterMedals,
|
|
getCharacterNotifications: () => getCharacterNotifications,
|
|
getCharacterOnline: () => getCharacterOnline,
|
|
getCharacterPortraits: () => getCharacterPortraits,
|
|
getCharacterPublicData: () => getCharacterPublicData,
|
|
getCharacterRoles: () => getCharacterRoles,
|
|
getCharacterStandings: () => getCharacterStandings,
|
|
getCharacterTitles: () => getCharacterTitles,
|
|
getCharacterWallet: () => getCharacterWallet,
|
|
getCharacterWalletJournal: () => getCharacterWalletJournal,
|
|
getCharacterWalletTransactions: () => getCharacterWalletTransactions,
|
|
getPortraitURL: () => getPortraitURL
|
|
});
|
|
function getCharacterPublicData(id) {
|
|
return esiFetch(`/characters/${id}/`);
|
|
}
|
|
function getCharacterAffiliations(ids) {
|
|
return esiFetch(`/characters/affiliation/`, undefined, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
})[0];
|
|
}
|
|
function getCharacterPortraits(id) {
|
|
return esiFetch(`/characters/${id}/portrait/`);
|
|
}
|
|
function getCharacterCorporationHistory(id) {
|
|
return esiFetch(`/characters/${id}/corporationhistory/`);
|
|
}
|
|
function getPortraitURL(id) {
|
|
return `https://images.evetech.net/characters/${id}/portrait`;
|
|
}
|
|
function getCharacterRoles(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_corporation_roles.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/roles/`, character);
|
|
}
|
|
function getCharacterTitles(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_titles.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/titles/`, character);
|
|
}
|
|
function getCharacterStandings(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_standings.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/standings/`, character);
|
|
}
|
|
function getCharacterNotifications(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/notifications/`, character);
|
|
}
|
|
function getCharacterContactNotifications(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/notifications/contacts`, character);
|
|
}
|
|
function getCharacterMedals(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_medals.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/medals/`, character);
|
|
}
|
|
function getCharacterJumpFatigue(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_fatigue.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/fatigue/`, character);
|
|
}
|
|
function getCharacterBlueprints(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_blueprints.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/blueprints/`, character);
|
|
}
|
|
function getCharacterAgentResearch(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-characters.read_agents_research.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/agents_research/`, character);
|
|
}
|
|
function getCharacterClones(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-clones.read_clones.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/clones/`, character);
|
|
}
|
|
function getCharacterImplants(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-clones.read_implants.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/implants/`, character);
|
|
}
|
|
function getCharacterAssets(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/`, character);
|
|
}
|
|
function getCharacterAssetLocations(character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/locations/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
function getCharacterAssetNames(character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/assets/names/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
function getCharacterWallet(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/`, character);
|
|
}
|
|
function getCharacterWalletTransactions(character, fromId) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/transactions/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(fromId)
|
|
});
|
|
}
|
|
function getCharacterWalletJournal(character, page = 1) {
|
|
if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character);
|
|
}
|
|
function getCharacterLocation(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_location.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/location/`, character);
|
|
}
|
|
function getCharacterOnline(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_online.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/online/`, character);
|
|
}
|
|
function getCharacterCurrentShip(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-location.read_ship_type.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/ship/`, character);
|
|
}
|
|
|
|
// ../eve/dist/esi/corporation.js
|
|
var corporation_exports = {};
|
|
__export(corporation_exports, {
|
|
getCorporationAllianceHistory: () => getCorporationAllianceHistory,
|
|
getCorporationAssetLocations: () => getCorporationAssetLocations,
|
|
getCorporationAssetNames: () => getCorporationAssetNames,
|
|
getCorporationAssets: () => getCorporationAssets,
|
|
getCorporationData: () => getCorporationData,
|
|
getCorporationIcons: () => getCorporationIcons
|
|
});
|
|
async function getCorporationData(id) {
|
|
return await esiFetch(`/corporations/${id}/`);
|
|
}
|
|
async function getCorporationAllianceHistory(id) {
|
|
return await esiFetch(`/corporations/${id}/alliancehistory/`);
|
|
}
|
|
async function getCorporationIcons(id) {
|
|
return await esiFetch(`/corporations/${id}/icons/`);
|
|
}
|
|
async function getCorporationAssets(id, character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/`, character);
|
|
}
|
|
async function getCorporationAssetLocations(id, character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/locations/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
async function getCorporationAssetNames(id, character, ids) {
|
|
if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
|
|
return null;
|
|
return await esiFetch(`/corporations/${id}/assets/names/`, character, {
|
|
method: "POST",
|
|
body: JSON.stringify(ids)
|
|
});
|
|
}
|
|
|
|
// ../eve/dist/esi/alliance.js
|
|
var alliance_exports = {};
|
|
__export(alliance_exports, {
|
|
getAllianceCorporations: () => getAllianceCorporations,
|
|
getAllianceData: () => getAllianceData,
|
|
getAllianceIcons: () => getAllianceIcons
|
|
});
|
|
async function getAllianceData(id) {
|
|
return await esiFetch(`/alliances/${id}/`);
|
|
}
|
|
async function getAllianceCorporations(id) {
|
|
return await esiFetch(`/alliances/${id}/corporations/`);
|
|
}
|
|
async function getAllianceIcons(id) {
|
|
return await esiFetch(`/alliances/${id}/icons/`);
|
|
}
|
|
|
|
// ../eve/dist/esi/skills.js
|
|
function getCharacterSkillQueue(character) {
|
|
if (!CharacterHelper.hasScope(character, "esi-skills.read_skillqueue.v1"))
|
|
return null;
|
|
return esiFetch(`/characters/${character.eveID}/skillqueue`, character);
|
|
}
|
|
function calculateTrainingPercentage(queuedSkill) {
|
|
const trainingStartPosition = (queuedSkill.training_start_sp - queuedSkill.level_start_sp) / queuedSkill.level_end_sp;
|
|
const timePosition = ((/* @__PURE__ */ new Date()).getTime() - new Date(queuedSkill.start_date).getTime()) / (new Date(queuedSkill.finish_date).getTime() - new Date(queuedSkill.start_date).getTime());
|
|
return trainingStartPosition + (1 - trainingStartPosition) * timePosition;
|
|
}
|
|
|
|
// ../util/dist/jsonQuery.js
|
|
var import_stream_chain = __toESM(require_src(), 1);
|
|
var import_stream_json = __toESM(require_stream_json(), 1);
|
|
var import_StreamArray = __toESM(require_StreamArray(), 1);
|
|
var import_StreamObject = __toESM(require_StreamObject(), 1);
|
|
var import_node_cache = __toESM(require_node_cache2(), 1);
|
|
import * as fs$1 from "fs";
|
|
var cache2 = new import_node_cache.default({ stdTTL: 3600 });
|
|
function queryJsonObject(filePath, query, cacheKey, cacheExpiry) {
|
|
if (cacheKey) {
|
|
const cached = cache2.get(cacheKey);
|
|
if (cached)
|
|
return Promise.resolve(cached);
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
const pipeline = import_stream_chain.chain([
|
|
fs$1.createReadStream(filePath),
|
|
import_stream_json.parser(),
|
|
import_StreamObject.streamObject(),
|
|
(data) => query(data) ? data.value : null
|
|
]);
|
|
pipeline.on("data", (value) => {
|
|
if (value) {
|
|
if (cacheKey)
|
|
cache2.set(cacheKey, value, cacheExpiry || 3600);
|
|
resolve(value);
|
|
}
|
|
});
|
|
pipeline.on("end", () => {
|
|
resolve(null);
|
|
});
|
|
pipeline.on("error", (err) => {
|
|
reject(err);
|
|
});
|
|
});
|
|
}
|
|
|
|
// ../eve/dist/models/type.js
|
|
import { join as join2 } from "path";
|
|
async function getType(type_id) {
|
|
const data = await queryJsonObject(join2(process.cwd(), "../../data/reference-data/types.json"), (data$1) => data$1.key === String(type_id));
|
|
if (!data)
|
|
throw new Error(`Type ID ${type_id} not found in reference data`);
|
|
return data;
|
|
}
|
|
|
|
// ../util/dist/text.js
|
|
function formatNumberToShortForm(number, locale = "en-uS") {
|
|
let suffix = "";
|
|
let value = number;
|
|
if (Math.abs(number) >= 1e9) {
|
|
value = number / 1e9;
|
|
suffix = "b";
|
|
} else if (Math.abs(number) >= 1e6) {
|
|
value = number / 1e6;
|
|
suffix = "M";
|
|
} else if (Math.abs(number) >= 1000) {
|
|
value = number / 1000;
|
|
suffix = "k";
|
|
}
|
|
const formattedValue = new Intl.NumberFormat(locale, { maximumSignificantDigits: 4 }).format(value);
|
|
return `${formattedValue}${suffix}`;
|
|
}
|
|
|
|
// ../eve/dist/models/skill.js
|
|
import { join as join3 } from "path";
|
|
async function getSkill(type_id) {
|
|
const data = await queryJsonObject(join3(process.cwd(), "../../data/reference-data/skills.json"), (data$1) => data$1.key === String(type_id));
|
|
if (!data)
|
|
throw new Error(`Skill ID ${type_id} not found in reference data`);
|
|
return data;
|
|
}
|
|
|
|
// node_modules/brisa/jsx-runtime/index.js
|
|
var n = Symbol.for("isJSX");
|
|
function S(r) {
|
|
return i(null, r);
|
|
}
|
|
function i(r, { children: e, ...o }, s) {
|
|
let a = e;
|
|
if (Array.isArray(e) && !l(e))
|
|
a = e.map((t) => t?.[n] ? t : S({ children: t }));
|
|
return Object.assign([r, { ...o, key: s }, a], { [n]: true });
|
|
}
|
|
function l(r) {
|
|
return Array.isArray(r) && ((n in r) || m(r));
|
|
}
|
|
function m(r) {
|
|
return r?.[0] === "HTML" && typeof r[1]?.html === "string";
|
|
}
|
|
|
|
// src/components/stats/skill-queue.tsx
|
|
async function SkillQueueStat({ character }) {
|
|
const queue = await getCharacterSkillQueue(character);
|
|
const current = queue?.find((skill2) => skill2.queue_position === 0);
|
|
if (!current || !current.start_date) {
|
|
return i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-title",
|
|
children: "No Skills Training"
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this);
|
|
}
|
|
const skill = await getSkill(current.skill_id);
|
|
const percentage = calculateTrainingPercentage(current) * 100;
|
|
return i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-title",
|
|
children: "Currently Training"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-value",
|
|
children: [(await getType(skill.type_id)).name.en, " ", current.finished_level]
|
|
}, undefined, true, undefined, this), i("div", {
|
|
class: "stat-desc",
|
|
children: i("progress", {
|
|
class: "progress progress-primary w-full",
|
|
value: percentage,
|
|
max: "100"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this);
|
|
}
|
|
SkillQueueStat.suspense = () => i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "stat-title",
|
|
children: "Currently Training"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "flex w-52 flex-col gap-4",
|
|
children: [i("div", {
|
|
class: "skeleton h-16 w-full"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "skeleton h-4 w-full"
|
|
}, undefined, false, undefined, null)]
|
|
}, undefined, true, undefined, null)]
|
|
}, undefined, true, undefined, null);
|
|
|
|
// src/components/stats/wallet.tsx
|
|
async function WalletStat({ character }) {
|
|
const balance = await character_exports.getCharacterWallet(character) || 0;
|
|
const journal = await character_exports.getCharacterWalletJournal(character, 1);
|
|
const earliestTransaction = journal?.filter((transaction) => {
|
|
const date = new Date(transaction.date);
|
|
return date.getDate() === new Date().getDate();
|
|
}).sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())[0];
|
|
const balanceChange = balance - (earliestTransaction?.balance || balance);
|
|
const balanceChangePercentage = balanceChange / (earliestTransaction?.balance || balance) * 100;
|
|
const balanceChangeDirection = balanceChange > 0 ? "\u2197\uFE0E" : "\u2198\uFE0E";
|
|
const balanceChangeText = `${balanceChangeDirection} ${formatNumberToShortForm(Math.abs(balanceChange))} (${Math.abs(Number(balanceChangePercentage.toFixed(2)))}%)`;
|
|
return i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-title",
|
|
children: "Wallet"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-value",
|
|
children: [formatNumberToShortForm(balance), " ISK"]
|
|
}, undefined, true, undefined, this), i("div", {
|
|
class: "stat-desc",
|
|
children: balanceChangeText
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this);
|
|
}
|
|
WalletStat.suspense = () => i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "stat-title",
|
|
children: "Wallet"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "flex w-52 flex-col gap-4",
|
|
children: [i("div", {
|
|
class: "skeleton h-16 w-full"
|
|
}, undefined, false, undefined, null), i("div", {
|
|
class: "skeleton h-4 w-full"
|
|
}, undefined, false, undefined, null)]
|
|
}, undefined, true, undefined, null)]
|
|
}, undefined, true, undefined, null);
|
|
|
|
// src/pages/index.tsx
|
|
function Homepage(props, request) {
|
|
const user = UserHelper.find(1);
|
|
const character = user.mainCharacterID && CharacterHelper.find(user.mainCharacterID);
|
|
return i(S, {
|
|
children: i("div", {
|
|
class: "bg-gray-900 py-24 sm:py-32",
|
|
children: i("div", {
|
|
class: "mx-auto max-w-7xl px-6 lg:px-8",
|
|
children: i("div", {
|
|
class: "mx-auto max-w-2xl lg:max-w-none",
|
|
children: i("div", {
|
|
class: "stats shadow",
|
|
children: [i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary",
|
|
children: i("svg", {
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
fill: "none",
|
|
viewBox: "0 0 24 24",
|
|
class: "inline-block h-8 w-8 stroke-current",
|
|
children: i("path", {
|
|
"stroke-linecap": "round",
|
|
"stroke-linejoin": "round",
|
|
"stroke-width": "2",
|
|
d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-title",
|
|
children: "Characters"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-value",
|
|
children: user.characterIDs.length
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-desc",
|
|
children: "Jan 1st - Feb 1st"
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this), character && i(SkillQueueStat, {
|
|
character
|
|
}, undefined, false, undefined, this), character && i(WalletStat, {
|
|
character
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat",
|
|
children: [i("div", {
|
|
class: "stat-figure text-secondary",
|
|
children: i("svg", {
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
fill: "none",
|
|
viewBox: "0 0 24 24",
|
|
class: "inline-block h-8 w-8 stroke-current",
|
|
children: i("path", {
|
|
"stroke-linecap": "round",
|
|
"stroke-linejoin": "round",
|
|
"stroke-width": "2",
|
|
d: "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-title",
|
|
children: "New Registers"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-value",
|
|
children: "1,200"
|
|
}, undefined, false, undefined, this), i("div", {
|
|
class: "stat-desc",
|
|
children: "\u2198\uFE0E 90 (14%)"
|
|
}, undefined, false, undefined, this)]
|
|
}, undefined, true, undefined, this)]
|
|
}, undefined, true, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this)
|
|
}, undefined, false, undefined, this);
|
|
}
|
|
export {
|
|
Homepage as default
|
|
};
|
|
|
|
//# debugId=AA342C1D9D53B62B64756E2164756E21
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcLi5cXHV0aWxcXG5vZGVfbW9kdWxlc1xcc3RyZWFtLWNoYWluXFxzcmNcXGRlZnMuanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXHN0cmVhbS1jaGFpblxcc3JjXFxnZW4uanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXHN0cmVhbS1jaGFpblxcc3JjXFxhc1N0cmVhbS5qcyIsICIuLlxcLi5cXHV0aWxcXG5vZGVfbW9kdWxlc1xcc3RyZWFtLWNoYWluXFxzcmNcXGluZGV4LmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcdXRpbHNcXFV0ZjhTdHJlYW0uanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXHN0cmVhbS1qc29uXFxQYXJzZXIuanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXHN0cmVhbS1qc29uXFx1dGlsc1xcZW1pdC5qcyIsICIuLlxcLi5cXHV0aWxcXG5vZGVfbW9kdWxlc1xcc3RyZWFtLWpzb25cXGluZGV4LmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcQXNzZW1ibGVyLmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcc3RyZWFtZXJzXFxTdHJlYW1CYXNlLmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tY2hhaW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcdXRpbHNcXHdpdGhQYXJzZXIuanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXHN0cmVhbS1qc29uXFxzdHJlYW1lcnNcXFN0cmVhbUFycmF5LmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxzdHJlYW0tanNvblxcc3RyZWFtZXJzXFxTdHJlYW1PYmplY3QuanMiLCAiLi5cXC4uXFx1dGlsXFxub2RlX21vZHVsZXNcXGNsb25lXFxjbG9uZS5qcyIsICIuLlxcLi5cXHV0aWxcXG5vZGVfbW9kdWxlc1xcbm9kZS1jYWNoZVxcbGliXFxub2RlX2NhY2hlLmpzIiwgIi4uXFwuLlxcdXRpbFxcbm9kZV9tb2R1bGVzXFxub2RlLWNhY2hlXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcX3ZpcnR1YWxcXHJvbGxkb3duX3J1bnRpbWUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3dC1kZWNvZGVcXGJ1aWxkXFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlMzIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcQG9zbG9qc1xcZW5jb2RpbmdcXGRpc3RcXGJhc2U2NC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhdXRoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxjaGFyYWN0ZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHVzZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHJlc3VtZS1jb21tYW5kLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcYnVuLXNxbGl0ZVxcZHJpdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxzZXNzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcc2NvcGVzLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXC4uXFx1dGlsXFxkaXN0XFxqc29uUXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXG1vZGVsc1xcdHlwZS5qcyIsICIuLlxcLi5cXHV0aWxcXGRpc3RcXHRleHQuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXG1vZGVsc1xcc2tpbGwuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcYnJpc2FcXGpzeC1ydW50aW1lXFxpbmRleC5qcyIsICIuLlxcc3JjXFxjb21wb25lbnRzXFxzdGF0c1xcc2tpbGwtcXVldWUudHN4IiwgIi4uXFxzcmNcXGNvbXBvbmVudHNcXHN0YXRzXFx3YWxsZXQudHN4IiwgIi4uXFxzcmNcXHBhZ2VzXFxpbmRleC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlLCBwcm9jZXNzKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBEYXRhU3RyZWFtKGRhdGEpIHtcbiAgdGhpcy5idWZmZXIgPSBudWxsO1xuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gTm8gaW5wdXRcbiAgaWYgKCFkYXRhKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBTdHJlYW1cbiAgaWYgKHR5cGVvZiBkYXRhLnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICBkYXRhLnBpcGUodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBCdWZmZXIgb3IgU3RyaW5nXG4gIC8vIG9yIE9iamVjdCAoYXNzdW1lZGx5IGEgcGFzc3dvcmRlZCBrZXkpXG4gIGlmIChkYXRhLmxlbmd0aCB8fCB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7XG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5lbWl0KCdlbmQnLCBkYXRhKTtcbiAgICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICB9LmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5leHBlY3RlZCBkYXRhIHR5cGUgKCcrIHR5cGVvZiBkYXRhICsgJyknKTtcbn1cbnV0aWwuaW5oZXJpdHMoRGF0YVN0cmVhbSwgU3RyZWFtKTtcblxuRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZShkYXRhKSB7XG4gIHRoaXMuYnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGhpcy5idWZmZXIsIEJ1ZmZlci5mcm9tKGRhdGEpXSk7XG4gIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpO1xufTtcblxuRGF0YVN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kKGRhdGEpIHtcbiAgaWYgKGRhdGEpXG4gICAgdGhpcy53cml0ZShkYXRhKTtcbiAgdGhpcy5lbWl0KCdlbmQnLCBkYXRhKTtcbiAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVN0cmVhbTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBnZXRQYXJhbVNpemUoa2V5U2l6ZSkge1xuXHR2YXIgcmVzdWx0ID0gKChrZXlTaXplIC8gOCkgfCAwKSArIChrZXlTaXplICUgOCA9PT0gMCA/IDAgOiAxKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIHBhcmFtQnl0ZXNGb3JBbGcgPSB7XG5cdEVTMjU2OiBnZXRQYXJhbVNpemUoMjU2KSxcblx0RVMzODQ6IGdldFBhcmFtU2l6ZSgzODQpLFxuXHRFUzUxMjogZ2V0UGFyYW1TaXplKDUyMSlcbn07XG5cbmZ1bmN0aW9uIGdldFBhcmFtQnl0ZXNGb3JBbGcoYWxnKSB7XG5cdHZhciBwYXJhbUJ5dGVzID0gcGFyYW1CeXRlc0ZvckFsZ1thbGddO1xuXHRpZiAocGFyYW1CeXRlcykge1xuXHRcdHJldHVybiBwYXJhbUJ5dGVzO1xuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGFsZ29yaXRobSBcIicgKyBhbGcgKyAnXCInKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGdldFBhcmFtQnl0ZXNGb3JBbGcgPSByZXF1aXJlKCcuL3BhcmFtLWJ5dGVzLWZvci1hbGcnKTtcblxudmFyIE1BWF9PQ1RFVCA9IDB4ODAsXG5cdENMQVNTX1VOSVZFUlNBTCA9IDAsXG5cdFBSSU1JVElWRV9CSVQgPSAweDIwLFxuXHRUQUdfU0VRID0gMHgxMCxcblx0VEFHX0lOVCA9IDB4MDIsXG5cdEVOQ09ERURfVEFHX1NFUSA9IChUQUdfU0VRIHwgUFJJTUlUSVZFX0JJVCkgfCAoQ0xBU1NfVU5JVkVSU0FMIDw8IDYpLFxuXHRFTkNPREVEX1RBR19JTlQgPSBUQUdfSU5UIHwgKENMQVNTX1VOSVZFUlNBTCA8PCA2KTtcblxuZnVuY3Rpb24gYmFzZTY0VXJsKGJhc2U2NCkge1xuXHRyZXR1cm4gYmFzZTY0XG5cdFx0LnJlcGxhY2UoLz0vZywgJycpXG5cdFx0LnJlcGxhY2UoL1xcKy9nLCAnLScpXG5cdFx0LnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufVxuXG5mdW5jdGlvbiBzaWduYXR1cmVBc0J1ZmZlcihzaWduYXR1cmUpIHtcblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihzaWduYXR1cmUpKSB7XG5cdFx0cmV0dXJuIHNpZ25hdHVyZTtcblx0fSBlbHNlIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHNpZ25hdHVyZSkge1xuXHRcdHJldHVybiBCdWZmZXIuZnJvbShzaWduYXR1cmUsICdiYXNlNjQnKTtcblx0fVxuXG5cdHRocm93IG5ldyBUeXBlRXJyb3IoJ0VDRFNBIHNpZ25hdHVyZSBtdXN0IGJlIGEgQmFzZTY0IHN0cmluZyBvciBhIEJ1ZmZlcicpO1xufVxuXG5mdW5jdGlvbiBkZXJUb0pvc2Uoc2lnbmF0dXJlLCBhbGcpIHtcblx0c2lnbmF0dXJlID0gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKTtcblx0dmFyIHBhcmFtQnl0ZXMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZyk7XG5cblx0Ly8gdGhlIERFUiBlbmNvZGVkIHBhcmFtIHNob3VsZCBhdCBtb3N0IGJlIHRoZSBwYXJhbSBzaXplLCBwbHVzIGEgcGFkZGluZ1xuXHQvLyB6ZXJvLCBzaW5jZSBkdWUgdG8gYmVpbmcgYSBzaWduZWQgaW50ZWdlclxuXHR2YXIgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoID0gcGFyYW1CeXRlcyArIDE7XG5cblx0dmFyIGlucHV0TGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDtcblxuXHR2YXIgb2Zmc2V0ID0gMDtcblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX1NFUSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJzZXFcIicpO1xuXHR9XG5cblx0dmFyIHNlcUxlbmd0aCA9IHNpZ25hdHVyZVtvZmZzZXQrK107XG5cdGlmIChzZXFMZW5ndGggPT09IChNQVhfT0NURVQgfCAxKSkge1xuXHRcdHNlcUxlbmd0aCA9IHNpZ25hdHVyZVtvZmZzZXQrK107XG5cdH1cblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgPCBzZXFMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic2VxXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzZXFMZW5ndGggKyAnXCIsIG9ubHkgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIiByZW1haW5pbmcnKTtcblx0fVxuXG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19JTlQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwiaW50XCIgZm9yIFwiclwiJyk7XG5cdH1cblxuXHR2YXIgckxlbmd0aCA9IHNpZ25hdHVyZVtvZmZzZXQrK107XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IC0gMiA8IHJMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wiclwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgckxlbmd0aCArICdcIiwgb25seSBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQgLSAyKSArICdcIiBhdmFpbGFibGUnKTtcblx0fVxuXG5cdGlmIChtYXhFbmNvZGVkUGFyYW1MZW5ndGggPCByTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInJcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHJMZW5ndGggKyAnXCIsIG1heCBvZiBcIicgKyBtYXhFbmNvZGVkUGFyYW1MZW5ndGggKyAnXCIgaXMgYWNjZXB0YWJsZScpO1xuXHR9XG5cblx0dmFyIHJPZmZzZXQgPSBvZmZzZXQ7XG5cdG9mZnNldCArPSByTGVuZ3RoO1xuXG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19JTlQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwiaW50XCIgZm9yIFwic1wiJyk7XG5cdH1cblxuXHR2YXIgc0xlbmd0aCA9IHNpZ25hdHVyZVtvZmZzZXQrK107XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0ICE9PSBzTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHNMZW5ndGggKyAnXCIsIGV4cGVjdGVkIFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCInKTtcblx0fVxuXG5cdGlmIChtYXhFbmNvZGVkUGFyYW1MZW5ndGggPCBzTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHNMZW5ndGggKyAnXCIsIG1heCBvZiBcIicgKyBtYXhFbmNvZGVkUGFyYW1MZW5ndGggKyAnXCIgaXMgYWNjZXB0YWJsZScpO1xuXHR9XG5cblx0dmFyIHNPZmZzZXQgPSBvZmZzZXQ7XG5cdG9mZnNldCArPSBzTGVuZ3RoO1xuXG5cdGlmIChvZmZzZXQgIT09IGlucHV0TGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBjb25zdW1lIGVudGlyZSBidWZmZXIsIGJ1dCBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiIGJ5dGVzIHJlbWFpbicpO1xuXHR9XG5cblx0dmFyIHJQYWRkaW5nID0gcGFyYW1CeXRlcyAtIHJMZW5ndGgsXG5cdFx0c1BhZGRpbmcgPSBwYXJhbUJ5dGVzIC0gc0xlbmd0aDtcblxuXHR2YXIgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKHJQYWRkaW5nICsgckxlbmd0aCArIHNQYWRkaW5nICsgc0xlbmd0aCk7XG5cblx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCByUGFkZGluZzsgKytvZmZzZXQpIHtcblx0XHRkc3Rbb2Zmc2V0XSA9IDA7XG5cdH1cblx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHJPZmZzZXQgKyBNYXRoLm1heCgtclBhZGRpbmcsIDApLCByT2Zmc2V0ICsgckxlbmd0aCk7XG5cblx0b2Zmc2V0ID0gcGFyYW1CeXRlcztcblxuXHRmb3IgKHZhciBvID0gb2Zmc2V0OyBvZmZzZXQgPCBvICsgc1BhZGRpbmc7ICsrb2Zmc2V0KSB7XG5cdFx0ZHN0W29mZnNldF0gPSAwO1xuXHR9XG5cdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCBzT2Zmc2V0ICsgTWF0aC5tYXgoLXNQYWRkaW5nLCAwKSwgc09mZnNldCArIHNMZW5ndGgpO1xuXG5cdGRzdCA9IGRzdC50b1N0cmluZygnYmFzZTY0Jyk7XG5cdGRzdCA9IGJhc2U2NFVybChkc3QpO1xuXG5cdHJldHVybiBkc3Q7XG59XG5cbmZ1bmN0aW9uIGNvdW50UGFkZGluZyhidWYsIHN0YXJ0LCBzdG9wKSB7XG5cdHZhciBwYWRkaW5nID0gMDtcblx0d2hpbGUgKHN0YXJ0ICsgcGFkZGluZyA8IHN0b3AgJiYgYnVmW3N0YXJ0ICsgcGFkZGluZ10gPT09IDApIHtcblx0XHQrK3BhZGRpbmc7XG5cdH1cblxuXHR2YXIgbmVlZHNTaWduID0gYnVmW3N0YXJ0ICsgcGFkZGluZ10gPj0gTUFYX09DVEVUO1xuXHRpZiAobmVlZHNTaWduKSB7XG5cdFx0LS1wYWRkaW5nO1xuXHR9XG5cblx0cmV0dXJuIHBhZGRpbmc7XG59XG5cbmZ1bmN0aW9uIGpvc2VUb0RlcihzaWduYXR1cmUsIGFsZykge1xuXHRzaWduYXR1cmUgPSBzaWduYXR1cmVBc0J1ZmZlcihzaWduYXR1cmUpO1xuXHR2YXIgcGFyYW1CeXRlcyA9IGdldFBhcmFtQnl0ZXNGb3JBbGcoYWxnKTtcblxuXHR2YXIgc2lnbmF0dXJlQnl0ZXMgPSBzaWduYXR1cmUubGVuZ3RoO1xuXHRpZiAoc2lnbmF0dXJlQnl0ZXMgIT09IHBhcmFtQnl0ZXMgKiAyKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignXCInICsgYWxnICsgJ1wiIHNpZ25hdHVyZXMgbXVzdCBiZSBcIicgKyBwYXJhbUJ5dGVzICogMiArICdcIiBieXRlcywgc2F3IFwiJyArIHNpZ25hdHVyZUJ5dGVzICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgclBhZGRpbmcgPSBjb3VudFBhZGRpbmcoc2lnbmF0dXJlLCAwLCBwYXJhbUJ5dGVzKTtcblx0dmFyIHNQYWRkaW5nID0gY291bnRQYWRkaW5nKHNpZ25hdHVyZSwgcGFyYW1CeXRlcywgc2lnbmF0dXJlLmxlbmd0aCk7XG5cdHZhciByTGVuZ3RoID0gcGFyYW1CeXRlcyAtIHJQYWRkaW5nO1xuXHR2YXIgc0xlbmd0aCA9IHBhcmFtQnl0ZXMgLSBzUGFkZGluZztcblxuXHR2YXIgcnNCeXRlcyA9IDEgKyAxICsgckxlbmd0aCArIDEgKyAxICsgc0xlbmd0aDtcblxuXHR2YXIgc2hvcnRMZW5ndGggPSByc0J5dGVzIDwgTUFYX09DVEVUO1xuXG5cdHZhciBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUoKHNob3J0TGVuZ3RoID8gMiA6IDMpICsgcnNCeXRlcyk7XG5cblx0dmFyIG9mZnNldCA9IDA7XG5cdGRzdFtvZmZzZXQrK10gPSBFTkNPREVEX1RBR19TRVE7XG5cdGlmIChzaG9ydExlbmd0aCkge1xuXHRcdC8vIEJpdCA4IGhhcyB2YWx1ZSBcIjBcIlxuXHRcdC8vIGJpdHMgNy0xIGdpdmUgdGhlIGxlbmd0aC5cblx0XHRkc3Rbb2Zmc2V0KytdID0gcnNCeXRlcztcblx0fSBlbHNlIHtcblx0XHQvLyBCaXQgOCBvZiBmaXJzdCBvY3RldCBoYXMgdmFsdWUgXCIxXCJcblx0XHQvLyBiaXRzIDctMSBnaXZlIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBsZW5ndGggb2N0ZXRzLlxuXHRcdGRzdFtvZmZzZXQrK10gPSBNQVhfT0NURVRcdHwgMTtcblx0XHQvLyBsZW5ndGgsIGJhc2UgMjU2XG5cdFx0ZHN0W29mZnNldCsrXSA9IHJzQnl0ZXMgJiAweGZmO1xuXHR9XG5cdGRzdFtvZmZzZXQrK10gPSBFTkNPREVEX1RBR19JTlQ7XG5cdGRzdFtvZmZzZXQrK10gPSByTGVuZ3RoO1xuXHRpZiAoclBhZGRpbmcgPCAwKSB7XG5cdFx0ZHN0W29mZnNldCsrXSA9IDA7XG5cdFx0b2Zmc2V0ICs9IHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCAwLCBwYXJhbUJ5dGVzKTtcblx0fSBlbHNlIHtcblx0XHRvZmZzZXQgKz0gc2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHJQYWRkaW5nLCBwYXJhbUJ5dGVzKTtcblx0fVxuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfSU5UO1xuXHRkc3Rbb2Zmc2V0KytdID0gc0xlbmd0aDtcblx0aWYgKHNQYWRkaW5nIDwgMCkge1xuXHRcdGRzdFtvZmZzZXQrK10gPSAwO1xuXHRcdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCBwYXJhbUJ5dGVzKTtcblx0fSBlbHNlIHtcblx0XHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgcGFyYW1CeXRlcyArIHNQYWRkaW5nKTtcblx0fVxuXG5cdHJldHVybiBkc3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRkZXJUb0pvc2U6IGRlclRvSm9zZSxcblx0am9zZVRvRGVyOiBqb3NlVG9EZXJcbn07XG4iLAogICAgIi8qanNoaW50IG5vZGU6dHJ1ZSAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjsgLy8gYnJvd3NlcmlmeVxudmFyIFNsb3dCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5TbG93QnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlckVxO1xuXG5mdW5jdGlvbiBidWZmZXJFcShhLCBiKSB7XG5cbiAgLy8gc2hvcnRjdXR0aW5nIG9uIHR5cGUgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzc1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYnVmZmVyIHNpemVzIHNob3VsZCBiZSB3ZWxsLWtub3duIGluZm9ybWF0aW9uLCBzbyBkZXNwaXRlIHRoaXNcbiAgLy8gc2hvcnRjdXR0aW5nLCBpdCBkb2Vzbid0IGxlYWsgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSAqY29udGVudHMqIG9mIHRoZVxuICAvLyBidWZmZXJzLlxuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAvKmpzaGludCBiaXR3aXNlOmZhbHNlICovXG4gICAgYyB8PSBhW2ldIF4gYltpXTsgLy8gWE9SXG4gIH1cbiAgcmV0dXJuIGMgPT09IDA7XG59XG5cbmJ1ZmZlckVxLmluc3RhbGwgPSBmdW5jdGlvbigpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gZnVuY3Rpb24gZXF1YWwodGhhdCkge1xuICAgIHJldHVybiBidWZmZXJFcSh0aGlzLCB0aGF0KTtcbiAgfTtcbn07XG5cbnZhciBvcmlnQnVmRXF1YWwgPSBCdWZmZXIucHJvdG90eXBlLmVxdWFsO1xudmFyIG9yaWdTbG93QnVmRXF1YWwgPSBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbDtcbmJ1ZmZlckVxLnJlc3RvcmUgPSBmdW5jdGlvbigpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IG9yaWdCdWZFcXVhbDtcbiAgU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBvcmlnU2xvd0J1ZkVxdWFsO1xufTtcbiIsCiAgICAidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIGZvcm1hdEVjZHNhID0gcmVxdWlyZSgnZWNkc2Etc2lnLWZvcm1hdHRlcicpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbnZhciBNU0dfSU5WQUxJRF9BTEdPUklUSE0gPSAnXCIlc1wiIGlzIG5vdCBhIHZhbGlkIGFsZ29yaXRobS5cXG4gIFN1cHBvcnRlZCBhbGdvcml0aG1zIGFyZTpcXG4gIFwiSFMyNTZcIiwgXCJIUzM4NFwiLCBcIkhTNTEyXCIsIFwiUlMyNTZcIiwgXCJSUzM4NFwiLCBcIlJTNTEyXCIsIFwiUFMyNTZcIiwgXCJQUzM4NFwiLCBcIlBTNTEyXCIsIFwiRVMyNTZcIiwgXCJFUzM4NFwiLCBcIkVTNTEyXCIgYW5kIFwibm9uZVwiLidcbnZhciBNU0dfSU5WQUxJRF9TRUNSRVQgPSAnc2VjcmV0IG11c3QgYmUgYSBzdHJpbmcgb3IgYnVmZmVyJztcbnZhciBNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkgPSAna2V5IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBidWZmZXInO1xudmFyIE1TR19JTlZBTElEX1NJR05FUl9LRVkgPSAna2V5IG11c3QgYmUgYSBzdHJpbmcsIGEgYnVmZmVyIG9yIGFuIG9iamVjdCc7XG5cbnZhciBzdXBwb3J0c0tleU9iamVjdHMgPSB0eXBlb2YgY3J5cHRvLmNyZWF0ZVB1YmxpY0tleSA9PT0gJ2Z1bmN0aW9uJztcbmlmIChzdXBwb3J0c0tleU9iamVjdHMpIHtcbiAgTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZICs9ICcgb3IgYSBLZXlPYmplY3QnO1xuICBNU0dfSU5WQUxJRF9TRUNSRVQgKz0gJ29yIGEgS2V5T2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gY2hlY2tJc1B1YmxpY0tleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzdXBwb3J0c0tleU9iamVjdHMpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmFzeW1tZXRyaWNLZXlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkuZXhwb3J0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrSXNQcml2YXRlS2V5KGtleSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0lHTkVSX0tFWSk7XG59O1xuXG5mdW5jdGlvbiBjaGVja0lzU2VjcmV0S2V5KGtleSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgaWYgKCFzdXBwb3J0c0tleU9iamVjdHMpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG5cbiAgaWYgKGtleS50eXBlICE9PSAnc2VjcmV0Jykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkuZXhwb3J0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZnJvbUJhc2U2NChiYXNlNjQpIHtcbiAgcmV0dXJuIGJhc2U2NFxuICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQoYmFzZTY0dXJsKSB7XG4gIGJhc2U2NHVybCA9IGJhc2U2NHVybC50b1N0cmluZygpO1xuXG4gIHZhciBwYWRkaW5nID0gNCAtIGJhc2U2NHVybC5sZW5ndGggJSA0O1xuICBpZiAocGFkZGluZyAhPT0gNCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKSB7XG4gICAgICBiYXNlNjR1cmwgKz0gJz0nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXNlNjR1cmxcbiAgICAucmVwbGFjZSgvXFwtL2csICcrJylcbiAgICAucmVwbGFjZSgvXy9nLCAnLycpO1xufVxuXG5mdW5jdGlvbiB0eXBlRXJyb3IodGVtcGxhdGUpIHtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBlcnJNc2cgPSB1dGlsLmZvcm1hdC5iaW5kKHV0aWwsIHRlbXBsYXRlKS5hcHBseShudWxsLCBhcmdzKTtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoZXJyTXNnKTtcbn1cblxuZnVuY3Rpb24gYnVmZmVyT3JTdHJpbmcob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSW5wdXQodGhpbmcpIHtcbiAgaWYgKCFidWZmZXJPclN0cmluZyh0aGluZykpXG4gICAgdGhpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGluZyk7XG4gIHJldHVybiB0aGluZztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSG1hY1NpZ25lcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKHRoaW5nLCBzZWNyZXQpIHtcbiAgICBjaGVja0lzU2VjcmV0S2V5KHNlY3JldCk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgdmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhJyArIGJpdHMsIHNlY3JldCk7XG4gICAgdmFyIHNpZyA9IChobWFjLnVwZGF0ZSh0aGluZyksIGhtYWMuZGlnZXN0KCdiYXNlNjQnKSlcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbnZhciBidWZmZXJFcXVhbDtcbnZhciB0aW1pbmdTYWZlRXF1YWwgPSAndGltaW5nU2FmZUVxdWFsJyBpbiBjcnlwdG8gPyBmdW5jdGlvbiB0aW1pbmdTYWZlRXF1YWwoYSwgYikge1xuICBpZiAoYS5ieXRlTGVuZ3RoICE9PSBiLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gY3J5cHRvLnRpbWluZ1NhZmVFcXVhbChhLCBiKVxufSA6IGZ1bmN0aW9uIHRpbWluZ1NhZmVFcXVhbChhLCBiKSB7XG4gIGlmICghYnVmZmVyRXF1YWwpIHtcbiAgICBidWZmZXJFcXVhbCA9IHJlcXVpcmUoJ2J1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lJyk7XG4gIH1cblxuICByZXR1cm4gYnVmZmVyRXF1YWwoYSwgYilcbn1cblxuZnVuY3Rpb24gY3JlYXRlSG1hY1ZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBzZWNyZXQpIHtcbiAgICB2YXIgY29tcHV0ZWRTaWcgPSBjcmVhdGVIbWFjU2lnbmVyKGJpdHMpKHRoaW5nLCBzZWNyZXQpO1xuICAgIHJldHVybiB0aW1pbmdTYWZlRXF1YWwoQnVmZmVyLmZyb20oc2lnbmF0dXJlKSwgQnVmZmVyLmZyb20oY29tcHV0ZWRTaWcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlTaWduZXIoYml0cykge1xuIHJldHVybiBmdW5jdGlvbiBzaWduKHRoaW5nLCBwcml2YXRlS2V5KSB7XG4gICAgY2hlY2tJc1ByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgLy8gRXZlbiB0aG91Z2ggd2UgYXJlIHNwZWNpZnlpbmcgXCJSU0FcIiBoZXJlLCB0aGlzIHdvcmtzIHdpdGggRUNEU0FcbiAgICAvLyBrZXlzIGFzIHdlbGwuXG4gICAgdmFyIHNpZ25lciA9IGNyeXB0by5jcmVhdGVTaWduKCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZhciBzaWcgPSAoc2lnbmVyLnVwZGF0ZSh0aGluZyksIHNpZ25lci5zaWduKHByaXZhdGVLZXksICdiYXNlNjQnKSk7XG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgcHVibGljS2V5KSB7XG4gICAgY2hlY2tJc1B1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHNpZ25hdHVyZSA9IHRvQmFzZTY0KHNpZ25hdHVyZSk7XG4gICAgdmFyIHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2ZXJpZmllci51cGRhdGUodGhpbmcpO1xuICAgIHJldHVybiB2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBzaWduYXR1cmUsICdiYXNlNjQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQU1NLZXlTaWduZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgcHJpdmF0ZUtleSkge1xuICAgIGNoZWNrSXNQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHZhciBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2YXIgc2lnID0gKHNpZ25lci51cGRhdGUodGhpbmcpLCBzaWduZXIuc2lnbih7XG4gICAgICBrZXk6IHByaXZhdGVLZXksXG4gICAgICBwYWRkaW5nOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QS0NTMV9QU1NfUEFERElORyxcbiAgICAgIHNhbHRMZW5ndGg6IGNyeXB0by5jb25zdGFudHMuUlNBX1BTU19TQUxUTEVOX0RJR0VTVFxuICAgIH0sICdiYXNlNjQnKSk7XG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQU1NLZXlWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgcHVibGljS2V5KSB7XG4gICAgY2hlY2tJc1B1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHNpZ25hdHVyZSA9IHRvQmFzZTY0KHNpZ25hdHVyZSk7XG4gICAgdmFyIHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2ZXJpZmllci51cGRhdGUodGhpbmcpO1xuICAgIHJldHVybiB2ZXJpZmllci52ZXJpZnkoe1xuICAgICAga2V5OiBwdWJsaWNLZXksXG4gICAgICBwYWRkaW5nOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QS0NTMV9QU1NfUEFERElORyxcbiAgICAgIHNhbHRMZW5ndGg6IGNyeXB0by5jb25zdGFudHMuUlNBX1BTU19TQUxUTEVOX0RJR0VTVFxuICAgIH0sIHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVDRFNBU2lnbmVyKGJpdHMpIHtcbiAgdmFyIGlubmVyID0gY3JlYXRlS2V5U2lnbmVyKGJpdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbigpIHtcbiAgICB2YXIgc2lnbmF0dXJlID0gaW5uZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBzaWduYXR1cmUgPSBmb3JtYXRFY2RzYS5kZXJUb0pvc2Uoc2lnbmF0dXJlLCAnRVMnICsgYml0cyk7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRUNEU0FWZXJpZmVyKGJpdHMpIHtcbiAgdmFyIGlubmVyID0gY3JlYXRlS2V5VmVyaWZpZXIoYml0cyk7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgcHVibGljS2V5KSB7XG4gICAgc2lnbmF0dXJlID0gZm9ybWF0RWNkc2Euam9zZVRvRGVyKHNpZ25hdHVyZSwgJ0VTJyArIGJpdHMpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB2YXIgcmVzdWx0ID0gaW5uZXIodGhpbmcsIHNpZ25hdHVyZSwgcHVibGljS2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb25lU2lnbmVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbigpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9uZVZlcmlmaWVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUpIHtcbiAgICByZXR1cm4gc2lnbmF0dXJlID09PSAnJztcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGp3YShhbGdvcml0aG0pIHtcbiAgdmFyIHNpZ25lckZhY3RvcmllcyA9IHtcbiAgICBoczogY3JlYXRlSG1hY1NpZ25lcixcbiAgICByczogY3JlYXRlS2V5U2lnbmVyLFxuICAgIHBzOiBjcmVhdGVQU1NLZXlTaWduZXIsXG4gICAgZXM6IGNyZWF0ZUVDRFNBU2lnbmVyLFxuICAgIG5vbmU6IGNyZWF0ZU5vbmVTaWduZXIsXG4gIH1cbiAgdmFyIHZlcmlmaWVyRmFjdG9yaWVzID0ge1xuICAgIGhzOiBjcmVhdGVIbWFjVmVyaWZpZXIsXG4gICAgcnM6IGNyZWF0ZUtleVZlcmlmaWVyLFxuICAgIHBzOiBjcmVhdGVQU1NLZXlWZXJpZmllcixcbiAgICBlczogY3JlYXRlRUNEU0FWZXJpZmVyLFxuICAgIG5vbmU6IGNyZWF0ZU5vbmVWZXJpZmllcixcbiAgfVxuICB2YXIgbWF0Y2ggPSBhbGdvcml0aG0ubWF0Y2goL14oUlN8UFN8RVN8SFMpKDI1NnwzODR8NTEyKSR8Xihub25lKSQvaSk7XG4gIGlmICghbWF0Y2gpXG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX0FMR09SSVRITSwgYWxnb3JpdGhtKTtcbiAgdmFyIGFsZ28gPSAobWF0Y2hbMV0gfHwgbWF0Y2hbM10pLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBiaXRzID0gbWF0Y2hbMl07XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduOiBzaWduZXJGYWN0b3JpZXNbYWxnb10oYml0cyksXG4gICAgdmVyaWZ5OiB2ZXJpZmllckZhY3Rvcmllc1thbGdvXShiaXRzKSxcbiAgfVxufTtcbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdG9TdHJpbmcob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicgfHwgQnVmZmVyLmlzQnVmZmVyKG9iaikpXG4gICAgcmV0dXJuIG9iai50b1N0cmluZygpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcbn07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgRGF0YVN0cmVhbSA9IHJlcXVpcmUoJy4vZGF0YS1zdHJlYW0nKTtcbnZhciBqd2EgPSByZXF1aXJlKCdqd2EnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9zdHJpbmcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBiYXNlNjR1cmwoc3RyaW5nLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyXG4gICAgLmZyb20oc3RyaW5nLCBlbmNvZGluZylcbiAgICAudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgLnJlcGxhY2UoLz0vZywgJycpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufVxuXG5mdW5jdGlvbiBqd3NTZWN1cmVkSW5wdXQoaGVhZGVyLCBwYXlsb2FkLCBlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4JztcbiAgdmFyIGVuY29kZWRIZWFkZXIgPSBiYXNlNjR1cmwodG9TdHJpbmcoaGVhZGVyKSwgJ2JpbmFyeScpO1xuICB2YXIgZW5jb2RlZFBheWxvYWQgPSBiYXNlNjR1cmwodG9TdHJpbmcocGF5bG9hZCksIGVuY29kaW5nKTtcbiAgcmV0dXJuIHV0aWwuZm9ybWF0KCclcy4lcycsIGVuY29kZWRIZWFkZXIsIGVuY29kZWRQYXlsb2FkKTtcbn1cblxuZnVuY3Rpb24gandzU2lnbihvcHRzKSB7XG4gIHZhciBoZWFkZXIgPSBvcHRzLmhlYWRlcjtcbiAgdmFyIHBheWxvYWQgPSBvcHRzLnBheWxvYWQ7XG4gIHZhciBzZWNyZXRPcktleSA9IG9wdHMuc2VjcmV0IHx8IG9wdHMucHJpdmF0ZUtleTtcbiAgdmFyIGVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdmFyIGFsZ28gPSBqd2EoaGVhZGVyLmFsZyk7XG4gIHZhciBzZWN1cmVkSW5wdXQgPSBqd3NTZWN1cmVkSW5wdXQoaGVhZGVyLCBwYXlsb2FkLCBlbmNvZGluZyk7XG4gIHZhciBzaWduYXR1cmUgPSBhbGdvLnNpZ24oc2VjdXJlZElucHV0LCBzZWNyZXRPcktleSk7XG4gIHJldHVybiB1dGlsLmZvcm1hdCgnJXMuJXMnLCBzZWN1cmVkSW5wdXQsIHNpZ25hdHVyZSk7XG59XG5cbmZ1bmN0aW9uIFNpZ25TdHJlYW0ob3B0cykge1xuICB2YXIgc2VjcmV0ID0gb3B0cy5zZWNyZXR8fG9wdHMucHJpdmF0ZUtleXx8b3B0cy5rZXk7XG4gIHZhciBzZWNyZXRTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbShzZWNyZXQpO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5oZWFkZXIgPSBvcHRzLmhlYWRlcjtcbiAgdGhpcy5lbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHRoaXMuc2VjcmV0ID0gdGhpcy5wcml2YXRlS2V5ID0gdGhpcy5rZXkgPSBzZWNyZXRTdHJlYW07XG4gIHRoaXMucGF5bG9hZCA9IG5ldyBEYXRhU3RyZWFtKG9wdHMucGF5bG9hZCk7XG4gIHRoaXMuc2VjcmV0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5wYXlsb2FkLndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnNpZ24oKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLnBheWxvYWQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNlY3JldC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy5zaWduKCk7XG4gIH0uYmluZCh0aGlzKSk7XG59XG51dGlsLmluaGVyaXRzKFNpZ25TdHJlYW0sIFN0cmVhbSk7XG5cblNpZ25TdHJlYW0ucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKCkge1xuICB0cnkge1xuICAgIHZhciBzaWduYXR1cmUgPSBqd3NTaWduKHtcbiAgICAgIGhlYWRlcjogdGhpcy5oZWFkZXIsXG4gICAgICBwYXlsb2FkOiB0aGlzLnBheWxvYWQuYnVmZmVyLFxuICAgICAgc2VjcmV0OiB0aGlzLnNlY3JldC5idWZmZXIsXG4gICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZ1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdCgnZG9uZScsIHNpZ25hdHVyZSk7XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgc2lnbmF0dXJlKTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlKTtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5cblNpZ25TdHJlYW0uc2lnbiA9IGp3c1NpZ247XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnblN0cmVhbTtcbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBEYXRhU3RyZWFtID0gcmVxdWlyZSgnLi9kYXRhLXN0cmVhbScpO1xudmFyIGp3YSA9IHJlcXVpcmUoJ2p3YScpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b3N0cmluZycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgSldTX1JFR0VYID0gL15bYS16QS1aMC05XFwtX10rP1xcLlthLXpBLVowLTlcXC1fXSs/XFwuKFthLXpBLVowLTlcXC1fXSspPyQvO1xuXG5mdW5jdGlvbiBpc09iamVjdCh0aGluZykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaW5nKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIHNhZmVKc29uUGFyc2UodGhpbmcpIHtcbiAgaWYgKGlzT2JqZWN0KHRoaW5nKSlcbiAgICByZXR1cm4gdGhpbmc7XG4gIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKHRoaW5nKTsgfVxuICBjYXRjaCAoZSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG59XG5cbmZ1bmN0aW9uIGhlYWRlckZyb21KV1MoandzU2lnKSB7XG4gIHZhciBlbmNvZGVkSGVhZGVyID0gandzU2lnLnNwbGl0KCcuJywgMSlbMF07XG4gIHJldHVybiBzYWZlSnNvblBhcnNlKEJ1ZmZlci5mcm9tKGVuY29kZWRIZWFkZXIsICdiYXNlNjQnKS50b1N0cmluZygnYmluYXJ5JykpO1xufVxuXG5mdW5jdGlvbiBzZWN1cmVkSW5wdXRGcm9tSldTKGp3c1NpZykge1xuICByZXR1cm4gandzU2lnLnNwbGl0KCcuJywgMikuam9pbignLicpO1xufVxuXG5mdW5jdGlvbiBzaWduYXR1cmVGcm9tSldTKGp3c1NpZykge1xuICByZXR1cm4gandzU2lnLnNwbGl0KCcuJylbMl07XG59XG5cbmZ1bmN0aW9uIHBheWxvYWRGcm9tSldTKGp3c1NpZywgZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG4gIHZhciBwYXlsb2FkID0gandzU2lnLnNwbGl0KCcuJylbMV07XG4gIHJldHVybiBCdWZmZXIuZnJvbShwYXlsb2FkLCAnYmFzZTY0JykudG9TdHJpbmcoZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSndzKHN0cmluZykge1xuICByZXR1cm4gSldTX1JFR0VYLnRlc3Qoc3RyaW5nKSAmJiAhIWhlYWRlckZyb21KV1Moc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gandzVmVyaWZ5KGp3c1NpZywgYWxnb3JpdGhtLCBzZWNyZXRPcktleSkge1xuICBpZiAoIWFsZ29yaXRobSkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJNaXNzaW5nIGFsZ29yaXRobSBwYXJhbWV0ZXIgZm9yIGp3cy52ZXJpZnlcIik7XG4gICAgZXJyLmNvZGUgPSBcIk1JU1NJTkdfQUxHT1JJVEhNXCI7XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGp3c1NpZyA9IHRvU3RyaW5nKGp3c1NpZyk7XG4gIHZhciBzaWduYXR1cmUgPSBzaWduYXR1cmVGcm9tSldTKGp3c1NpZyk7XG4gIHZhciBzZWN1cmVkSW5wdXQgPSBzZWN1cmVkSW5wdXRGcm9tSldTKGp3c1NpZyk7XG4gIHZhciBhbGdvID0gandhKGFsZ29yaXRobSk7XG4gIHJldHVybiBhbGdvLnZlcmlmeShzZWN1cmVkSW5wdXQsIHNpZ25hdHVyZSwgc2VjcmV0T3JLZXkpO1xufVxuXG5mdW5jdGlvbiBqd3NEZWNvZGUoandzU2lnLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBqd3NTaWcgPSB0b1N0cmluZyhqd3NTaWcpO1xuXG4gIGlmICghaXNWYWxpZEp3cyhqd3NTaWcpKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBoZWFkZXIgPSBoZWFkZXJGcm9tSldTKGp3c1NpZyk7XG5cbiAgaWYgKCFoZWFkZXIpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHBheWxvYWQgPSBwYXlsb2FkRnJvbUpXUyhqd3NTaWcpO1xuICBpZiAoaGVhZGVyLnR5cCA9PT0gJ0pXVCcgfHwgb3B0cy5qc29uKVxuICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWQsIG9wdHMuZW5jb2RpbmcpO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICBzaWduYXR1cmU6IHNpZ25hdHVyZUZyb21KV1MoandzU2lnKVxuICB9O1xufVxuXG5mdW5jdGlvbiBWZXJpZnlTdHJlYW0ob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHNlY3JldE9yS2V5ID0gb3B0cy5zZWNyZXR8fG9wdHMucHVibGljS2V5fHxvcHRzLmtleTtcbiAgdmFyIHNlY3JldFN0cmVhbSA9IG5ldyBEYXRhU3RyZWFtKHNlY3JldE9yS2V5KTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuYWxnb3JpdGhtID0gb3B0cy5hbGdvcml0aG07XG4gIHRoaXMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB0aGlzLnNlY3JldCA9IHRoaXMucHVibGljS2V5ID0gdGhpcy5rZXkgPSBzZWNyZXRTdHJlYW07XG4gIHRoaXMuc2lnbmF0dXJlID0gbmV3IERhdGFTdHJlYW0ob3B0cy5zaWduYXR1cmUpO1xuICB0aGlzLnNlY3JldC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlLndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnZlcmlmeSgpO1xuICB9LmJpbmQodGhpcykpO1xuXG4gIHRoaXMuc2lnbmF0dXJlLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zZWNyZXQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMudmVyaWZ5KCk7XG4gIH0uYmluZCh0aGlzKSk7XG59XG51dGlsLmluaGVyaXRzKFZlcmlmeVN0cmVhbSwgU3RyZWFtKTtcblZlcmlmeVN0cmVhbS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KCkge1xuICB0cnkge1xuICAgIHZhciB2YWxpZCA9IGp3c1ZlcmlmeSh0aGlzLnNpZ25hdHVyZS5idWZmZXIsIHRoaXMuYWxnb3JpdGhtLCB0aGlzLmtleS5idWZmZXIpO1xuICAgIHZhciBvYmogPSBqd3NEZWNvZGUodGhpcy5zaWduYXR1cmUuYnVmZmVyLCB0aGlzLmVuY29kaW5nKTtcbiAgICB0aGlzLmVtaXQoJ2RvbmUnLCB2YWxpZCwgb2JqKTtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCB2YWxpZCk7XG4gICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlKTtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5cblZlcmlmeVN0cmVhbS5kZWNvZGUgPSBqd3NEZWNvZGU7XG5WZXJpZnlTdHJlYW0uaXNWYWxpZCA9IGlzVmFsaWRKd3M7XG5WZXJpZnlTdHJlYW0udmVyaWZ5ID0gandzVmVyaWZ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlcmlmeVN0cmVhbTtcbiIsCiAgICAiLypnbG9iYWwgZXhwb3J0cyovXG52YXIgU2lnblN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3NpZ24tc3RyZWFtJyk7XG52YXIgVmVyaWZ5U3RyZWFtID0gcmVxdWlyZSgnLi9saWIvdmVyaWZ5LXN0cmVhbScpO1xuXG52YXIgQUxHT1JJVEhNUyA9IFtcbiAgJ0hTMjU2JywgJ0hTMzg0JywgJ0hTNTEyJyxcbiAgJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJyxcbiAgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyxcbiAgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ1xuXTtcblxuZXhwb3J0cy5BTEdPUklUSE1TID0gQUxHT1JJVEhNUztcbmV4cG9ydHMuc2lnbiA9IFNpZ25TdHJlYW0uc2lnbjtcbmV4cG9ydHMudmVyaWZ5ID0gVmVyaWZ5U3RyZWFtLnZlcmlmeTtcbmV4cG9ydHMuZGVjb2RlID0gVmVyaWZ5U3RyZWFtLmRlY29kZTtcbmV4cG9ydHMuaXNWYWxpZCA9IFZlcmlmeVN0cmVhbS5pc1ZhbGlkO1xuZXhwb3J0cy5jcmVhdGVTaWduID0gZnVuY3Rpb24gY3JlYXRlU2lnbihvcHRzKSB7XG4gIHJldHVybiBuZXcgU2lnblN0cmVhbShvcHRzKTtcbn07XG5leHBvcnRzLmNyZWF0ZVZlcmlmeSA9IGZ1bmN0aW9uIGNyZWF0ZVZlcmlmeShvcHRzKSB7XG4gIHJldHVybiBuZXcgVmVyaWZ5U3RyZWFtKG9wdHMpO1xufTtcbiIsCiAgICAidmFyIGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChqd3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBkZWNvZGVkID0gandzLmRlY29kZShqd3QsIG9wdGlvbnMpO1xuICBpZiAoIWRlY29kZWQpIHsgcmV0dXJuIG51bGw7IH1cbiAgdmFyIHBheWxvYWQgPSBkZWNvZGVkLnBheWxvYWQ7XG5cbiAgLy90cnkgcGFyc2UgdGhlIHBheWxvYWRcbiAgaWYodHlwZW9mIHBheWxvYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBvYmogPSBKU09OLnBhcnNlKHBheWxvYWQpO1xuICAgICAgaWYob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHBheWxvYWQgPSBvYmo7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyB9XG4gIH1cblxuICAvL3JldHVybiBoZWFkZXIgaWYgYGNvbXBsZXRlYCBvcHRpb24gaXMgZW5hYmxlZC4gIGhlYWRlciBpbmNsdWRlcyBjbGFpbXNcbiAgLy9zdWNoIGFzIGBraWRgIGFuZCBgYWxnYCB1c2VkIHRvIHNlbGVjdCB0aGUga2V5IHdpdGhpbiBhIEpXS1MgbmVlZGVkIHRvXG4gIC8vdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAgaWYgKG9wdGlvbnMuY29tcGxldGUgPT09IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyOiBkZWNvZGVkLmhlYWRlcixcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBzaWduYXR1cmU6IGRlY29kZWQuc2lnbmF0dXJlXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZDtcbn07XG4iLAogICAgInZhciBKc29uV2ViVG9rZW5FcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBlcnJvcikge1xuICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICBpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG4gIHRoaXMubmFtZSA9ICdKc29uV2ViVG9rZW5FcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIGlmIChlcnJvcikgdGhpcy5pbm5lciA9IGVycm9yO1xufTtcblxuSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSnNvbldlYlRva2VuRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gSnNvbldlYlRva2VuRXJyb3I7XG4iLAogICAgInZhciBKc29uV2ViVG9rZW5FcnJvciA9IHJlcXVpcmUoJy4vSnNvbldlYlRva2VuRXJyb3InKTtcblxudmFyIE5vdEJlZm9yZUVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGRhdGUpIHtcbiAgSnNvbldlYlRva2VuRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgdGhpcy5uYW1lID0gJ05vdEJlZm9yZUVycm9yJztcbiAgdGhpcy5kYXRlID0gZGF0ZTtcbn07XG5cbk5vdEJlZm9yZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlKTtcblxuTm90QmVmb3JlRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTm90QmVmb3JlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gTm90QmVmb3JlRXJyb3I7IiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL0pzb25XZWJUb2tlbkVycm9yJyk7XG5cbnZhciBUb2tlbkV4cGlyZWRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBleHBpcmVkQXQpIHtcbiAgSnNvbldlYlRva2VuRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgdGhpcy5uYW1lID0gJ1Rva2VuRXhwaXJlZEVycm9yJztcbiAgdGhpcy5leHBpcmVkQXQgPSBleHBpcmVkQXQ7XG59O1xuXG5Ub2tlbkV4cGlyZWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSk7XG5cblRva2VuRXhwaXJlZEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRva2VuRXhwaXJlZEVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRva2VuRXhwaXJlZEVycm9yOyIsCiAgICAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwKICAgICJ2YXIgbXMgPSByZXF1aXJlKCdtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aW1lLCBpYXQpIHtcbiAgdmFyIHRpbWVzdGFtcCA9IGlhdCB8fCBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICBpZiAodHlwZW9mIHRpbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IG1zKHRpbWUpO1xuICAgIGlmICh0eXBlb2YgbWlsbGlzZWNvbmRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5mbG9vcih0aW1lc3RhbXAgKyBtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdGltZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wICsgdGltZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cblxufTsiLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5jb25zdCBTRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG5jb25zdCBNQVhfTEVOR1RIID0gMjU2XG5jb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIDkwMDcxOTkyNTQ3NDA5OTFcblxuLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuY29uc3QgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2XG5cbi8vIE1heCBzYWZlIGxlbmd0aCBmb3IgYSBidWlsZCBpZGVudGlmaWVyLiBUaGUgbWF4IGxlbmd0aCBtaW51cyA2IGNoYXJhY3RlcnMgZm9yXG4vLyB0aGUgc2hvcnRlc3QgdmVyc2lvbiB3aXRoIGEgYnVpbGQgMC4wLjArQlVJTEQuXG5jb25zdCBNQVhfU0FGRV9CVUlMRF9MRU5HVEggPSBNQVhfTEVOR1RIIC0gNlxuXG5jb25zdCBSRUxFQVNFX1RZUEVTID0gW1xuICAnbWFqb3InLFxuICAncHJlbWFqb3InLFxuICAnbWlub3InLFxuICAncHJlbWlub3InLFxuICAncGF0Y2gnLFxuICAncHJlcGF0Y2gnLFxuICAncHJlcmVsZWFzZScsXG5dXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RILFxuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9TQUZFX0lOVEVHRVIsXG4gIFJFTEVBU0VfVFlQRVMsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFOiAwYjAwMSxcbiAgRkxBR19MT09TRTogMGIwMTAsXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkZWJ1ZyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gIHByb2Nlc3MuZW52ICYmXG4gIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbikgPyAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvcignU0VNVkVSJywgLi4uYXJncylcbiAgOiAoKSA9PiB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVnXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX0xFTkdUSCxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKVxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge31cblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbmNvbnN0IHJlID0gZXhwb3J0cy5yZSA9IFtdXG5jb25zdCBzYWZlUmUgPSBleHBvcnRzLnNhZmVSZSA9IFtdXG5jb25zdCBzcmMgPSBleHBvcnRzLnNyYyA9IFtdXG5jb25zdCBzYWZlU3JjID0gZXhwb3J0cy5zYWZlU3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgc2FmZVNyY1tpbmRleF0gPSBzYWZlXG4gIHJlW2luZGV4XSA9IG5ldyBSZWdFeHAodmFsdWUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxuICBzYWZlUmVbaW5kZXhdID0gbmV3IFJlZ0V4cChzYWZlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGZvciB0b2tlbml6aW5nLFxuLy8gdmFsaWRhdGluZywgYW5kIHBhcnNpbmcgU2VtVmVyIHZlcnNpb24gc3RyaW5ncy5cblxuLy8gIyMgTnVtZXJpYyBJZGVudGlmaWVyXG4vLyBBIHNpbmdsZSBgMGAsIG9yIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGRpZ2l0cy5cblxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSJywgJzB8WzEtOV1cXFxcZConKVxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSTE9PU0UnLCAnXFxcXGQrJylcblxuLy8gIyMgTm9uLW51bWVyaWMgSWRlbnRpZmllclxuLy8gWmVybyBvciBtb3JlIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgaHlwaGVuLCBhbmQgdGhlbiB6ZXJvIG9yXG4vLyBtb3JlIGxldHRlcnMsIGRpZ2l0cywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ05PTk5VTUVSSUNJREVOVElGSUVSJywgYFxcXFxkKlthLXpBLVotXSR7TEVUVEVSREFTSE5VTUJFUn0qYClcblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTicsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT05MT09TRScsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvbiBJZGVudGlmaWVyXG4vLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuLy8gTm9uLW51bWJlcmljIGlkZW50aWZpZXJzIGluY2x1ZGUgbnVtYmVyaWMgaWRlbnRpZmllcnMgYnV0IGNhbiBiZSBsb25nZXIuXG4vLyBUaGVyZWZvcmUgbm9uLW51bWJlcmljIGlkZW50aWZpZXJzIG11c3QgZ28gZmlyc3QuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIHBhcnNlIG91dCBqdXN0IHRoZSBvcHRpb25zIHdlIGNhcmUgYWJvdXRcbmNvbnN0IGxvb3NlT3B0aW9uID0gT2JqZWN0LmZyZWV6ZSh7IGxvb3NlOiB0cnVlIH0pXG5jb25zdCBlbXB0eU9wdHMgPSBPYmplY3QuZnJlZXplKHsgfSlcbmNvbnN0IHBhcnNlT3B0aW9ucyA9IG9wdGlvbnMgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gZW1wdHlPcHRzXG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGxvb3NlT3B0aW9uXG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZU9wdGlvbnNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG51bWVyaWMgPSAvXlswLTldKyQvXG5jb25zdCBjb21wYXJlSWRlbnRpZmllcnMgPSAoYSwgYikgPT4ge1xuICBjb25zdCBhbnVtID0gbnVtZXJpYy50ZXN0KGEpXG4gIGNvbnN0IGJudW0gPSBudW1lcmljLnRlc3QoYilcblxuICBpZiAoYW51bSAmJiBibnVtKSB7XG4gICAgYSA9ICthXG4gICAgYiA9ICtiXG4gIH1cblxuICByZXR1cm4gYSA9PT0gYiA/IDBcbiAgICA6IChhbnVtICYmICFibnVtKSA/IC0xXG4gICAgOiAoYm51bSAmJiAhYW51bSkgPyAxXG4gICAgOiBhIDwgYiA/IC0xXG4gICAgOiAxXG59XG5cbmNvbnN0IHJjb21wYXJlSWRlbnRpZmllcnMgPSAoYSwgYikgPT4gY29tcGFyZUlkZW50aWZpZXJzKGIsIGEpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHZlcnNpb24uaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgICByZXR1cm4gdmVyc2lvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24udmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHZlcnNpb24uIE11c3QgYmUgYSBzdHJpbmcuIEdvdCB0eXBlIFwiJHt0eXBlb2YgdmVyc2lvbn1cIi5gKVxuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGB2ZXJzaW9uIGlzIGxvbmdlciB0aGFuICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2VtVmVyJywgdmVyc2lvbiwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIC8vIHRoaXMgaXNuJ3QgYWN0dWFsbHkgcmVsZXZhbnQgZm9yIHZlcnNpb25zLCBidXQga2VlcCBpdCBzbyB0aGF0IHdlXG4gICAgLy8gZG9uJ3QgcnVuIGludG8gdHJvdWJsZSBwYXNzaW5nIHRoaXMub3B0aW9ucyBhcm91bmQuXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgY29uc3QgbSA9IHZlcnNpb24udHJpbSgpLm1hdGNoKG9wdGlvbnMubG9vc2UgPyByZVt0LkxPT1NFXSA6IHJlW3QuRlVMTF0pXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgVmVyc2lvbjogJHt2ZXJzaW9ufWApXG4gICAgfVxuXG4gICAgdGhpcy5yYXcgPSB2ZXJzaW9uXG5cbiAgICAvLyB0aGVzZSBhcmUgYWN0dWFsbHkgbnVtYmVyc1xuICAgIHRoaXMubWFqb3IgPSArbVsxXVxuICAgIHRoaXMubWlub3IgPSArbVsyXVxuICAgIHRoaXMucGF0Y2ggPSArbVszXVxuXG4gICAgaWYgKHRoaXMubWFqb3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWFqb3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtaW5vciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXRjaCA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5wYXRjaCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgcGF0Y2ggdmVyc2lvbicpXG4gICAgfVxuXG4gICAgLy8gbnVtYmVyaWZ5IGFueSBwcmVyZWxlYXNlIG51bWVyaWMgaWRzXG4gICAgaWYgKCFtWzRdKSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKChpZCkgPT4ge1xuICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICAgIGNvbnN0IG51bSA9ICtpZFxuICAgICAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPCBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkID0gbVs1XSA/IG1bNV0uc3BsaXQoJy4nKSA6IFtdXG4gICAgdGhpcy5mb3JtYXQoKVxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICB0aGlzLnZlcnNpb24gPSBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5wYXRjaH1gXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmVyc2lvbiArPSBgLSR7dGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICBjb21wYXJlIChvdGhlcikge1xuICAgIGRlYnVnKCdTZW1WZXIuY29tcGFyZScsIHRoaXMudmVyc2lvbiwgdGhpcy5vcHRpb25zLCBvdGhlcilcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09ICdzdHJpbmcnICYmIG90aGVyID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGlmIChvdGhlci52ZXJzaW9uID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcilcbiAgfVxuXG4gIGNvbXBhcmVNYWluIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1ham9yLCBvdGhlci5tYWpvcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLCBvdGhlci5taW5vcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaClcbiAgICApXG4gIH1cblxuICBjb21wYXJlUHJlIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgLy8gTk9UIGhhdmluZyBhIHByZXJlbGVhc2UgaXMgPiBoYXZpbmcgb25lXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmIG90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnByZXJlbGVhc2VbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5wcmVyZWxlYXNlW2ldXG4gICAgICBkZWJ1ZygncHJlcmVsZWFzZSBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICBjb21wYXJlQnVpbGQgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5idWlsZFtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLmJ1aWxkW2ldXG4gICAgICBkZWJ1ZygnYnVpbGQgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuICAvLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG4gIGluYyAocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpIHtcbiAgICBpZiAocmVsZWFzZS5zdGFydHNXaXRoKCdwcmUnKSkge1xuICAgICAgaWYgKCFpZGVudGlmaWVyICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICAgIH1cbiAgICAgIC8vIEF2b2lkIGFuIGludmFsaWQgc2VtdmVyIHJlc3VsdHNcbiAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gYC0ke2lkZW50aWZpZXJ9YC5tYXRjaCh0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LlBSRVJFTEVBU0VMT09TRV0gOiByZVt0LlBSRVJFTEVBU0VdKVxuICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAgIC8vIHByZXBhdGNoLlxuICAgICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJzaW9uICR7dGhpcy5yYXd9IGlzIG5vdCBhIHByZXJlbGVhc2VgKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWlub3IgIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnBhdGNoICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWlub3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgICAvLyAxLjAuMCAncHJlJyB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICBjb25zdCBiYXNlID0gTnVtYmVyKGlkZW50aWZpZXJCYXNlKSA/IDEgOiAwXG5cbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbYmFzZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgICBpID0gLTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKSAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaChiYXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgICBsZXQgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCBiYXNlXVxuICAgICAgICAgIGlmIChpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXJlbGVhc2UgPSBbaWRlbnRpZmllcl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnByZXJlbGVhc2VbMF0sIGlkZW50aWZpZXIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICR7cmVsZWFzZX1gKVxuICAgIH1cbiAgICB0aGlzLnJhdyA9IHRoaXMuZm9ybWF0KClcbiAgICBpZiAodGhpcy5idWlsZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmF3ICs9IGArJHt0aGlzLmJ1aWxkLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZW1WZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gKHZlcnNpb24sIG9wdGlvbnMsIHRocm93RXJyb3JzID0gZmFsc2UpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAoIXRocm93RXJyb3JzKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICB0aHJvdyBlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB2YWxpZCA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHYgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gdiA/IHYudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCBjbGVhbiA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIG9wdGlvbnMpXG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBjbGVhblxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuXG5jb25zdCBpbmMgPSAodmVyc2lvbiwgcmVsZWFzZSwgb3B0aW9ucywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpID0+IHtcbiAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT09ICdzdHJpbmcnKSB7XG4gICAgaWRlbnRpZmllckJhc2UgPSBpZGVudGlmaWVyXG4gICAgaWRlbnRpZmllciA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKFxuICAgICAgdmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlciA/IHZlcnNpb24udmVyc2lvbiA6IHZlcnNpb24sXG4gICAgICBvcHRpb25zXG4gICAgKS5pbmMocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpLnZlcnNpb25cbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluY1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlLmpzJylcblxuY29uc3QgZGlmZiA9ICh2ZXJzaW9uMSwgdmVyc2lvbjIpID0+IHtcbiAgY29uc3QgdjEgPSBwYXJzZSh2ZXJzaW9uMSwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgdjIgPSBwYXJzZSh2ZXJzaW9uMiwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgY29tcGFyaXNvbiA9IHYxLmNvbXBhcmUodjIpXG5cbiAgaWYgKGNvbXBhcmlzb24gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgdjFIaWdoZXIgPSBjb21wYXJpc29uID4gMFxuICBjb25zdCBoaWdoVmVyc2lvbiA9IHYxSGlnaGVyID8gdjEgOiB2MlxuICBjb25zdCBsb3dWZXJzaW9uID0gdjFIaWdoZXIgPyB2MiA6IHYxXG4gIGNvbnN0IGhpZ2hIYXNQcmUgPSAhIWhpZ2hWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG4gIGNvbnN0IGxvd0hhc1ByZSA9ICEhbG93VmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuXG4gIGlmIChsb3dIYXNQcmUgJiYgIWhpZ2hIYXNQcmUpIHtcbiAgICAvLyBHb2luZyBmcm9tIHByZXJlbGVhc2UgLT4gbm8gcHJlcmVsZWFzZSByZXF1aXJlcyBzb21lIHNwZWNpYWwgY2FzaW5nXG5cbiAgICAvLyBJZiB0aGUgbG93IHZlcnNpb24gaGFzIG9ubHkgYSBtYWpvciwgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBhIG1ham9yXG4gICAgLy8gU29tZSBleGFtcGxlczpcbiAgICAvLyAxLjAuMC0xIC0+IDEuMC4wXG4gICAgLy8gMS4wLjAtMSAtPiAxLjEuMVxuICAgIC8vIDEuMC4wLTEgLT4gMi4wLjBcbiAgICBpZiAoIWxvd1ZlcnNpb24ucGF0Y2ggJiYgIWxvd1ZlcnNpb24ubWlub3IpIHtcbiAgICAgIHJldHVybiAnbWFqb3InXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG1haW4gcGFydCBoYXMgbm8gZGlmZmVyZW5jZVxuICAgIGlmIChsb3dWZXJzaW9uLmNvbXBhcmVNYWluKGhpZ2hWZXJzaW9uKSA9PT0gMCkge1xuICAgICAgaWYgKGxvd1ZlcnNpb24ubWlub3IgJiYgIWxvd1ZlcnNpb24ucGF0Y2gpIHtcbiAgICAgICAgcmV0dXJuICdtaW5vcidcbiAgICAgIH1cbiAgICAgIHJldHVybiAncGF0Y2gnXG4gICAgfVxuICB9XG5cbiAgLy8gYWRkIHRoZSBgcHJlYCBwcmVmaXggaWYgd2UgYXJlIGdvaW5nIHRvIGEgcHJlcmVsZWFzZSB2ZXJzaW9uXG4gIGNvbnN0IHByZWZpeCA9IGhpZ2hIYXNQcmUgPyAncHJlJyA6ICcnXG5cbiAgaWYgKHYxLm1ham9yICE9PSB2Mi5tYWpvcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWFqb3InXG4gIH1cblxuICBpZiAodjEubWlub3IgIT09IHYyLm1pbm9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtaW5vcidcbiAgfVxuXG4gIGlmICh2MS5wYXRjaCAhPT0gdjIucGF0Y2gpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ3BhdGNoJ1xuICB9XG5cbiAgLy8gaGlnaCBhbmQgbG93IGFyZSBwcmVsZWFzZXNcbiAgcmV0dXJuICdwcmVyZWxlYXNlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRpZmZcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1ham9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5tYWpvclxubW9kdWxlLmV4cG9ydHMgPSBtYWpvclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWlub3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1pbm9yXG5tb2R1bGUuZXhwb3J0cyA9IG1pbm9yXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXRjaCA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkucGF0Y2hcbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCBwcmVyZWxlYXNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIChwYXJzZWQgJiYgcGFyc2VkLnByZXJlbGVhc2UubGVuZ3RoKSA/IHBhcnNlZC5wcmVyZWxlYXNlIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBwcmVyZWxlYXNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PlxuICBuZXcgU2VtVmVyKGEsIGxvb3NlKS5jb21wYXJlKG5ldyBTZW1WZXIoYiwgbG9vc2UpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYiwgYSwgbG9vc2UpXG5tb2R1bGUuZXhwb3J0cyA9IHJjb21wYXJlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIHRydWUpXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVMb29zZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gKGEsIGIsIGxvb3NlKSA9PiB7XG4gIGNvbnN0IHZlcnNpb25BID0gbmV3IFNlbVZlcihhLCBsb29zZSlcbiAgY29uc3QgdmVyc2lvbkIgPSBuZXcgU2VtVmVyKGIsIGxvb3NlKVxuICByZXR1cm4gdmVyc2lvbkEuY29tcGFyZSh2ZXJzaW9uQikgfHwgdmVyc2lvbkEuY29tcGFyZUJ1aWxkKHZlcnNpb25CKVxufVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlQnVpbGRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChhLCBiLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCByc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYiwgYSwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSByc29ydFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDBcbm1vZHVsZS5leHBvcnRzID0gbHRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID09PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGVxXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IG5lcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgIT09IDBcbm1vZHVsZS5leHBvcnRzID0gbmVxXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMFxubW9kdWxlLmV4cG9ydHMgPSBndGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHRlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0ZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vbmVxJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9ndCcpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2d0ZScpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4vbHQnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9sdGUnKVxuXG5jb25zdCBjbXAgPSAoYSwgb3AsIGIsIGxvb3NlKSA9PiB7XG4gIHN3aXRjaCAob3ApIHtcbiAgICBjYXNlICc9PT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhID09PSBiXG5cbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhICE9PSBiXG5cbiAgICBjYXNlICcnOlxuICAgIGNhc2UgJz0nOlxuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBlcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJyE9JzpcbiAgICAgIHJldHVybiBuZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+JzpcbiAgICAgIHJldHVybiBndChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz49JzpcbiAgICAgIHJldHVybiBndGUoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8JzpcbiAgICAgIHJldHVybiBsdChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzw9JzpcbiAgICAgIHJldHVybiBsdGUoYSwgYiwgbG9vc2UpXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBvcGVyYXRvcjogJHtvcH1gKVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGNtcFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBjb2VyY2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgdmVyc2lvbiA9IFN0cmluZyh2ZXJzaW9uKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGxldCBtYXRjaCA9IG51bGxcbiAgaWYgKCFvcHRpb25zLnJ0bCkge1xuICAgIG1hdGNoID0gdmVyc2lvbi5tYXRjaChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VGVUxMXSA6IHJlW3QuQ09FUkNFXSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGaW5kIHRoZSByaWdodC1tb3N0IGNvZXJjaWJsZSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBzaGFyZVxuICAgIC8vIGEgdGVybWludXMgd2l0aCBhIG1vcmUgbGVmdC13YXJkIGNvZXJjaWJsZSBzdHJpbmcuXG4gICAgLy8gRWcsICcxLjIuMy40JyB3YW50cyB0byBjb2VyY2UgJzIuMy40Jywgbm90ICczLjQnIG9yICc0J1xuICAgIC8vIFdpdGggaW5jbHVkZVByZXJlbGVhc2Ugb3B0aW9uIHNldCwgJzEuMi4zLjQtcmMnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQtcmMnLCBub3QgJzIuMy40J1xuICAgIC8vXG4gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzdHJpbmcgY2hlY2tpbmcgd2l0aCBhIC9nIHJlZ2V4cFxuICAgIC8vIE1hbnVhbGx5IHNldCB0aGUgaW5kZXggc28gYXMgdG8gcGljayB1cCBvdmVybGFwcGluZyBtYXRjaGVzLlxuICAgIC8vIFN0b3Agd2hlbiB3ZSBnZXQgYSBtYXRjaCB0aGF0IGVuZHMgYXQgdGhlIHN0cmluZyBlbmQsIHNpbmNlIG5vXG4gICAgLy8gY29lcmNpYmxlIHN0cmluZyBjYW4gYmUgbW9yZSByaWdodC13YXJkIHdpdGhvdXQgdGhlIHNhbWUgdGVybWludXMuXG4gICAgY29uc3QgY29lcmNlUnRsUmVnZXggPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VSVExGVUxMXSA6IHJlW3QuQ09FUkNFUlRMXVxuICAgIGxldCBuZXh0XG4gICAgd2hpbGUgKChuZXh0ID0gY29lcmNlUnRsUmVnZXguZXhlYyh2ZXJzaW9uKSkgJiZcbiAgICAgICAgKCFtYXRjaCB8fCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCAhPT0gdmVyc2lvbi5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBpZiAoIW1hdGNoIHx8XG4gICAgICAgICAgICBuZXh0LmluZGV4ICsgbmV4dFswXS5sZW5ndGggIT09IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoID0gbmV4dFxuICAgICAgfVxuICAgICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gbmV4dC5pbmRleCArIG5leHRbMV0ubGVuZ3RoICsgbmV4dFsyXS5sZW5ndGhcbiAgICB9XG4gICAgLy8gbGVhdmUgaXQgaW4gYSBjbGVhbiBzdGF0ZVxuICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IC0xXG4gIH1cblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbWFqb3IgPSBtYXRjaFsyXVxuICBjb25zdCBtaW5vciA9IG1hdGNoWzNdIHx8ICcwJ1xuICBjb25zdCBwYXRjaCA9IG1hdGNoWzRdIHx8ICcwJ1xuICBjb25zdCBwcmVyZWxlYXNlID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs1XSA/IGAtJHttYXRjaFs1XX1gIDogJydcbiAgY29uc3QgYnVpbGQgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzZdID8gYCske21hdGNoWzZdfWAgOiAnJ1xuXG4gIHJldHVybiBwYXJzZShgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH0ke3ByZXJlbGVhc2V9JHtidWlsZH1gLCBvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMgPSBjb2VyY2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMubWF4ID0gMTAwMFxuICAgIHRoaXMubWFwID0gbmV3IE1hcCgpXG4gIH1cblxuICBnZXQgKGtleSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tYXAuZ2V0KGtleSlcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGtleSBmcm9tIHRoZSBtYXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kXG4gICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KVxuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cblxuICBkZWxldGUgKGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5kZWxldGUoa2V5KVxuICB9XG5cbiAgc2V0IChrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuZGVsZXRlKGtleSlcblxuICAgIGlmICghZGVsZXRlZCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiBjYWNoZSBpcyBmdWxsLCBkZWxldGUgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbVxuICAgICAgaWYgKHRoaXMubWFwLnNpemUgPj0gdGhpcy5tYXgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLm1hcC5rZXlzKCkubmV4dCgpLnZhbHVlXG4gICAgICAgIHRoaXMuZGVsZXRlKGZpcnN0S2V5KVxuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNQQUNFX0NIQVJBQ1RFUlMgPSAvXFxzKy9nXG5cbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBSYW5nZSB7XG4gIGNvbnN0cnVjdG9yIChyYW5nZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhbmdlLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgcmFuZ2UuaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgLy8ganVzdCBwdXQgaXQgaW4gdGhlIHNldCBhbmQgcmV0dXJuXG4gICAgICB0aGlzLnJhdyA9IHJhbmdlLnZhbHVlXG4gICAgICB0aGlzLnNldCA9IFtbcmFuZ2VdXVxuICAgICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICAvLyBGaXJzdCByZWR1Y2UgYWxsIHdoaXRlc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZSBzbyB3ZSBkbyBub3QgaGF2ZSB0byByZWx5XG4gICAgLy8gb24gcG90ZW50aWFsbHkgc2xvdyByZWdleGVzIGxpa2UgXFxzKi4gVGhpcyBpcyB0aGVuIHN0b3JlZCBhbmQgdXNlZCBmb3JcbiAgICAvLyBmdXR1cmUgZXJyb3IgbWVzc2FnZXMgYXMgd2VsbC5cbiAgICB0aGlzLnJhdyA9IHJhbmdlLnRyaW0oKS5yZXBsYWNlKFNQQUNFX0NIQVJBQ1RFUlMsICcgJylcblxuICAgIC8vIEZpcnN0LCBzcGxpdCBvbiB8fFxuICAgIHRoaXMuc2V0ID0gdGhpcy5yYXdcbiAgICAgIC5zcGxpdCgnfHwnKVxuICAgICAgLy8gbWFwIHRoZSByYW5nZSB0byBhIDJkIGFycmF5IG9mIGNvbXBhcmF0b3JzXG4gICAgICAubWFwKHIgPT4gdGhpcy5wYXJzZVJhbmdlKHIudHJpbSgpKSlcbiAgICAgIC8vIHRocm93IG91dCBhbnkgY29tcGFyYXRvciBsaXN0cyB0aGF0IGFyZSBlbXB0eVxuICAgICAgLy8gdGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCBpdCB3YXMgbm90IGEgdmFsaWQgcmFuZ2UsIHdoaWNoIGlzIGFsbG93ZWRcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIGJ1dCB3aWxsIHN0aWxsIHRocm93IGlmIHRoZSBXSE9MRSByYW5nZSBpcyBpbnZhbGlkLlxuICAgICAgLmZpbHRlcihjID0+IGMubGVuZ3RoKVxuXG4gICAgaWYgKCF0aGlzLnNldC5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgU2VtVmVyIFJhbmdlOiAke3RoaXMucmF3fWApXG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgbm90IHRoZSBudWxsIHNldCwgdGhyb3cgb3V0IG51bGwgc2V0cy5cbiAgICBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgLy8ga2VlcCB0aGUgZmlyc3Qgb25lLCBpbiBjYXNlIHRoZXkncmUgYWxsIG51bGwgc2V0c1xuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnNldFswXVxuICAgICAgdGhpcy5zZXQgPSB0aGlzLnNldC5maWx0ZXIoYyA9PiAhaXNOdWxsU2V0KGNbMF0pKVxuICAgICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldCA9IFtmaXJzdF1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSAqLCB0aGVuIHRoZSByYW5nZSBpcyBqdXN0ICpcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuc2V0KSB7XG4gICAgICAgICAgaWYgKGMubGVuZ3RoID09PSAxICYmIGlzQW55KGNbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldCA9IFtjXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdHRlZCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHJhbmdlICgpIHtcbiAgICBpZiAodGhpcy5mb3JtYXR0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mb3JtYXR0ZWQgPSAnJ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSAnfHwnXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcHMgPSB0aGlzLnNldFtpXVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbXBzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaWYgKGsgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSAnICdcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gY29tcHNba10udG9TdHJpbmcoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgcGFyc2VSYW5nZSAocmFuZ2UpIHtcbiAgICAvLyBtZW1vaXplIHJhbmdlIHBhcnNpbmcgZm9yIHBlcmZvcm1hbmNlLlxuICAgIC8vIHRoaXMgaXMgYSB2ZXJ5IGhvdCBwYXRoLCBhbmQgZnVsbHkgZGV0ZXJtaW5pc3RpYy5cbiAgICBjb25zdCBtZW1vT3B0cyA9XG4gICAgICAodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFKSB8XG4gICAgICAodGhpcy5vcHRpb25zLmxvb3NlICYmIEZMQUdfTE9PU0UpXG4gICAgY29uc3QgbWVtb0tleSA9IG1lbW9PcHRzICsgJzonICsgcmFuZ2VcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobWVtb0tleSlcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkXG4gICAgfVxuXG4gICAgY29uc3QgbG9vc2UgPSB0aGlzLm9wdGlvbnMubG9vc2VcbiAgICAvLyBgMS4yLjMgLSAxLjIuNGAgPT4gYD49MS4yLjMgPD0xLjIuNGBcbiAgICBjb25zdCBociA9IGxvb3NlID8gcmVbdC5IWVBIRU5SQU5HRUxPT1NFXSA6IHJlW3QuSFlQSEVOUkFOR0VdXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKGhyLCBoeXBoZW5SZXBsYWNlKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkpXG4gICAgZGVidWcoJ2h5cGhlbiByZXBsYWNlJywgcmFuZ2UpXG5cbiAgICAvLyBgPiAxLjIuMyA8IDEuMi41YCA9PiBgPjEuMi4zIDwxLjIuNWBcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5DT01QQVJBVE9SVFJJTV0sIGNvbXBhcmF0b3JUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY29tcGFyYXRvciB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBgfiAxLjIuM2AgPT4gYH4xLjIuM2BcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5USUxERVRSSU1dLCB0aWxkZVRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCd0aWxkZSB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBgXiAxLjIuM2AgPT4gYF4xLjIuM2BcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5DQVJFVFRSSU1dLCBjYXJldFRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjYXJldCB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSB0cmltbWVkIGFuZFxuICAgIC8vIHJlYWR5IHRvIGJlIHNwbGl0IGludG8gY29tcGFyYXRvcnMuXG5cbiAgICBsZXQgcmFuZ2VMaXN0ID0gcmFuZ2VcbiAgICAgIC5zcGxpdCgnICcpXG4gICAgICAubWFwKGNvbXAgPT4gcGFyc2VDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgICAuam9pbignICcpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLy8gPj0wLjAuMCBpcyBlcXVpdmFsZW50IHRvICpcbiAgICAgIC5tYXAoY29tcCA9PiByZXBsYWNlR1RFMChjb21wLCB0aGlzLm9wdGlvbnMpKVxuXG4gICAgaWYgKGxvb3NlKSB7XG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCB0aHJvdyBvdXQgYW55IHRoYXQgYXJlIG5vdCB2YWxpZCBjb21wYXJhdG9yc1xuICAgICAgcmFuZ2VMaXN0ID0gcmFuZ2VMaXN0LmZpbHRlcihjb21wID0+IHtcbiAgICAgICAgZGVidWcoJ2xvb3NlIGludmFsaWQgZmlsdGVyJywgY29tcCwgdGhpcy5vcHRpb25zKVxuICAgICAgICByZXR1cm4gISFjb21wLm1hdGNoKHJlW3QuQ09NUEFSQVRPUkxPT1NFXSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlYnVnKCdyYW5nZSBsaXN0JywgcmFuZ2VMaXN0KVxuXG4gICAgLy8gaWYgYW55IGNvbXBhcmF0b3JzIGFyZSB0aGUgbnVsbCBzZXQsIHRoZW4gcmVwbGFjZSB3aXRoIEpVU1QgbnVsbCBzZXRcbiAgICAvLyBpZiBtb3JlIHRoYW4gb25lIGNvbXBhcmF0b3IsIHJlbW92ZSBhbnkgKiBjb21wYXJhdG9yc1xuICAgIC8vIGFsc28sIGRvbid0IGluY2x1ZGUgdGhlIHNhbWUgY29tcGFyYXRvciBtb3JlIHRoYW4gb25jZVxuICAgIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcCgpXG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZUxpc3QubWFwKGNvbXAgPT4gbmV3IENvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29tcGFyYXRvcnMpIHtcbiAgICAgIGlmIChpc051bGxTZXQoY29tcCkpIHtcbiAgICAgICAgcmV0dXJuIFtjb21wXVxuICAgICAgfVxuICAgICAgcmFuZ2VNYXAuc2V0KGNvbXAudmFsdWUsIGNvbXApXG4gICAgfVxuICAgIGlmIChyYW5nZU1hcC5zaXplID4gMSAmJiByYW5nZU1hcC5oYXMoJycpKSB7XG4gICAgICByYW5nZU1hcC5kZWxldGUoJycpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gWy4uLnJhbmdlTWFwLnZhbHVlcygpXVxuICAgIGNhY2hlLnNldChtZW1vS2V5LCByZXN1bHQpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaW50ZXJzZWN0cyAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBSYW5nZSBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0LnNvbWUoKHRoaXNDb21wYXJhdG9ycykgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgaXNTYXRpc2ZpYWJsZSh0aGlzQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgIHJhbmdlLnNldC5zb21lKChyYW5nZUNvbXBhcmF0b3JzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzU2F0aXNmaWFibGUocmFuZ2VDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgICAgIHRoaXNDb21wYXJhdG9ycy5ldmVyeSgodGhpc0NvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlQ29tcGFyYXRvcnMuZXZlcnkoKHJhbmdlQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzQ29tcGFyYXRvci5pbnRlcnNlY3RzKHJhbmdlQ29tcGFyYXRvciwgb3B0aW9ucylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICAvLyBpZiBBTlkgb2YgdGhlIHNldHMgbWF0Y2ggQUxMIG9mIGl0cyBjb21wYXJhdG9ycywgdGhlbiBwYXNzXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0ZXN0U2V0KHRoaXMuc2V0W2ldLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZ2VcblxuY29uc3QgTFJVID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvbHJ1Y2FjaGUnKVxuY29uc3QgY2FjaGUgPSBuZXcgTFJVKClcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi9jb21wYXJhdG9yJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3Qge1xuICBzYWZlUmU6IHJlLFxuICB0LFxuICBjb21wYXJhdG9yVHJpbVJlcGxhY2UsXG4gIHRpbGRlVHJpbVJlcGxhY2UsXG4gIGNhcmV0VHJpbVJlcGxhY2UsXG59ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgeyBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSwgRkxBR19MT09TRSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcblxuY29uc3QgaXNOdWxsU2V0ID0gYyA9PiBjLnZhbHVlID09PSAnPDAuMC4wLTAnXG5jb25zdCBpc0FueSA9IGMgPT4gYy52YWx1ZSA9PT0gJydcblxuLy8gdGFrZSBhIHNldCBvZiBjb21wYXJhdG9ycyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmVcbi8vIGV4aXN0cyBhIHZlcnNpb24gd2hpY2ggY2FuIHNhdGlzZnkgaXRcbmNvbnN0IGlzU2F0aXNmaWFibGUgPSAoY29tcGFyYXRvcnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcbiAgY29uc3QgcmVtYWluaW5nQ29tcGFyYXRvcnMgPSBjb21wYXJhdG9ycy5zbGljZSgpXG4gIGxldCB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG5cbiAgd2hpbGUgKHJlc3VsdCAmJiByZW1haW5pbmdDb21wYXJhdG9ycy5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSByZW1haW5pbmdDb21wYXJhdG9ycy5ldmVyeSgob3RoZXJDb21wYXJhdG9yKSA9PiB7XG4gICAgICByZXR1cm4gdGVzdENvbXBhcmF0b3IuaW50ZXJzZWN0cyhvdGhlckNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgfSlcblxuICAgIHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gY29tcHJpc2VkIG9mIHhyYW5nZXMsIHRpbGRlcywgc3RhcnMsIGFuZCBndGx0J3MgYXQgdGhpcyBwb2ludC5cbi8vIGFscmVhZHkgcmVwbGFjZWQgdGhlIGh5cGhlbiByYW5nZXNcbi8vIHR1cm4gaW50byBhIHNldCBvZiBKVVNUIGNvbXBhcmF0b3JzLlxuY29uc3QgcGFyc2VDb21wYXJhdG9yID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NvbXAnLCBjb21wLCBvcHRpb25zKVxuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygnY2FyZXQnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygndGlsZGVzJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd4cmFuZ2UnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdzdGFycycsIGNvbXApXG4gIHJldHVybiBjb21wXG59XG5cbmNvbnN0IGlzWCA9IGlkID0+ICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJ1xuXG4vLyB+LCB+PiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIH4yLCB+Mi54LCB+Mi54LngsIH4+Miwgfj4yLnggfj4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjAtMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjEuMi4zLCB+PjEuMi4zIC0tPiA+PTEuMi4zIDwxLjMuMC0wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4wLjAuMSAtLT4gPj0wLjAuMSA8MC4xLjAtMFxuY29uc3QgcmVwbGFjZVRpbGRlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVRpbGRlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVRpbGRlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlRJTERFTE9PU0VdIDogcmVbdC5USUxERV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICAvLyB+MS4yID09ID49MS4yLjAgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wIDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VUaWxkZSBwcicsIHByKVxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd0aWxkZSByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBeIC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gXjIsIF4yLngsIF4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjIuMCwgXjIuMC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4xLjIuMyAtLT4gPj0xLjIuMyA8Mi4wLjAtMFxuLy8gXjEuMi4wIC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMC4wLjEgLS0+ID49MC4wLjEgPDAuMC4yLTBcbi8vIF4wLjEuMCAtLT4gPj0wLjEuMCA8MC4yLjAtMFxuY29uc3QgcmVwbGFjZUNhcmV0cyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZUNhcmV0KGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZUNhcmV0ID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCwgb3B0aW9ucylcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LkNBUkVUTE9PU0VdIDogcmVbdC5DQVJFVF1cbiAgY29uc3QgeiA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcilcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2VzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VYUmFuZ2UoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29tcCA9IGNvbXAudHJpbSgpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5YUkFOR0VMT09TRV0gOiByZVt0LlhSQU5HRV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAocmV0LCBndGx0LCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd4UmFuZ2UnLCBjb21wLCByZXQsIGd0bHQsIE0sIG0sIHAsIHByKVxuICAgIGNvbnN0IHhNID0gaXNYKE0pXG4gICAgY29uc3QgeG0gPSB4TSB8fCBpc1gobSlcbiAgICBjb25zdCB4cCA9IHhtIHx8IGlzWChwKVxuICAgIGNvbnN0IGFueVggPSB4cFxuXG4gICAgaWYgKGd0bHQgPT09ICc9JyAmJiBhbnlYKSB7XG4gICAgICBndGx0ID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBpbmNsdWRpbmcgcHJlcmVsZWFzZXMgaW4gdGhlIG1hdGNoLCB0aGVuIHdlIG5lZWRcbiAgICAvLyB0byBmaXggdGhpcyB0byAtMCwgdGhlIGxvd2VzdCBwb3NzaWJsZSBwcmVyZWxlYXNlIHZhbHVlXG4gICAgcHIgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wLTAnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGZvcmJpZGRlblxuICAgICAgICByZXQgPSAnKidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gd2Uga25vdyBwYXRjaCBpcyBhbiB4LCBiZWNhdXNlIHdlIGhhdmUgYW55IHggYXQgYWxsLlxuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKSB7XG4gICAgICAgIG0gPSAwXG4gICAgICB9XG4gICAgICBwID0gMFxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nKSB7XG4gICAgICAgIC8vID4xID0+ID49Mi4wLjBcbiAgICAgICAgLy8gPjEuMiA9PiA+PTEuMy4wXG4gICAgICAgIGd0bHQgPSAnPj0nXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgICBtID0gMFxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChndGx0ID09PSAnPCcpIHtcbiAgICAgICAgcHIgPSAnLTAnXG4gICAgICB9XG5cbiAgICAgIHJldCA9IGAke2d0bHQgKyBNfS4ke219LiR7cH0ke3ByfWBcbiAgICB9IGVsc2UgaWYgKHhtKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7cHJ9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpXG5cbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5jb25zdCByZXBsYWNlU3RhcnMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgb3B0aW9ucylcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW3QuU1RBUl0sICcnKVxufVxuXG5jb25zdCByZXBsYWNlR1RFMCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlR1RFMCcsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW29wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyB0LkdURTBQUkUgOiB0LkdURTBdLCAnJylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gc3RyaW5nLnJlcGxhY2UocmVbdC5IWVBIRU5SQU5HRV0pXG4vLyBNLCBtLCBwYXRjaCwgcHJlcmVsZWFzZSwgYnVpbGRcbi8vIDEuMiAtIDMuNC41ID0+ID49MS4yLjAgPD0zLjQuNVxuLy8gMS4yLjMgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTBcbi8vIFRPRE8gYnVpbGQ/XG5jb25zdCBoeXBoZW5SZXBsYWNlID0gaW5jUHIgPT4gKCQwLFxuICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICB0bywgdE0sIHRtLCB0cCwgdHByKSA9PiB7XG4gIGlmIChpc1goZk0pKSB7XG4gICAgZnJvbSA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKGZtKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4wLjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChpc1goZnApKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LiR7Zm19LjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChmcHIpIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfWBcbiAgfSBlbHNlIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfSR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9XG5cbiAgaWYgKGlzWCh0TSkpIHtcbiAgICB0byA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKHRtKSkge1xuICAgIHRvID0gYDwkeyt0TSArIDF9LjAuMC0wYFxuICB9IGVsc2UgaWYgKGlzWCh0cCkpIHtcbiAgICB0byA9IGA8JHt0TX0uJHsrdG0gKyAxfS4wLTBgXG4gIH0gZWxzZSBpZiAodHByKSB7XG4gICAgdG8gPSBgPD0ke3RNfS4ke3RtfS4ke3RwfS0ke3Rwcn1gXG4gIH0gZWxzZSBpZiAoaW5jUHIpIHtcbiAgICB0byA9IGA8JHt0TX0uJHt0bX0uJHsrdHAgKyAxfS0wYFxuICB9IGVsc2Uge1xuICAgIHRvID0gYDw9JHt0b31gXG4gIH1cblxuICByZXR1cm4gYCR7ZnJvbX0gJHt0b31gLnRyaW0oKVxufVxuXG5jb25zdCB0ZXN0U2V0ID0gKHNldCwgdmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoICYmICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKHNldFtpXS5zZW12ZXIpXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQ29tcGFyYXRvci5BTlkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBzZXRbaV0uc2VtdmVyXG4gICAgICAgIGlmIChhbGxvd2VkLm1ham9yID09PSB2ZXJzaW9uLm1ham9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLm1pbm9yID09PSB2ZXJzaW9uLm1pbm9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLnBhdGNoID09PSB2ZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnNpb24gaGFzIGEgLXByZSwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBsaWtlLlxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEFOWSA9IFN5bWJvbCgnU2VtVmVyIEFOWScpXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgQ29tcGFyYXRvciB7XG4gIHN0YXRpYyBnZXQgQU5ZICgpIHtcbiAgICByZXR1cm4gQU5ZXG4gIH1cblxuICBjb25zdHJ1Y3RvciAoY29tcCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgaWYgKGNvbXAubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSkge1xuICAgICAgICByZXR1cm4gY29tcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcCA9IGNvbXAudmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wID0gY29tcC50cmltKCkuc3BsaXQoL1xccysvKS5qb2luKCcgJylcbiAgICBkZWJ1ZygnY29tcGFyYXRvcicsIGNvbXAsIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICB0aGlzLnBhcnNlKGNvbXApXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wZXJhdG9yICsgdGhpcy5zZW12ZXIudmVyc2lvblxuICAgIH1cblxuICAgIGRlYnVnKCdjb21wJywgdGhpcylcbiAgfVxuXG4gIHBhcnNlIChjb21wKSB7XG4gICAgY29uc3QgciA9IHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuQ09NUEFSQVRPUkxPT1NFXSA6IHJlW3QuQ09NUEFSQVRPUl1cbiAgICBjb25zdCBtID0gY29tcC5tYXRjaChyKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGNvbXBhcmF0b3I6ICR7Y29tcH1gKVxuICAgIH1cblxuICAgIHRoaXMub3BlcmF0b3IgPSBtWzFdICE9PSB1bmRlZmluZWQgPyBtWzFdIDogJydcbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz0nKSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiBpdCBsaXRlcmFsbHkgaXMganVzdCAnPicgb3IgJycgdGhlbiBhbGxvdyBhbnl0aGluZy5cbiAgICBpZiAoIW1bMl0pIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gQU5ZXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gbmV3IFNlbVZlcihtWzJdLCB0aGlzLm9wdGlvbnMubG9vc2UpXG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cblxuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsIHZlcnNpb24sIHRoaXMub3B0aW9ucy5sb29zZSlcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZIHx8IHZlcnNpb24gPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY21wKHZlcnNpb24sIHRoaXMub3BlcmF0b3IsIHRoaXMuc2VtdmVyLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBpbnRlcnNlY3RzIChjb21wLCBvcHRpb25zKSB7XG4gICAgaWYgKCEoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIENvbXBhcmF0b3IgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKGNvbXAudmFsdWUsIG9wdGlvbnMpLnRlc3QodGhpcy52YWx1ZSlcbiAgICB9IGVsc2UgaWYgKGNvbXAub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAoY29tcC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy52YWx1ZSwgb3B0aW9ucykudGVzdChjb21wLnNlbXZlcilcbiAgICB9XG5cbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIG5vdGhpbmcgY2FuIHBvc3NpYmx5IGJlIGxvd2VyXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlID09PSAnPDAuMC4wLTAnIHx8IGNvbXAudmFsdWUgPT09ICc8MC4wLjAtMCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSB8fCBjb21wLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gaW5jcmVhc2luZyAoPiBvciA+PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGRlY3JlYXNpbmcgKDwgb3IgPD0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBzYW1lIFNlbVZlciBhbmQgYm90aCBzaWRlcyBhcmUgaW5jbHVzaXZlICg8PSBvciA+PSlcbiAgICBpZiAoXG4gICAgICAodGhpcy5zZW12ZXIudmVyc2lvbiA9PT0gY29tcC5zZW12ZXIudmVyc2lvbikgJiZcbiAgICAgIHRoaXMub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSAmJiBjb21wLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgbGVzcyB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJzwnLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGdyZWF0ZXIgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc+JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wYXJhdG9yXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY21wJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlJylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbi8vIE1vc3RseSBqdXN0IGZvciB0ZXN0aW5nIGFuZCBsZWdhY3kgQVBJIHJlYXNvbnNcbmNvbnN0IHRvQ29tcGFyYXRvcnMgPSAocmFuZ2UsIG9wdGlvbnMpID0+XG4gIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykuc2V0XG4gICAgLm1hcChjb21wID0+IGNvbXAubWFwKGMgPT4gYy52YWx1ZSkuam9pbignICcpLnRyaW0oKS5zcGxpdCgnICcpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvQ29tcGFyYXRvcnNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbmNvbnN0IG1heFNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtYXggPSBudWxsXG4gIGxldCBtYXhTViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1heCB8fCBtYXhTVi5jb21wYXJlKHYpID09PSAtMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1heCwgdiwgdHJ1ZSlcbiAgICAgICAgbWF4ID0gdlxuICAgICAgICBtYXhTViA9IG5ldyBTZW1WZXIobWF4LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1heFxufVxubW9kdWxlLmV4cG9ydHMgPSBtYXhTYXRpc2Z5aW5nXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgbWluU2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1pbiA9IG51bGxcbiAgbGV0IG1pblNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWluIHx8IG1pblNWLmNvbXBhcmUodikgPT09IDEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtaW4sIHYsIHRydWUpXG4gICAgICAgIG1pbiA9IHZcbiAgICAgICAgbWluU1YgPSBuZXcgU2VtVmVyKG1pbiwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtaW5cbn1cbm1vZHVsZS5leHBvcnRzID0gbWluU2F0aXNmeWluZ1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcblxuY29uc3QgbWluVmVyc2lvbiA9IChyYW5nZSwgbG9vc2UpID0+IHtcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKVxuXG4gIGxldCBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMC0wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG51bGxcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IHNldE1pbiA9IG51bGxcbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICAvLyBDbG9uZSB0byBhdm9pZCBtYW5pcHVsYXRpbmcgdGhlIGNvbXBhcmF0b3IncyBzZW12ZXIgb2JqZWN0LlxuICAgICAgY29uc3QgY29tcHZlciA9IG5ldyBTZW1WZXIoY29tcGFyYXRvci5zZW12ZXIudmVyc2lvbilcbiAgICAgIHN3aXRjaCAoY29tcGFyYXRvci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICBpZiAoY29tcHZlci5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29tcHZlci5wYXRjaCsrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucHJlcmVsZWFzZS5wdXNoKDApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXB2ZXIucmF3ID0gY29tcHZlci5mb3JtYXQoKVxuICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJyc6XG4gICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICBpZiAoIXNldE1pbiB8fCBndChjb21wdmVyLCBzZXRNaW4pKSB7XG4gICAgICAgICAgICBzZXRNaW4gPSBjb21wdmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgLyogSWdub3JlIG1heGltdW0gdmVyc2lvbnMgKi9cbiAgICAgICAgICBicmVha1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRpb246ICR7Y29tcGFyYXRvci5vcGVyYXRvcn1gKVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHNldE1pbiAmJiAoIW1pbnZlciB8fCBndChtaW52ZXIsIHNldE1pbikpKSB7XG4gICAgICBtaW52ZXIgPSBzZXRNaW5cbiAgICB9XG4gIH1cblxuICBpZiAobWludmVyICYmIHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblZlcnNpb25cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCB2YWxpZFJhbmdlID0gKHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUmV0dXJuICcqJyBpbnN0ZWFkIG9mICcnIHNvIHRoYXQgdHJ1dGhpbmVzcyB3b3Jrcy5cbiAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgaXQncyBpbnZhbGlkIGFueXdheVxuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnJhbmdlIHx8ICcqJ1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRSYW5nZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCB7IEFOWSB9ID0gQ29tcGFyYXRvclxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvZ3RlJylcblxuY29uc3Qgb3V0c2lkZSA9ICh2ZXJzaW9uLCByYW5nZSwgaGlsbywgb3B0aW9ucykgPT4ge1xuICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcblxuICBsZXQgZ3RmbiwgbHRlZm4sIGx0Zm4sIGNvbXAsIGVjb21wXG4gIHN3aXRjaCAoaGlsbykge1xuICAgIGNhc2UgJz4nOlxuICAgICAgZ3RmbiA9IGd0XG4gICAgICBsdGVmbiA9IGx0ZVxuICAgICAgbHRmbiA9IGx0XG4gICAgICBjb21wID0gJz4nXG4gICAgICBlY29tcCA9ICc+PSdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnPCc6XG4gICAgICBndGZuID0gbHRcbiAgICAgIGx0ZWZuID0gZ3RlXG4gICAgICBsdGZuID0gZ3RcbiAgICAgIGNvbXAgPSAnPCdcbiAgICAgIGVjb21wID0gJzw9J1xuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCBwcm92aWRlIGEgaGlsbyB2YWwgb2YgXCI8XCIgb3IgXCI+XCInKVxuICB9XG5cbiAgLy8gSWYgaXQgc2F0aXNmaWVzIHRoZSByYW5nZSBpdCBpcyBub3Qgb3V0c2lkZVxuICBpZiAoc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gRnJvbSBub3cgb24sIHZhcmlhYmxlIHRlcm1zIGFyZSBhcyBpZiB3ZSdyZSBpbiBcImd0clwiIG1vZGUuXG4gIC8vIGJ1dCBub3RlIHRoYXQgZXZlcnl0aGluZyBpcyBmbGlwcGVkIGZvciB0aGUgXCJsdHJcIiBmdW5jdGlvbi5cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldXG5cbiAgICBsZXQgaGlnaCA9IG51bGxcbiAgICBsZXQgbG93ID0gbnVsbFxuXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgaWYgKGNvbXBhcmF0b3Iuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCc+PTAuMC4wJylcbiAgICAgIH1cbiAgICAgIGhpZ2ggPSBoaWdoIHx8IGNvbXBhcmF0b3JcbiAgICAgIGxvdyA9IGxvdyB8fCBjb21wYXJhdG9yXG4gICAgICBpZiAoZ3Rmbihjb21wYXJhdG9yLnNlbXZlciwgaGlnaC5zZW12ZXIsIG9wdGlvbnMpKSB7XG4gICAgICAgIGhpZ2ggPSBjb21wYXJhdG9yXG4gICAgICB9IGVsc2UgaWYgKGx0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGxvdy5zZW12ZXIsIG9wdGlvbnMpKSB7XG4gICAgICAgIGxvdyA9IGNvbXBhcmF0b3JcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gSWYgdGhlIGVkZ2UgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhIG9wZXJhdG9yIHRoZW4gb3VyIHZlcnNpb25cbiAgICAvLyBpc24ndCBvdXRzaWRlIGl0XG4gICAgaWYgKGhpZ2gub3BlcmF0b3IgPT09IGNvbXAgfHwgaGlnaC5vcGVyYXRvciA9PT0gZWNvbXApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBsb3dlc3QgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhbiBvcGVyYXRvciBhbmQgb3VyIHZlcnNpb25cbiAgICAvLyBpcyBsZXNzIHRoYW4gaXQgdGhlbiBpdCBpc24ndCBoaWdoZXIgdGhhbiB0aGUgcmFuZ2VcbiAgICBpZiAoKCFsb3cub3BlcmF0b3IgfHwgbG93Lm9wZXJhdG9yID09PSBjb21wKSAmJlxuICAgICAgICBsdGVmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChsb3cub3BlcmF0b3IgPT09IGVjb21wICYmIGx0Zm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHNpZGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuY29uc3QgZ3RyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPicsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGd0clxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmNvbnN0IGx0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJzwnLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBsdHJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBpbnRlcnNlY3RzID0gKHIxLCByMiwgb3B0aW9ucykgPT4ge1xuICByMSA9IG5ldyBSYW5nZShyMSwgb3B0aW9ucylcbiAgcjIgPSBuZXcgUmFuZ2UocjIsIG9wdGlvbnMpXG4gIHJldHVybiByMS5pbnRlcnNlY3RzKHIyLCBvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbnRlcnNlY3RzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBnaXZlbiBhIHNldCBvZiB2ZXJzaW9ucyBhbmQgYSByYW5nZSwgY3JlYXRlIGEgXCJzaW1wbGlmaWVkXCIgcmFuZ2Vcbi8vIHRoYXQgaW5jbHVkZXMgdGhlIHNhbWUgdmVyc2lvbnMgdGhhdCB0aGUgb3JpZ2luYWwgcmFuZ2UgZG9lc1xuLy8gSWYgdGhlIG9yaWdpbmFsIHJhbmdlIGlzIHNob3J0ZXIgdGhhbiB0aGUgc2ltcGxpZmllZCBvbmUsIHJldHVybiB0aGF0LlxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxubW9kdWxlLmV4cG9ydHMgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHNldCA9IFtdXG4gIGxldCBmaXJzdCA9IG51bGxcbiAgbGV0IHByZXYgPSBudWxsXG4gIGNvbnN0IHYgPSB2ZXJzaW9ucy5zb3J0KChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIG9wdGlvbnMpKVxuICBmb3IgKGNvbnN0IHZlcnNpb24gb2Ygdikge1xuICAgIGNvbnN0IGluY2x1ZGVkID0gc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKVxuICAgIGlmIChpbmNsdWRlZCkge1xuICAgICAgcHJldiA9IHZlcnNpb25cbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSB2ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHNldC5wdXNoKFtmaXJzdCwgcHJldl0pXG4gICAgICB9XG4gICAgICBwcmV2ID0gbnVsbFxuICAgICAgZmlyc3QgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChmaXJzdCkge1xuICAgIHNldC5wdXNoKFtmaXJzdCwgbnVsbF0pXG4gIH1cblxuICBjb25zdCByYW5nZXMgPSBbXVxuICBmb3IgKGNvbnN0IFttaW4sIG1heF0gb2Ygc2V0KSB7XG4gICAgaWYgKG1pbiA9PT0gbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChtaW4pXG4gICAgfSBlbHNlIGlmICghbWF4ICYmIG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goJyonKVxuICAgIH0gZWxzZSBpZiAoIW1heCkge1xuICAgICAgcmFuZ2VzLnB1c2goYD49JHttaW59YClcbiAgICB9IGVsc2UgaWYgKG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goYDw9JHttYXh9YClcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2VzLnB1c2goYCR7bWlufSAtICR7bWF4fWApXG4gICAgfVxuICB9XG4gIGNvbnN0IHNpbXBsaWZpZWQgPSByYW5nZXMuam9pbignIHx8ICcpXG4gIGNvbnN0IG9yaWdpbmFsID0gdHlwZW9mIHJhbmdlLnJhdyA9PT0gJ3N0cmluZycgPyByYW5nZS5yYXcgOiBTdHJpbmcocmFuZ2UpXG4gIHJldHVybiBzaW1wbGlmaWVkLmxlbmd0aCA8IG9yaWdpbmFsLmxlbmd0aCA/IHNpbXBsaWZpZWQgOiByYW5nZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlLmpzJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3IuanMnKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcblxuLy8gQ29tcGxleCByYW5nZSBgcjEgfHwgcjIgfHwgLi4uYCBpcyBhIHN1YnNldCBvZiBgUjEgfHwgUjIgfHwgLi4uYCBpZmY6XG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIGlzIGEgbnVsbCBzZXQsIE9SXG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIHdoaWNoIGlzIG5vdCBhIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mXG4vLyAgIHNvbWUgYFIxLCBSMiwgLi4uYFxuLy9cbi8vIFNpbXBsZSByYW5nZSBgYzEgYzIgLi4uYCBpcyBhIHN1YnNldCBvZiBzaW1wbGUgcmFuZ2UgYEMxIEMyIC4uLmAgaWZmOlxuLy8gLSBJZiBjIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvciwgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIGZhbHNlXG4vLyAgIC0gZWxzZSByZXBsYWNlIGMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gdHJ1ZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBDIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gTGV0IEVRIGJlIHRoZSBzZXQgb2YgPSBjb21wYXJhdG9ycyBpbiBjXG4vLyAtIElmIEVRIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gTGV0IEdUIGJlIHRoZSBoaWdoZXN0ID4gb3IgPj0gY29tcGFyYXRvciBpbiBjXG4vLyAtIExldCBMVCBiZSB0aGUgbG93ZXN0IDwgb3IgPD0gY29tcGFyYXRvciBpbiBjXG4vLyAtIElmIEdUIGFuZCBMVCwgYW5kIEdULnNlbXZlciA+IExULnNlbXZlciwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBJZiBhbnkgQyBpcyBhID0gcmFuZ2UsIGFuZCBHVCBvciBMVCBhcmUgc2V0LCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgRVFcbi8vICAgLSBJZiBHVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgR1QsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBMVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgTFQsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBFUSBzYXRpc2ZpZXMgZXZlcnkgQywgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIHJldHVybiBmYWxzZVxuLy8gLSBJZiBHVFxuLy8gICAtIElmIEdULnNlbXZlciBpcyBsb3dlciB0aGFuIGFueSA+IG9yID49IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1QgaXMgPj0sIGFuZCBHVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIEdULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIExUXG4vLyAgIC0gSWYgTFQuc2VtdmVyIGlzIGdyZWF0ZXIgdGhhbiBhbnkgPCBvciA8PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIExUIGlzIDw9LCBhbmQgTFQuc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBMVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBFbHNlIHJldHVybiB0cnVlXG5cbmNvbnN0IHN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdWIgPSBuZXcgUmFuZ2Uoc3ViLCBvcHRpb25zKVxuICBkb20gPSBuZXcgUmFuZ2UoZG9tLCBvcHRpb25zKVxuICBsZXQgc2F3Tm9uTnVsbCA9IGZhbHNlXG5cbiAgT1VURVI6IGZvciAoY29uc3Qgc2ltcGxlU3ViIG9mIHN1Yi5zZXQpIHtcbiAgICBmb3IgKGNvbnN0IHNpbXBsZURvbSBvZiBkb20uc2V0KSB7XG4gICAgICBjb25zdCBpc1N1YiA9IHNpbXBsZVN1YnNldChzaW1wbGVTdWIsIHNpbXBsZURvbSwgb3B0aW9ucylcbiAgICAgIHNhd05vbk51bGwgPSBzYXdOb25OdWxsIHx8IGlzU3ViICE9PSBudWxsXG4gICAgICBpZiAoaXNTdWIpIHtcbiAgICAgICAgY29udGludWUgT1VURVJcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhlIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mIGV2ZXJ5dGhpbmcsIGJ1dCBudWxsIHNpbXBsZSByYW5nZXMgaW5cbiAgICAvLyBhIGNvbXBsZXggcmFuZ2Ugc2hvdWxkIGJlIGlnbm9yZWQuICBzbyBpZiB3ZSBzYXcgYSBub24tbnVsbCByYW5nZSxcbiAgICAvLyB0aGVuIHdlIGtub3cgdGhpcyBpc24ndCBhIHN1YnNldCwgYnV0IGlmIEVWRVJZIHNpbXBsZSByYW5nZSB3YXMgbnVsbCxcbiAgICAvLyB0aGVuIGl0IGlzIGEgc3Vic2V0LlxuICAgIGlmIChzYXdOb25OdWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZSA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMC0wJyldXG5jb25zdCBtaW5pbXVtVmVyc2lvbiA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXVxuXG5jb25zdCBzaW1wbGVTdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzdWIubGVuZ3RoID09PSAxICYmIHN1YlswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBjb25zdCBlcVNldCA9IG5ldyBTZXQoKVxuICBsZXQgZ3QsIGx0XG4gIGZvciAoY29uc3QgYyBvZiBzdWIpIHtcbiAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgIGd0ID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgbHQgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcVNldC5hZGQoYy5zZW12ZXIpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVxU2V0LnNpemUgPiAxKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGxldCBndGx0Q29tcFxuICBpZiAoZ3QgJiYgbHQpIHtcbiAgICBndGx0Q29tcCA9IGNvbXBhcmUoZ3Quc2VtdmVyLCBsdC5zZW12ZXIsIG9wdGlvbnMpXG4gICAgaWYgKGd0bHRDb21wID4gMCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKGd0bHRDb21wID09PSAwICYmIChndC5vcGVyYXRvciAhPT0gJz49JyB8fCBsdC5vcGVyYXRvciAhPT0gJzw9JykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gd2lsbCBpdGVyYXRlIG9uZSBvciB6ZXJvIHRpbWVzXG4gIGZvciAoY29uc3QgZXEgb2YgZXFTZXQpIHtcbiAgICBpZiAoZ3QgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGd0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKGx0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhsdCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICAgIGlmICghc2F0aXNmaWVzKGVxLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBsZXQgaGlnaGVyLCBsb3dlclxuICBsZXQgaGFzRG9tTFQsIGhhc0RvbUdUXG4gIC8vIGlmIHRoZSBzdWJzZXQgaGFzIGEgcHJlcmVsZWFzZSwgd2UgbmVlZCBhIGNvbXBhcmF0b3IgaW4gdGhlIHN1cGVyc2V0XG4gIC8vIHdpdGggdGhlIHNhbWUgdHVwbGUgYW5kIGEgcHJlcmVsZWFzZSwgb3IgaXQncyBub3QgYSBzdWJzZXRcbiAgbGV0IG5lZWREb21MVFByZSA9IGx0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBsdC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBsdC5zZW12ZXIgOiBmYWxzZVxuICBsZXQgbmVlZERvbUdUUHJlID0gZ3QgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGd0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGd0LnNlbXZlciA6IGZhbHNlXG4gIC8vIGV4Y2VwdGlvbjogPDEuMi4zLTAgaXMgdGhlIHNhbWUgYXMgPDEuMi4zXG4gIGlmIChuZWVkRG9tTFRQcmUgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2UubGVuZ3RoID09PSAxICYmXG4gICAgICBsdC5vcGVyYXRvciA9PT0gJzwnICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlWzBdID09PSAwKSB7XG4gICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICBoYXNEb21HVCA9IGhhc0RvbUdUIHx8IGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nXG4gICAgaGFzRG9tTFQgPSBoYXNEb21MVCB8fCBjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9J1xuICAgIGlmIChndCkge1xuICAgICAgaWYgKG5lZWREb21HVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21HVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21HVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21HVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21HVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgICBoaWdoZXIgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGhpZ2hlciA9PT0gYyAmJiBoaWdoZXIgIT09IGd0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3Qub3BlcmF0b3IgPT09ICc+PScgJiYgIXNhdGlzZmllcyhndC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsdCkge1xuICAgICAgaWYgKG5lZWREb21MVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21MVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21MVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21MVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgICBsb3dlciA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChsb3dlciA9PT0gYyAmJiBsb3dlciAhPT0gbHQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsdC5vcGVyYXRvciA9PT0gJzw9JyAmJiAhc2F0aXNmaWVzKGx0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjLm9wZXJhdG9yICYmIChsdCB8fCBndCkgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIHdhcyBhIDwgb3IgPiwgYW5kIG5vdGhpbmcgaW4gdGhlIGRvbSwgdGhlbiBtdXN0IGJlIGZhbHNlXG4gIC8vIFVOTEVTUyBpdCB3YXMgbGltaXRlZCBieSBhbm90aGVyIHJhbmdlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gIC8vIEVnLCA+MS4wLjAgPDEuMC4xIGlzIHN0aWxsIGEgc3Vic2V0IG9mIDwyLjAuMFxuICBpZiAoZ3QgJiYgaGFzRG9tTFQgJiYgIWx0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobHQgJiYgaGFzRG9tR1QgJiYgIWd0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB3ZSBuZWVkZWQgYSBwcmVyZWxlYXNlIHJhbmdlIGluIGEgc3BlY2lmaWMgdHVwbGUsIGJ1dCBkaWRuJ3QgZ2V0IG9uZVxuICAvLyB0aGVuIHRoaXMgaXNuJ3QgYSBzdWJzZXQuICBlZyA+PTEuMi4zLXByZSBpcyBub3QgYSBzdWJzZXQgb2YgPj0xLjAuMCxcbiAgLy8gYmVjYXVzZSBpdCBpbmNsdWRlcyBwcmVyZWxlYXNlcyBpbiB0aGUgMS4yLjMgdHVwbGVcbiAgaWYgKG5lZWREb21HVFByZSB8fCBuZWVkRG9tTFRQcmUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vID49MS4yLjMgaXMgbG93ZXIgdGhhbiA+MS4yLjNcbmNvbnN0IGhpZ2hlckdUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wID4gMCA/IGFcbiAgICA6IGNvbXAgPCAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJz4nICYmIGEub3BlcmF0b3IgPT09ICc+PScgPyBiXG4gICAgOiBhXG59XG5cbi8vIDw9MS4yLjMgaXMgaGlnaGVyIHRoYW4gPDEuMi4zXG5jb25zdCBsb3dlckxUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wIDwgMCA/IGFcbiAgICA6IGNvbXAgPiAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJzwnICYmIGEub3BlcmF0b3IgPT09ICc8PScgPyBiXG4gICAgOiBhXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3Vic2V0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBqdXN0IHByZS1sb2FkIGFsbCB0aGUgc3R1ZmYgdGhhdCBpbmRleC5qcyBsYXppbHkgZXhwb3J0c1xuY29uc3QgaW50ZXJuYWxSZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvcmUnKVxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBpZGVudGlmaWVycyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvaWRlbnRpZmllcnMnKVxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXJzZScpXG5jb25zdCB2YWxpZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ZhbGlkJylcbmNvbnN0IGNsZWFuID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY2xlYW4nKVxuY29uc3QgaW5jID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvaW5jJylcbmNvbnN0IGRpZmYgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9kaWZmJylcbmNvbnN0IG1ham9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWFqb3InKVxuY29uc3QgbWlub3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9taW5vcicpXG5jb25zdCBwYXRjaCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhdGNoJylcbmNvbnN0IHByZXJlbGVhc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wcmVyZWxlYXNlJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlJylcbmNvbnN0IHJjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcmNvbXBhcmUnKVxuY29uc3QgY29tcGFyZUxvb3NlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1sb29zZScpXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zb3J0JylcbmNvbnN0IHJzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcnNvcnQnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGVxID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZXEnKVxuY29uc3QgbmVxID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbmVxJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0ZScpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgY21wID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY21wJylcbmNvbnN0IGNvZXJjZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvZXJjZScpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IHRvQ29tcGFyYXRvcnMgPSByZXF1aXJlKCcuL3Jhbmdlcy90by1jb21wYXJhdG9ycycpXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWF4LXNhdGlzZnlpbmcnKVxuY29uc3QgbWluU2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblZlcnNpb24gPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tdmVyc2lvbicpXG5jb25zdCB2YWxpZFJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZXMvdmFsaWQnKVxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL291dHNpZGUnKVxuY29uc3QgZ3RyID0gcmVxdWlyZSgnLi9yYW5nZXMvZ3RyJylcbmNvbnN0IGx0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2x0cicpXG5jb25zdCBpbnRlcnNlY3RzID0gcmVxdWlyZSgnLi9yYW5nZXMvaW50ZXJzZWN0cycpXG5jb25zdCBzaW1wbGlmeVJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZXMvc2ltcGxpZnknKVxuY29uc3Qgc3Vic2V0ID0gcmVxdWlyZSgnLi9yYW5nZXMvc3Vic2V0Jylcbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXJzZSxcbiAgdmFsaWQsXG4gIGNsZWFuLFxuICBpbmMsXG4gIGRpZmYsXG4gIG1ham9yLFxuICBtaW5vcixcbiAgcGF0Y2gsXG4gIHByZXJlbGVhc2UsXG4gIGNvbXBhcmUsXG4gIHJjb21wYXJlLFxuICBjb21wYXJlTG9vc2UsXG4gIGNvbXBhcmVCdWlsZCxcbiAgc29ydCxcbiAgcnNvcnQsXG4gIGd0LFxuICBsdCxcbiAgZXEsXG4gIG5lcSxcbiAgZ3RlLFxuICBsdGUsXG4gIGNtcCxcbiAgY29lcmNlLFxuICBDb21wYXJhdG9yLFxuICBSYW5nZSxcbiAgc2F0aXNmaWVzLFxuICB0b0NvbXBhcmF0b3JzLFxuICBtYXhTYXRpc2Z5aW5nLFxuICBtaW5TYXRpc2Z5aW5nLFxuICBtaW5WZXJzaW9uLFxuICB2YWxpZFJhbmdlLFxuICBvdXRzaWRlLFxuICBndHIsXG4gIGx0cixcbiAgaW50ZXJzZWN0cyxcbiAgc2ltcGxpZnlSYW5nZSxcbiAgc3Vic2V0LFxuICBTZW1WZXIsXG4gIHJlOiBpbnRlcm5hbFJlLnJlLFxuICBzcmM6IGludGVybmFsUmUuc3JjLFxuICB0b2tlbnM6IGludGVybmFsUmUudCxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTjogY29uc3RhbnRzLlNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIFJFTEVBU0VfVFlQRVM6IGNvbnN0YW50cy5SRUxFQVNFX1RZUEVTLFxuICBjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLmNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMucmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsCiAgICAiY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICc+PTE1LjcuMCcpO1xuIiwKICAgICJjb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZW12ZXIuc2F0aXNmaWVzKHByb2Nlc3MudmVyc2lvbiwgJz49MTYuOS4wJyk7XG4iLAogICAgImNvbnN0IEFTWU1NRVRSSUNfS0VZX0RFVEFJTFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9hc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZCcpO1xuY29uc3QgUlNBX1BTU19LRVlfREVUQUlMU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL3JzYVBzc0tleURldGFpbHNTdXBwb3J0ZWQnKTtcblxuY29uc3QgYWxsb3dlZEFsZ29yaXRobXNGb3JLZXlzID0ge1xuICAnZWMnOiBbJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ10sXG4gICdyc2EnOiBbJ1JTMjU2JywgJ1BTMjU2JywgJ1JTMzg0JywgJ1BTMzg0JywgJ1JTNTEyJywgJ1BTNTEyJ10sXG4gICdyc2EtcHNzJzogWydQUzI1NicsICdQUzM4NCcsICdQUzUxMiddXG59O1xuXG5jb25zdCBhbGxvd2VkQ3VydmVzID0ge1xuICBFUzI1NjogJ3ByaW1lMjU2djEnLFxuICBFUzM4NDogJ3NlY3AzODRyMScsXG4gIEVTNTEyOiAnc2VjcDUyMXIxJyxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYWxnb3JpdGhtLCBrZXkpIHtcbiAgaWYgKCFhbGdvcml0aG0gfHwgIWtleSkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleVR5cGUgPSBrZXkuYXN5bW1ldHJpY0tleVR5cGU7XG4gIGlmICgha2V5VHlwZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGFsbG93ZWRBbGdvcml0aG1zID0gYWxsb3dlZEFsZ29yaXRobXNGb3JLZXlzW2tleVR5cGVdO1xuXG4gIGlmICghYWxsb3dlZEFsZ29yaXRobXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24ga2V5IHR5cGUgXCIke2tleVR5cGV9XCIuYCk7XG4gIH1cblxuICBpZiAoIWFsbG93ZWRBbGdvcml0aG1zLmluY2x1ZGVzKGFsZ29yaXRobSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFwiYWxnXCIgcGFyYW1ldGVyIGZvciBcIiR7a2V5VHlwZX1cIiBrZXkgdHlwZSBtdXN0IGJlIG9uZSBvZjogJHthbGxvd2VkQWxnb3JpdGhtcy5qb2luKCcsICcpfS5gKVxuICB9XG5cbiAgLypcbiAgICogSWdub3JlIHRoZSBuZXh0IGJsb2NrIGZyb20gdGVzdCBjb3ZlcmFnZSBiZWNhdXNlIGl0IGdldHMgZXhlY3V0ZWRcbiAgICogY29uZGl0aW9uYWxseSBkZXBlbmRpbmcgb24gdGhlIE5vZGUgdmVyc2lvbi4gTm90IGlnbm9yaW5nIGl0IHdvdWxkXG4gICAqIHByZXZlbnQgdXMgZnJvbSByZWFjaGluZyB0aGUgdGFyZ2V0ICUgb2YgY292ZXJhZ2UgZm9yIHZlcnNpb25zIG9mXG4gICAqIE5vZGUgdW5kZXIgMTUuNy4wLlxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKEFTWU1NRVRSSUNfS0VZX0RFVEFJTFNfU1VQUE9SVEVEKSB7XG4gICAgc3dpdGNoIChrZXlUeXBlKSB7XG4gICAgY2FzZSAnZWMnOlxuICAgICAgY29uc3Qga2V5Q3VydmUgPSBrZXkuYXN5bW1ldHJpY0tleURldGFpbHMubmFtZWRDdXJ2ZTtcbiAgICAgIGNvbnN0IGFsbG93ZWRDdXJ2ZSA9IGFsbG93ZWRDdXJ2ZXNbYWxnb3JpdGhtXTtcblxuICAgICAgaWYgKGtleUN1cnZlICE9PSBhbGxvd2VkQ3VydmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImFsZ1wiIHBhcmFtZXRlciBcIiR7YWxnb3JpdGhtfVwiIHJlcXVpcmVzIGN1cnZlIFwiJHthbGxvd2VkQ3VydmV9XCIuYCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JzYS1wc3MnOlxuICAgICAgaWYgKFJTQV9QU1NfS0VZX0RFVEFJTFNfU1VQUE9SVEVEKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGFsZ29yaXRobS5zbGljZSgtMyksIDEwKTtcbiAgICAgICAgY29uc3QgeyBoYXNoQWxnb3JpdGhtLCBtZ2YxSGFzaEFsZ29yaXRobSwgc2FsdExlbmd0aCB9ID0ga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzO1xuXG4gICAgICAgIGlmIChoYXNoQWxnb3JpdGhtICE9PSBgc2hhJHtsZW5ndGh9YCB8fCBtZ2YxSGFzaEFsZ29yaXRobSAhPT0gaGFzaEFsZ29yaXRobSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9yIHRoaXMgb3BlcmF0aW9uLCBpdHMgUlNBLVBTUyBwYXJhbWV0ZXJzIGRvIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgXCJhbGdcIiAke2FsZ29yaXRobX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2FsdExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHNhbHRMZW5ndGggPiBsZW5ndGggPj4gMykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZm9yIHRoaXMgb3BlcmF0aW9uLCBpdHMgUlNBLVBTUyBwYXJhbWV0ZXIgc2FsdExlbmd0aCBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgXCJhbGdcIiAke2FsZ29yaXRobX0uYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLAogICAgInZhciBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZW12ZXIuc2F0aXNmaWVzKHByb2Nlc3MudmVyc2lvbiwgJ142LjEyLjAgfHwgPj04LjAuMCcpO1xuIiwKICAgICJjb25zdCBKc29uV2ViVG9rZW5FcnJvciA9IHJlcXVpcmUoJy4vbGliL0pzb25XZWJUb2tlbkVycm9yJyk7XG5jb25zdCBOb3RCZWZvcmVFcnJvciA9IHJlcXVpcmUoJy4vbGliL05vdEJlZm9yZUVycm9yJyk7XG5jb25zdCBUb2tlbkV4cGlyZWRFcnJvciA9IHJlcXVpcmUoJy4vbGliL1Rva2VuRXhwaXJlZEVycm9yJyk7XG5jb25zdCBkZWNvZGUgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuY29uc3QgdGltZXNwYW4gPSByZXF1aXJlKCcuL2xpYi90aW1lc3BhbicpO1xuY29uc3QgdmFsaWRhdGVBc3ltbWV0cmljS2V5ID0gcmVxdWlyZSgnLi9saWIvdmFsaWRhdGVBc3ltbWV0cmljS2V5Jyk7XG5jb25zdCBQU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2xpYi9wc1N1cHBvcnRlZCcpO1xuY29uc3QgandzID0gcmVxdWlyZSgnandzJyk7XG5jb25zdCB7S2V5T2JqZWN0LCBjcmVhdGVTZWNyZXRLZXksIGNyZWF0ZVB1YmxpY0tleX0gPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuXG5jb25zdCBQVUJfS0VZX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJ107XG5jb25zdCBFQ19LRVlfQUxHUyA9IFsnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXTtcbmNvbnN0IFJTQV9LRVlfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInXTtcbmNvbnN0IEhTX0FMR1MgPSBbJ0hTMjU2JywgJ0hTMzg0JywgJ0hTNTEyJ107XG5cbmlmIChQU19TVVBQT1JURUQpIHtcbiAgUFVCX0tFWV9BTEdTLnNwbGljZShQVUJfS0VZX0FMR1MubGVuZ3RoLCAwLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInKTtcbiAgUlNBX0tFWV9BTEdTLnNwbGljZShSU0FfS0VZX0FMR1MubGVuZ3RoLCAwLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoand0U3RyaW5nLCBzZWNyZXRPclB1YmxpY0tleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKCh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgJiYgIWNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIC8vY2xvbmUgdGhpcyBvYmplY3Qgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIG11dGF0ZSBpdC5cbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuXG4gIGxldCBkb25lO1xuXG4gIGlmIChjYWxsYmFjaykge1xuICAgIGRvbmUgPSBjYWxsYmFjaztcbiAgfSBlbHNlIHtcbiAgICBkb25lID0gZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgJiYgdHlwZW9mIG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdjbG9ja1RpbWVzdGFtcCBtdXN0IGJlIGEgbnVtYmVyJykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubm9uY2UgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG9wdGlvbnMubm9uY2UgIT09ICdzdHJpbmcnIHx8IG9wdGlvbnMubm9uY2UudHJpbSgpID09PSAnJykpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ25vbmNlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2FsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyBtdXN0IGJlIGEgYm9vbGVhbicpKTtcbiAgfVxuXG4gIGNvbnN0IGNsb2NrVGltZXN0YW1wID0gb3B0aW9ucy5jbG9ja1RpbWVzdGFtcCB8fCBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICBpZiAoIWp3dFN0cmluZyl7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbXVzdCBiZSBwcm92aWRlZCcpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygand0U3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG11c3QgYmUgYSBzdHJpbmcnKSk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGp3dFN0cmluZy5zcGxpdCgnLicpO1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpe1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG1hbGZvcm1lZCcpKTtcbiAgfVxuXG4gIGxldCBkZWNvZGVkVG9rZW47XG5cbiAgdHJ5IHtcbiAgICBkZWNvZGVkVG9rZW4gPSBkZWNvZGUoand0U3RyaW5nLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuICB9IGNhdGNoKGVycikge1xuICAgIHJldHVybiBkb25lKGVycik7XG4gIH1cblxuICBpZiAoIWRlY29kZWRUb2tlbikge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCB0b2tlbicpKTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZWRUb2tlbi5oZWFkZXI7XG4gIGxldCBnZXRTZWNyZXQ7XG5cbiAgaWYodHlwZW9mIHNlY3JldE9yUHVibGljS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYoIWNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3ZlcmlmeSBtdXN0IGJlIGNhbGxlZCBhc3luY2hyb25vdXMgaWYgc2VjcmV0IG9yIHB1YmxpYyBrZXkgaXMgcHJvdmlkZWQgYXMgYSBjYWxsYmFjaycpKTtcbiAgICB9XG5cbiAgICBnZXRTZWNyZXQgPSBzZWNyZXRPclB1YmxpY0tleTtcbiAgfVxuICBlbHNlIHtcbiAgICBnZXRTZWNyZXQgPSBmdW5jdGlvbihoZWFkZXIsIHNlY3JldENhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gc2VjcmV0Q2FsbGJhY2sobnVsbCwgc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZ2V0U2VjcmV0KGhlYWRlciwgZnVuY3Rpb24oZXJyLCBzZWNyZXRPclB1YmxpY0tleSkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdlcnJvciBpbiBzZWNyZXQgb3IgcHVibGljIGtleSBjYWxsYmFjazogJyArIGVyci5tZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU2lnbmF0dXJlID0gcGFydHNbMl0udHJpbSgpICE9PSAnJztcblxuICAgIGlmICghaGFzU2lnbmF0dXJlICYmIHNlY3JldE9yUHVibGljS2V5KXtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IHNpZ25hdHVyZSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2lnbmF0dXJlICYmICFzZWNyZXRPclB1YmxpY0tleSkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdzZWNyZXQgb3IgcHVibGljIGtleSBtdXN0IGJlIHByb3ZpZGVkJykpO1xuICAgIH1cblxuICAgIGlmICghaGFzU2lnbmF0dXJlICYmICFvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigncGxlYXNlIHNwZWNpZnkgXCJub25lXCIgaW4gXCJhbGdvcml0aG1zXCIgdG8gdmVyaWZ5IHVuc2lnbmVkIHRva2VucycpKTtcbiAgICB9XG5cbiAgICBpZiAoc2VjcmV0T3JQdWJsaWNLZXkgIT0gbnVsbCAmJiAhKHNlY3JldE9yUHVibGljS2V5IGluc3RhbmNlb2YgS2V5T2JqZWN0KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VjcmV0T3JQdWJsaWNLZXkgPSBjcmVhdGVQdWJsaWNLZXkoc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlY3JldE9yUHVibGljS2V5ID0gY3JlYXRlU2VjcmV0S2V5KHR5cGVvZiBzZWNyZXRPclB1YmxpY0tleSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShzZWNyZXRPclB1YmxpY0tleSkgOiBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3NlY3JldE9yUHVibGljS2V5IGlzIG5vdCB2YWxpZCBrZXkgbWF0ZXJpYWwnKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5hbGdvcml0aG1zKSB7XG4gICAgICBpZiAoc2VjcmV0T3JQdWJsaWNLZXkudHlwZSA9PT0gJ3NlY3JldCcpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gSFNfQUxHUztcbiAgICAgIH0gZWxzZSBpZiAoWydyc2EnLCAncnNhLXBzcyddLmluY2x1ZGVzKHNlY3JldE9yUHVibGljS2V5LmFzeW1tZXRyaWNLZXlUeXBlKSkge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBSU0FfS0VZX0FMR1NcbiAgICAgIH0gZWxzZSBpZiAoc2VjcmV0T3JQdWJsaWNLZXkuYXN5bW1ldHJpY0tleVR5cGUgPT09ICdlYycpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gRUNfS0VZX0FMR1NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IFBVQl9LRVlfQUxHU1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFsZ29yaXRobXMuaW5kZXhPZihkZWNvZGVkVG9rZW4uaGVhZGVyLmFsZykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgYWxnb3JpdGhtJykpO1xuICAgIH1cblxuICAgIGlmIChoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0hTJykgJiYgc2VjcmV0T3JQdWJsaWNLZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigoYHNlY3JldE9yUHVibGljS2V5IG11c3QgYmUgYSBzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9IGVsc2UgaWYgKC9eKD86UlN8UFN8RVMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNlY3JldE9yUHVibGljS2V5LnR5cGUgIT09ICdwdWJsaWMnKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoKGBzZWNyZXRPclB1YmxpY0tleSBtdXN0IGJlIGFuIGFzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkoaGVhZGVyLmFsZywgc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdmFsaWQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFsaWQgPSBqd3MudmVyaWZ5KGp3dFN0cmluZywgZGVjb2RlZFRva2VuLmhlYWRlci5hbGcsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZG9uZShlKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgc2lnbmF0dXJlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVkVG9rZW4ucGF5bG9hZDtcblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICd1bmRlZmluZWQnICYmICFvcHRpb25zLmlnbm9yZU5vdEJlZm9yZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIG5iZiB2YWx1ZScpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXlsb2FkLm5iZiA+IGNsb2NrVGltZXN0YW1wICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IE5vdEJlZm9yZUVycm9yKCdqd3Qgbm90IGFjdGl2ZScsIG5ldyBEYXRlKHBheWxvYWQubmJmICogMTAwMCkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuZXhwICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0aW9ucy5pZ25vcmVFeHBpcmF0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWQuZXhwICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgZXhwIHZhbHVlJykpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb2NrVGltZXN0YW1wID49IHBheWxvYWQuZXhwICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IFRva2VuRXhwaXJlZEVycm9yKCdqd3QgZXhwaXJlZCcsIG5ldyBEYXRlKHBheWxvYWQuZXhwICogMTAwMCkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hdWRpZW5jZSkge1xuICAgICAgY29uc3QgYXVkaWVuY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmF1ZGllbmNlKSA/IG9wdGlvbnMuYXVkaWVuY2UgOiBbb3B0aW9ucy5hdWRpZW5jZV07XG4gICAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuYXVkKSA/IHBheWxvYWQuYXVkIDogW3BheWxvYWQuYXVkXTtcblxuICAgICAgY29uc3QgbWF0Y2ggPSB0YXJnZXQuc29tZShmdW5jdGlvbiAodGFyZ2V0QXVkaWVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGF1ZGllbmNlcy5zb21lKGZ1bmN0aW9uIChhdWRpZW5jZSkge1xuICAgICAgICAgIHJldHVybiBhdWRpZW5jZSBpbnN0YW5jZW9mIFJlZ0V4cCA/IGF1ZGllbmNlLnRlc3QodGFyZ2V0QXVkaWVuY2UpIDogYXVkaWVuY2UgPT09IHRhcmdldEF1ZGllbmNlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGF1ZGllbmNlIGludmFsaWQuIGV4cGVjdGVkOiAnICsgYXVkaWVuY2VzLmpvaW4oJyBvciAnKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlzc3Vlcikge1xuICAgICAgY29uc3QgaW52YWxpZF9pc3N1ZXIgPVxuICAgICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuaXNzdWVyID09PSAnc3RyaW5nJyAmJiBwYXlsb2FkLmlzcyAhPT0gb3B0aW9ucy5pc3N1ZXIpIHx8XG4gICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KG9wdGlvbnMuaXNzdWVyKSAmJiBvcHRpb25zLmlzc3Vlci5pbmRleE9mKHBheWxvYWQuaXNzKSA9PT0gLTEpO1xuXG4gICAgICBpZiAoaW52YWxpZF9pc3N1ZXIpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgaXNzdWVyIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5pc3N1ZXIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5zdWIgIT09IG9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBzdWJqZWN0IGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5zdWJqZWN0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuand0aWQpIHtcbiAgICAgIGlmIChwYXlsb2FkLmp0aSAhPT0gb3B0aW9ucy5qd3RpZCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBqd3RpZCBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuand0aWQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5ub25jZSkge1xuICAgICAgaWYgKHBheWxvYWQubm9uY2UgIT09IG9wdGlvbnMubm9uY2UpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgbm9uY2UgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLm5vbmNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4QWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWQuaWF0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2lhdCByZXF1aXJlZCB3aGVuIG1heEFnZSBpcyBzcGVjaWZpZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heEFnZVRpbWVzdGFtcCA9IHRpbWVzcGFuKG9wdGlvbnMubWF4QWdlLCBwYXlsb2FkLmlhdCk7XG4gICAgICBpZiAodHlwZW9mIG1heEFnZVRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdcIm1heEFnZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9ja1RpbWVzdGFtcCA+PSBtYXhBZ2VUaW1lc3RhbXAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgVG9rZW5FeHBpcmVkRXJyb3IoJ21heEFnZSBleGNlZWRlZCcsIG5ldyBEYXRlKG1heEFnZVRpbWVzdGFtcCAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY29tcGxldGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGRlY29kZWRUb2tlbi5zaWduYXR1cmU7XG5cbiAgICAgIHJldHVybiBkb25lKG51bGwsIHtcbiAgICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZShudWxsLCBwYXlsb2FkKTtcbiAgfSk7XG59O1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICBpZiAodmFsdWUgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbiAgfVxuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuXG4gKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAqIG9mIGBwcm9wc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7XG4gIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCksXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICAvLyBTYWZhcmkgOSBtYWtlcyBgYXJndW1lbnRzLmxlbmd0aGAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgdmFyIHJlc3VsdCA9IChpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpXG4gICAgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpXG4gICAgOiBbXTtcblxuICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCxcbiAgICAgIHNraXBJbmRleGVzID0gISFsZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoa2V5ID09ICdsZW5ndGgnIHx8IGlzSW5kZXgoa2V5LCBsZW5ndGgpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIGBjb2xsZWN0aW9uYC4gSWYgYGNvbGxlY3Rpb25gIGlzIGEgc3RyaW5nLCBpdCdzXG4gKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBpcyB1c2VkIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhc1xuICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgY29sbGVjdGlvbiA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbiA6IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgfVxuICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbilcbiAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIHx8IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA4LTkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXkgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGlzT2JqZWN0KHZhbHVlKSA/IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPyBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluY2x1ZGVzO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAzLjAuMyAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQm9vbGVhbihudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYm9vbFRhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Jvb2xlYW47XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BOdW1iZXIuaXNJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzSW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzSW50ZWdlcigzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzSW50ZWdlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ludGVnZXI7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIDMuMC4zIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlIGNsYXNzaWZpZWRcbiAqIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc051bWJlcigzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBudW1iZXJUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTnVtYmVyO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QgaW4gSUUgPCA5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNIb3N0T2JqZWN0KHZhbHVlKSB7XG4gIC8vIE1hbnkgaG9zdCBvYmplY3RzIGFyZSBgT2JqZWN0YCBvYmplY3RzIHRoYXQgY2FuIGNvZXJjZSB0byBzdHJpbmdzXG4gIC8vIGRlc3BpdGUgaGF2aW5nIGltcHJvcGVybHkgZGVmaW5lZCBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gISEodmFsdWUgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHxcbiAgICAgIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpICE9IG9iamVjdFRhZyB8fCBpc0hvc3RPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIDQuMC4xIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEB0eXBlIEZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAqIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGlsZSBpdCdzIGNhbGxlZCBsZXNzIHRoYW4gYG5gIHRpbWVzLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5iZWZvcmUoNSwgYWRkQ29udGFjdFRvTGlzdCkpO1xuICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICovXG5mdW5jdGlvbiBiZWZvcmUobiwgZnVuYykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBuID0gdG9JbnRlZ2VyKG4pO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaWYgKC0tbiA+IDApIHtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgaWYgKG4gPD0gMSkge1xuICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAqIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uLiBUaGUgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAqIGluaXRpYWxpemUoKTtcbiAqIGluaXRpYWxpemUoKTtcbiAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gKi9cbmZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9uY2U7XG4iLAogICAgImNvbnN0IHRpbWVzcGFuID0gcmVxdWlyZSgnLi9saWIvdGltZXNwYW4nKTtcbmNvbnN0IFBTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vbGliL3BzU3VwcG9ydGVkJyk7XG5jb25zdCB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkgPSByZXF1aXJlKCcuL2xpYi92YWxpZGF0ZUFzeW1tZXRyaWNLZXknKTtcbmNvbnN0IGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCdsb2Rhc2guaW5jbHVkZXMnKTtcbmNvbnN0IGlzQm9vbGVhbiA9IHJlcXVpcmUoJ2xvZGFzaC5pc2Jvb2xlYW4nKTtcbmNvbnN0IGlzSW50ZWdlciA9IHJlcXVpcmUoJ2xvZGFzaC5pc2ludGVnZXInKTtcbmNvbnN0IGlzTnVtYmVyID0gcmVxdWlyZSgnbG9kYXNoLmlzbnVtYmVyJyk7XG5jb25zdCBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoLmlzcGxhaW5vYmplY3QnKTtcbmNvbnN0IGlzU3RyaW5nID0gcmVxdWlyZSgnbG9kYXNoLmlzc3RyaW5nJyk7XG5jb25zdCBvbmNlID0gcmVxdWlyZSgnbG9kYXNoLm9uY2UnKTtcbmNvbnN0IHsgS2V5T2JqZWN0LCBjcmVhdGVTZWNyZXRLZXksIGNyZWF0ZVByaXZhdGVLZXkgfSA9IHJlcXVpcmUoJ2NyeXB0bycpXG5cbmNvbnN0IFNVUFBPUlRFRF9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMicsICdFUzI1NicsICdFUzM4NCcsICdFUzUxMicsICdIUzI1NicsICdIUzM4NCcsICdIUzUxMicsICdub25lJ107XG5pZiAoUFNfU1VQUE9SVEVEKSB7XG4gIFNVUFBPUlRFRF9BTEdTLnNwbGljZSgzLCAwLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInKTtcbn1cblxuY29uc3Qgc2lnbl9vcHRpb25zX3NjaGVtYSA9IHtcbiAgZXhwaXJlc0luOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc0ludGVnZXIodmFsdWUpIHx8IChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpOyB9LCBtZXNzYWdlOiAnXCJleHBpcmVzSW5cIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4nIH0sXG4gIG5vdEJlZm9yZTogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSB8fCAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wibm90QmVmb3JlXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuJyB9LFxuICBhdWRpZW5jZTogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNTdHJpbmcodmFsdWUpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpOyB9LCBtZXNzYWdlOiAnXCJhdWRpZW5jZVwiIG11c3QgYmUgYSBzdHJpbmcgb3IgYXJyYXknIH0sXG4gIGFsZ29yaXRobTogeyBpc1ZhbGlkOiBpbmNsdWRlcy5iaW5kKG51bGwsIFNVUFBPUlRFRF9BTEdTKSwgbWVzc2FnZTogJ1wiYWxnb3JpdGhtXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbnVtIHZhbHVlJyB9LFxuICBoZWFkZXI6IHsgaXNWYWxpZDogaXNQbGFpbk9iamVjdCwgbWVzc2FnZTogJ1wiaGVhZGVyXCIgbXVzdCBiZSBhbiBvYmplY3QnIH0sXG4gIGVuY29kaW5nOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJlbmNvZGluZ1wiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIGlzc3VlcjogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiaXNzdWVyXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgc3ViamVjdDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wic3ViamVjdFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIGp3dGlkOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJqd3RpZFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIG5vVGltZXN0YW1wOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wibm9UaW1lc3RhbXBcIiBtdXN0IGJlIGEgYm9vbGVhbicgfSxcbiAga2V5aWQ6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImtleWlkXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgbXV0YXRlUGF5bG9hZDogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcIm11dGF0ZVBheWxvYWRcIiBtdXN0IGJlIGEgYm9vbGVhbicgfSxcbiAgYWxsb3dJbnNlY3VyZUtleVNpemVzOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wiYWxsb3dJbnNlY3VyZUtleVNpemVzXCIgbXVzdCBiZSBhIGJvb2xlYW4nfSxcbiAgYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wiYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzXCIgbXVzdCBiZSBhIGJvb2xlYW4nfVxufTtcblxuY29uc3QgcmVnaXN0ZXJlZF9jbGFpbXNfc2NoZW1hID0ge1xuICBpYXQ6IHsgaXNWYWxpZDogaXNOdW1iZXIsIG1lc3NhZ2U6ICdcImlhdFwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzJyB9LFxuICBleHA6IHsgaXNWYWxpZDogaXNOdW1iZXIsIG1lc3NhZ2U6ICdcImV4cFwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzJyB9LFxuICBuYmY6IHsgaXNWYWxpZDogaXNOdW1iZXIsIG1lc3NhZ2U6ICdcIm5iZlwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzJyB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZShzY2hlbWEsIGFsbG93VW5rbm93biwgb2JqZWN0LCBwYXJhbWV0ZXJOYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChvYmplY3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBcIicgKyBwYXJhbWV0ZXJOYW1lICsgJ1wiIHRvIGJlIGEgcGxhaW4gb2JqZWN0LicpO1xuICB9XG4gIE9iamVjdC5rZXlzKG9iamVjdClcbiAgICAuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgaWYgKCFhbGxvd1Vua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGtleSArICdcIiBpcyBub3QgYWxsb3dlZCBpbiBcIicgKyBwYXJhbWV0ZXJOYW1lICsgJ1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZGF0b3IuaXNWYWxpZChvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZhbGlkYXRvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHNpZ25fb3B0aW9uc19zY2hlbWEsIGZhbHNlLCBvcHRpb25zLCAnb3B0aW9ucycpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBheWxvYWQocGF5bG9hZCkge1xuICByZXR1cm4gdmFsaWRhdGUocmVnaXN0ZXJlZF9jbGFpbXNfc2NoZW1hLCB0cnVlLCBwYXlsb2FkLCAncGF5bG9hZCcpO1xufVxuXG5jb25zdCBvcHRpb25zX3RvX3BheWxvYWQgPSB7XG4gICdhdWRpZW5jZSc6ICdhdWQnLFxuICAnaXNzdWVyJzogJ2lzcycsXG4gICdzdWJqZWN0JzogJ3N1YicsXG4gICdqd3RpZCc6ICdqdGknXG59O1xuXG5jb25zdCBvcHRpb25zX2Zvcl9vYmplY3RzID0gW1xuICAnZXhwaXJlc0luJyxcbiAgJ25vdEJlZm9yZScsXG4gICdub1RpbWVzdGFtcCcsXG4gICdhdWRpZW5jZScsXG4gICdpc3N1ZXInLFxuICAnc3ViamVjdCcsXG4gICdqd3RpZCcsXG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXlsb2FkLCBzZWNyZXRPclByaXZhdGVLZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIH1cblxuICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFCdWZmZXIuaXNCdWZmZXIocGF5bG9hZCk7XG5cbiAgY29uc3QgaGVhZGVyID0gT2JqZWN0LmFzc2lnbih7XG4gICAgYWxnOiBvcHRpb25zLmFsZ29yaXRobSB8fCAnSFMyNTYnLFxuICAgIHR5cDogaXNPYmplY3RQYXlsb2FkID8gJ0pXVCcgOiB1bmRlZmluZWQsXG4gICAga2lkOiBvcHRpb25zLmtleWlkXG4gIH0sIG9wdGlvbnMuaGVhZGVyKTtcblxuICBmdW5jdGlvbiBmYWlsdXJlKGVycikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmICghc2VjcmV0T3JQcml2YXRlS2V5ICYmIG9wdGlvbnMuYWxnb3JpdGhtICE9PSAnbm9uZScpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3NlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGhhdmUgYSB2YWx1ZScpKTtcbiAgfVxuXG4gIGlmIChzZWNyZXRPclByaXZhdGVLZXkgIT0gbnVsbCAmJiAhKHNlY3JldE9yUHJpdmF0ZUtleSBpbnN0YW5jZW9mIEtleU9iamVjdCkpIHtcbiAgICB0cnkge1xuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5ID0gY3JlYXRlUHJpdmF0ZUtleShzZWNyZXRPclByaXZhdGVLZXkpXG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VjcmV0T3JQcml2YXRlS2V5ID0gY3JlYXRlU2VjcmV0S2V5KHR5cGVvZiBzZWNyZXRPclByaXZhdGVLZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oc2VjcmV0T3JQcml2YXRlS2V5KSA6IHNlY3JldE9yUHJpdmF0ZUtleSlcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdzZWNyZXRPclByaXZhdGVLZXkgaXMgbm90IHZhbGlkIGtleSBtYXRlcmlhbCcpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpICYmIHNlY3JldE9yUHJpdmF0ZUtleS50eXBlICE9PSAnc2VjcmV0Jykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigoYHNlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGJlIGEgc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gIH0gZWxzZSBpZiAoL14oPzpSU3xQU3xFUykvLnRlc3QoaGVhZGVyLmFsZykpIHtcbiAgICBpZiAoc2VjcmV0T3JQcml2YXRlS2V5LnR5cGUgIT09ICdwcml2YXRlJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKChgc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgYmUgYW4gYXN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmXG4gICAgICAhaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdFUycpICYmXG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkuYXN5bW1ldHJpY0tleURldGFpbHMgIT09IHVuZGVmaW5lZCAmJiAvL0tleU9iamVjdC5hc3ltbWV0cmljS2V5RGV0YWlscyBpcyBzdXBwb3J0ZWQgaW4gTm9kZSAxNStcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleS5hc3ltbWV0cmljS2V5RGV0YWlscy5tb2R1bHVzTGVuZ3RoIDwgMjA0OCkge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKGBzZWNyZXRPclByaXZhdGVLZXkgaGFzIGEgbWluaW11bSBrZXkgc2l6ZSBvZiAyMDQ4IGJpdHMgZm9yICR7aGVhZGVyLmFsZ31gKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigncGF5bG9hZCBpcyByZXF1aXJlZCcpKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVQYXlsb2FkKHBheWxvYWQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLm11dGF0ZVBheWxvYWQpIHtcbiAgICAgIHBheWxvYWQgPSBPYmplY3QuYXNzaWduKHt9LHBheWxvYWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbnZhbGlkX29wdGlvbnMgPSBvcHRpb25zX2Zvcl9vYmplY3RzLmZpbHRlcihmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9wdGlvbnNbb3B0XSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfSk7XG5cbiAgICBpZiAoaW52YWxpZF9vcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignaW52YWxpZCAnICsgaW52YWxpZF9vcHRpb25zLmpvaW4oJywnKSArICcgb3B0aW9uIGZvciAnICsgKHR5cGVvZiBwYXlsb2FkICkgKyAnIHBheWxvYWQnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy5leHBpcmVzSW5cIiBvcHRpb24gdGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCJleHBcIiBwcm9wZXJ0eS4nKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5ub3RCZWZvcmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLm5vdEJlZm9yZVwiIG9wdGlvbiB0aGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcIm5iZlwiIHByb3BlcnR5LicpKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWlsdXJlKGVycm9yKTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMpIHtcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVBc3ltbWV0cmljS2V5KGhlYWRlci5hbGcsIHNlY3JldE9yUHJpdmF0ZUtleSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0aW1lc3RhbXAgPSBwYXlsb2FkLmlhdCB8fCBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICBpZiAob3B0aW9ucy5ub1RpbWVzdGFtcCkge1xuICAgIGRlbGV0ZSBwYXlsb2FkLmlhdDtcbiAgfSBlbHNlIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICBwYXlsb2FkLmlhdCA9IHRpbWVzdGFtcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ub3RCZWZvcmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQubmJmID0gdGltZXNwYW4ob3B0aW9ucy5ub3RCZWZvcmUsIHRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ1wibm90QmVmb3JlXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkLmV4cCA9IHRpbWVzcGFuKG9wdGlvbnMuZXhwaXJlc0luLCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuZXhwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdcImV4cGlyZXNJblwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICB9XG4gIH1cblxuICBPYmplY3Qua2V5cyhvcHRpb25zX3RvX3BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGNvbnN0IGNsYWltID0gb3B0aW9uc190b19wYXlsb2FkW2tleV07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWRbY2xhaW1dICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMuJyArIGtleSArICdcIiBvcHRpb24uIFRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwiJyArIGNsYWltICsgJ1wiIHByb3BlcnR5LicpKTtcbiAgICAgIH1cbiAgICAgIHBheWxvYWRbY2xhaW1dID0gb3B0aW9uc1trZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nIHx8ICd1dGY4JztcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiBvbmNlKGNhbGxiYWNrKTtcblxuICAgIGp3cy5jcmVhdGVTaWduKHtcbiAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgcHJpdmF0ZUtleTogc2VjcmV0T3JQcml2YXRlS2V5LFxuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZ1xuICAgIH0pLm9uY2UoJ2Vycm9yJywgY2FsbGJhY2spXG4gICAgICAub25jZSgnZG9uZScsIGZ1bmN0aW9uIChzaWduYXR1cmUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGluIGZhdm9yIG9mIHRoZSBtb2R1bHVzIGxlbmd0aCBjaGVjayBiZWZvcmUgc2lnbmluZyBvbmNlIG5vZGUgMTUrIGlzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgICAgIGlmKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJiAvXig/OlJTfFBTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzaWduYXR1cmUubGVuZ3RoIDwgMjU2KSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YCkpXG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc2lnbmF0dXJlKTtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGxldCBzaWduYXR1cmUgPSBqd3Muc2lnbih7aGVhZGVyOiBoZWFkZXIsIHBheWxvYWQ6IHBheWxvYWQsIHNlY3JldDogc2VjcmV0T3JQcml2YXRlS2V5LCBlbmNvZGluZzogZW5jb2Rpbmd9KTtcbiAgICAvLyBUT0RPOiBSZW1vdmUgaW4gZmF2b3Igb2YgdGhlIG1vZHVsdXMgbGVuZ3RoIGNoZWNrIGJlZm9yZSBzaWduaW5nIG9uY2Ugbm9kZSAxNSsgaXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb25cbiAgICBpZighb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiYgL14oPzpSU3xQUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2lnbmF0dXJlLmxlbmd0aCA8IDI1Nikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNyZXRPclByaXZhdGVLZXkgaGFzIGEgbWluaW11bSBrZXkgc2l6ZSBvZiAyMDQ4IGJpdHMgZm9yICR7aGVhZGVyLmFsZ31gKVxuICAgIH1cbiAgICByZXR1cm4gc2lnbmF0dXJlXG4gIH1cbn07XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBkZWNvZGU6IHJlcXVpcmUoJy4vZGVjb2RlJyksXG4gIHZlcmlmeTogcmVxdWlyZSgnLi92ZXJpZnknKSxcbiAgc2lnbjogcmVxdWlyZSgnLi9zaWduJyksXG4gIEpzb25XZWJUb2tlbkVycm9yOiByZXF1aXJlKCcuL2xpYi9Kc29uV2ViVG9rZW5FcnJvcicpLFxuICBOb3RCZWZvcmVFcnJvcjogcmVxdWlyZSgnLi9saWIvTm90QmVmb3JlRXJyb3InKSxcbiAgVG9rZW5FeHBpcmVkRXJyb3I6IHJlcXVpcmUoJy4vbGliL1Rva2VuRXhwaXJlZEVycm9yJyksXG59O1xuIiwKICAgICIoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVXRpbHNcbiAgZnVuY3Rpb24gYXNzZXJ0ICh2YWwsIG1zZykge1xuICAgIGlmICghdmFsKSB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG4gIH1cblxuICAvLyBDb3VsZCB1c2UgYGluaGVyaXRzYCBtb2R1bGUsIGJ1dCBkb24ndCB3YW50IHRvIG1vdmUgZnJvbSBzaW5nbGUgZmlsZVxuICAvLyBhcmNoaXRlY3R1cmUgeWV0LlxuICBmdW5jdGlvbiBpbmhlcml0cyAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfVxuXG4gIC8vIEJOXG5cbiAgZnVuY3Rpb24gQk4gKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKEJOLmlzQk4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB0aGlzLndvcmRzID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBSZWR1Y3Rpb24gY29udGV4dFxuICAgIHRoaXMucmVkID0gbnVsbDtcblxuICAgIGlmIChudW1iZXIgIT09IG51bGwpIHtcbiAgICAgIGlmIChiYXNlID09PSAnbGUnIHx8IGJhc2UgPT09ICdiZScpIHtcbiAgICAgICAgZW5kaWFuID0gYmFzZTtcbiAgICAgICAgYmFzZSA9IDEwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0KG51bWJlciB8fCAwLCBiYXNlIHx8IDEwLCBlbmRpYW4gfHwgJ2JlJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gQk47XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CTiA9IEJOO1xuICB9XG5cbiAgQk4uQk4gPSBCTjtcbiAgQk4ud29yZFNpemUgPSAyNjtcblxuICB2YXIgQnVmZmVyO1xuICB0cnkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIEJ1ZmZlciA9IHdpbmRvdy5CdWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuXG4gIEJOLmlzQk4gPSBmdW5jdGlvbiBpc0JOIChudW0pIHtcbiAgICBpZiAobnVtIGluc3RhbmNlb2YgQk4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudW0gIT09IG51bGwgJiYgdHlwZW9mIG51bSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIG51bS5jb25zdHJ1Y3Rvci53b3JkU2l6ZSA9PT0gQk4ud29yZFNpemUgJiYgQXJyYXkuaXNBcnJheShudW0ud29yZHMpO1xuICB9O1xuXG4gIEJOLm1heCA9IGZ1bmN0aW9uIG1heCAobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5jbXAocmlnaHQpID4gMCkgcmV0dXJuIGxlZnQ7XG4gICAgcmV0dXJuIHJpZ2h0O1xuICB9O1xuXG4gIEJOLm1pbiA9IGZ1bmN0aW9uIG1pbiAobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5jbXAocmlnaHQpIDwgMCkgcmV0dXJuIGxlZnQ7XG4gICAgcmV0dXJuIHJpZ2h0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdE51bWJlcihudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIGJhc2UgPSAxNjtcbiAgICB9XG4gICAgYXNzZXJ0KGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpO1xuXG4gICAgbnVtYmVyID0gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBpZiAobnVtYmVyWzBdID09PSAnLScpIHtcbiAgICAgIHN0YXJ0Kys7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCBudW1iZXIubGVuZ3RoKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gMTYpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VIZXgobnVtYmVyLCBzdGFydCwgZW5kaWFuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3BhcnNlQmFzZShudW1iZXIsIGJhc2UsIHN0YXJ0KTtcbiAgICAgICAgaWYgKGVuZGlhbiA9PT0gJ2xlJykge1xuICAgICAgICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbiBfaW5pdE51bWJlciAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICBudW1iZXIgPSAtbnVtYmVyO1xuICAgIH1cbiAgICBpZiAobnVtYmVyIDwgMHg0MDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyBudW1iZXIgJiAweDNmZmZmZmYgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA8IDB4MTAwMDAwMDAwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmZcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChudW1iZXIgPCAweDIwMDAwMDAwMDAwMDAwKTsgLy8gMiBeIDUzICh1bnNhZmUpXG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmLFxuICAgICAgICAxXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAzO1xuICAgIH1cblxuICAgIGlmIChlbmRpYW4gIT09ICdsZScpIHJldHVybjtcblxuICAgIC8vIFJldmVyc2UgdGhlIGJ5dGVzXG4gICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24gX2luaXRBcnJheSAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICAvLyBQZXJoYXBzIGEgVWludDhBcnJheVxuICAgIGFzc2VydCh0eXBlb2YgbnVtYmVyLmxlbmd0aCA9PT0gJ251bWJlcicpO1xuICAgIGlmIChudW1iZXIubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKG51bWJlci5sZW5ndGggLyAzKTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciBqLCB3O1xuICAgIHZhciBvZmYgPSAwO1xuICAgIGlmIChlbmRpYW4gPT09ICdiZScpIHtcbiAgICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSAxLCBqID0gMDsgaSA+PSAwOyBpIC09IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSAtIDFdIDw8IDgpIHwgKG51bWJlcltpIC0gMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtYmVyLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgKyAxXSA8PCA4KSB8IChudW1iZXJbaSArIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlSGV4NEJpdHMgKHN0cmluZywgaW5kZXgpIHtcbiAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAvLyAnQScgLSAnRidcbiAgICBpZiAoYyA+PSA2NSAmJiBjIDw9IDcwKSB7XG4gICAgICByZXR1cm4gYyAtIDU1O1xuICAgIC8vICdhJyAtICdmJ1xuICAgIH0gZWxzZSBpZiAoYyA+PSA5NyAmJiBjIDw9IDEwMikge1xuICAgICAgcmV0dXJuIGMgLSA4NztcbiAgICAvLyAnMCcgLSAnOSdcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChjIC0gNDgpICYgMHhmO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSGV4Qnl0ZSAoc3RyaW5nLCBsb3dlckJvdW5kLCBpbmRleCkge1xuICAgIHZhciByID0gcGFyc2VIZXg0Qml0cyhzdHJpbmcsIGluZGV4KTtcbiAgICBpZiAoaW5kZXggLSAxID49IGxvd2VyQm91bmQpIHtcbiAgICAgIHIgfD0gcGFyc2VIZXg0Qml0cyhzdHJpbmcsIGluZGV4IC0gMSkgPDwgNDtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3BhcnNlSGV4ID0gZnVuY3Rpb24gX3BhcnNlSGV4IChudW1iZXIsIHN0YXJ0LCBlbmRpYW4pIHtcbiAgICAvLyBDcmVhdGUgcG9zc2libHkgYmlnZ2VyIGFycmF5IHRvIGVuc3VyZSB0aGF0IGl0IGZpdHMgdGhlIG51bWJlclxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChudW1iZXIubGVuZ3RoIC0gc3RhcnQpIC8gNik7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICAvLyAyNC1iaXRzIGNodW5rc1xuICAgIHZhciBvZmYgPSAwO1xuICAgIHZhciBqID0gMDtcblxuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiZScpIHtcbiAgICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSAxOyBpID49IHN0YXJ0OyBpIC09IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcGFyc2VMZW5ndGggPSBudW1iZXIubGVuZ3RoIC0gc3RhcnQ7XG4gICAgICBmb3IgKGkgPSBwYXJzZUxlbmd0aCAlIDIgPT09IDAgPyBzdGFydCArIDEgOiBzdGFydDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB3ID0gcGFyc2VIZXhCeXRlKG51bWJlciwgc3RhcnQsIGkpIDw8IG9mZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ICYgMHgzZmZmZmZmO1xuICAgICAgICBpZiAob2ZmID49IDE4KSB7XG4gICAgICAgICAgb2ZmIC09IDE4O1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgPj4+IDI2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZiArPSA4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlQmFzZSAoc3RyLCBzdGFydCwgZW5kLCBtdWwpIHtcbiAgICB2YXIgciA9IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHN0ci5sZW5ndGgsIGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSkgLSA0ODtcblxuICAgICAgciAqPSBtdWw7XG5cbiAgICAgIC8vICdhJ1xuICAgICAgaWYgKGMgPj0gNDkpIHtcbiAgICAgICAgciArPSBjIC0gNDkgKyAweGE7XG5cbiAgICAgIC8vICdBJ1xuICAgICAgfSBlbHNlIGlmIChjID49IDE3KSB7XG4gICAgICAgIHIgKz0gYyAtIDE3ICsgMHhhO1xuXG4gICAgICAvLyAnMCcgLSAnOSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgKz0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uIF9wYXJzZUJhc2UgKG51bWJlciwgYmFzZSwgc3RhcnQpIHtcbiAgICAvLyBJbml0aWFsaXplIGFzIHplcm9cbiAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuXG4gICAgLy8gRmluZCBsZW5ndGggb2YgbGltYiBpbiBiYXNlXG4gICAgZm9yICh2YXIgbGltYkxlbiA9IDAsIGxpbWJQb3cgPSAxOyBsaW1iUG93IDw9IDB4M2ZmZmZmZjsgbGltYlBvdyAqPSBiYXNlKSB7XG4gICAgICBsaW1iTGVuKys7XG4gICAgfVxuICAgIGxpbWJMZW4tLTtcbiAgICBsaW1iUG93ID0gKGxpbWJQb3cgLyBiYXNlKSB8IDA7XG5cbiAgICB2YXIgdG90YWwgPSBudW1iZXIubGVuZ3RoIC0gc3RhcnQ7XG4gICAgdmFyIG1vZCA9IHRvdGFsICUgbGltYkxlbjtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4odG90YWwsIHRvdGFsIC0gbW9kKSArIHN0YXJ0O1xuXG4gICAgdmFyIHdvcmQgPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBsaW1iTGVuKSB7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgaSArIGxpbWJMZW4sIGJhc2UpO1xuXG4gICAgICB0aGlzLmltdWxuKGxpbWJQb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2QgIT09IDApIHtcbiAgICAgIHZhciBwb3cgPSAxO1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIG51bWJlci5sZW5ndGgsIGJhc2UpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbW9kOyBpKyspIHtcbiAgICAgICAgcG93ICo9IGJhc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW11bG4ocG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkZXN0KSB7XG4gICAgZGVzdC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXN0LndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICB9XG4gICAgZGVzdC5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBkZXN0Lm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICBkZXN0LnJlZCA9IHRoaXMucmVkO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICB2YXIgciA9IG5ldyBCTihudWxsKTtcbiAgICB0aGlzLmNvcHkocik7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbiBfZXhwYW5kIChzaXplKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGAwYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiBzdHJpcCAoKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fbm9ybVNpZ24gPSBmdW5jdGlvbiBfbm9ybVNpZ24gKCkge1xuICAgIC8vIC0wID0gMFxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICByZXR1cm4gKHRoaXMucmVkID8gJzxCTi1SOiAnIDogJzxCTjogJykgKyB0aGlzLnRvU3RyaW5nKDE2KSArICc+JztcbiAgfTtcblxuICAvKlxuXG4gIHZhciB6ZXJvcyA9IFtdO1xuICB2YXIgZ3JvdXBTaXplcyA9IFtdO1xuICB2YXIgZ3JvdXBCYXNlcyA9IFtdO1xuXG4gIHZhciBzID0gJyc7XG4gIHZhciBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBCTi53b3JkU2l6ZSkge1xuICAgIHplcm9zW2ldID0gcztcbiAgICBzICs9ICcwJztcbiAgfVxuICBncm91cFNpemVzWzBdID0gMDtcbiAgZ3JvdXBTaXplc1sxXSA9IDA7XG4gIGdyb3VwQmFzZXNbMF0gPSAwO1xuICBncm91cEJhc2VzWzFdID0gMDtcbiAgdmFyIGJhc2UgPSAyIC0gMTtcbiAgd2hpbGUgKCsrYmFzZSA8IDM2ICsgMSkge1xuICAgIHZhciBncm91cFNpemUgPSAwO1xuICAgIHZhciBncm91cEJhc2UgPSAxO1xuICAgIHdoaWxlIChncm91cEJhc2UgPCAoMSA8PCBCTi53b3JkU2l6ZSkgLyBiYXNlKSB7XG4gICAgICBncm91cEJhc2UgKj0gYmFzZTtcbiAgICAgIGdyb3VwU2l6ZSArPSAxO1xuICAgIH1cbiAgICBncm91cFNpemVzW2Jhc2VdID0gZ3JvdXBTaXplO1xuICAgIGdyb3VwQmFzZXNbYmFzZV0gPSBncm91cEJhc2U7XG4gIH1cblxuICAqL1xuXG4gIHZhciB6ZXJvcyA9IFtcbiAgICAnJyxcbiAgICAnMCcsXG4gICAgJzAwJyxcbiAgICAnMDAwJyxcbiAgICAnMDAwMCcsXG4gICAgJzAwMDAwJyxcbiAgICAnMDAwMDAwJyxcbiAgICAnMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgXTtcblxuICB2YXIgZ3JvdXBTaXplcyA9IFtcbiAgICAwLCAwLFxuICAgIDI1LCAxNiwgMTIsIDExLCAxMCwgOSwgOCxcbiAgICA4LCA3LCA3LCA3LCA3LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1XG4gIF07XG5cbiAgdmFyIGdyb3VwQmFzZXMgPSBbXG4gICAgMCwgMCxcbiAgICAzMzU1NDQzMiwgNDMwNDY3MjEsIDE2Nzc3MjE2LCA0ODgyODEyNSwgNjA0NjYxNzYsIDQwMzUzNjA3LCAxNjc3NzIxNixcbiAgICA0MzA0NjcyMSwgMTAwMDAwMDAsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LFxuICAgIDE2Nzc3MjE2LCAyNDEzNzU2OSwgMzQwMTIyMjQsIDQ3MDQ1ODgxLCA2NDAwMDAwMCwgNDA4NDEwMSwgNTE1MzYzMixcbiAgICA2NDM2MzQzLCA3OTYyNjI0LCA5NzY1NjI1LCAxMTg4MTM3NiwgMTQzNDg5MDcsIDE3MjEwMzY4LCAyMDUxMTE0OSxcbiAgICAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3NlxuICBdO1xuXG4gIEJOLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChiYXNlLCBwYWRkaW5nKSB7XG4gICAgYmFzZSA9IGJhc2UgfHwgMTA7XG4gICAgcGFkZGluZyA9IHBhZGRpbmcgfCAwIHx8IDE7XG5cbiAgICB2YXIgb3V0O1xuICAgIGlmIChiYXNlID09PSAxNiB8fCBiYXNlID09PSAnaGV4Jykge1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgb2ZmID0gMDtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldO1xuICAgICAgICB2YXIgd29yZCA9ICgoKHcgPDwgb2ZmKSB8IGNhcnJ5KSAmIDB4ZmZmZmZmKS50b1N0cmluZygxNik7XG4gICAgICAgIGNhcnJ5ID0gKHcgPj4+ICgyNCAtIG9mZikpICYgMHhmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyO1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FycnkgIT09IDAgfHwgaSAhPT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbNiAtIHdvcmQubGVuZ3RoXSArIHdvcmQgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gd29yZCArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICAgIG91dCA9IGNhcnJ5LnRvU3RyaW5nKDE2KSArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KSB7XG4gICAgICAvLyB2YXIgZ3JvdXBTaXplID0gTWF0aC5mbG9vcihCTi53b3JkU2l6ZSAqIE1hdGguTE4yIC8gTWF0aC5sb2coYmFzZSkpO1xuICAgICAgdmFyIGdyb3VwU2l6ZSA9IGdyb3VwU2l6ZXNbYmFzZV07XG4gICAgICAvLyB2YXIgZ3JvdXBCYXNlID0gTWF0aC5wb3coYmFzZSwgZ3JvdXBTaXplKTtcbiAgICAgIHZhciBncm91cEJhc2UgPSBncm91cEJhc2VzW2Jhc2VdO1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgYyA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGMubmVnYXRpdmUgPSAwO1xuICAgICAgd2hpbGUgKCFjLmlzWmVybygpKSB7XG4gICAgICAgIHZhciByID0gYy5tb2RuKGdyb3VwQmFzZSkudG9TdHJpbmcoYmFzZSk7XG4gICAgICAgIGMgPSBjLmlkaXZuKGdyb3VwQmFzZSk7XG5cbiAgICAgICAgaWYgKCFjLmlzWmVybygpKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbZ3JvdXBTaXplIC0gci5sZW5ndGhdICsgciArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSByICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBhc3NlcnQoZmFsc2UsICdCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Jyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIgKCkge1xuICAgIHZhciByZXQgPSB0aGlzLndvcmRzWzBdO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0ICs9IHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAweDAxKSB7XG4gICAgICAvLyBOT1RFOiBhdCB0aGlzIHN0YWdlIGl0IGlzIGtub3duIHRoYXQgdGhlIHRvcCBiaXQgaXMgc2V0XG4gICAgICByZXQgKz0gMHgxMDAwMDAwMDAwMDAwMCArICh0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gMikge1xuICAgICAgYXNzZXJ0KGZhbHNlLCAnTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzJyk7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgPyAtcmV0IDogcmV0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiB0b0J1ZmZlciAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlciwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheSAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uIHRvQXJyYXlMaWtlIChBcnJheVR5cGUsIGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgoKTtcbiAgICB2YXIgcmVxTGVuZ3RoID0gbGVuZ3RoIHx8IE1hdGgubWF4KDEsIGJ5dGVMZW5ndGgpO1xuICAgIGFzc2VydChieXRlTGVuZ3RoIDw9IHJlcUxlbmd0aCwgJ2J5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgnKTtcbiAgICBhc3NlcnQocmVxTGVuZ3RoID4gMCwgJ1JlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCcpO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuICAgIHZhciBsaXR0bGVFbmRpYW4gPSBlbmRpYW4gPT09ICdsZSc7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheVR5cGUocmVxTGVuZ3RoKTtcblxuICAgIHZhciBiLCBpO1xuICAgIHZhciBxID0gdGhpcy5jbG9uZSgpO1xuICAgIGlmICghbGl0dGxlRW5kaWFuKSB7XG4gICAgICAvLyBBc3N1bWUgYmlnLWVuZGlhblxuICAgICAgZm9yIChpID0gMDsgaSA8IHJlcUxlbmd0aCAtIGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbcmVxTGVuZ3RoIC0gaSAtIDFdID0gYjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW2ldID0gYjtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IGkgPCByZXFMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKE1hdGguY2x6MzIpIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIodyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHZhciB0ID0gdztcbiAgICAgIHZhciByID0gMDtcbiAgICAgIGlmICh0ID49IDB4MTAwMCkge1xuICAgICAgICByICs9IDEzO1xuICAgICAgICB0ID4+Pj0gMTM7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDQwKSB7XG4gICAgICAgIHIgKz0gNztcbiAgICAgICAgdCA+Pj49IDc7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDgpIHtcbiAgICAgICAgciArPSA0O1xuICAgICAgICB0ID4+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4MDIpIHtcbiAgICAgICAgciArPSAyO1xuICAgICAgICB0ID4+Pj0gMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByICsgdDtcbiAgICB9O1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uIF96ZXJvQml0cyAodykge1xuICAgIC8vIFNob3J0LWN1dFxuICAgIGlmICh3ID09PSAwKSByZXR1cm4gMjY7XG5cbiAgICB2YXIgdCA9IHc7XG4gICAgdmFyIHIgPSAwO1xuICAgIGlmICgodCAmIDB4MWZmZikgPT09IDApIHtcbiAgICAgIHIgKz0gMTM7XG4gICAgICB0ID4+Pj0gMTM7XG4gICAgfVxuICAgIGlmICgodCAmIDB4N2YpID09PSAwKSB7XG4gICAgICByICs9IDc7XG4gICAgICB0ID4+Pj0gNztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHhmKSA9PT0gMCkge1xuICAgICAgciArPSA0O1xuICAgICAgdCA+Pj49IDQ7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MykgPT09IDApIHtcbiAgICAgIHIgKz0gMjtcbiAgICAgIHQgPj4+PSAyO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDEpID09PSAwKSB7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIC8vIFJldHVybiBudW1iZXIgb2YgdXNlZCBiaXRzIGluIGEgQk5cbiAgQk4ucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uIGJpdExlbmd0aCAoKSB7XG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGhpID0gdGhpcy5fY291bnRCaXRzKHcpO1xuICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgaGk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdG9CaXRBcnJheSAobnVtKSB7XG4gICAgdmFyIHcgPSBuZXcgQXJyYXkobnVtLmJpdExlbmd0aCgpKTtcblxuICAgIGZvciAodmFyIGJpdCA9IDA7IGJpdCA8IHcubGVuZ3RoOyBiaXQrKykge1xuICAgICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgICAgd1tiaXRdID0gKG51bS53b3Jkc1tvZmZdICYgKDEgPDwgd2JpdCkpID4+PiB3Yml0O1xuICAgIH1cblxuICAgIHJldHVybiB3O1xuICB9XG5cbiAgLy8gTnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0c1xuICBCTi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbiB6ZXJvQml0cyAoKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiAwO1xuXG4gICAgdmFyIHIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2ldKTtcbiAgICAgIHIgKz0gYjtcbiAgICAgIGlmIChiICE9PSAyNikgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gYnl0ZUxlbmd0aCAoKSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uIHRvVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWJzKCkuaW5vdG4od2lkdGgpLmlhZGRuKDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uIGZyb21Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLnRlc3RuKHdpZHRoIC0gMSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdG4od2lkdGgpLmlhZGRuKDEpLmluZWcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbiBpc05lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uIGluZWcgKCkge1xuICAgIGlmICghdGhpcy5pc1plcm8oKSkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24gaXVvciAobnVtKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldIHwgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uIGlvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVvcihudW0pO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pb3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uIHVvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uIGl1YW5kIChudW0pIHtcbiAgICAvLyBiID0gbWluLWxlbmd0aChudW0sIHRoaXMpXG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSAmIG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGIubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uIGlhbmQgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1YW5kKG51bSk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYW5kKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24gdWFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdWFuZCh0aGlzKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24gaXV4b3IgKG51bSkge1xuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldIF4gYi53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcyAhPT0gYSkge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24gaXhvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXV4b3IobnVtKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5peG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml4b3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbiB1eG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1eG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1eG9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIE5vdCBgYHRoaXNgYCB3aXRoIGBgd2lkdGhgYCBiaXR3aWR0aFxuICBCTi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbiBpbm90biAod2lkdGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyAmJiB3aWR0aCA+PSAwKTtcblxuICAgIHZhciBieXRlc05lZWRlZCA9IE1hdGguY2VpbCh3aWR0aCAvIDI2KSB8IDA7XG4gICAgdmFyIGJpdHNMZWZ0ID0gd2lkdGggJSAyNjtcblxuICAgIC8vIEV4dGVuZCB0aGUgYnVmZmVyIHdpdGggbGVhZGluZyB6ZXJvZXNcbiAgICB0aGlzLl9leHBhbmQoYnl0ZXNOZWVkZWQpO1xuXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgYnl0ZXNOZWVkZWQtLTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY29tcGxldGUgd29yZHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHJlc2lkdWVcbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAoMHgzZmZmZmZmID4+ICgyNiAtIGJpdHNMZWZ0KSk7XG4gICAgfVxuXG4gICAgLy8gQW5kIHJlbW92ZSBsZWFkaW5nIHplcm9lc1xuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbiBub3RuICh3aWR0aCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4od2lkdGgpO1xuICB9O1xuXG4gIC8vIFNldCBgYml0YCBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbiBzZXRuIChiaXQsIHZhbCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG5cbiAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgIHRoaXMuX2V4cGFuZChvZmYgKyAxKTtcblxuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSB8ICgxIDw8IHdiaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gJiB+KDEgPDwgd2JpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAobnVtKSB7XG4gICAgdmFyIHI7XG5cbiAgICAvLyBuZWdhdGl2ZSArIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gcG9zaXRpdmUgKyBuZWdhdGl2ZVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhLCBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAobnVtKSB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSB0aGlzLnN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSBpZiAobnVtLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gbnVtLnN1Yih0aGlzKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGQobnVtKTtcblxuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYWRkKHRoaXMpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAobnVtKSB7XG4gICAgLy8gdGhpcyAtICgtbnVtKSA9IHRoaXMgKyBudW1cbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgdmFyIHIgPSB0aGlzLmlhZGQobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcblxuICAgIC8vIC10aGlzIC0gbnVtID0gLSh0aGlzICsgbnVtKVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGQobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgdmFyIGNtcCA9IHRoaXMuY21wKG51bSk7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24gLSB6ZXJvaWZ5XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIGEgPiBiXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGNtcCA+IDApIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSAtIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgaWYgKGNhcnJ5ID09PSAwICYmIGkgPCBhLmxlbmd0aCAmJiBhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSk7XG5cbiAgICBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzbWFsbE11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgdmFyIGxlbiA9IChzZWxmLmxlbmd0aCArIG51bS5sZW5ndGgpIHwgMDtcbiAgICBvdXQubGVuZ3RoID0gbGVuO1xuICAgIGxlbiA9IChsZW4gLSAxKSB8IDA7XG5cbiAgICAvLyBQZWVsIG9uZSBpdGVyYXRpb24gKGNvbXBpbGVyIGNhbid0IGRvIGl0LCBiZWNhdXNlIG9mIGNvZGUgY29tcGxleGl0eSlcbiAgICB2YXIgYSA9IHNlbGYud29yZHNbMF0gfCAwO1xuICAgIHZhciBiID0gbnVtLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICB2YXIgY2FycnkgPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgIG91dC53b3Jkc1swXSA9IGxvO1xuXG4gICAgZm9yICh2YXIgayA9IDE7IGsgPCBsZW47IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBjYXJyeSA+Pj4gMjY7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IChrIC0gaikgfCAwO1xuICAgICAgICBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICByID0gYSAqIGIgKyByd29yZDtcbiAgICAgICAgbmNhcnJ5ICs9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkIHwgMDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5IHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICAvLyBUT0RPKGluZHV0bnkpOiBpdCBtYXkgYmUgcmVhc29uYWJsZSB0byBvbWl0IGl0IGZvciB1c2VycyB3aG8gZG9uJ3QgbmVlZFxuICAvLyB0byB3b3JrIHdpdGggMjU2LWJpdCBudW1iZXJzLCBvdGhlcndpc2UgaXQgZ2l2ZXMgMjAlIGltcHJvdmVtZW50IGZvciAyNTYtYml0XG4gIC8vIG11bHRpcGxpY2F0aW9uIChsaWtlIGVsbGlwdGljIHNlY3AyNTZrMSkuXG4gIHZhciBjb21iMTBNdWxUbyA9IGZ1bmN0aW9uIGNvbWIxME11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBhID0gc2VsZi53b3JkcztcbiAgICB2YXIgYiA9IG51bS53b3JkcztcbiAgICB2YXIgbyA9IG91dC53b3JkcztcbiAgICB2YXIgYyA9IDA7XG4gICAgdmFyIGxvO1xuICAgIHZhciBtaWQ7XG4gICAgdmFyIGhpO1xuICAgIHZhciBhMCA9IGFbMF0gfCAwO1xuICAgIHZhciBhbDAgPSBhMCAmIDB4MWZmZjtcbiAgICB2YXIgYWgwID0gYTAgPj4+IDEzO1xuICAgIHZhciBhMSA9IGFbMV0gfCAwO1xuICAgIHZhciBhbDEgPSBhMSAmIDB4MWZmZjtcbiAgICB2YXIgYWgxID0gYTEgPj4+IDEzO1xuICAgIHZhciBhMiA9IGFbMl0gfCAwO1xuICAgIHZhciBhbDIgPSBhMiAmIDB4MWZmZjtcbiAgICB2YXIgYWgyID0gYTIgPj4+IDEzO1xuICAgIHZhciBhMyA9IGFbM10gfCAwO1xuICAgIHZhciBhbDMgPSBhMyAmIDB4MWZmZjtcbiAgICB2YXIgYWgzID0gYTMgPj4+IDEzO1xuICAgIHZhciBhNCA9IGFbNF0gfCAwO1xuICAgIHZhciBhbDQgPSBhNCAmIDB4MWZmZjtcbiAgICB2YXIgYWg0ID0gYTQgPj4+IDEzO1xuICAgIHZhciBhNSA9IGFbNV0gfCAwO1xuICAgIHZhciBhbDUgPSBhNSAmIDB4MWZmZjtcbiAgICB2YXIgYWg1ID0gYTUgPj4+IDEzO1xuICAgIHZhciBhNiA9IGFbNl0gfCAwO1xuICAgIHZhciBhbDYgPSBhNiAmIDB4MWZmZjtcbiAgICB2YXIgYWg2ID0gYTYgPj4+IDEzO1xuICAgIHZhciBhNyA9IGFbN10gfCAwO1xuICAgIHZhciBhbDcgPSBhNyAmIDB4MWZmZjtcbiAgICB2YXIgYWg3ID0gYTcgPj4+IDEzO1xuICAgIHZhciBhOCA9IGFbOF0gfCAwO1xuICAgIHZhciBhbDggPSBhOCAmIDB4MWZmZjtcbiAgICB2YXIgYWg4ID0gYTggPj4+IDEzO1xuICAgIHZhciBhOSA9IGFbOV0gfCAwO1xuICAgIHZhciBhbDkgPSBhOSAmIDB4MWZmZjtcbiAgICB2YXIgYWg5ID0gYTkgPj4+IDEzO1xuICAgIHZhciBiMCA9IGJbMF0gfCAwO1xuICAgIHZhciBibDAgPSBiMCAmIDB4MWZmZjtcbiAgICB2YXIgYmgwID0gYjAgPj4+IDEzO1xuICAgIHZhciBiMSA9IGJbMV0gfCAwO1xuICAgIHZhciBibDEgPSBiMSAmIDB4MWZmZjtcbiAgICB2YXIgYmgxID0gYjEgPj4+IDEzO1xuICAgIHZhciBiMiA9IGJbMl0gfCAwO1xuICAgIHZhciBibDIgPSBiMiAmIDB4MWZmZjtcbiAgICB2YXIgYmgyID0gYjIgPj4+IDEzO1xuICAgIHZhciBiMyA9IGJbM10gfCAwO1xuICAgIHZhciBibDMgPSBiMyAmIDB4MWZmZjtcbiAgICB2YXIgYmgzID0gYjMgPj4+IDEzO1xuICAgIHZhciBiNCA9IGJbNF0gfCAwO1xuICAgIHZhciBibDQgPSBiNCAmIDB4MWZmZjtcbiAgICB2YXIgYmg0ID0gYjQgPj4+IDEzO1xuICAgIHZhciBiNSA9IGJbNV0gfCAwO1xuICAgIHZhciBibDUgPSBiNSAmIDB4MWZmZjtcbiAgICB2YXIgYmg1ID0gYjUgPj4+IDEzO1xuICAgIHZhciBiNiA9IGJbNl0gfCAwO1xuICAgIHZhciBibDYgPSBiNiAmIDB4MWZmZjtcbiAgICB2YXIgYmg2ID0gYjYgPj4+IDEzO1xuICAgIHZhciBiNyA9IGJbN10gfCAwO1xuICAgIHZhciBibDcgPSBiNyAmIDB4MWZmZjtcbiAgICB2YXIgYmg3ID0gYjcgPj4+IDEzO1xuICAgIHZhciBiOCA9IGJbOF0gfCAwO1xuICAgIHZhciBibDggPSBiOCAmIDB4MWZmZjtcbiAgICB2YXIgYmg4ID0gYjggPj4+IDEzO1xuICAgIHZhciBiOSA9IGJbOV0gfCAwO1xuICAgIHZhciBibDkgPSBiOSAmIDB4MWZmZjtcbiAgICB2YXIgYmg5ID0gYjkgPj4+IDEzO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0gc2VsZi5uZWdhdGl2ZSBeIG51bS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gMTk7XG4gICAgLyogayA9IDAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDAsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMCwgYmgwKTtcbiAgICB2YXIgdzAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcwID4+PiAyNikpIHwgMDtcbiAgICB3MCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDEsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDEpKSB8IDA7XG4gICAgdmFyIHcxID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MSA+Pj4gMjYpKSB8IDA7XG4gICAgdzEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwyLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDIsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDIsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMikpIHwgMDtcbiAgICB2YXIgdzIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcyID4+PiAyNikpIHwgMDtcbiAgICB3MiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDMsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMykpIHwgMDtcbiAgICB2YXIgdzMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHczID4+PiAyNikpIHwgMDtcbiAgICB3MyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDQsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDQpKSB8IDA7XG4gICAgdmFyIHc0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NCA+Pj4gMjYpKSB8IDA7XG4gICAgdzQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw1LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDUsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDUsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNSkpIHwgMDtcbiAgICB2YXIgdzUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc1ID4+PiAyNikpIHwgMDtcbiAgICB3NSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDYsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNikpIHwgMDtcbiAgICB2YXIgdzYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc2ID4+PiAyNikpIHwgMDtcbiAgICB3NiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDcsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDcpKSB8IDA7XG4gICAgdmFyIHc3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NyA+Pj4gMjYpKSB8IDA7XG4gICAgdzcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw4LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDgsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDgsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOCkpIHwgMDtcbiAgICB2YXIgdzggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc4ID4+PiAyNikpIHwgMDtcbiAgICB3OCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDkgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzkgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc5ID4+PiAyNikpIHwgMDtcbiAgICB3OSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDEpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTAgPj4+IDI2KSkgfCAwO1xuICAgIHcxMCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDExICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDIpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMSA+Pj4gMjYpKSB8IDA7XG4gICAgdzExICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgzKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwzKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgzKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTIgPj4+IDI2KSkgfCAwO1xuICAgIHcxMiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDQpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEzID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTMgPj4+IDI2KSkgfCAwO1xuICAgIHcxMyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDUpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg2KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw2KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg2KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTUgPj4+IDI2KSkgfCAwO1xuICAgIHcxNSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDcpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTYgPj4+IDI2KSkgfCAwO1xuICAgIHcxNiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDgpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNyA+Pj4gMjYpKSB8IDA7XG4gICAgdzE3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg5KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw5KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg5KTtcbiAgICB2YXIgdzE4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTggPj4+IDI2KSkgfCAwO1xuICAgIHcxOCAmPSAweDNmZmZmZmY7XG4gICAgb1swXSA9IHcwO1xuICAgIG9bMV0gPSB3MTtcbiAgICBvWzJdID0gdzI7XG4gICAgb1szXSA9IHczO1xuICAgIG9bNF0gPSB3NDtcbiAgICBvWzVdID0gdzU7XG4gICAgb1s2XSA9IHc2O1xuICAgIG9bN10gPSB3NztcbiAgICBvWzhdID0gdzg7XG4gICAgb1s5XSA9IHc5O1xuICAgIG9bMTBdID0gdzEwO1xuICAgIG9bMTFdID0gdzExO1xuICAgIG9bMTJdID0gdzEyO1xuICAgIG9bMTNdID0gdzEzO1xuICAgIG9bMTRdID0gdzE0O1xuICAgIG9bMTVdID0gdzE1O1xuICAgIG9bMTZdID0gdzE2O1xuICAgIG9bMTddID0gdzE3O1xuICAgIG9bMThdID0gdzE4O1xuICAgIGlmIChjICE9PSAwKSB7XG4gICAgICBvWzE5XSA9IGM7XG4gICAgICBvdXQubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgLy8gUG9seWZpbGwgY29tYlxuICBpZiAoIU1hdGguaW11bCkge1xuICAgIGNvbWIxME11bFRvID0gc21hbGxNdWxUbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpZ011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aDtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgdmFyIGhuY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3V0Lmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBobmNhcnJ5O1xuICAgICAgaG5jYXJyeSA9IDA7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IGsgLSBqO1xuICAgICAgICB2YXIgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICB2YXIgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHZhciByID0gYSAqIGI7XG5cbiAgICAgICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArICgociAvIDB4NDAwMDAwMCkgfCAwKSkgfCAwO1xuICAgICAgICBsbyA9IChsbyArIHJ3b3JkKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAobG8gPj4+IDI2KSkgfCAwO1xuXG4gICAgICAgIGhuY2FycnkgKz0gbmNhcnJ5ID4+PiAyNjtcbiAgICAgICAgbmNhcnJ5ICY9IDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkO1xuICAgICAgY2FycnkgPSBuY2Fycnk7XG4gICAgICBuY2FycnkgPSBobmNhcnJ5O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtYm9NdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgZmZ0bSA9IG5ldyBGRlRNKCk7XG4gICAgcmV0dXJuIGZmdG0ubXVscChzZWxmLCBudW0sIG91dCk7XG4gIH1cblxuICBCTi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiBtdWxUbyAobnVtLCBvdXQpIHtcbiAgICB2YXIgcmVzO1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCArIG51bS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxMCAmJiBudW0ubGVuZ3RoID09PSAxMCkge1xuICAgICAgcmVzID0gY29tYjEwTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgNjMpIHtcbiAgICAgIHJlcyA9IHNtYWxsTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgMTAyNCkge1xuICAgICAgcmVzID0gYmlnTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvb2xleS1UdWtleSBhbGdvcml0aG0gZm9yIEZGVFxuICAvLyBzbGlnaHRseSByZXZpc2l0ZWQgdG8gcmVseSBvbiBsb29waW5nIGluc3RlYWQgb2YgcmVjdXJzaW9uXG5cbiAgZnVuY3Rpb24gRkZUTSAoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIEZGVE0ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbiBtYWtlUkJUIChOKSB7XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGwgPSBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKSAtIDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHRbaV0gPSB0aGlzLnJldkJpbihpLCBsLCBOKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGJpbmFyeS1yZXZlcnNlZCByZXByZXNlbnRhdGlvbiBvZiBgeGBcbiAgRkZUTS5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24gcmV2QmluICh4LCBsLCBOKSB7XG4gICAgaWYgKHggPT09IDAgfHwgeCA9PT0gTiAtIDEpIHJldHVybiB4O1xuXG4gICAgdmFyIHJiID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgcmIgfD0gKHggJiAxKSA8PCAobCAtIGkgLSAxKTtcbiAgICAgIHggPj49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJiO1xuICB9O1xuXG4gIC8vIFBlcmZvcm1zIFwidHdlZWRsaW5nXCIgcGhhc2UsIHRoZXJlZm9yZSAnZW11bGF0aW5nJ1xuICAvLyBiZWhhdmlvdXIgb2YgdGhlIHJlY3Vyc2l2ZSBhbGdvcml0aG1cbiAgRkZUTS5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uIHBlcm11dGUgKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcnR3c1tpXSA9IHJ3c1tyYnRbaV1dO1xuICAgICAgaXR3c1tpXSA9IGl3c1tyYnRbaV1dO1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0gKHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOLCByYnQpIHtcbiAgICB0aGlzLnBlcm11dGUocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTik7XG5cbiAgICBmb3IgKHZhciBzID0gMTsgcyA8IE47IHMgPDw9IDEpIHtcbiAgICAgIHZhciBsID0gcyA8PCAxO1xuXG4gICAgICB2YXIgcnR3ZGYgPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpO1xuICAgICAgdmFyIGl0d2RmID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKTtcblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBOOyBwICs9IGwpIHtcbiAgICAgICAgdmFyIHJ0d2RmXyA9IHJ0d2RmO1xuICAgICAgICB2YXIgaXR3ZGZfID0gaXR3ZGY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzOyBqKyspIHtcbiAgICAgICAgICB2YXIgcmUgPSBydHdzW3AgKyBqXTtcbiAgICAgICAgICB2YXIgaWUgPSBpdHdzW3AgKyBqXTtcblxuICAgICAgICAgIHZhciBybyA9IHJ0d3NbcCArIGogKyBzXTtcbiAgICAgICAgICB2YXIgaW8gPSBpdHdzW3AgKyBqICsgc107XG5cbiAgICAgICAgICB2YXIgcnggPSBydHdkZl8gKiBybyAtIGl0d2RmXyAqIGlvO1xuXG4gICAgICAgICAgaW8gPSBydHdkZl8gKiBpbyArIGl0d2RmXyAqIHJvO1xuICAgICAgICAgIHJvID0gcng7XG5cbiAgICAgICAgICBydHdzW3AgKyBqXSA9IHJlICsgcm87XG4gICAgICAgICAgaXR3c1twICsgal0gPSBpZSArIGlvO1xuXG4gICAgICAgICAgcnR3c1twICsgaiArIHNdID0gcmUgLSBybztcbiAgICAgICAgICBpdHdzW3AgKyBqICsgc10gPSBpZSAtIGlvO1xuXG4gICAgICAgICAgLyoganNoaW50IG1heGRlcHRoIDogZmFsc2UgKi9cbiAgICAgICAgICBpZiAoaiAhPT0gbCkge1xuICAgICAgICAgICAgcnggPSBydHdkZiAqIHJ0d2RmXyAtIGl0d2RmICogaXR3ZGZfO1xuXG4gICAgICAgICAgICBpdHdkZl8gPSBydHdkZiAqIGl0d2RmXyArIGl0d2RmICogcnR3ZGZfO1xuICAgICAgICAgICAgcnR3ZGZfID0gcng7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24gZ3Vlc3NMZW4xM2IgKG4sIG0pIHtcbiAgICB2YXIgTiA9IE1hdGgubWF4KG0sIG4pIHwgMTtcbiAgICB2YXIgb2RkID0gTiAmIDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoTiA9IE4gLyAyIHwgMDsgTjsgTiA9IE4gPj4+IDEpIHtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4gMSA8PCBpICsgMSArIG9kZDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbiBjb25qdWdhdGUgKHJ3cywgaXdzLCBOKSB7XG4gICAgaWYgKE4gPD0gMSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdCA9IHJ3c1tpXTtcblxuICAgICAgcndzW2ldID0gcndzW04gLSBpIC0gMV07XG4gICAgICByd3NbTiAtIGkgLSAxXSA9IHQ7XG5cbiAgICAgIHQgPSBpd3NbaV07XG5cbiAgICAgIGl3c1tpXSA9IC1pd3NbTiAtIGkgLSAxXTtcbiAgICAgIGl3c1tOIC0gaSAtIDFdID0gLXQ7XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uIG5vcm1hbGl6ZTEzYiAod3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHcgPSBNYXRoLnJvdW5kKHdzWzIgKiBpICsgMV0gLyBOKSAqIDB4MjAwMCArXG4gICAgICAgIE1hdGgucm91bmQod3NbMiAqIGldIC8gTikgK1xuICAgICAgICBjYXJyeTtcblxuICAgICAgd3NbaV0gPSB3ICYgMHgzZmZmZmZmO1xuXG4gICAgICBpZiAodyA8IDB4NDAwMDAwMCkge1xuICAgICAgICBjYXJyeSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXJyeSA9IHcgLyAweDQwMDAwMDAgfCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3cztcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24gY29udmVydDEzYiAod3MsIGxlbiwgcndzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjYXJyeSA9IGNhcnJ5ICsgKHdzW2ldIHwgMCk7XG5cbiAgICAgIHJ3c1syICogaV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgICByd3NbMiAqIGkgKyAxXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICB9XG5cbiAgICAvLyBQYWQgd2l0aCB6ZXJvZXNcbiAgICBmb3IgKGkgPSAyICogbGVuOyBpIDwgTjsgKytpKSB7XG4gICAgICByd3NbaV0gPSAwO1xuICAgIH1cblxuICAgIGFzc2VydChjYXJyeSA9PT0gMCk7XG4gICAgYXNzZXJ0KChjYXJyeSAmIH4weDFmZmYpID09PSAwKTtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24gc3R1YiAoTikge1xuICAgIHZhciBwaCA9IG5ldyBBcnJheShOKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcGhbaV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBwaDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24gbXVscCAoeCwgeSwgb3V0KSB7XG4gICAgdmFyIE4gPSAyICogdGhpcy5ndWVzc0xlbjEzYih4Lmxlbmd0aCwgeS5sZW5ndGgpO1xuXG4gICAgdmFyIHJidCA9IHRoaXMubWFrZVJCVChOKTtcblxuICAgIHZhciBfID0gdGhpcy5zdHViKE4pO1xuXG4gICAgdmFyIHJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgcndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBucndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBucndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbml3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgcm13cyA9IG91dC53b3JkcztcbiAgICBybXdzLmxlbmd0aCA9IE47XG5cbiAgICB0aGlzLmNvbnZlcnQxM2IoeC53b3JkcywgeC5sZW5ndGgsIHJ3cywgTik7XG4gICAgdGhpcy5jb252ZXJ0MTNiKHkud29yZHMsIHkubGVuZ3RoLCBucndzLCBOKTtcblxuICAgIHRoaXMudHJhbnNmb3JtKHJ3cywgXywgcndzdCwgaXdzdCwgTiwgcmJ0KTtcbiAgICB0aGlzLnRyYW5zZm9ybShucndzLCBfLCBucndzdCwgbml3c3QsIE4sIHJidCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdmFyIHJ4ID0gcndzdFtpXSAqIG5yd3N0W2ldIC0gaXdzdFtpXSAqIG5pd3N0W2ldO1xuICAgICAgaXdzdFtpXSA9IHJ3c3RbaV0gKiBuaXdzdFtpXSArIGl3c3RbaV0gKiBucndzdFtpXTtcbiAgICAgIHJ3c3RbaV0gPSByeDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmp1Z2F0ZShyd3N0LCBpd3N0LCBOKTtcbiAgICB0aGlzLnRyYW5zZm9ybShyd3N0LCBpd3N0LCBybXdzLCBfLCBOLCByYnQpO1xuICAgIHRoaXMuY29uanVnYXRlKHJtd3MsIF8sIE4pO1xuICAgIHRoaXMubm9ybWFsaXplMTNiKHJtd3MsIE4pO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0geC5uZWdhdGl2ZSBeIHkubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHgubGVuZ3RoICsgeS5sZW5ndGg7XG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGB0aGlzYCBieSBgbnVtYFxuICBCTi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLm11bFRvKG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBlbXBsb3lpbmcgRkZUXG4gIEJOLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24gbXVsZiAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgTXVsdGlwbGljYXRpb25cbiAgQk4ucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSwgdGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24gaW11bG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG5cbiAgICAvLyBDYXJyeVxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKiBudW07XG4gICAgICB2YXIgbG8gPSAodyAmIDB4M2ZmZmZmZikgKyAoY2FycnkgJiAweDNmZmZmZmYpO1xuICAgICAgY2FycnkgPj49IDI2O1xuICAgICAgY2FycnkgKz0gKHcgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgIC8vIE5PVEU6IGxvIGlzIDI3Yml0IG1heGltdW1cbiAgICAgIGNhcnJ5ICs9IGxvID4+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gbnVtID09PSAwID8gMSA6IHRoaXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbiBtdWxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKG51bSk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7XG4gIH07XG5cbiAgLy8gTWF0aC5wb3coYHRoaXNgLCBgbnVtYClcbiAgQk4ucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAobnVtKSB7XG4gICAgdmFyIHcgPSB0b0JpdEFycmF5KG51bSk7XG4gICAgaWYgKHcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IEJOKDEpO1xuXG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lc1xuICAgIHZhciByZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKywgcmVzID0gcmVzLnNxcigpKSB7XG4gICAgICBpZiAod1tpXSAhPT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCsraSA8IHcubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBxID0gcmVzLnNxcigpOyBpIDwgdy5sZW5ndGg7IGkrKywgcSA9IHEuc3FyKCkpIHtcbiAgICAgICAgaWYgKHdbaV0gPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHJlcy5tdWwocSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0IGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbiBpdXNobG4gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG4gICAgdmFyIGNhcnJ5TWFzayA9ICgweDNmZmZmZmYgPj4+ICgyNiAtIHIpKSA8PCAoMjYgLSByKTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV3Q2FycnkgPSB0aGlzLndvcmRzW2ldICYgY2FycnlNYXNrO1xuICAgICAgICB2YXIgYyA9ICgodGhpcy53b3Jkc1tpXSB8IDApIC0gbmV3Q2FycnkpIDw8IHI7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjIHwgY2Fycnk7XG4gICAgICAgIGNhcnJ5ID0gbmV3Q2FycnkgPj4+ICgyNiAtIHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FycnkpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIHNdID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggKz0gcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uIGlzaGxuIChiaXRzKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodCBpbi1wbGFjZVxuICAvLyBOT1RFOiBgaGludGAgaXMgYSBsb3dlc3QgYml0IGJlZm9yZSB0cmFpbGluZyB6ZXJvZXNcbiAgLy8gTk9URTogaWYgYGV4dGVuZGVkYCBpcyBwcmVzZW50IC0gaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBkZXN0cm95ZWQgYml0c1xuICBCTi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24gaXVzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgaDtcbiAgICBpZiAoaGludCkge1xuICAgICAgaCA9IChoaW50IC0gKGhpbnQgJSAyNikpIC8gMjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gTWF0aC5taW4oKGJpdHMgLSByKSAvIDI2LCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgdmFyIG1hc2tlZFdvcmRzID0gZXh0ZW5kZWQ7XG5cbiAgICBoIC09IHM7XG4gICAgaCA9IE1hdGgubWF4KDAsIGgpO1xuXG4gICAgLy8gRXh0ZW5kZWQgbW9kZSwgY29weSBtYXNrZWQgcGFydFxuICAgIGlmIChtYXNrZWRXb3Jkcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgbWFza2VkV29yZHMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuICAgICAgbWFza2VkV29yZHMubGVuZ3RoID0gcztcbiAgICB9XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgLy8gTm8tb3AsIHdlIHNob3VsZCBub3QgbW92ZSBhbnl0aGluZyBhdCBhbGxcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gcykge1xuICAgICAgdGhpcy5sZW5ndGggLT0gcztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2kgKyBzXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiAoY2FycnkgIT09IDAgfHwgaSA+PSBoKTsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IChjYXJyeSA8PCAoMjYgLSByKSkgfCAod29yZCA+Pj4gcik7XG4gICAgICBjYXJyeSA9IHdvcmQgJiBtYXNrO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FycmllZCBiaXRzIGFzIGEgbWFza1xuICAgIGlmIChtYXNrZWRXb3JkcyAmJiBjYXJyeSAhPT0gMCkge1xuICAgICAgbWFza2VkV29yZHMud29yZHNbbWFza2VkV29yZHMubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uIGlzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNocm4oYml0cywgaGludCwgZXh0ZW5kZWQpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnRcbiAgQk4ucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbiBzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbiB1c2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0XG4gIEJOLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24gc2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24gdXNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihiaXRzKTtcbiAgfTtcblxuICAvLyBUZXN0IGlmIG4gYml0IGlzIHNldFxuICBCTi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbiB0ZXN0biAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBiaXQgYW5kIHJldHVyblxuICAgIHZhciB3ID0gdGhpcy53b3Jkc1tzXTtcblxuICAgIHJldHVybiAhISh3ICYgcSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyIChpbi1wbGFjZSlcbiAgQk4ucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uIGltYXNrbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcblxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAnaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzJyk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHMrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gbWFzaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlclxuICBCTi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbiBtYXNrbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGJpdHMpO1xuICB9O1xuXG4gIC8vIEFkZCBwbGFpbiBudW1iZXIgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uIGlhZGRuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pc3VibigtbnVtKTtcblxuICAgIC8vIFBvc3NpYmxlIHNpZ24gY2hhbmdlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgbnVtKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gPSBudW0gLSAodGhpcy53b3Jkc1swXSB8IDApO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pc3VibihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aG91dCBjaGVja3NcbiAgICByZXR1cm4gdGhpcy5faWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24gX2lhZGRuIChudW0pIHtcbiAgICB0aGlzLndvcmRzWzBdICs9IG51bTtcblxuICAgIC8vIENhcnJ5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldID49IDB4NDAwMDAwMDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldIC09IDB4NDAwMDAwMDtcbiAgICAgIGlmIChpID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSArIDEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgcGxhaW4gbnVtYmVyIGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uIGlzdWJuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtbnVtKTtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZG4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy53b3Jkc1swXSAtPSBudW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXJyeVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldIDwgMDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gKz0gMHg0MDAwMDAwO1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSAtPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbiBhZGRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbiBzdWJuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbiBpYWJzICgpIHtcbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiBhYnMgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbiBfaXNobG5zdWJtdWwgKG51bSwgbXVsLCBzaGlmdCkge1xuICAgIHZhciBsZW4gPSBudW0ubGVuZ3RoICsgc2hpZnQ7XG4gICAgdmFyIGk7XG5cbiAgICB0aGlzLl9leHBhbmQobGVuKTtcblxuICAgIHZhciB3O1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgdmFyIHJpZ2h0ID0gKG51bS53b3Jkc1tpXSB8IDApICogbXVsO1xuICAgICAgdyAtPSByaWdodCAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gKHcgPj4gMjYpIC0gKChyaWdodCAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGggLSBzaGlmdDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24gX3dvcmREaXYgKG51bSwgbW9kZSkge1xuICAgIHZhciBzaGlmdCA9IHRoaXMubGVuZ3RoIC0gbnVtLmxlbmd0aDtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgdmFyIGJoaUJpdHMgPSB0aGlzLl9jb3VudEJpdHMoYmhpKTtcbiAgICBzaGlmdCA9IDI2IC0gYmhpQml0cztcbiAgICBpZiAoc2hpZnQgIT09IDApIHtcbiAgICAgIGIgPSBiLnVzaGxuKHNoaWZ0KTtcbiAgICAgIGEuaXVzaGxuKHNoaWZ0KTtcbiAgICAgIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdW90aWVudFxuICAgIHZhciBtID0gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICB2YXIgcTtcblxuICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgcSA9IG5ldyBCTihudWxsKTtcbiAgICAgIHEubGVuZ3RoID0gbSArIDE7XG4gICAgICBxLndvcmRzID0gbmV3IEFycmF5KHEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICBxLndvcmRzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwgMSwgbSk7XG4gICAgaWYgKGRpZmYubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIGEgPSBkaWZmO1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1ttXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IG0gLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgdmFyIHFqID0gKGEud29yZHNbYi5sZW5ndGggKyBqXSB8IDApICogMHg0MDAwMDAwICtcbiAgICAgICAgKGEud29yZHNbYi5sZW5ndGggKyBqIC0gMV0gfCAwKTtcblxuICAgICAgLy8gTk9URTogKHFqIC8gYmhpKSBpcyAoMHgzZmZmZmZmICogMHg0MDAwMDAwICsgMHgzZmZmZmZmKSAvIDB4MjAwMDAwMCBtYXhcbiAgICAgIC8vICgweDdmZmZmZmYpXG4gICAgICBxaiA9IE1hdGgubWluKChxaiAvIGJoaSkgfCAwLCAweDNmZmZmZmYpO1xuXG4gICAgICBhLl9pc2hsbnN1Ym11bChiLCBxaiwgaik7XG4gICAgICB3aGlsZSAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBxai0tO1xuICAgICAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgYS5faXNobG5zdWJtdWwoYiwgMSwgaik7XG4gICAgICAgIGlmICghYS5pc1plcm8oKSkge1xuICAgICAgICAgIGEubmVnYXRpdmUgXj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1tqXSA9IHFqO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocSkge1xuICAgICAgcS5zdHJpcCgpO1xuICAgIH1cbiAgICBhLnN0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXY6IHEgfHwgbnVsbCxcbiAgICAgIG1vZDogYVxuICAgIH07XG4gIH07XG5cbiAgLy8gTk9URTogMSkgYG1vZGVgIGNhbiBiZSBzZXQgdG8gYG1vZGAgdG8gcmVxdWVzdCBtb2Qgb25seSxcbiAgLy8gICAgICAgdG8gYGRpdmAgdG8gcmVxdWVzdCBkaXYgb25seSwgb3IgYmUgYWJzZW50IHRvXG4gIC8vICAgICAgIHJlcXVlc3QgYm90aCBkaXYgJiBtb2RcbiAgLy8gICAgICAgMikgYHBvc2l0aXZlYCBpcyB0cnVlIGlmIHVuc2lnbmVkIG1vZCBpcyByZXF1ZXN0ZWRcbiAgQk4ucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uIGRpdm1vZCAobnVtLCBtb2RlLCBwb3NpdGl2ZSkge1xuICAgIGFzc2VydCghbnVtLmlzWmVybygpKTtcblxuICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiBuZXcgQk4oMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiByZXMubW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodGhpcy5uZWdhdGl2ZSAmIG51bS5uZWdhdGl2ZSkgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlzdWIobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHJlcy5kaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUgYXQgdGhpcyBwb2ludFxuXG4gICAgLy8gU3RyaXAgYm90aCBudW1iZXJzIHRvIGFwcHJveGltYXRlIHNoaWZ0IHZhbHVlXG4gICAgaWYgKG51bS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChudW0pIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogdGhpc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJ5IHNob3J0IHJlZHVjdGlvblxuICAgIGlmIChudW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2RpdicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICAgIG1vZDogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29yZERpdihudW0sIG1vZGUpO1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgIC8gYG51bWBcbiAgQk4ucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uIGRpdiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ2RpdicsIGZhbHNlKS5kaXY7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgJSBgbnVtYFxuICBCTi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gbW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgZmFsc2UpLm1vZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uIHVtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCB0cnVlKS5tb2Q7XG4gIH07XG5cbiAgLy8gRmluZCBSb3VuZChgdGhpc2AgLyBgbnVtYClcbiAgQk4ucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24gZGl2Um91bmQgKG51bSkge1xuICAgIHZhciBkbSA9IHRoaXMuZGl2bW9kKG51bSk7XG5cbiAgICAvLyBGYXN0IGNhc2UgLSBleGFjdCBkaXZpc2lvblxuICAgIGlmIChkbS5tb2QuaXNaZXJvKCkpIHJldHVybiBkbS5kaXY7XG5cbiAgICB2YXIgbW9kID0gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0ubW9kLmlzdWIobnVtKSA6IGRtLm1vZDtcblxuICAgIHZhciBoYWxmID0gbnVtLnVzaHJuKDEpO1xuICAgIHZhciByMiA9IG51bS5hbmRsbigxKTtcbiAgICB2YXIgY21wID0gbW9kLmNtcChoYWxmKTtcblxuICAgIC8vIFJvdW5kIGRvd25cbiAgICBpZiAoY21wIDwgMCB8fCByMiA9PT0gMSAmJiBjbXAgPT09IDApIHJldHVybiBkbS5kaXY7XG5cbiAgICAvLyBSb3VuZCB1cFxuICAgIHJldHVybiBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5kaXYuaXN1Ym4oMSkgOiBkbS5kaXYuaWFkZG4oMSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbiBtb2RuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG4gICAgdmFyIHAgPSAoMSA8PCAyNikgJSBudW07XG5cbiAgICB2YXIgYWNjID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgYWNjID0gKHAgKiBhY2MgKyAodGhpcy53b3Jkc1tpXSB8IDApKSAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIGRpdmlzaW9uIGJ5IG51bWJlclxuICBCTi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbiBpZGl2biAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICsgY2FycnkgKiAweDQwMDAwMDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKHcgLyBudW0pIHwgMDtcbiAgICAgIGNhcnJ5ID0gdyAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24gZGl2biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24gZWdjZCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIHggPSB0aGlzO1xuICAgIHZhciB5ID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKHgubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHggPSB4LnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgfVxuXG4gICAgLy8gQSAqIHggKyBCICogeSA9IHhcbiAgICB2YXIgQSA9IG5ldyBCTigxKTtcbiAgICB2YXIgQiA9IG5ldyBCTigwKTtcblxuICAgIC8vIEMgKiB4ICsgRCAqIHkgPSB5XG4gICAgdmFyIEMgPSBuZXcgQk4oMCk7XG4gICAgdmFyIEQgPSBuZXcgQk4oMSk7XG5cbiAgICB2YXIgZyA9IDA7XG5cbiAgICB3aGlsZSAoeC5pc0V2ZW4oKSAmJiB5LmlzRXZlbigpKSB7XG4gICAgICB4Lml1c2hybigxKTtcbiAgICAgIHkuaXVzaHJuKDEpO1xuICAgICAgKytnO1xuICAgIH1cblxuICAgIHZhciB5cCA9IHkuY2xvbmUoKTtcbiAgICB2YXIgeHAgPSB4LmNsb25lKCk7XG5cbiAgICB3aGlsZSAoIXguaXNaZXJvKCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7ICh4LndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgeC5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEEuaXNPZGQoKSB8fCBCLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEEuaWFkZCh5cCk7XG4gICAgICAgICAgICBCLmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEEuaXVzaHJuKDEpO1xuICAgICAgICAgIEIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7ICh5LndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgeS5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEMuaXNPZGQoKSB8fCBELmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEMuaWFkZCh5cCk7XG4gICAgICAgICAgICBELmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEMuaXVzaHJuKDEpO1xuICAgICAgICAgIEQuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh4LmNtcCh5KSA+PSAwKSB7XG4gICAgICAgIHguaXN1Yih5KTtcbiAgICAgICAgQS5pc3ViKEMpO1xuICAgICAgICBCLmlzdWIoRCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5LmlzdWIoeCk7XG4gICAgICAgIEMuaXN1YihBKTtcbiAgICAgICAgRC5pc3ViKEIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhOiBDLFxuICAgICAgYjogRCxcbiAgICAgIGdjZDogeS5pdXNobG4oZylcbiAgICB9O1xuICB9O1xuXG4gIC8vIFRoaXMgaXMgcmVkdWNlZCBpbmNhcm5hdGlvbiBvZiB0aGUgYmluYXJ5IEVFQVxuICAvLyBhYm92ZSwgZGVzaWduYXRlZCB0byBpbnZlcnQgbWVtYmVycyBvZiB0aGVcbiAgLy8gX3ByaW1lXyBmaWVsZHMgRihwKSBhdCBhIG1heGltYWwgc3BlZWRcbiAgQk4ucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uIF9pbnZtcCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIGEgPSB0aGlzO1xuICAgIHZhciBiID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGEgPSBhLnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICAgIHZhciB4MiA9IG5ldyBCTigwKTtcblxuICAgIHZhciBkZWx0YSA9IGIuY2xvbmUoKTtcblxuICAgIHdoaWxlIChhLmNtcG4oMSkgPiAwICYmIGIuY21wbigxKSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7IChhLndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYS5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgxLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgxLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgxLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoYi53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIGIuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmICh4Mi5pc09kZCgpKSB7XG4gICAgICAgICAgICB4Mi5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4Mi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGEuY21wKGIpID49IDApIHtcbiAgICAgICAgYS5pc3ViKGIpO1xuICAgICAgICB4MS5pc3ViKHgyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIuaXN1YihhKTtcbiAgICAgICAgeDIuaXN1Yih4MSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlcztcbiAgICBpZiAoYS5jbXBuKDEpID09PSAwKSB7XG4gICAgICByZXMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0geDI7XG4gICAgfVxuXG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQocCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24gZ2NkIChudW0pIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIG51bS5hYnMoKTtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gdGhpcy5hYnMoKTtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtLmNsb25lKCk7XG4gICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgYi5uZWdhdGl2ZSA9IDA7XG5cbiAgICAvLyBSZW1vdmUgY29tbW9uIGZhY3RvciBvZiB0d29cbiAgICBmb3IgKHZhciBzaGlmdCA9IDA7IGEuaXNFdmVuKCkgJiYgYi5pc0V2ZW4oKTsgc2hpZnQrKykge1xuICAgICAgYS5pdXNocm4oMSk7XG4gICAgICBiLml1c2hybigxKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB3aGlsZSAoYS5pc0V2ZW4oKSkge1xuICAgICAgICBhLml1c2hybigxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiLmlzRXZlbigpKSB7XG4gICAgICAgIGIuaXVzaHJuKDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IGEuY21wKGIpO1xuICAgICAgaWYgKHIgPCAwKSB7XG4gICAgICAgIC8vIFN3YXAgYGFgIGFuZCBgYmAgdG8gbWFrZSBgYWAgYWx3YXlzIGJpZ2dlciB0aGFuIGBiYFxuICAgICAgICB2YXIgdCA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gdDtcbiAgICAgIH0gZWxzZSBpZiAociA9PT0gMCB8fCBiLmNtcG4oMSkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGEuaXN1YihiKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIHJldHVybiBiLml1c2hsbihzaGlmdCk7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IG51bWJlciBpbiB0aGUgZmllbGQgRihudW0pXG4gIEJOLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4gKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgfTtcblxuICAvLyBBbmQgZmlyc3Qgd29yZCBhbmQgbnVtXG4gIEJOLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uIGFuZGxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIG51bTtcbiAgfTtcblxuICAvLyBJbmNyZW1lbnQgYXQgdGhlIGJpdCBwb3NpdGlvbiBpbi1saW5lXG4gIEJOLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uIGJpbmNuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicpO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHRoaXMuX2V4cGFuZChzICsgMSk7XG4gICAgICB0aGlzLndvcmRzW3NdIHw9IHE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgYml0IGFuZCBwcm9wYWdhdGUsIGlmIG5lZWRlZFxuICAgIHZhciBjYXJyeSA9IHE7XG4gICAgZm9yICh2YXIgaSA9IHM7IGNhcnJ5ICE9PSAwICYmIGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdyArPSBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+Pj4gMjY7XG4gICAgICB3ICY9IDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24gY21wbiAobnVtKSB7XG4gICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFuZWdhdGl2ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG5lZ2F0aXZlKSByZXR1cm4gMTtcblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29tcGFyZSB0d28gbnVtYmVycyBhbmQgcmV0dXJuOlxuICAvLyAxIC0gaWYgYHRoaXNgID4gYG51bWBcbiAgLy8gMCAtIGlmIGB0aGlzYCA9PSBgbnVtYFxuICAvLyAtMSAtIGlmIGB0aGlzYCA8IGBudW1gXG4gIEJOLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbiBjbXAgKG51bSkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIDE7XG5cbiAgICB2YXIgcmVzID0gdGhpcy51Y21wKG51bSk7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zaGwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24gcmVkTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbiByZWRJTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbiByZWRTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FyKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24gcmVkSVNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXNxcih0aGlzKTtcbiAgfTtcblxuICAvLyBTcXVhcmUgcm9vdCBvdmVyIHBcbiAgQk4ucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbiByZWRTcXJ0ICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXJ0KHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24gcmVkSW52bSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW52bSh0aGlzKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgICUgYHJlZCBtb2R1bG9gXG4gIEJOLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbiByZWROZWcgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubmVnKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbiByZWRQb3cgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCAmJiAhbnVtLnJlZCwgJ3JlZFBvdyhub3JtYWxOdW0pJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnBvdyh0aGlzLCBudW0pO1xuICB9O1xuXG4gIC8vIFByaW1lIG51bWJlcnMgd2l0aCBlZmZpY2llbnQgcmVkdWN0aW9uXG4gIHZhciBwcmltZXMgPSB7XG4gICAgazI1NjogbnVsbCxcbiAgICBwMjI0OiBudWxsLFxuICAgIHAxOTI6IG51bGwsXG4gICAgcDI1NTE5OiBudWxsXG4gIH07XG5cbiAgLy8gUHNldWRvLU1lcnNlbm5lIHByaW1lXG4gIGZ1bmN0aW9uIE1QcmltZSAobmFtZSwgcCkge1xuICAgIC8vIFAgPSAyIF4gTiAtIEtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucCA9IG5ldyBCTihwLCAxNik7XG4gICAgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuayA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCk7XG5cbiAgICB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpO1xuICB9XG5cbiAgTVByaW1lLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24gX3RtcCAoKSB7XG4gICAgdmFyIHRtcCA9IG5ldyBCTihudWxsKTtcbiAgICB0bXAud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbiBpcmVkdWNlIChudW0pIHtcbiAgICAvLyBBc3N1bWVzIHRoYXQgYG51bWAgaXMgbGVzcyB0aGFuIGBQXjJgXG4gICAgLy8gbnVtID0gSEkgKiAoMiBeIE4gLSBLKSArIEhJICogSyArIExPID0gSEkgKiBLICsgTE8gKG1vZCBQKVxuICAgIHZhciByID0gbnVtO1xuICAgIHZhciBybGVuO1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5zcGxpdChyLCB0aGlzLnRtcCk7XG4gICAgICByID0gdGhpcy5pbXVsSyhyKTtcbiAgICAgIHIgPSByLmlhZGQodGhpcy50bXApO1xuICAgICAgcmxlbiA9IHIuYml0TGVuZ3RoKCk7XG4gICAgfSB3aGlsZSAocmxlbiA+IHRoaXMubik7XG5cbiAgICB2YXIgY21wID0gcmxlbiA8IHRoaXMubiA/IC0xIDogci51Y21wKHRoaXMucCk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgci53b3Jkc1swXSA9IDA7XG4gICAgICByLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICByLmlzdWIodGhpcy5wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHIuc3RyaXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyByIGlzIEJOIHY0IGluc3RhbmNlXG4gICAgICAgIHIuc3RyaXAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHIgaXMgQk4gdjUgaW5zdGFuY2VcbiAgICAgICAgci5fc3RyaXAoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXQpIHtcbiAgICBpbnB1dC5pdXNocm4odGhpcy5uLCAwLCBvdXQpO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgcmV0dXJuIG51bS5pbXVsKHRoaXMuayk7XG4gIH07XG5cbiAgZnVuY3Rpb24gSzI1NiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ2syNTYnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyk7XG4gIH1cbiAgaW5oZXJpdHMoSzI1NiwgTVByaW1lKTtcblxuICBLMjU2LnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0cHV0KSB7XG4gICAgLy8gMjU2ID0gOSAqIDI2ICsgMjJcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmO1xuXG4gICAgdmFyIG91dExlbiA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgOSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRMZW47IGkrKykge1xuICAgICAgb3V0cHV0LndvcmRzW2ldID0gaW5wdXQud29yZHNbaV07XG4gICAgfVxuICAgIG91dHB1dC5sZW5ndGggPSBvdXRMZW47XG5cbiAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDkpIHtcbiAgICAgIGlucHV0LndvcmRzWzBdID0gMDtcbiAgICAgIGlucHV0Lmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2hpZnQgYnkgOSBsaW1ic1xuICAgIHZhciBwcmV2ID0gaW5wdXQud29yZHNbOV07XG4gICAgb3V0cHV0LndvcmRzW291dHB1dC5sZW5ndGgrK10gPSBwcmV2ICYgbWFzaztcblxuICAgIGZvciAoaSA9IDEwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0ID0gaW5wdXQud29yZHNbaV0gfCAwO1xuICAgICAgaW5wdXQud29yZHNbaSAtIDEwXSA9ICgobmV4dCAmIG1hc2spIDw8IDQpIHwgKHByZXYgPj4+IDIyKTtcbiAgICAgIHByZXYgPSBuZXh0O1xuICAgIH1cbiAgICBwcmV2ID4+Pj0gMjI7XG4gICAgaW5wdXQud29yZHNbaSAtIDEwXSA9IHByZXY7XG4gICAgaWYgKHByZXYgPT09IDAgJiYgaW5wdXQubGVuZ3RoID4gMTApIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDk7XG4gICAgfVxuICB9O1xuXG4gIEsyNTYucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEwMDAwMDNkMSA9IFsgMHg0MCwgMHgzZDEgXVxuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoXSA9IDA7XG4gICAgbnVtLndvcmRzW251bS5sZW5ndGggKyAxXSA9IDA7XG4gICAgbnVtLmxlbmd0aCArPSAyO1xuXG4gICAgLy8gYm91bmRlZCBhdDogMHg0MCAqIDB4M2ZmZmZmZiArIDB4M2QwID0gMHgxMDAwMDAzOTBcbiAgICB2YXIgbG8gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IG51bS53b3Jkc1tpXSB8IDA7XG4gICAgICBsbyArPSB3ICogMHgzZDE7XG4gICAgICBudW0ud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgIGxvID0gdyAqIDB4NDAgKyAoKGxvIC8gMHg0MDAwMDAwKSB8IDApO1xuICAgIH1cblxuICAgIC8vIEZhc3QgbGVuZ3RoIHJlZHVjdGlvblxuICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICBudW0ubGVuZ3RoLS07XG4gICAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgICBudW0ubGVuZ3RoLS07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgZnVuY3Rpb24gUDIyNCAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AyMjQnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDIyNCwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMTkyICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDE5MicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnKTtcbiAgfVxuICBpbmhlcml0cyhQMTkyLCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAyNTUxOSAoKSB7XG4gICAgLy8gMiBeIDI1NSAtIDE5XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJzI1NTE5JyxcbiAgICAgICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDI1NTE5LCBNUHJpbWUpO1xuXG4gIFAyNTUxOS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTNcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGkgPSAobnVtLndvcmRzW2ldIHwgMCkgKiAweDEzICsgY2Fycnk7XG4gICAgICB2YXIgbG8gPSBoaSAmIDB4M2ZmZmZmZjtcbiAgICAgIGhpID4+Pj0gMjY7XG5cbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvO1xuICAgICAgY2FycnkgPSBoaTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBudW0ud29yZHNbbnVtLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIC8vIEV4cG9ydGVkIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcywgdXNlIHBsYWluIG5hbWUgaW5zdGVhZFxuICBCTi5fcHJpbWUgPSBmdW5jdGlvbiBwcmltZSAobmFtZSkge1xuICAgIC8vIENhY2hlZCB2ZXJzaW9uIG9mIHByaW1lXG4gICAgaWYgKHByaW1lc1tuYW1lXSkgcmV0dXJuIHByaW1lc1tuYW1lXTtcblxuICAgIHZhciBwcmltZTtcbiAgICBpZiAobmFtZSA9PT0gJ2syNTYnKSB7XG4gICAgICBwcmltZSA9IG5ldyBLMjU2KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDIyNCcpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyMjQoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMTkyJykge1xuICAgICAgcHJpbWUgPSBuZXcgUDE5MigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyNTUxOScpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyNTUxOSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcHJpbWUgJyArIG5hbWUpO1xuICAgIH1cbiAgICBwcmltZXNbbmFtZV0gPSBwcmltZTtcblxuICAgIHJldHVybiBwcmltZTtcbiAgfTtcblxuICAvL1xuICAvLyBCYXNlIHJlZHVjdGlvbiBlbmdpbmVcbiAgLy9cbiAgZnVuY3Rpb24gUmVkIChtKSB7XG4gICAgaWYgKHR5cGVvZiBtID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHByaW1lID0gQk4uX3ByaW1lKG0pO1xuICAgICAgdGhpcy5tID0gcHJpbWUucDtcbiAgICAgIHRoaXMucHJpbWUgPSBwcmltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG0uZ3RuKDEpLCAnbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgICAgdGhpcy5wcmltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MSA9IGZ1bmN0aW9uIF92ZXJpZnkxIChhKSB7XG4gICAgYXNzZXJ0KGEubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24gX3ZlcmlmeTIgKGEsIGIpIHtcbiAgICBhc3NlcnQoKGEubmVnYXRpdmUgfCBiLm5lZ2F0aXZlKSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkICYmIGEucmVkID09PSBiLnJlZCxcbiAgICAgICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24gaW1vZCAoYSkge1xuICAgIGlmICh0aGlzLnByaW1lKSByZXR1cm4gdGhpcy5wcmltZS5pcmVkdWNlKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgICByZXR1cm4gYS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnIChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubS5zdWIoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmFkZChiKTtcbiAgICBpZiAocmVzLmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcy5pc3ViKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuaWFkZChiKTtcbiAgICBpZiAocmVzLmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcy5pc3ViKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuaXN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24gc2hsIChhLCBudW0pIHtcbiAgICB0aGlzLl92ZXJpZnkxKGEpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS51c2hsbihudW0pKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEuaW11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5tdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKGEpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKGEsIGEuY2xvbmUoKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKGEpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwoYSwgYSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24gc3FydCAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIG1vZDMgPSB0aGlzLm0uYW5kbG4oMyk7XG4gICAgYXNzZXJ0KG1vZDMgJSAyID09PSAxKTtcblxuICAgIC8vIEZhc3QgY2FzZVxuICAgIGlmIChtb2QzID09PSAzKSB7XG4gICAgICB2YXIgcG93ID0gdGhpcy5tLmFkZChuZXcgQk4oMSkpLml1c2hybigyKTtcbiAgICAgIHJldHVybiB0aGlzLnBvdyhhLCBwb3cpO1xuICAgIH1cblxuICAgIC8vIFRvbmVsbGktU2hhbmtzIGFsZ29yaXRobSAoVG90YWxseSB1bm9wdGltaXplZCBhbmQgc2xvdylcbiAgICAvL1xuICAgIC8vIEZpbmQgUSBhbmQgUywgdGhhdCBRICogMiBeIFMgPSAoUCAtIDEpXG4gICAgdmFyIHEgPSB0aGlzLm0uc3VibigxKTtcbiAgICB2YXIgcyA9IDA7XG4gICAgd2hpbGUgKCFxLmlzWmVybygpICYmIHEuYW5kbG4oMSkgPT09IDApIHtcbiAgICAgIHMrKztcbiAgICAgIHEuaXVzaHJuKDEpO1xuICAgIH1cbiAgICBhc3NlcnQoIXEuaXNaZXJvKCkpO1xuXG4gICAgdmFyIG9uZSA9IG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICB2YXIgbk9uZSA9IG9uZS5yZWROZWcoKTtcblxuICAgIC8vIEZpbmQgcXVhZHJhdGljIG5vbi1yZXNpZHVlXG4gICAgLy8gTk9URTogTWF4IGlzIHN1Y2ggYmVjYXVzZSBvZiBnZW5lcmFsaXplZCBSaWVtYW5uIGh5cG90aGVzaXMuXG4gICAgdmFyIGxwb3cgPSB0aGlzLm0uc3VibigxKS5pdXNocm4oMSk7XG4gICAgdmFyIHogPSB0aGlzLm0uYml0TGVuZ3RoKCk7XG4gICAgeiA9IG5ldyBCTigyICogeiAqIHopLnRvUmVkKHRoaXMpO1xuXG4gICAgd2hpbGUgKHRoaXMucG93KHosIGxwb3cpLmNtcChuT25lKSAhPT0gMCkge1xuICAgICAgei5yZWRJQWRkKG5PbmUpO1xuICAgIH1cblxuICAgIHZhciBjID0gdGhpcy5wb3coeiwgcSk7XG4gICAgdmFyIHIgPSB0aGlzLnBvdyhhLCBxLmFkZG4oMSkuaXVzaHJuKDEpKTtcbiAgICB2YXIgdCA9IHRoaXMucG93KGEsIHEpO1xuICAgIHZhciBtID0gcztcbiAgICB3aGlsZSAodC5jbXAob25lKSAhPT0gMCkge1xuICAgICAgdmFyIHRtcCA9IHQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgdG1wLmNtcChvbmUpICE9PSAwOyBpKyspIHtcbiAgICAgICAgdG1wID0gdG1wLnJlZFNxcigpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGkgPCBtKTtcbiAgICAgIHZhciBiID0gdGhpcy5wb3coYywgbmV3IEJOKDEpLml1c2hsbihtIC0gaSAtIDEpKTtcblxuICAgICAgciA9IHIucmVkTXVsKGIpO1xuICAgICAgYyA9IGIucmVkU3FyKCk7XG4gICAgICB0ID0gdC5yZWRNdWwoYyk7XG4gICAgICBtID0gaTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgdmFyIGludiA9IGEuX2ludm1wKHRoaXMubSk7XG4gICAgaWYgKGludi5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaW52Lm5lZ2F0aXZlID0gMDtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KS5yZWROZWcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpO1xuICAgIH1cbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAoYSwgbnVtKSB7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICBpZiAobnVtLmNtcG4oMSkgPT09IDApIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgd2luZG93U2l6ZSA9IDQ7XG4gICAgdmFyIHduZCA9IG5ldyBBcnJheSgxIDw8IHdpbmRvd1NpemUpO1xuICAgIHduZFswXSA9IG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICB3bmRbMV0gPSBhO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgd25kLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3bmRbaV0gPSB0aGlzLm11bCh3bmRbaSAtIDFdLCBhKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzID0gd25kWzBdO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgY3VycmVudExlbiA9IDA7XG4gICAgdmFyIHN0YXJ0ID0gbnVtLmJpdExlbmd0aCgpICUgMjY7XG4gICAgaWYgKHN0YXJ0ID09PSAwKSB7XG4gICAgICBzdGFydCA9IDI2O1xuICAgIH1cblxuICAgIGZvciAoaSA9IG51bS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSBudW0ud29yZHNbaV07XG4gICAgICBmb3IgKHZhciBqID0gc3RhcnQgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB2YXIgYml0ID0gKHdvcmQgPj4gaikgJiAxO1xuICAgICAgICBpZiAocmVzICE9PSB3bmRbMF0pIHtcbiAgICAgICAgICByZXMgPSB0aGlzLnNxcihyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJpdCA9PT0gMCAmJiBjdXJyZW50ID09PSAwKSB7XG4gICAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50IDw8PSAxO1xuICAgICAgICBjdXJyZW50IHw9IGJpdDtcbiAgICAgICAgY3VycmVudExlbisrO1xuICAgICAgICBpZiAoY3VycmVudExlbiAhPT0gd2luZG93U2l6ZSAmJiAoaSAhPT0gMCB8fCBqICE9PSAwKSkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gdGhpcy5tdWwocmVzLCB3bmRbY3VycmVudF0pO1xuICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgY3VycmVudCA9IDA7XG4gICAgICB9XG4gICAgICBzdGFydCA9IDI2O1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHZhciByID0gbnVtLnVtb2QodGhpcy5tKTtcblxuICAgIHJldHVybiByID09PSBudW0gPyByLmNsb25lKCkgOiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHJlcyA9IG51bS5jbG9uZSgpO1xuICAgIHJlcy5yZWQgPSBudWxsO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy9cbiAgLy8gTW9udGdvbWVyeSBtZXRob2QgZW5naW5lXG4gIC8vXG5cbiAgQk4ubW9udCA9IGZ1bmN0aW9uIG1vbnQgKG51bSkge1xuICAgIHJldHVybiBuZXcgTW9udChudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIE1vbnQgKG0pIHtcbiAgICBSZWQuY2FsbCh0aGlzLCBtKTtcblxuICAgIHRoaXMuc2hpZnQgPSB0aGlzLm0uYml0TGVuZ3RoKCk7XG4gICAgaWYgKHRoaXMuc2hpZnQgJSAyNiAhPT0gMCkge1xuICAgICAgdGhpcy5zaGlmdCArPSAyNiAtICh0aGlzLnNoaWZ0ICUgMjYpO1xuICAgIH1cblxuICAgIHRoaXMuciA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5zaGlmdCk7XG4gICAgdGhpcy5yMiA9IHRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpO1xuICAgIHRoaXMucmludiA9IHRoaXMuci5faW52bXAodGhpcy5tKTtcblxuICAgIHRoaXMubWludiA9IHRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLm1pbnYudW1vZCh0aGlzLnIpO1xuICAgIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTtcbiAgfVxuICBpbmhlcml0cyhNb250LCBSZWQpO1xuXG4gIE1vbnQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChudW0udXNobG4odGhpcy5zaGlmdCkpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByID0gdGhpcy5pbW9kKG51bS5tdWwodGhpcy5yaW52KSk7XG4gICAgci5yZWQgPSBudWxsO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChhLCBiKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkgfHwgYi5pc1plcm8oKSkge1xuICAgICAgYS53b3Jkc1swXSA9IDA7XG4gICAgICBhLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICB2YXIgdCA9IGEuaW11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcblxuICAgIGlmICh1LmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcyA9IHUuaXN1Yih0aGlzLm0pO1xuICAgIH0gZWxzZSBpZiAodS5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzID0gdS5pYWRkKHRoaXMubSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkgfHwgYi5pc1plcm8oKSkgcmV0dXJuIG5ldyBCTigwKS5fZm9yY2VSZWQodGhpcyk7XG5cbiAgICB2YXIgdCA9IGEubXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuICAgIGlmICh1LmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcyA9IHUuaXN1Yih0aGlzLm0pO1xuICAgIH0gZWxzZSBpZiAodS5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzID0gdS5pYWRkKHRoaXMubSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICAvLyAoQVIpXi0xICogUl4yID0gKEFeLTEgKiBSXi0xKSAqIFJeMiA9IEFeLTEgKiBSXG4gICAgdmFyIHJlcyA9IHRoaXMuaW1vZChhLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG59KSh0eXBlb2YgbW9kdWxlID09PSAndW5kZWZpbmVkJyB8fCBtb2R1bGUsIHRoaXMpO1xuIiwKICAgICJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLAogICAgInRyeSB7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIHV0aWwuaW5oZXJpdHMgIT09ICdmdW5jdGlvbicpIHRocm93ICcnO1xuICBtb2R1bGUuZXhwb3J0cyA9IHV0aWwuaW5oZXJpdHM7XG59IGNhdGNoIChlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmhlcml0c19icm93c2VyLmpzJyk7XG59XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxudmFyIHNhZmVyID0ge31cblxudmFyIGtleVxuXG5mb3IgKGtleSBpbiBidWZmZXIpIHtcbiAgaWYgKCFidWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ1Nsb3dCdWZmZXInIHx8IGtleSA9PT0gJ0J1ZmZlcicpIGNvbnRpbnVlXG4gIHNhZmVyW2tleV0gPSBidWZmZXJba2V5XVxufVxuXG52YXIgU2FmZXIgPSBzYWZlci5CdWZmZXIgPSB7fVxuZm9yIChrZXkgaW4gQnVmZmVyKSB7XG4gIGlmICghQnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdhbGxvY1Vuc2FmZScgfHwga2V5ID09PSAnYWxsb2NVbnNhZmVTbG93JykgY29udGludWVcbiAgU2FmZXJba2V5XSA9IEJ1ZmZlcltrZXldXG59XG5cbnNhZmVyLkJ1ZmZlci5wcm90b3R5cGUgPSBCdWZmZXIucHJvdG90eXBlXG5cbmlmICghU2FmZXIuZnJvbSB8fCBTYWZlci5mcm9tID09PSBVaW50OEFycmF5LmZyb20pIHtcbiAgU2FmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cbn1cblxuaWYgKCFTYWZlci5hbGxvYykge1xuICBTYWZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc2l6ZSlcbiAgICB9XG4gICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0gMiAqICgxIDw8IDMwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gICAgfVxuICAgIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgICBpZiAoIWZpbGwgfHwgZmlsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGJ1Zi5maWxsKDApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG59XG5cbmlmICghc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICB0cnkge1xuICAgIHNhZmVyLmtTdHJpbmdNYXhMZW5ndGggPSBwcm9jZXNzLmJpbmRpbmcoJ2J1ZmZlcicpLmtTdHJpbmdNYXhMZW5ndGhcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIHdlIGNhbid0IGRldGVybWluZSBrU3RyaW5nTWF4TGVuZ3RoIGluIGVudmlyb25tZW50cyB3aGVyZSBwcm9jZXNzLmJpbmRpbmdcbiAgICAvLyBpcyB1bnN1cHBvcnRlZCwgc28gbGV0J3Mgbm90IHNldCBpdFxuICB9XG59XG5cbmlmICghc2FmZXIuY29uc3RhbnRzKSB7XG4gIHNhZmVyLmNvbnN0YW50cyA9IHtcbiAgICBNQVhfTEVOR1RIOiBzYWZlci5rTWF4TGVuZ3RoXG4gIH1cbiAgaWYgKHNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgICBzYWZlci5jb25zdGFudHMuTUFYX1NUUklOR19MRU5HVEggPSBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlclxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZnVuY3Rpb24gUmVwb3J0ZXIob3B0aW9ucykge1xuICB0aGlzLl9yZXBvcnRlclN0YXRlID0ge1xuICAgIG9iajogbnVsbCxcbiAgICBwYXRoOiBbXSxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9LFxuICAgIGVycm9yczogW11cbiAgfTtcbn1cbmV4cG9ydHMuUmVwb3J0ZXIgPSBSZXBvcnRlcjtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmlzRXJyb3IgPSBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgUmVwb3J0ZXJFcnJvcjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHJldHVybiB7IG9iajogc3RhdGUub2JqLCBwYXRoTGVuOiBzdGF0ZS5wYXRoLmxlbmd0aCB9O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKGRhdGEpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLm9iaiA9IGRhdGEub2JqO1xuICBzdGF0ZS5wYXRoID0gc3RhdGUucGF0aC5zbGljZSgwLCBkYXRhLnBhdGhMZW4pO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyS2V5ID0gZnVuY3Rpb24gZW50ZXJLZXkoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGgucHVzaChrZXkpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmV4aXRLZXkgPSBmdW5jdGlvbiBleGl0S2V5KGluZGV4KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5wYXRoID0gc3RhdGUucGF0aC5zbGljZSgwLCBpbmRleCAtIDEpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlS2V5ID0gZnVuY3Rpb24gbGVhdmVLZXkoaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHRoaXMuZXhpdEtleShpbmRleCk7XG4gIGlmIChzdGF0ZS5vYmogIT09IG51bGwpXG4gICAgc3RhdGUub2JqW2tleV0gPSB2YWx1ZTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gcGF0aCgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5qb2luKCcvJyk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJPYmplY3QgPSBmdW5jdGlvbiBlbnRlck9iamVjdCgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IHByZXYgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHt9O1xuICByZXR1cm4gcHJldjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZU9iamVjdCA9IGZ1bmN0aW9uIGxlYXZlT2JqZWN0KHByZXYpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IG5vdyA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0gcHJldjtcbiAgcmV0dXJuIG5vdztcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKG1zZykge1xuICBsZXQgZXJyO1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3QgaW5oZXJpdGVkID0gbXNnIGluc3RhbmNlb2YgUmVwb3J0ZXJFcnJvcjtcbiAgaWYgKGluaGVyaXRlZCkge1xuICAgIGVyciA9IG1zZztcbiAgfSBlbHNlIHtcbiAgICBlcnIgPSBuZXcgUmVwb3J0ZXJFcnJvcihzdGF0ZS5wYXRoLm1hcChmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gJ1snICsgSlNPTi5zdHJpbmdpZnkoZWxlbSkgKyAnXSc7XG4gICAgfSkuam9pbignJyksIG1zZy5tZXNzYWdlIHx8IG1zZywgbXNnLnN0YWNrKTtcbiAgfVxuXG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHRocm93IGVycjtcblxuICBpZiAoIWluaGVyaXRlZClcbiAgICBzdGF0ZS5lcnJvcnMucHVzaChlcnIpO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUud3JhcFJlc3VsdCA9IGZ1bmN0aW9uIHdyYXBSZXN1bHQocmVzdWx0KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICByZXR1cm4ge1xuICAgIHJlc3VsdDogdGhpcy5pc0Vycm9yKHJlc3VsdCkgPyBudWxsIDogcmVzdWx0LFxuICAgIGVycm9yczogc3RhdGUuZXJyb3JzXG4gIH07XG59O1xuXG5mdW5jdGlvbiBSZXBvcnRlckVycm9yKHBhdGgsIG1zZykge1xuICB0aGlzLnBhdGggPSBwYXRoO1xuICB0aGlzLnJldGhyb3cobXNnKTtcbn1cbmluaGVyaXRzKFJlcG9ydGVyRXJyb3IsIEVycm9yKTtcblxuUmVwb3J0ZXJFcnJvci5wcm90b3R5cGUucmV0aHJvdyA9IGZ1bmN0aW9uIHJldGhyb3cobXNnKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1zZyArICcgYXQ6ICcgKyAodGhpcy5wYXRoIHx8ICcoc2hhbGxvdyknKTtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcG9ydGVyRXJyb3IpO1xuXG4gIGlmICghdGhpcy5zdGFjaykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJRSBvbmx5IGFkZHMgc3RhY2sgd2hlbiB0aHJvd25cbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBlLnN0YWNrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbmZ1bmN0aW9uIERlY29kZXJCdWZmZXIoYmFzZSwgb3B0aW9ucykge1xuICBSZXBvcnRlci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiYXNlKSkge1xuICAgIHRoaXMuZXJyb3IoJ0lucHV0IG5vdCBCdWZmZXInKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmJhc2UgPSBiYXNlO1xuICB0aGlzLm9mZnNldCA9IDA7XG4gIHRoaXMubGVuZ3RoID0gYmFzZS5sZW5ndGg7XG59XG5pbmhlcml0cyhEZWNvZGVyQnVmZmVyLCBSZXBvcnRlcik7XG5leHBvcnRzLkRlY29kZXJCdWZmZXIgPSBEZWNvZGVyQnVmZmVyO1xuXG5EZWNvZGVyQnVmZmVyLmlzRGVjb2RlckJ1ZmZlciA9IGZ1bmN0aW9uIGlzRGVjb2RlckJ1ZmZlcihkYXRhKSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgRGVjb2RlckJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT3IgYWNjZXB0IGNvbXBhdGlibGUgQVBJXG4gIGNvbnN0IGlzQ29tcGF0aWJsZSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhLmJhc2UpICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnRGVjb2RlckJ1ZmZlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5vZmZzZXQgPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLnNhdmUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yZXN0b3JlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEuaXNFbXB0eSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnNraXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yYXcgPT09ICdmdW5jdGlvbic7XG5cbiAgcmV0dXJuIGlzQ29tcGF0aWJsZTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiBzYXZlKCkge1xuICByZXR1cm4geyBvZmZzZXQ6IHRoaXMub2Zmc2V0LCByZXBvcnRlcjogUmVwb3J0ZXIucHJvdG90eXBlLnNhdmUuY2FsbCh0aGlzKSB9O1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoc2F2ZSkge1xuICAvLyBSZXR1cm4gc2tpcHBlZCBkYXRhXG4gIGNvbnN0IHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG4gIHJlcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0O1xuXG4gIHRoaXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIFJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcywgc2F2ZS5yZXBvcnRlcik7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICByZXR1cm4gdGhpcy5vZmZzZXQgPT09IHRoaXMubGVuZ3RoO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KGZhaWwpIHtcbiAgaWYgKHRoaXMub2Zmc2V0ICsgMSA8PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIHNraXAoYnl0ZXMsIGZhaWwpIHtcbiAgaWYgKCEodGhpcy5vZmZzZXQgKyBieXRlcyA8PSB0aGlzLmxlbmd0aCkpXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoZmFpbCB8fCAnRGVjb2RlckJ1ZmZlciBvdmVycnVuJyk7XG5cbiAgY29uc3QgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcblxuICAvLyBTaGFyZSByZXBvcnRlciBzdGF0ZVxuICByZXMuX3JlcG9ydGVyU3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHJlcy5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0ICsgYnl0ZXM7XG4gIHRoaXMub2Zmc2V0ICs9IGJ5dGVzO1xuICByZXR1cm4gcmVzO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24gcmF3KHNhdmUpIHtcbiAgcmV0dXJuIHRoaXMuYmFzZS5zbGljZShzYXZlID8gc2F2ZS5vZmZzZXQgOiB0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGgpO1xufTtcblxuZnVuY3Rpb24gRW5jb2RlckJ1ZmZlcih2YWx1ZSwgcmVwb3J0ZXIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgaWYgKCFFbmNvZGVyQnVmZmVyLmlzRW5jb2RlckJ1ZmZlcihpdGVtKSlcbiAgICAgICAgaXRlbSA9IG5ldyBFbmNvZGVyQnVmZmVyKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIHRoaXMubGVuZ3RoICs9IGl0ZW0ubGVuZ3RoO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSwgdGhpcyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghKDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHhmZikpXG4gICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ25vbi1ieXRlIEVuY29kZXJCdWZmZXIgdmFsdWUnKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGU6ICcgKyB0eXBlb2YgdmFsdWUpO1xuICB9XG59XG5leHBvcnRzLkVuY29kZXJCdWZmZXIgPSBFbmNvZGVyQnVmZmVyO1xuXG5FbmNvZGVyQnVmZmVyLmlzRW5jb2RlckJ1ZmZlciA9IGZ1bmN0aW9uIGlzRW5jb2RlckJ1ZmZlcihkYXRhKSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgRW5jb2RlckJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT3IgYWNjZXB0IGNvbXBhdGlibGUgQVBJXG4gIGNvbnN0IGlzQ29tcGF0aWJsZSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgIGRhdGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ0VuY29kZXJCdWZmZXInICYmXG4gICAgdHlwZW9mIGRhdGEubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmpvaW4gPT09ICdmdW5jdGlvbic7XG5cbiAgcmV0dXJuIGlzQ29tcGF0aWJsZTtcbn07XG5cbkVuY29kZXJCdWZmZXIucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKG91dCwgb2Zmc2V0KSB7XG4gIGlmICghb3V0KVxuICAgIG91dCA9IEJ1ZmZlci5hbGxvYyh0aGlzLmxlbmd0aCk7XG4gIGlmICghb2Zmc2V0KVxuICAgIG9mZnNldCA9IDA7XG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBvdXQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgaXRlbS5qb2luKG91dCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSBpdGVtLmxlbmd0aDtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgb3V0W29mZnNldF0gPSB0aGlzLnZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgIG91dC53cml0ZSh0aGlzLnZhbHVlLCBvZmZzZXQpO1xuICAgIGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih0aGlzLnZhbHVlKSlcbiAgICAgIHRoaXMudmFsdWUuY29weShvdXQsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn07XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0O1xuXG5mdW5jdGlvbiBhc3NlcnQodmFsLCBtc2cpIHtcbiAgaWYgKCF2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xufVxuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBhc3NlcnRFcXVhbChsLCByLCBtc2cpIHtcbiAgaWYgKGwgIT0gcilcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICgnQXNzZXJ0aW9uIGZhaWxlZDogJyArIGwgKyAnICE9ICcgKyByKSk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZS9yZXBvcnRlcicpLlJlcG9ydGVyO1xuY29uc3QgRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UvYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmNvbnN0IERlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbi8vIFN1cHBvcnRlZCB0YWdzXG5jb25zdCB0YWdzID0gW1xuICAnc2VxJywgJ3NlcW9mJywgJ3NldCcsICdzZXRvZicsICdvYmppZCcsICdib29sJyxcbiAgJ2dlbnRpbWUnLCAndXRjdGltZScsICdudWxsXycsICdlbnVtJywgJ2ludCcsICdvYmpEZXNjJyxcbiAgJ2JpdHN0cicsICdibXBzdHInLCAnY2hhcnN0cicsICdnZW5zdHInLCAnZ3JhcGhzdHInLCAnaWE1c3RyJywgJ2lzbzY0NnN0cicsXG4gICdudW1zdHInLCAnb2N0c3RyJywgJ3ByaW50c3RyJywgJ3Q2MXN0cicsICd1bmlzdHInLCAndXRmOHN0cicsICd2aWRlb3N0cidcbl07XG5cbi8vIFB1YmxpYyBtZXRob2RzIGxpc3RcbmNvbnN0IG1ldGhvZHMgPSBbXG4gICdrZXknLCAnb2JqJywgJ3VzZScsICdvcHRpb25hbCcsICdleHBsaWNpdCcsICdpbXBsaWNpdCcsICdkZWYnLCAnY2hvaWNlJyxcbiAgJ2FueScsICdjb250YWlucydcbl0uY29uY2F0KHRhZ3MpO1xuXG4vLyBPdmVycmlkZWQgbWV0aG9kcyBsaXN0XG5jb25zdCBvdmVycmlkZWQgPSBbXG4gICdfcGVla1RhZycsICdfZGVjb2RlVGFnJywgJ191c2UnLFxuICAnX2RlY29kZVN0cicsICdfZGVjb2RlT2JqaWQnLCAnX2RlY29kZVRpbWUnLFxuICAnX2RlY29kZU51bGwnLCAnX2RlY29kZUludCcsICdfZGVjb2RlQm9vbCcsICdfZGVjb2RlTGlzdCcsXG5cbiAgJ19lbmNvZGVDb21wb3NpdGUnLCAnX2VuY29kZVN0cicsICdfZW5jb2RlT2JqaWQnLCAnX2VuY29kZVRpbWUnLFxuICAnX2VuY29kZU51bGwnLCAnX2VuY29kZUludCcsICdfZW5jb2RlQm9vbCdcbl07XG5cbmZ1bmN0aW9uIE5vZGUoZW5jLCBwYXJlbnQsIG5hbWUpIHtcbiAgY29uc3Qgc3RhdGUgPSB7fTtcbiAgdGhpcy5fYmFzZVN0YXRlID0gc3RhdGU7XG5cbiAgc3RhdGUubmFtZSA9IG5hbWU7XG4gIHN0YXRlLmVuYyA9IGVuYztcblxuICBzdGF0ZS5wYXJlbnQgPSBwYXJlbnQgfHwgbnVsbDtcbiAgc3RhdGUuY2hpbGRyZW4gPSBudWxsO1xuXG4gIC8vIFN0YXRlXG4gIHN0YXRlLnRhZyA9IG51bGw7XG4gIHN0YXRlLmFyZ3MgPSBudWxsO1xuICBzdGF0ZS5yZXZlcnNlQXJncyA9IG51bGw7XG4gIHN0YXRlLmNob2ljZSA9IG51bGw7XG4gIHN0YXRlLm9wdGlvbmFsID0gZmFsc2U7XG4gIHN0YXRlLmFueSA9IGZhbHNlO1xuICBzdGF0ZS5vYmogPSBmYWxzZTtcbiAgc3RhdGUudXNlID0gbnVsbDtcbiAgc3RhdGUudXNlRGVjb2RlciA9IG51bGw7XG4gIHN0YXRlLmtleSA9IG51bGw7XG4gIHN0YXRlWydkZWZhdWx0J10gPSBudWxsO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuY29udGFpbnMgPSBudWxsO1xuXG4gIC8vIFNob3VsZCBjcmVhdGUgbmV3IGluc3RhbmNlIG9uIGVhY2ggbWV0aG9kXG4gIGlmICghc3RhdGUucGFyZW50KSB7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLl93cmFwKCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gTm9kZTtcblxuY29uc3Qgc3RhdGVQcm9wcyA9IFtcbiAgJ2VuYycsICdwYXJlbnQnLCAnY2hpbGRyZW4nLCAndGFnJywgJ2FyZ3MnLCAncmV2ZXJzZUFyZ3MnLCAnY2hvaWNlJyxcbiAgJ29wdGlvbmFsJywgJ2FueScsICdvYmonLCAndXNlJywgJ2FsdGVyZWRVc2UnLCAna2V5JywgJ2RlZmF1bHQnLCAnZXhwbGljaXQnLFxuICAnaW1wbGljaXQnLCAnY29udGFpbnMnXG5dO1xuXG5Ob2RlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgY29uc3QgY3N0YXRlID0ge307XG4gIHN0YXRlUHJvcHMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgY3N0YXRlW3Byb3BdID0gc3RhdGVbcHJvcF07XG4gIH0pO1xuICBjb25zdCByZXMgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihjc3RhdGUucGFyZW50KTtcbiAgcmVzLl9iYXNlU3RhdGUgPSBjc3RhdGU7XG4gIHJldHVybiByZXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fd3JhcCA9IGZ1bmN0aW9uIHdyYXAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBtZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgdGhpc1ttZXRob2RdID0gZnVuY3Rpb24gX3dyYXBwZWRNZXRob2QoKSB7XG4gICAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICAgICAgc3RhdGUuY2hpbGRyZW4ucHVzaChjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmVbbWV0aG9kXS5hcHBseShjbG9uZSwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9LCB0aGlzKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChib2R5KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBib2R5LmNhbGwodGhpcyk7XG5cbiAgLy8gRmlsdGVyIGNoaWxkcmVuXG4gIHN0YXRlLmNoaWxkcmVuID0gc3RhdGUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID09PSB0aGlzO1xuICB9LCB0aGlzKTtcbiAgYXNzZXJ0LmVxdWFsKHN0YXRlLmNoaWxkcmVuLmxlbmd0aCwgMSwgJ1Jvb3Qgbm9kZSBjYW4gaGF2ZSBvbmx5IG9uZSBjaGlsZCcpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3VzZUFyZ3MgPSBmdW5jdGlvbiB1c2VBcmdzKGFyZ3MpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRmlsdGVyIGNoaWxkcmVuIGFuZCBhcmdzXG4gIGNvbnN0IGNoaWxkcmVuID0gYXJncy5maWx0ZXIoZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I7XG4gIH0sIHRoaXMpO1xuICBhcmdzID0gYXJncy5maWx0ZXIoZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuICEoYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0sIHRoaXMpO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuY2hpbGRyZW4gPT09IG51bGwpO1xuICAgIHN0YXRlLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAvLyBSZXBsYWNlIHBhcmVudCB0byBtYWludGFpbiBiYWNrd2FyZCBsaW5rXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPSB0aGlzO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5hcmdzID09PSBudWxsKTtcbiAgICBzdGF0ZS5hcmdzID0gYXJncztcbiAgICBzdGF0ZS5yZXZlcnNlQXJncyA9IGFyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnIHx8IGFyZy5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KVxuICAgICAgICByZXR1cm4gYXJnO1xuXG4gICAgICBjb25zdCByZXMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGFyZykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PSAoa2V5IHwgMCkpXG4gICAgICAgICAga2V5IHw9IDA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJnW2tleV07XG4gICAgICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vXG4vLyBPdmVycmlkZWQgbWV0aG9kc1xuLy9cblxub3ZlcnJpZGVkLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gIE5vZGUucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiBfb3ZlcnJpZGVkKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXRob2QgKyAnIG5vdCBpbXBsZW1lbnRlZCBmb3IgZW5jb2Rpbmc6ICcgKyBzdGF0ZS5lbmMpO1xuICB9O1xufSk7XG5cbi8vXG4vLyBQdWJsaWMgbWV0aG9kc1xuLy9cblxudGFncy5mb3JFYWNoKGZ1bmN0aW9uKHRhZykge1xuICBOb2RlLnByb3RvdHlwZVt0YWddID0gZnVuY3Rpb24gX3RhZ01ldGhvZCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgIGFzc2VydChzdGF0ZS50YWcgPT09IG51bGwpO1xuICAgIHN0YXRlLnRhZyA9IHRhZztcblxuICAgIHRoaXMuX3VzZUFyZ3MoYXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG5Ob2RlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoaXRlbSkge1xuICBhc3NlcnQoaXRlbSk7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS51c2UgPT09IG51bGwpO1xuICBzdGF0ZS51c2UgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub3B0aW9uYWwgPSBmdW5jdGlvbiBvcHRpb25hbCgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgc3RhdGUub3B0aW9uYWwgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuZGVmID0gZnVuY3Rpb24gZGVmKHZhbCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbCk7XG4gIHN0YXRlWydkZWZhdWx0J10gPSB2YWw7XG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmV4cGxpY2l0ID0gZnVuY3Rpb24gZXhwbGljaXQobnVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuaW1wbGljaXQgPSBmdW5jdGlvbiBpbXBsaWNpdChudW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmV4cGxpY2l0ID09PSBudWxsICYmIHN0YXRlLmltcGxpY2l0ID09PSBudWxsKTtcbiAgc3RhdGUuaW1wbGljaXQgPSBudW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5vYmogPSBmdW5jdGlvbiBvYmooKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICBzdGF0ZS5vYmogPSB0cnVlO1xuXG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMClcbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24ga2V5KG5ld0tleSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUua2V5ID09PSBudWxsKTtcbiAgc3RhdGUua2V5ID0gbmV3S2V5O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb24gYW55KCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5hbnkgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuY2hvaWNlID0gZnVuY3Rpb24gY2hvaWNlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuY2hvaWNlID09PSBudWxsKTtcbiAgc3RhdGUuY2hvaWNlID0gb2JqO1xuICB0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfSkpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhpdGVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS51c2UgPT09IG51bGwpO1xuICBzdGF0ZS5jb250YWlucyA9IGl0ZW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gRGVjb2Rpbmdcbi8vXG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBpbnB1dC53cmFwUmVzdWx0KHN0YXRlLmNoaWxkcmVuWzBdLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpKTtcblxuICBsZXQgcmVzdWx0ID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgbGV0IHByZXNlbnQgPSB0cnVlO1xuXG4gIGxldCBwcmV2S2V5ID0gbnVsbDtcbiAgaWYgKHN0YXRlLmtleSAhPT0gbnVsbClcbiAgICBwcmV2S2V5ID0gaW5wdXQuZW50ZXJLZXkoc3RhdGUua2V5KTtcblxuICAvLyBDaGVjayBpZiB0YWcgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsKSB7XG4gICAgbGV0IHRhZyA9IG51bGw7XG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuZXhwbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUuaW1wbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5pbXBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS50YWc7XG5cbiAgICBpZiAodGFnID09PSBudWxsICYmICFzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIFRyaWFsIGFuZCBFcnJvclxuICAgICAgY29uc3Qgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpXG4gICAgICAgICAgdGhpcy5fZGVjb2RlR2VuZXJpYyhzdGF0ZS50YWcsIGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcmVzZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVzZW50ID0gdGhpcy5fcGVla1RhZyhpbnB1dCwgdGFnLCBzdGF0ZS5hbnkpO1xuXG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihwcmVzZW50KSlcbiAgICAgICAgcmV0dXJuIHByZXNlbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBvYmplY3Qgb24gc3RhY2tcbiAgbGV0IHByZXZPYmo7XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICBwcmV2T2JqID0gaW5wdXQuZW50ZXJPYmplY3QoKTtcblxuICBpZiAocHJlc2VudCkge1xuICAgIC8vIFVud3JhcCBleHBsaWNpdCB2YWx1ZXNcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGV4cGxpY2l0ID0gdGhpcy5fZGVjb2RlVGFnKGlucHV0LCBzdGF0ZS5leHBsaWNpdCk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihleHBsaWNpdCkpXG4gICAgICAgIHJldHVybiBleHBsaWNpdDtcbiAgICAgIGlucHV0ID0gZXhwbGljaXQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBpbnB1dC5vZmZzZXQ7XG5cbiAgICAvLyBVbndyYXAgaW1wbGljaXQgYW5kIG5vcm1hbCB2YWx1ZXNcbiAgICBpZiAoc3RhdGUudXNlID09PSBudWxsICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgICAgbGV0IHNhdmU7XG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgY29uc3QgYm9keSA9IHRoaXMuX2RlY29kZVRhZyhcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWcsXG4gICAgICAgIHN0YXRlLmFueVxuICAgICAgKTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGJvZHkpKVxuICAgICAgICByZXR1cm4gYm9keTtcblxuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgcmVzdWx0ID0gaW5wdXQucmF3KHNhdmUpO1xuICAgICAgZWxzZVxuICAgICAgICBpbnB1dCA9IGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFjayAmJiBzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICBvcHRpb25zLnRyYWNrKGlucHV0LnBhdGgoKSwgc3RhcnQsIGlucHV0Lmxlbmd0aCwgJ3RhZ2dlZCcpO1xuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFjayAmJiBzdGF0ZS50YWcgIT09IG51bGwpXG4gICAgICBvcHRpb25zLnRyYWNrKGlucHV0LnBhdGgoKSwgaW5wdXQub2Zmc2V0LCBpbnB1dC5sZW5ndGgsICdjb250ZW50Jyk7XG5cbiAgICAvLyBTZWxlY3QgcHJvcGVyIG1ldGhvZCBmb3IgdGFnXG4gICAgaWYgKHN0YXRlLmFueSkge1xuICAgICAgLy8gbm8tb3BcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZGVjb2RlR2VuZXJpYyhzdGF0ZS50YWcsIGlucHV0LCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQuaXNFcnJvcihyZXN1bHQpKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIC8vIERlY29kZSBjaGlsZHJlblxuICAgIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgc3RhdGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiBkZWNvZGVDaGlsZHJlbihjaGlsZCkge1xuICAgICAgICAvLyBOT1RFOiBXZSBhcmUgaWdub3JpbmcgZXJyb3JzIGhlcmUsIHRvIGxldCBwYXJzZXIgY29udGludWUgd2l0aCBvdGhlclxuICAgICAgICAvLyBwYXJ0cyBvZiBlbmNvZGVkIGRhdGFcbiAgICAgICAgY2hpbGQuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgY29udGFpbmVkL2VuY29kZWQgYnkgc2NoZW1hLCBvbmx5IGluIGJpdCBvciBvY3RldCBzdHJpbmdzXG4gICAgaWYgKHN0YXRlLmNvbnRhaW5zICYmIChzdGF0ZS50YWcgPT09ICdvY3RzdHInIHx8IHN0YXRlLnRhZyA9PT0gJ2JpdHN0cicpKSB7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IERlY29kZXJCdWZmZXIocmVzdWx0KTtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2dldFVzZShzdGF0ZS5jb250YWlucywgaW5wdXQuX3JlcG9ydGVyU3RhdGUub2JqKVxuICAgICAgICAuX2RlY29kZShkYXRhLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3Agb2JqZWN0XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICByZXN1bHQgPSBpbnB1dC5sZWF2ZU9iamVjdChwcmV2T2JqKTtcblxuICAvLyBTZXQga2V5XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwgJiYgKHJlc3VsdCAhPT0gbnVsbCB8fCBwcmVzZW50ID09PSB0cnVlKSlcbiAgICBpbnB1dC5sZWF2ZUtleShwcmV2S2V5LCBzdGF0ZS5rZXksIHJlc3VsdCk7XG4gIGVsc2UgaWYgKHByZXZLZXkgIT09IG51bGwpXG4gICAgaW5wdXQuZXhpdEtleShwcmV2S2V5KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUdlbmVyaWMgPSBmdW5jdGlvbiBkZWNvZGVHZW5lcmljKHRhZywgaW5wdXQsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgaWYgKHRhZyA9PT0gJ3NlcScgfHwgdGFnID09PSAnc2V0JylcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHRhZyA9PT0gJ3NlcW9mJyB8fCB0YWcgPT09ICdzZXRvZicpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUxpc3QoaW5wdXQsIHRhZywgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVN0cihpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBzdGF0ZS5hcmdzWzBdLCBzdGF0ZS5hcmdzWzFdLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgbnVsbCwgbnVsbCwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVUaW1lKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdudWxsXycpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU51bGwoaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdib29sJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlQm9vbChpbnB1dCwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUludChpbnB1dCwgc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzWzBdLCBvcHRpb25zKTtcblxuICBpZiAoc3RhdGUudXNlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgIC5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ3Vua25vd24gdGFnOiAnICsgdGFnKTtcbiAgfVxufTtcblxuTm9kZS5wcm90b3R5cGUuX2dldFVzZSA9IGZ1bmN0aW9uIF9nZXRVc2UoZW50aXR5LCBvYmopIHtcblxuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgLy8gQ3JlYXRlIGFsdGVyZWQgdXNlIGRlY29kZXIgaWYgaW1wbGljaXQgaXMgc2V0XG4gIHN0YXRlLnVzZURlY29kZXIgPSB0aGlzLl91c2UoZW50aXR5LCBvYmopO1xuICBhc3NlcnQoc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLnBhcmVudCA9PT0gbnVsbCk7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuY2hpbGRyZW5bMF07XG4gIGlmIChzdGF0ZS5pbXBsaWNpdCAhPT0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0KSB7XG4gICAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuY2xvbmUoKTtcbiAgICBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBzdGF0ZS5pbXBsaWNpdDtcbiAgfVxuICByZXR1cm4gc3RhdGUudXNlRGVjb2Rlcjtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVDaG9pY2UgPSBmdW5jdGlvbiBkZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGxldCByZXN1bHQgPSBudWxsO1xuICBsZXQgbWF0Y2ggPSBmYWxzZTtcblxuICBPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpLnNvbWUoZnVuY3Rpb24oa2V5KSB7XG4gICAgY29uc3Qgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICBjb25zdCBub2RlID0gc3RhdGUuY2hvaWNlW2tleV07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbm9kZS5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXN1bHQgPSB7IHR5cGU6IGtleSwgdmFsdWU6IHZhbHVlIH07XG4gICAgICBtYXRjaCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIHRoaXMpO1xuXG4gIGlmICghbWF0Y2gpXG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCdDaG9pY2Ugbm90IG1hdGNoZWQnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy9cbi8vIEVuY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fY3JlYXRlRW5jb2RlckJ1ZmZlciA9IGZ1bmN0aW9uIGNyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSkge1xuICByZXR1cm4gbmV3IEVuY29kZXJCdWZmZXIoZGF0YSwgdGhpcy5yZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsICYmIHN0YXRlWydkZWZhdWx0J10gPT09IGRhdGEpXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2VuY29kZVZhbHVlKGRhdGEsIHJlcG9ydGVyLCBwYXJlbnQpO1xuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuO1xuXG4gIGlmICh0aGlzLl9za2lwRGVmYXVsdChyZXN1bHQsIHJlcG9ydGVyLCBwYXJlbnQpKVxuICAgIHJldHVybjtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZVZhbHVlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBzdGF0ZS5jaGlsZHJlblswXS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyIHx8IG5ldyBSZXBvcnRlcigpKTtcblxuICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAvLyBTZXQgcmVwb3J0ZXIgdG8gc2hhcmUgaXQgd2l0aCBhIGNoaWxkIGNsYXNzXG4gIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjtcblxuICAvLyBDaGVjayBpZiBkYXRhIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCAmJiBkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbClcbiAgICAgIGRhdGEgPSBzdGF0ZVsnZGVmYXVsdCddO1xuICAgIGVsc2VcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVuY29kZSBjaGlsZHJlbiBmaXJzdFxuICBsZXQgY29udGVudCA9IG51bGw7XG4gIGxldCBwcmltaXRpdmUgPSBmYWxzZTtcbiAgaWYgKHN0YXRlLmFueSkge1xuICAgIC8vIEFueXRoaW5nIHRoYXQgd2FzIGdpdmVuIGlzIHRyYW5zbGF0ZWQgdG8gYnVmZmVyXG4gICAgcmVzdWx0ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UpIHtcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNvbnRhaW5zKSB7XG4gICAgY29udGVudCA9IHRoaXMuX2dldFVzZShzdGF0ZS5jb250YWlucywgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICBwcmltaXRpdmUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgY29udGVudCA9IHN0YXRlLmNoaWxkcmVuLm1hcChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUudGFnID09PSAnbnVsbF8nKVxuICAgICAgICByZXR1cm4gY2hpbGQuX2VuY29kZShudWxsLCByZXBvcnRlciwgZGF0YSk7XG5cbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLmtleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdDaGlsZCBzaG91bGQgaGF2ZSBhIGtleScpO1xuICAgICAgY29uc3QgcHJldktleSA9IHJlcG9ydGVyLmVudGVyS2V5KGNoaWxkLl9iYXNlU3RhdGUua2V5KTtcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JylcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdDaGlsZCBleHBlY3RlZCwgYnV0IGlucHV0IGlzIG5vdCBvYmplY3QnKTtcblxuICAgICAgY29uc3QgcmVzID0gY2hpbGQuX2VuY29kZShkYXRhW2NoaWxkLl9iYXNlU3RhdGUua2V5XSwgcmVwb3J0ZXIsIGRhdGEpO1xuICAgICAgcmVwb3J0ZXIubGVhdmVLZXkocHJldktleSk7XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgdGhpcykuZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSk7XG4gICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoY29udGVudCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJ3NlcW9mJyB8fCBzdGF0ZS50YWcgPT09ICdzZXRvZicpIHtcbiAgICAgIC8vIFRPRE8oaW5kdXRueSk6IHRoaXMgc2hvdWxkIGJlIHRocm93biBvbiBEU0wgbGV2ZWxcbiAgICAgIGlmICghKHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJncy5sZW5ndGggPT09IDEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1RvbyBtYW55IGFyZ3MgZm9yIDogJyArIHN0YXRlLnRhZyk7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdzZXFvZi9zZXRvZiwgYnV0IGRhdGEgaXMgbm90IEFycmF5Jyk7XG5cbiAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jbG9uZSgpO1xuICAgICAgY2hpbGQuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gICAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUuYXJnc1swXSwgZGF0YSkuX2VuY29kZShpdGVtLCByZXBvcnRlcik7XG4gICAgICB9LCBjaGlsZCkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUudXNlICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBwYXJlbnQpLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5fZW5jb2RlUHJpbWl0aXZlKHN0YXRlLnRhZywgZGF0YSk7XG4gICAgICBwcmltaXRpdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVuY29kZSBkYXRhIGl0c2VsZlxuICBpZiAoIXN0YXRlLmFueSAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICBjb25zdCB0YWcgPSBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnO1xuICAgIGNvbnN0IGNscyA9IHN0YXRlLmltcGxpY2l0ID09PSBudWxsID8gJ3VuaXZlcnNhbCcgOiAnY29udGV4dCc7XG5cbiAgICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXBvcnRlci5lcnJvcignVGFnIGNvdWxkIGJlIG9taXR0ZWQgb25seSBmb3IgLnVzZSgpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZSh0YWcsIHByaW1pdGl2ZSwgY2xzLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwIGluIGV4cGxpY2l0XG4gIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUoc3RhdGUuZXhwbGljaXQsIGZhbHNlLCAnY29udGV4dCcsIHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVDaG9pY2UgPSBmdW5jdGlvbiBlbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgY29uc3Qgbm9kZSA9IHN0YXRlLmNob2ljZVtkYXRhLnR5cGVdO1xuICBpZiAoIW5vZGUpIHtcbiAgICBhc3NlcnQoXG4gICAgICBmYWxzZSxcbiAgICAgIGRhdGEudHlwZSArICcgbm90IGZvdW5kIGluICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKSkpO1xuICB9XG4gIHJldHVybiBub2RlLl9lbmNvZGUoZGF0YS52YWx1ZSwgcmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZVByaW1pdGl2ZSA9IGZ1bmN0aW9uIGVuY29kZVByaW1pdGl2ZSh0YWcsIGRhdGEpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgaWYgKC9zdHIkLy50ZXN0KHRhZykpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihkYXRhLCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgc3RhdGUucmV2ZXJzZUFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0pO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIG51bGwsIG51bGwpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlVGltZShkYXRhLCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdudWxsXycpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU51bGwoKTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlSW50KGRhdGEsIHN0YXRlLmFyZ3MgJiYgc3RhdGUucmV2ZXJzZUFyZ3NbMF0pO1xuICBlbHNlIGlmICh0YWcgPT09ICdib29sJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlQm9vbChkYXRhKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihkYXRhLCB0YWcpO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0YWc6ICcgKyB0YWcpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzTnVtc3RyID0gZnVuY3Rpb24gaXNOdW1zdHIoc3RyKSB7XG4gIHJldHVybiAvXlswLTkgXSokLy50ZXN0KHN0cik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNQcmludHN0ciA9IGZ1bmN0aW9uIGlzUHJpbnRzdHIoc3RyKSB7XG4gIHJldHVybiAvXltBLVphLXowLTkgJygpKywtLi86PT9dKiQvLnRlc3Qoc3RyKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuLy8gSGVscGVyXG5mdW5jdGlvbiByZXZlcnNlKG1hcCkge1xuICBjb25zdCByZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgLy8gQ29udmVydCBrZXkgdG8gaW50ZWdlciBpZiBpdCBpcyBzdHJpbmdpZmllZFxuICAgIGlmICgoa2V5IHwgMCkgPT0ga2V5KVxuICAgICAga2V5ID0ga2V5IHwgMDtcblxuICAgIGNvbnN0IHZhbHVlID0gbWFwW2tleV07XG4gICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0cy50YWdDbGFzcyA9IHtcbiAgMDogJ3VuaXZlcnNhbCcsXG4gIDE6ICdhcHBsaWNhdGlvbicsXG4gIDI6ICdjb250ZXh0JyxcbiAgMzogJ3ByaXZhdGUnXG59O1xuZXhwb3J0cy50YWdDbGFzc0J5TmFtZSA9IHJldmVyc2UoZXhwb3J0cy50YWdDbGFzcyk7XG5cbmV4cG9ydHMudGFnID0ge1xuICAweDAwOiAnZW5kJyxcbiAgMHgwMTogJ2Jvb2wnLFxuICAweDAyOiAnaW50JyxcbiAgMHgwMzogJ2JpdHN0cicsXG4gIDB4MDQ6ICdvY3RzdHInLFxuICAweDA1OiAnbnVsbF8nLFxuICAweDA2OiAnb2JqaWQnLFxuICAweDA3OiAnb2JqRGVzYycsXG4gIDB4MDg6ICdleHRlcm5hbCcsXG4gIDB4MDk6ICdyZWFsJyxcbiAgMHgwYTogJ2VudW0nLFxuICAweDBiOiAnZW1iZWQnLFxuICAweDBjOiAndXRmOHN0cicsXG4gIDB4MGQ6ICdyZWxhdGl2ZU9pZCcsXG4gIDB4MTA6ICdzZXEnLFxuICAweDExOiAnc2V0JyxcbiAgMHgxMjogJ251bXN0cicsXG4gIDB4MTM6ICdwcmludHN0cicsXG4gIDB4MTQ6ICd0NjFzdHInLFxuICAweDE1OiAndmlkZW9zdHInLFxuICAweDE2OiAnaWE1c3RyJyxcbiAgMHgxNzogJ3V0Y3RpbWUnLFxuICAweDE4OiAnZ2VudGltZScsXG4gIDB4MTk6ICdncmFwaHN0cicsXG4gIDB4MWE6ICdpc282NDZzdHInLFxuICAweDFiOiAnZ2Vuc3RyJyxcbiAgMHgxYzogJ3VuaXN0cicsXG4gIDB4MWQ6ICdjaGFyc3RyJyxcbiAgMHgxZTogJ2JtcHN0cidcbn07XG5leHBvcnRzLnRhZ0J5TmFtZSA9IHJldmVyc2UoZXhwb3J0cy50YWcpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbmNvbnN0IE5vZGUgPSByZXF1aXJlKCcuLi9iYXNlL25vZGUnKTtcblxuLy8gSW1wb3J0IERFUiBjb25zdGFudHNcbmNvbnN0IGRlciA9IHJlcXVpcmUoJy4uL2NvbnN0YW50cy9kZXInKTtcblxuZnVuY3Rpb24gREVSRW5jb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gREVSRW5jb2RlcjtcblxuREVSRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLnRyZWUuX2VuY29kZShkYXRhLCByZXBvcnRlcikuam9pbigpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIE5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIE5vZGUpO1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQ29tcG9zaXRlID0gZnVuY3Rpb24gZW5jb2RlQ29tcG9zaXRlKHRhZyxcbiAgcHJpbWl0aXZlLFxuICBjbHMsXG4gIGNvbnRlbnQpIHtcbiAgY29uc3QgZW5jb2RlZFRhZyA9IGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCB0aGlzLnJlcG9ydGVyKTtcblxuICAvLyBTaG9ydCBmb3JtXG4gIGlmIChjb250ZW50Lmxlbmd0aCA8IDB4ODApIHtcbiAgICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgaGVhZGVyWzBdID0gZW5jb2RlZFRhZztcbiAgICBoZWFkZXJbMV0gPSBjb250ZW50Lmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbiAgfVxuXG4gIC8vIExvbmcgZm9ybVxuICAvLyBDb3VudCBvY3RldHMgcmVxdWlyZWQgdG8gc3RvcmUgbGVuZ3RoXG4gIGxldCBsZW5PY3RldHMgPSAxO1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGg7IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgbGVuT2N0ZXRzKys7XG5cbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEgKyAxICsgbGVuT2N0ZXRzKTtcbiAgaGVhZGVyWzBdID0gZW5jb2RlZFRhZztcbiAgaGVhZGVyWzFdID0gMHg4MCB8IGxlbk9jdGV0cztcblxuICBmb3IgKGxldCBpID0gMSArIGxlbk9jdGV0cywgaiA9IGNvbnRlbnQubGVuZ3RoOyBqID4gMDsgaS0tLCBqID4+PSA4KVxuICAgIGhlYWRlcltpXSA9IGogJiAweGZmO1xuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZVN0ciA9IGZ1bmN0aW9uIGVuY29kZVN0cihzdHIsIHRhZykge1xuICBpZiAodGFnID09PSAnYml0c3RyJykge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgc3RyLnVudXNlZCB8IDAsIHN0ci5kYXRhIF0pO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JtcHN0cicpIHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2Moc3RyLmxlbmd0aCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBidWYud3JpdGVVSW50MTZCRShzdHIuY2hhckNvZGVBdChpKSwgaSAqIDIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihidWYpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHN1cHBvcnRzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgZGlnaXRzIGFuZCBzcGFjZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3ByaW50c3RyJykge1xuICAgIGlmICghdGhpcy5faXNQcmludHN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1ZXN0aW9uIG1hcmsnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJykge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHVuc3VwcG9ydGVkJyk7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVPYmppZCA9IGZ1bmN0aW9uIGVuY29kZU9iamlkKGlkLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignc3RyaW5nIG9iamlkIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCBmb3VuZCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGlkKSlcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCBub3QgZm91bmQgaW4gdmFsdWVzIG1hcCcpO1xuICAgIGlkID0gdmFsdWVzW2lkXS5zcGxpdCgvW1xccy5dKy9nKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKVxuICAgICAgaWRbaV0gfD0gMDtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIGlkID0gaWQuc2xpY2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKVxuICAgICAgaWRbaV0gfD0gMDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQoKSBzaG91bGQgYmUgZWl0aGVyIGFycmF5IG9yIHN0cmluZywgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdDogJyArIEpTT04uc3RyaW5naWZ5KGlkKSk7XG4gIH1cblxuICBpZiAoIXJlbGF0aXZlKSB7XG4gICAgaWYgKGlkWzFdID49IDQwKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1NlY29uZCBvYmppZCBpZGVudGlmaWVyIE9PQicpO1xuICAgIGlkLnNwbGljZSgwLCAyLCBpZFswXSAqIDQwICsgaWRbMV0pO1xuICB9XG5cbiAgLy8gQ291bnQgbnVtYmVyIG9mIG9jdGV0c1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaWRlbnQgPSBpZFtpXTtcbiAgICBmb3IgKHNpemUrKzsgaWRlbnQgPj0gMHg4MDsgaWRlbnQgPj49IDcpXG4gICAgICBzaXplKys7XG4gIH1cblxuICBjb25zdCBvYmppZCA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgbGV0IG9mZnNldCA9IG9iamlkLmxlbmd0aCAtIDE7XG4gIGZvciAobGV0IGkgPSBpZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCBpZGVudCA9IGlkW2ldO1xuICAgIG9iamlkW29mZnNldC0tXSA9IGlkZW50ICYgMHg3ZjtcbiAgICB3aGlsZSAoKGlkZW50ID4+PSA3KSA+IDApXG4gICAgICBvYmppZFtvZmZzZXQtLV0gPSAweDgwIHwgKGlkZW50ICYgMHg3Zik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihvYmppZCk7XG59O1xuXG5mdW5jdGlvbiB0d28obnVtKSB7XG4gIGlmIChudW0gPCAxMClcbiAgICByZXR1cm4gJzAnICsgbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIG51bTtcbn1cblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZVRpbWUgPSBmdW5jdGlvbiBlbmNvZGVUaW1lKHRpbWUsIHRhZykge1xuICBsZXQgc3RyO1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZSk7XG5cbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAndXRjdGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRVVENGdWxsWWVhcigpICUgMTAwKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKHN0ciwgJ29jdHN0cicpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZU51bGwgPSBmdW5jdGlvbiBlbmNvZGVOdWxsKCkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcignJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSwgdmFsdWVzKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1N0cmluZyBpbnQgb3IgZW51bSBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShudW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignVmFsdWVzIG1hcCBkb2VzblxcJ3QgY29udGFpbjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShudW0pKTtcbiAgICB9XG4gICAgbnVtID0gdmFsdWVzW251bV07XG4gIH1cblxuICAvLyBCaWdudW0sIGFzc3VtZSBiaWcgZW5kaWFuXG4gIGlmICh0eXBlb2YgbnVtICE9PSAnbnVtYmVyJyAmJiAhQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICBjb25zdCBudW1BcnJheSA9IG51bS50b0FycmF5KCk7XG4gICAgaWYgKCFudW0uc2lnbiAmJiBudW1BcnJheVswXSAmIDB4ODApIHtcbiAgICAgIG51bUFycmF5LnVuc2hpZnQoMCk7XG4gICAgfVxuICAgIG51bSA9IEJ1ZmZlci5mcm9tKG51bUFycmF5KTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIGxldCBzaXplID0gbnVtLmxlbmd0aDtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIHNpemUrKztcblxuICAgIGNvbnN0IG91dCA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICBudW0uY29weShvdXQpO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgb3V0WzBdID0gMDtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihvdXQpO1xuICB9XG5cbiAgaWYgKG51bSA8IDB4ODApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobnVtKTtcblxuICBpZiAobnVtIDwgMHgxMDApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzAsIG51bV0pO1xuXG4gIGxldCBzaXplID0gMTtcbiAgZm9yIChsZXQgaSA9IG51bTsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBzaXplKys7XG5cbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5KHNpemUpO1xuICBmb3IgKGxldCBpID0gb3V0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgb3V0W2ldID0gbnVtICYgMHhmZjtcbiAgICBudW0gPj49IDg7XG4gIH1cbiAgaWYob3V0WzBdICYgMHg4MCkge1xuICAgIG91dC51bnNoaWZ0KDApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoQnVmZmVyLmZyb20ob3V0KSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQm9vbCA9IGZ1bmN0aW9uIGVuY29kZUJvb2wodmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodmFsdWUgPyAweGZmIDogMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXRFbmNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3NraXBEZWZhdWx0ID0gZnVuY3Rpb24gc2tpcERlZmF1bHQoZGF0YUJ1ZmZlciwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbGV0IGk7XG4gIGlmIChzdGF0ZVsnZGVmYXVsdCddID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBkYXRhID0gZGF0YUJ1ZmZlci5qb2luKCk7XG4gIGlmIChzdGF0ZS5kZWZhdWx0QnVmZmVyID09PSB1bmRlZmluZWQpXG4gICAgc3RhdGUuZGVmYXVsdEJ1ZmZlciA9IHRoaXMuX2VuY29kZVZhbHVlKHN0YXRlWydkZWZhdWx0J10sIHJlcG9ydGVyLCBwYXJlbnQpLmpvaW4oKTtcblxuICBpZiAoZGF0YS5sZW5ndGggIT09IHN0YXRlLmRlZmF1bHRCdWZmZXIubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspXG4gICAgaWYgKGRhdGFbaV0gIT09IHN0YXRlLmRlZmF1bHRCdWZmZXJbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHJlcG9ydGVyKSB7XG4gIGxldCByZXM7XG5cbiAgaWYgKHRhZyA9PT0gJ3NlcW9mJylcbiAgICB0YWcgPSAnc2VxJztcbiAgZWxzZSBpZiAodGFnID09PSAnc2V0b2YnKVxuICAgIHRhZyA9ICdzZXQnO1xuXG4gIGlmIChkZXIudGFnQnlOYW1lLmhhc093blByb3BlcnR5KHRhZykpXG4gICAgcmVzID0gZGVyLnRhZ0J5TmFtZVt0YWddO1xuICBlbHNlIGlmICh0eXBlb2YgdGFnID09PSAnbnVtYmVyJyAmJiAodGFnIHwgMCkgPT09IHRhZylcbiAgICByZXMgPSB0YWc7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1Vua25vd24gdGFnOiAnICsgdGFnKTtcblxuICBpZiAocmVzID49IDB4MWYpXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdNdWx0aS1vY3RldCB0YWcgZW5jb2RpbmcgdW5zdXBwb3J0ZWQnKTtcblxuICBpZiAoIXByaW1pdGl2ZSlcbiAgICByZXMgfD0gMHgyMDtcblxuICByZXMgfD0gKGRlci50YWdDbGFzc0J5TmFtZVtjbHMgfHwgJ3VuaXZlcnNhbCddIDw8IDYpO1xuXG4gIHJldHVybiByZXM7XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5jb25zdCBERVJFbmNvZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcblxuZnVuY3Rpb24gUEVNRW5jb2RlcihlbnRpdHkpIHtcbiAgREVSRW5jb2Rlci5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIHRoaXMuZW5jID0gJ3BlbSc7XG59XG5pbmhlcml0cyhQRU1FbmNvZGVyLCBERVJFbmNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRW5jb2RlcjtcblxuUEVNRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3QgYnVmID0gREVSRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlLmNhbGwodGhpcywgZGF0YSk7XG5cbiAgY29uc3QgcCA9IGJ1Zi50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IG91dCA9IFsgJy0tLS0tQkVHSU4gJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nIF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkgKz0gNjQpXG4gICAgb3V0LnB1c2gocC5zbGljZShpLCBpICsgNjQpKTtcbiAgb3V0LnB1c2goJy0tLS0tRU5EICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyk7XG4gIHJldHVybiBvdXQuam9pbignXFxuJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVuY29kZXJzID0gZXhwb3J0cztcblxuZW5jb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmVuY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5jb25zdCBiaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuY29uc3QgRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UvYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmNvbnN0IE5vZGUgPSByZXF1aXJlKCcuLi9iYXNlL25vZGUnKTtcblxuLy8gSW1wb3J0IERFUiBjb25zdGFudHNcbmNvbnN0IGRlciA9IHJlcXVpcmUoJy4uL2NvbnN0YW50cy9kZXInKTtcblxuZnVuY3Rpb24gREVSRGVjb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gREVSRGVjb2RlcjtcblxuREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKCFEZWNvZGVyQnVmZmVyLmlzRGVjb2RlckJ1ZmZlcihkYXRhKSkge1xuICAgIGRhdGEgPSBuZXcgRGVjb2RlckJ1ZmZlcihkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnRyZWUuX2RlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBOb2RlLmNhbGwodGhpcywgJ2RlcicsIHBhcmVudCk7XG59XG5pbmhlcml0cyhERVJOb2RlLCBOb2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3BlZWtUYWcgPSBmdW5jdGlvbiBwZWVrVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgaWYgKGJ1ZmZlci5pc0VtcHR5KCkpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgY29uc3QgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsICdGYWlsZWQgdG8gcGVlayB0YWc6IFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgYnVmZmVyLnJlc3RvcmUoc3RhdGUpO1xuXG4gIHJldHVybiBkZWNvZGVkVGFnLnRhZyA9PT0gdGFnIHx8IGRlY29kZWRUYWcudGFnU3RyID09PSB0YWcgfHxcbiAgICAoZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnKSA9PT0gdGFnIHx8IGFueTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUYWcgPSBmdW5jdGlvbiBkZWNvZGVUYWcoYnVmZmVyLCB0YWcsIGFueSkge1xuICBjb25zdCBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlcixcbiAgICAnRmFpbGVkIHRvIGRlY29kZSB0YWcgb2YgXCInICsgdGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlcbiAgICByZXR1cm4gZGVjb2RlZFRhZztcblxuICBsZXQgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlcixcbiAgICBkZWNvZGVkVGFnLnByaW1pdGl2ZSxcbiAgICAnRmFpbGVkIHRvIGdldCBsZW5ndGggb2YgXCInICsgdGFnICsgJ1wiJyk7XG5cbiAgLy8gRmFpbHVyZVxuICBpZiAoYnVmZmVyLmlzRXJyb3IobGVuKSlcbiAgICByZXR1cm4gbGVuO1xuXG4gIGlmICghYW55ICYmXG4gICAgICBkZWNvZGVkVGFnLnRhZyAhPT0gdGFnICYmXG4gICAgICBkZWNvZGVkVGFnLnRhZ1N0ciAhPT0gdGFnICYmXG4gICAgICBkZWNvZGVkVGFnLnRhZ1N0ciArICdvZicgIT09IHRhZykge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0ZhaWxlZCB0byBtYXRjaCB0YWc6IFwiJyArIHRhZyArICdcIicpO1xuICB9XG5cbiAgaWYgKGRlY29kZWRUYWcucHJpbWl0aXZlIHx8IGxlbiAhPT0gbnVsbClcbiAgICByZXR1cm4gYnVmZmVyLnNraXAobGVuLCAnRmFpbGVkIHRvIG1hdGNoIGJvZHkgb2Y6IFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEluZGVmaW5pdGUgbGVuZ3RoLi4uIGZpbmQgRU5EIHRhZ1xuICBjb25zdCBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIGNvbnN0IHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChcbiAgICBidWZmZXIsXG4gICAgJ0ZhaWxlZCB0byBza2lwIGluZGVmaW5pdGUgbGVuZ3RoIGJvZHk6IFwiJyArIHRoaXMudGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgIHJldHVybiByZXM7XG5cbiAgbGVuID0gYnVmZmVyLm9mZnNldCAtIHN0YXRlLm9mZnNldDtcbiAgYnVmZmVyLnJlc3RvcmUoc3RhdGUpO1xuICByZXR1cm4gYnVmZmVyLnNraXAobGVuLCAnRmFpbGVkIHRvIG1hdGNoIGJvZHkgb2Y6IFwiJyArIHRhZyArICdcIicpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3NraXBVbnRpbEVuZCA9IGZ1bmN0aW9uIHNraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpIHtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih0YWcpKVxuICAgICAgcmV0dXJuIHRhZztcbiAgICBjb25zdCBsZW4gPSBkZXJEZWNvZGVMZW4oYnVmZmVyLCB0YWcucHJpbWl0aXZlLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IobGVuKSlcbiAgICAgIHJldHVybiBsZW47XG5cbiAgICBsZXQgcmVzO1xuICAgIGlmICh0YWcucHJpbWl0aXZlIHx8IGxlbiAhPT0gbnVsbClcbiAgICAgIHJlcyA9IGJ1ZmZlci5za2lwKGxlbik7XG4gICAgZWxzZVxuICAgICAgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCk7XG5cbiAgICAvLyBGYWlsdXJlXG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHRhZy50YWdTdHIgPT09ICdlbmQnKVxuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVMaXN0ID0gZnVuY3Rpb24gZGVjb2RlTGlzdChidWZmZXIsIHRhZywgZGVjb2RlcixcbiAgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgY29uc3QgcG9zc2libGVFbmQgPSB0aGlzLl9wZWVrVGFnKGJ1ZmZlciwgJ2VuZCcpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihwb3NzaWJsZUVuZCkpXG4gICAgICByZXR1cm4gcG9zc2libGVFbmQ7XG5cbiAgICBjb25zdCByZXMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIsICdkZXInLCBvcHRpb25zKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSAmJiBwb3NzaWJsZUVuZClcbiAgICAgIGJyZWFrO1xuICAgIHJlc3VsdC5wdXNoKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVTdHIgPSBmdW5jdGlvbiBkZWNvZGVTdHIoYnVmZmVyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICBjb25zdCB1bnVzZWQgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHVudXNlZCkpXG4gICAgICByZXR1cm4gdW51c2VkO1xuICAgIHJldHVybiB7IHVudXNlZDogdW51c2VkLCBkYXRhOiBidWZmZXIucmF3KCkgfTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgY29uc3QgcmF3ID0gYnVmZmVyLnJhdygpO1xuICAgIGlmIChyYXcubGVuZ3RoICUgMiA9PT0gMSlcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoJyk7XG5cbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyYXcucmVhZFVJbnQxNkJFKGkgKiAyKSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnbnVtc3RyJykge1xuICAgIGNvbnN0IG51bXN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKG51bXN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bXN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBudW1zdHI7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2N0c3RyJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3ByaW50c3RyJykge1xuICAgIGNvbnN0IHByaW50c3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNQcmludHN0cihwcmludHN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHByaW50c3RyO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgKyB0YWcgKyAnIHVuc3VwcG9ydGVkJyk7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVPYmppZCA9IGZ1bmN0aW9uIGRlY29kZU9iamlkKGJ1ZmZlciwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBsZXQgcmVzdWx0O1xuICBjb25zdCBpZGVudGlmaWVycyA9IFtdO1xuICBsZXQgaWRlbnQgPSAwO1xuICBsZXQgc3ViaWRlbnQgPSAwO1xuICB3aGlsZSAoIWJ1ZmZlci5pc0VtcHR5KCkpIHtcbiAgICBzdWJpZGVudCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZGVudCA8PD0gNztcbiAgICBpZGVudCB8PSBzdWJpZGVudCAmIDB4N2Y7XG4gICAgaWYgKChzdWJpZGVudCAmIDB4ODApID09PSAwKSB7XG4gICAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcbiAgICAgIGlkZW50ID0gMDtcbiAgICB9XG4gIH1cbiAgaWYgKHN1YmlkZW50ICYgMHg4MClcbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcblxuICBjb25zdCBmaXJzdCA9IChpZGVudGlmaWVyc1swXSAvIDQwKSB8IDA7XG4gIGNvbnN0IHNlY29uZCA9IGlkZW50aWZpZXJzWzBdICUgNDA7XG5cbiAgaWYgKHJlbGF0aXZlKVxuICAgIHJlc3VsdCA9IGlkZW50aWZpZXJzO1xuICBlbHNlXG4gICAgcmVzdWx0ID0gW2ZpcnN0LCBzZWNvbmRdLmNvbmNhdChpZGVudGlmaWVycy5zbGljZSgxKSk7XG5cbiAgaWYgKHZhbHVlcykge1xuICAgIGxldCB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJyAnKV07XG4gICAgaWYgKHRtcCA9PT0gdW5kZWZpbmVkKVxuICAgICAgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcuJyldO1xuICAgIGlmICh0bXAgIT09IHVuZGVmaW5lZClcbiAgICAgIHJlc3VsdCA9IHRtcDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlVGltZSA9IGZ1bmN0aW9uIGRlY29kZVRpbWUoYnVmZmVyLCB0YWcpIHtcbiAgY29uc3Qgc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCk7XG5cbiAgbGV0IHllYXI7XG4gIGxldCBtb247XG4gIGxldCBkYXk7XG4gIGxldCBob3VyO1xuICBsZXQgbWluO1xuICBsZXQgc2VjO1xuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICB5ZWFyID0gc3RyLnNsaWNlKDAsIDQpIHwgMDtcbiAgICBtb24gPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIGRheSA9IHN0ci5zbGljZSg2LCA4KSB8IDA7XG4gICAgaG91ciA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIG1pbiA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBzZWMgPSBzdHIuc2xpY2UoMTIsIDE0KSB8IDA7XG4gIH0gZWxzZSBpZiAodGFnID09PSAndXRjdGltZScpIHtcbiAgICB5ZWFyID0gc3RyLnNsaWNlKDAsIDIpIHwgMDtcbiAgICBtb24gPSBzdHIuc2xpY2UoMiwgNCkgfCAwO1xuICAgIGRheSA9IHN0ci5zbGljZSg0LCA2KSB8IDA7XG4gICAgaG91ciA9IHN0ci5zbGljZSg2LCA4KSB8IDA7XG4gICAgbWluID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgc2VjID0gc3RyLnNsaWNlKDEwLCAxMikgfCAwO1xuICAgIGlmICh5ZWFyIDwgNzApXG4gICAgICB5ZWFyID0gMjAwMCArIHllYXI7XG4gICAgZWxzZVxuICAgICAgeWVhciA9IDE5MDAgKyB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiBEYXRlLlVUQyh5ZWFyLCBtb24gLSAxLCBkYXksIGhvdXIsIG1pbiwgc2VjLCAwKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVOdWxsID0gZnVuY3Rpb24gZGVjb2RlTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlQm9vbCA9IGZ1bmN0aW9uIGRlY29kZUJvb2woYnVmZmVyKSB7XG4gIGNvbnN0IHJlcyA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcbiAgZWxzZVxuICAgIHJldHVybiByZXMgIT09IDA7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ1ZmZlciwgdmFsdWVzKSB7XG4gIC8vIEJpZ2ludCwgcmV0dXJuIGFzIGl0IGlzIChhc3N1bWUgYmlnIGVuZGlhbilcbiAgY29uc3QgcmF3ID0gYnVmZmVyLnJhdygpO1xuICBsZXQgcmVzID0gbmV3IGJpZ251bShyYXcpO1xuXG4gIGlmICh2YWx1ZXMpXG4gICAgcmVzID0gdmFsdWVzW3Jlcy50b1N0cmluZygxMCldIHx8IHJlcztcblxuICByZXR1cm4gcmVzO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RGVjb2RlcignZGVyJykudHJlZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBkZXJEZWNvZGVUYWcoYnVmLCBmYWlsKSB7XG4gIGxldCB0YWcgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICBpZiAoYnVmLmlzRXJyb3IodGFnKSlcbiAgICByZXR1cm4gdGFnO1xuXG4gIGNvbnN0IGNscyA9IGRlci50YWdDbGFzc1t0YWcgPj4gNl07XG4gIGNvbnN0IHByaW1pdGl2ZSA9ICh0YWcgJiAweDIwKSA9PT0gMDtcblxuICAvLyBNdWx0aS1vY3RldCB0YWcgLSBsb2FkXG4gIGlmICgodGFnICYgMHgxZikgPT09IDB4MWYpIHtcbiAgICBsZXQgb2N0ID0gdGFnO1xuICAgIHRhZyA9IDA7XG4gICAgd2hpbGUgKChvY3QgJiAweDgwKSA9PT0gMHg4MCkge1xuICAgICAgb2N0ID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICAgIGlmIChidWYuaXNFcnJvcihvY3QpKVxuICAgICAgICByZXR1cm4gb2N0O1xuXG4gICAgICB0YWcgPDw9IDc7XG4gICAgICB0YWcgfD0gb2N0ICYgMHg3ZjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFnICY9IDB4MWY7XG4gIH1cbiAgY29uc3QgdGFnU3RyID0gZGVyLnRhZ1t0YWddO1xuXG4gIHJldHVybiB7XG4gICAgY2xzOiBjbHMsXG4gICAgcHJpbWl0aXZlOiBwcmltaXRpdmUsXG4gICAgdGFnOiB0YWcsXG4gICAgdGFnU3RyOiB0YWdTdHJcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVyRGVjb2RlTGVuKGJ1ZiwgcHJpbWl0aXZlLCBmYWlsKSB7XG4gIGxldCBsZW4gPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICBpZiAoYnVmLmlzRXJyb3IobGVuKSlcbiAgICByZXR1cm4gbGVuO1xuXG4gIC8vIEluZGVmaW5pdGUgZm9ybVxuICBpZiAoIXByaW1pdGl2ZSAmJiBsZW4gPT09IDB4ODApXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgLy8gRGVmaW5pdGUgZm9ybVxuICBpZiAoKGxlbiAmIDB4ODApID09PSAwKSB7XG4gICAgLy8gU2hvcnQgZm9ybVxuICAgIHJldHVybiBsZW47XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgY29uc3QgbnVtID0gbGVuICYgMHg3ZjtcbiAgaWYgKG51bSA+IDQpXG4gICAgcmV0dXJuIGJ1Zi5lcnJvcignbGVuZ3RoIG9jdGVjdCBpcyB0b28gbG9uZycpO1xuXG4gIGxlbiA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICBsZW4gPDw9IDg7XG4gICAgY29uc3QgaiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgaWYgKGJ1Zi5pc0Vycm9yKGopKVxuICAgICAgcmV0dXJuIGo7XG4gICAgbGVuIHw9IGo7XG4gIH1cblxuICByZXR1cm4gbGVuO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxuY29uc3QgREVSRGVjb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTURlY29kZXIoZW50aXR5KSB7XG4gIERFUkRlY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufVxuaW5oZXJpdHMoUEVNRGVjb2RlciwgREVSRGVjb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTURlY29kZXI7XG5cblBFTURlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxpbmVzID0gZGF0YS50b1N0cmluZygpLnNwbGl0KC9bXFxyXFxuXSsvZyk7XG5cbiAgY29uc3QgbGFiZWwgPSBvcHRpb25zLmxhYmVsLnRvVXBwZXJDYXNlKCk7XG5cbiAgY29uc3QgcmUgPSAvXi0tLS0tKEJFR0lOfEVORCkgKFteLV0rKS0tLS0tJC87XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtYXRjaCA9IGxpbmVzW2ldLm1hdGNoKHJlKTtcbiAgICBpZiAobWF0Y2ggPT09IG51bGwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChtYXRjaFsyXSAhPT0gbGFiZWwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0JFR0lOJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0VORCcpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZW5kID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAnICsgbGFiZWwpO1xuXG4gIGNvbnN0IGJhc2U2NCA9IGxpbmVzLnNsaWNlKHN0YXJ0ICsgMSwgZW5kKS5qb2luKCcnKTtcbiAgLy8gUmVtb3ZlIGV4Y2Vzc2l2ZSBzeW1ib2xzXG4gIGJhc2U2NC5yZXBsYWNlKC9bXmEtejAtOSsvPV0rL2dpLCAnJyk7XG5cbiAgY29uc3QgaW5wdXQgPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKTtcbiAgcmV0dXJuIERFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZS5jYWxsKHRoaXMsIGlucHV0LCBvcHRpb25zKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZGVjb2RlcnMgPSBleHBvcnRzO1xuXG5kZWNvZGVycy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuZGVjb2RlcnMucGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlbmNvZGVycyA9IHJlcXVpcmUoJy4vZW5jb2RlcnMnKTtcbmNvbnN0IGRlY29kZXJzID0gcmVxdWlyZSgnLi9kZWNvZGVycycpO1xuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5jb25zdCBhcGkgPSBleHBvcnRzO1xuXG5hcGkuZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG5hbWUsIGJvZHkpIHtcbiAgcmV0dXJuIG5ldyBFbnRpdHkobmFtZSwgYm9keSk7XG59O1xuXG5mdW5jdGlvbiBFbnRpdHkobmFtZSwgYm9keSkge1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmJvZHkgPSBib2R5O1xuXG4gIHRoaXMuZGVjb2RlcnMgPSB7fTtcbiAgdGhpcy5lbmNvZGVycyA9IHt9O1xufVxuXG5FbnRpdHkucHJvdG90eXBlLl9jcmVhdGVOYW1lZCA9IGZ1bmN0aW9uIGNyZWF0ZU5hbWVkKEJhc2UpIHtcbiAgY29uc3QgbmFtZSA9IHRoaXMubmFtZTtcblxuICBmdW5jdGlvbiBHZW5lcmF0ZWQoZW50aXR5KSB7XG4gICAgdGhpcy5faW5pdE5hbWVkKGVudGl0eSwgbmFtZSk7XG4gIH1cbiAgaW5oZXJpdHMoR2VuZXJhdGVkLCBCYXNlKTtcbiAgR2VuZXJhdGVkLnByb3RvdHlwZS5faW5pdE5hbWVkID0gZnVuY3Rpb24gX2luaXROYW1lZChlbnRpdHksIG5hbWUpIHtcbiAgICBCYXNlLmNhbGwodGhpcywgZW50aXR5LCBuYW1lKTtcbiAgfTtcblxuICByZXR1cm4gbmV3IEdlbmVyYXRlZCh0aGlzKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldERlY29kZXIgPSBmdW5jdGlvbiBfZ2V0RGVjb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGRlY29kZXJcbiAgaWYgKCF0aGlzLmRlY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5kZWNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoZGVjb2RlcnNbZW5jXSk7XG4gIHJldHVybiB0aGlzLmRlY29kZXJzW2VuY107XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuX2dldERlY29kZXIoZW5jKS5kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXRFbmNvZGVyID0gZnVuY3Rpb24gX2dldEVuY29kZXIoZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAnZGVyJztcbiAgLy8gTGF6aWx5IGNyZWF0ZSBlbmNvZGVyXG4gIGlmICghdGhpcy5lbmNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZW5jb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGVuY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5lbmNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgZW5jLCAvKiBpbnRlcm5hbCAqLyByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy5fZ2V0RW5jb2RlcihlbmMpLmVuY29kZShkYXRhLCByZXBvcnRlcik7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGJhc2UgPSBleHBvcnRzO1xuXG5iYXNlLlJlcG9ydGVyID0gcmVxdWlyZSgnLi9yZXBvcnRlcicpLlJlcG9ydGVyO1xuYmFzZS5EZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuYmFzZS5FbmNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi9idWZmZXInKS5FbmNvZGVyQnVmZmVyO1xuYmFzZS5Ob2RlID0gcmVxdWlyZSgnLi9ub2RlJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29uc3RhbnRzID0gZXhwb3J0cztcblxuLy8gSGVscGVyXG5jb25zdGFudHMuX3JldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlKG1hcCkge1xuICBjb25zdCByZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgLy8gQ29udmVydCBrZXkgdG8gaW50ZWdlciBpZiBpdCBpcyBzdHJpbmdpZmllZFxuICAgIGlmICgoa2V5IHwgMCkgPT0ga2V5KVxuICAgICAga2V5ID0ga2V5IHwgMDtcblxuICAgIGNvbnN0IHZhbHVlID0gbWFwW2tleV07XG4gICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmNvbnN0YW50cy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGFzbjEgPSBleHBvcnRzO1xuXG5hc24xLmJpZ251bSA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbmFzbjEuZGVmaW5lID0gcmVxdWlyZSgnLi9hc24xL2FwaScpLmRlZmluZTtcbmFzbjEuYmFzZSA9IHJlcXVpcmUoJy4vYXNuMS9iYXNlJyk7XG5hc24xLmNvbnN0YW50cyA9IHJlcXVpcmUoJy4vYXNuMS9jb25zdGFudHMnKTtcbmFzbjEuZGVjb2RlcnMgPSByZXF1aXJlKCcuL2FzbjEvZGVjb2RlcnMnKTtcbmFzbjEuZW5jb2RlcnMgPSByZXF1aXJlKCcuL2FzbjEvZW5jb2RlcnMnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBleHBvcnRzO1xuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgIT09ICdzdHJpbmcnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgICByZXNbaV0gPSBtc2dbaV0gfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKGVuYyA9PT0gJ2hleCcpIHtcbiAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgIG1zZyA9ICcwJyArIG1zZztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgIHJlcy5wdXNoKHBhcnNlSW50KG1zZ1tpXSArIG1zZ1tpICsgMV0sIDE2KSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICB2YXIgaGkgPSBjID4+IDg7XG4gICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgIGlmIChoaSlcbiAgICAgICAgcmVzLnB1c2goaGksIGxvKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzLnB1c2gobG8pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG51dGlscy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0hleCA9IHRvSGV4O1xuXG51dGlscy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoYXJyLCBlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRvSGV4KGFycik7XG4gIGVsc2VcbiAgICByZXR1cm4gYXJyO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBleHBvcnRzO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBtaW5Bc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgbWluVXRpbHMgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG5cbnV0aWxzLmFzc2VydCA9IG1pbkFzc2VydDtcbnV0aWxzLnRvQXJyYXkgPSBtaW5VdGlscy50b0FycmF5O1xudXRpbHMuemVybzIgPSBtaW5VdGlscy56ZXJvMjtcbnV0aWxzLnRvSGV4ID0gbWluVXRpbHMudG9IZXg7XG51dGlscy5lbmNvZGUgPSBtaW5VdGlscy5lbmNvZGU7XG5cbi8vIFJlcHJlc2VudCBudW0gaW4gYSB3LU5BRiBmb3JtXG5mdW5jdGlvbiBnZXROQUYobnVtLCB3LCBiaXRzKSB7XG4gIHZhciBuYWYgPSBuZXcgQXJyYXkoTWF0aC5tYXgobnVtLmJpdExlbmd0aCgpLCBiaXRzKSArIDEpO1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IG5hZi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG5hZltpXSA9IDA7XG4gIH1cblxuICB2YXIgd3MgPSAxIDw8ICh3ICsgMSk7XG4gIHZhciBrID0gbnVtLmNsb25lKCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG5hZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciB6O1xuICAgIHZhciBtb2QgPSBrLmFuZGxuKHdzIC0gMSk7XG4gICAgaWYgKGsuaXNPZGQoKSkge1xuICAgICAgaWYgKG1vZCA+ICh3cyA+PiAxKSAtIDEpXG4gICAgICAgIHogPSAod3MgPj4gMSkgLSBtb2Q7XG4gICAgICBlbHNlXG4gICAgICAgIHogPSBtb2Q7XG4gICAgICBrLmlzdWJuKHopO1xuICAgIH0gZWxzZSB7XG4gICAgICB6ID0gMDtcbiAgICB9XG5cbiAgICBuYWZbaV0gPSB6O1xuICAgIGsuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIG5hZjtcbn1cbnV0aWxzLmdldE5BRiA9IGdldE5BRjtcblxuLy8gUmVwcmVzZW50IGsxLCBrMiBpbiBhIEpvaW50IFNwYXJzZSBGb3JtXG5mdW5jdGlvbiBnZXRKU0YoazEsIGsyKSB7XG4gIHZhciBqc2YgPSBbXG4gICAgW10sXG4gICAgW10sXG4gIF07XG5cbiAgazEgPSBrMS5jbG9uZSgpO1xuICBrMiA9IGsyLmNsb25lKCk7XG4gIHZhciBkMSA9IDA7XG4gIHZhciBkMiA9IDA7XG4gIHZhciBtODtcbiAgd2hpbGUgKGsxLmNtcG4oLWQxKSA+IDAgfHwgazIuY21wbigtZDIpID4gMCkge1xuICAgIC8vIEZpcnN0IHBoYXNlXG4gICAgdmFyIG0xNCA9IChrMS5hbmRsbigzKSArIGQxKSAmIDM7XG4gICAgdmFyIG0yNCA9IChrMi5hbmRsbigzKSArIGQyKSAmIDM7XG4gICAgaWYgKG0xNCA9PT0gMylcbiAgICAgIG0xNCA9IC0xO1xuICAgIGlmIChtMjQgPT09IDMpXG4gICAgICBtMjQgPSAtMTtcbiAgICB2YXIgdTE7XG4gICAgaWYgKChtMTQgJiAxKSA9PT0gMCkge1xuICAgICAgdTEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMS5hbmRsbig3KSArIGQxKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMjQgPT09IDIpXG4gICAgICAgIHUxID0gLW0xNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTEgPSBtMTQ7XG4gICAgfVxuICAgIGpzZlswXS5wdXNoKHUxKTtcblxuICAgIHZhciB1MjtcbiAgICBpZiAoKG0yNCAmIDEpID09PSAwKSB7XG4gICAgICB1MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG04ID0gKGsyLmFuZGxuKDcpICsgZDIpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0xNCA9PT0gMilcbiAgICAgICAgdTIgPSAtbTI0O1xuICAgICAgZWxzZVxuICAgICAgICB1MiA9IG0yNDtcbiAgICB9XG4gICAganNmWzFdLnB1c2godTIpO1xuXG4gICAgLy8gU2Vjb25kIHBoYXNlXG4gICAgaWYgKDIgKiBkMSA9PT0gdTEgKyAxKVxuICAgICAgZDEgPSAxIC0gZDE7XG4gICAgaWYgKDIgKiBkMiA9PT0gdTIgKyAxKVxuICAgICAgZDIgPSAxIC0gZDI7XG4gICAgazEuaXVzaHJuKDEpO1xuICAgIGsyLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBqc2Y7XG59XG51dGlscy5nZXRKU0YgPSBnZXRKU0Y7XG5cbmZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KG9iaiwgbmFtZSwgY29tcHV0ZXIpIHtcbiAgdmFyIGtleSA9ICdfJyArIG5hbWU7XG4gIG9iai5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpc1trZXldICE9PSB1bmRlZmluZWQgPyB0aGlzW2tleV0gOlxuICAgICAgdGhpc1trZXldID0gY29tcHV0ZXIuY2FsbCh0aGlzKTtcbiAgfTtcbn1cbnV0aWxzLmNhY2hlZFByb3BlcnR5ID0gY2FjaGVkUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHBhcnNlQnl0ZXMoYnl0ZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycgPyB1dGlscy50b0FycmF5KGJ5dGVzLCAnaGV4JykgOlxuICAgIGJ5dGVzO1xufVxudXRpbHMucGFyc2VCeXRlcyA9IHBhcnNlQnl0ZXM7XG5cbmZ1bmN0aW9uIGludEZyb21MRShieXRlcykge1xuICByZXR1cm4gbmV3IEJOKGJ5dGVzLCAnaGV4JywgJ2xlJyk7XG59XG51dGlscy5pbnRGcm9tTEUgPSBpbnRGcm9tTEU7XG5cbiIsCiAgICAidmFyIHI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmFuZChsZW4pIHtcbiAgaWYgKCFyKVxuICAgIHIgPSBuZXcgUmFuZChudWxsKTtcblxuICByZXR1cm4gci5nZW5lcmF0ZShsZW4pO1xufTtcblxuZnVuY3Rpb24gUmFuZChyYW5kKSB7XG4gIHRoaXMucmFuZCA9IHJhbmQ7XG59XG5tb2R1bGUuZXhwb3J0cy5SYW5kID0gUmFuZDtcblxuUmFuZC5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiBnZW5lcmF0ZShsZW4pIHtcbiAgcmV0dXJuIHRoaXMuX3JhbmQobGVuKTtcbn07XG5cbi8vIEVtdWxhdGUgY3J5cHRvIEFQSSB1c2luZyByYW5keVxuUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gIGlmICh0aGlzLnJhbmQuZ2V0Qnl0ZXMpXG4gICAgcmV0dXJuIHRoaXMucmFuZC5nZXRCeXRlcyhuKTtcblxuICB2YXIgcmVzID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKVxuICAgIHJlc1tpXSA9IHRoaXMucmFuZC5nZXRCeXRlKCk7XG4gIHJldHVybiByZXM7XG59O1xuXG5pZiAodHlwZW9mIHNlbGYgPT09ICdvYmplY3QnKSB7XG4gIGlmIChzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlcnNcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHNlbGYubXNDcnlwdG8gJiYgc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBJRVxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcblxuICAvLyBTYWZhcmkncyBXZWJXb3JrZXJzIGRvIG5vdCBoYXZlIGBjcnlwdG9gXG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBPbGQganVua1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICB9O1xuICB9XG59IGVsc2Uge1xuICAvLyBOb2RlLmpzIG9yIFdlYiB3b3JrZXIgd2l0aCBubyBjcnlwdG8gc3VwcG9ydFxuICB0cnkge1xuICAgIHZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgICBpZiAodHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCcpO1xuXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGdldE5BRiA9IHV0aWxzLmdldE5BRjtcbnZhciBnZXRKU0YgPSB1dGlscy5nZXRKU0Y7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBCYXNlQ3VydmUodHlwZSwgY29uZikge1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnAgPSBuZXcgQk4oY29uZi5wLCAxNik7XG5cbiAgLy8gVXNlIE1vbnRnb21lcnksIHdoZW4gdGhlcmUgaXMgbm8gZmFzdCByZWR1Y3Rpb24gZm9yIHRoZSBwcmltZVxuICB0aGlzLnJlZCA9IGNvbmYucHJpbWUgPyBCTi5yZWQoY29uZi5wcmltZSkgOiBCTi5tb250KHRoaXMucCk7XG5cbiAgLy8gVXNlZnVsIGZvciBtYW55IGN1cnZlc1xuICB0aGlzLnplcm8gPSBuZXcgQk4oMCkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLm9uZSA9IG5ldyBCTigxKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudHdvID0gbmV3IEJOKDIpLnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyBDdXJ2ZSBjb25maWd1cmF0aW9uLCBvcHRpb25hbFxuICB0aGlzLm4gPSBjb25mLm4gJiYgbmV3IEJOKGNvbmYubiwgMTYpO1xuICB0aGlzLmcgPSBjb25mLmcgJiYgdGhpcy5wb2ludEZyb21KU09OKGNvbmYuZywgY29uZi5nUmVkKTtcblxuICAvLyBUZW1wb3JhcnkgYXJyYXlzXG4gIHRoaXMuX3duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQyID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDMgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUNCA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLl9iaXRMZW5ndGggPSB0aGlzLm4gPyB0aGlzLm4uYml0TGVuZ3RoKCkgOiAwO1xuXG4gIC8vIEdlbmVyYWxpemVkIEdyZWcgTWF4d2VsbCdzIHRyaWNrXG4gIHZhciBhZGp1c3RDb3VudCA9IHRoaXMubiAmJiB0aGlzLnAuZGl2KHRoaXMubik7XG4gIGlmICghYWRqdXN0Q291bnQgfHwgYWRqdXN0Q291bnQuY21wbigxMDApID4gMCkge1xuICAgIHRoaXMucmVkTiA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbWF4d2VsbFRyaWNrID0gdHJ1ZTtcbiAgICB0aGlzLnJlZE4gPSB0aGlzLm4udG9SZWQodGhpcy5yZWQpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VDdXJ2ZTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fZml4ZWROYWZNdWwgPSBmdW5jdGlvbiBfZml4ZWROYWZNdWwocCwgaykge1xuICBhc3NlcnQocC5wcmVjb21wdXRlZCk7XG4gIHZhciBkb3VibGVzID0gcC5fZ2V0RG91YmxlcygpO1xuXG4gIHZhciBuYWYgPSBnZXROQUYoaywgMSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgdmFyIEkgPSAoMSA8PCAoZG91Ymxlcy5zdGVwICsgMSkpIC0gKGRvdWJsZXMuc3RlcCAlIDIgPT09IDAgPyAyIDogMSk7XG4gIEkgLz0gMztcblxuICAvLyBUcmFuc2xhdGUgaW50byBtb3JlIHdpbmRvd2VkIGZvcm1cbiAgdmFyIHJlcHIgPSBbXTtcbiAgdmFyIGo7XG4gIHZhciBuYWZXO1xuICBmb3IgKGogPSAwOyBqIDwgbmFmLmxlbmd0aDsgaiArPSBkb3VibGVzLnN0ZXApIHtcbiAgICBuYWZXID0gMDtcbiAgICBmb3IgKHZhciBsID0gaiArIGRvdWJsZXMuc3RlcCAtIDE7IGwgPj0gajsgbC0tKVxuICAgICAgbmFmVyA9IChuYWZXIDw8IDEpICsgbmFmW2xdO1xuICAgIHJlcHIucHVzaChuYWZXKTtcbiAgfVxuXG4gIHZhciBhID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciBiID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZvciAodmFyIGkgPSBJOyBpID4gMDsgaS0tKSB7XG4gICAgZm9yIChqID0gMDsgaiA8IHJlcHIubGVuZ3RoOyBqKyspIHtcbiAgICAgIG5hZlcgPSByZXByW2pdO1xuICAgICAgaWYgKG5hZlcgPT09IGkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdKTtcbiAgICAgIGVsc2UgaWYgKG5hZlcgPT09IC1pKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXS5uZWcoKSk7XG4gICAgfVxuICAgIGEgPSBhLmFkZChiKTtcbiAgfVxuICByZXR1cm4gYS50b1AoKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWwgPSBmdW5jdGlvbiBfd25hZk11bChwLCBrKSB7XG4gIHZhciB3ID0gNDtcblxuICAvLyBQcmVjb21wdXRlIHdpbmRvd1xuICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKHcpO1xuICB3ID0gbmFmUG9pbnRzLnduZDtcbiAgdmFyIHduZCA9IG5hZlBvaW50cy5wb2ludHM7XG5cbiAgLy8gR2V0IE5BRiBmb3JtXG4gIHZhciBuYWYgPSBnZXROQUYoaywgdywgdGhpcy5fYml0TGVuZ3RoKTtcblxuICAvLyBBZGQgYHRoaXNgKihOKzEpIGZvciBldmVyeSB3LU5BRiBpbmRleFxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZvciAodmFyIGkgPSBuYWYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAvLyBDb3VudCB6ZXJvZXNcbiAgICBmb3IgKHZhciBsID0gMDsgaSA+PSAwICYmIG5hZltpXSA9PT0gMDsgaS0tKVxuICAgICAgbCsrO1xuICAgIGlmIChpID49IDApXG4gICAgICBsKys7XG4gICAgYWNjID0gYWNjLmRibHAobCk7XG5cbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcbiAgICB2YXIgeiA9IG5hZltpXTtcbiAgICBhc3NlcnQoeiAhPT0gMCk7XG4gICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpIHtcbiAgICAgIC8vIEogKy0gUFxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSiArLSBKXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwLnR5cGUgPT09ICdhZmZpbmUnID8gYWNjLnRvUCgpIDogYWNjO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bEFkZCA9IGZ1bmN0aW9uIF93bmFmTXVsQWRkKGRlZlcsXG4gIHBvaW50cyxcbiAgY29lZmZzLFxuICBsZW4sXG4gIGphY29iaWFuUmVzdWx0KSB7XG4gIHZhciB3bmRXaWR0aCA9IHRoaXMuX3duYWZUMTtcbiAgdmFyIHduZCA9IHRoaXMuX3duYWZUMjtcbiAgdmFyIG5hZiA9IHRoaXMuX3duYWZUMztcblxuICAvLyBGaWxsIGFsbCBhcnJheXNcbiAgdmFyIG1heCA9IDA7XG4gIHZhciBpO1xuICB2YXIgajtcbiAgdmFyIHA7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHAgPSBwb2ludHNbaV07XG4gICAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyhkZWZXKTtcbiAgICB3bmRXaWR0aFtpXSA9IG5hZlBvaW50cy53bmQ7XG4gICAgd25kW2ldID0gbmFmUG9pbnRzLnBvaW50cztcbiAgfVxuXG4gIC8vIENvbWIgc21hbGwgd2luZG93IE5BRnNcbiAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAxOyBpIC09IDIpIHtcbiAgICB2YXIgYSA9IGkgLSAxO1xuICAgIHZhciBiID0gaTtcbiAgICBpZiAod25kV2lkdGhbYV0gIT09IDEgfHwgd25kV2lkdGhbYl0gIT09IDEpIHtcbiAgICAgIG5hZlthXSA9IGdldE5BRihjb2VmZnNbYV0sIHduZFdpZHRoW2FdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbmFmW2JdID0gZ2V0TkFGKGNvZWZmc1tiXSwgd25kV2lkdGhbYl0sIHRoaXMuX2JpdExlbmd0aCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYV0ubGVuZ3RoLCBtYXgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2JdLmxlbmd0aCwgbWF4KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjb21iID0gW1xuICAgICAgcG9pbnRzW2FdLCAvKiAxICovXG4gICAgICBudWxsLCAvKiAzICovXG4gICAgICBudWxsLCAvKiA1ICovXG4gICAgICBwb2ludHNbYl0sIC8qIDcgKi9cbiAgICBdO1xuXG4gICAgLy8gVHJ5IHRvIGF2b2lkIFByb2plY3RpdmUgcG9pbnRzLCBpZiBwb3NzaWJsZVxuICAgIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55LnJlZE5lZygpKSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IFtcbiAgICAgIC0zLCAvKiAtMSAtMSAqL1xuICAgICAgLTEsIC8qIC0xIDAgKi9cbiAgICAgIC01LCAvKiAtMSAxICovXG4gICAgICAtNywgLyogMCAtMSAqL1xuICAgICAgMCwgLyogMCAwICovXG4gICAgICA3LCAvKiAwIDEgKi9cbiAgICAgIDUsIC8qIDEgLTEgKi9cbiAgICAgIDEsIC8qIDEgMCAqL1xuICAgICAgMywgIC8qIDEgMSAqL1xuICAgIF07XG5cbiAgICB2YXIganNmID0gZ2V0SlNGKGNvZWZmc1thXSwgY29lZmZzW2JdKTtcbiAgICBtYXggPSBNYXRoLm1heChqc2ZbMF0ubGVuZ3RoLCBtYXgpO1xuICAgIG5hZlthXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIG5hZltiXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIGZvciAoaiA9IDA7IGogPCBtYXg7IGorKykge1xuICAgICAgdmFyIGphID0ganNmWzBdW2pdIHwgMDtcbiAgICAgIHZhciBqYiA9IGpzZlsxXVtqXSB8IDA7XG5cbiAgICAgIG5hZlthXVtqXSA9IGluZGV4WyhqYSArIDEpICogMyArIChqYiArIDEpXTtcbiAgICAgIG5hZltiXVtqXSA9IDA7XG4gICAgICB3bmRbYV0gPSBjb21iO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIHRtcCA9IHRoaXMuX3duYWZUNDtcbiAgZm9yIChpID0gbWF4OyBpID49IDA7IGktLSkge1xuICAgIHZhciBrID0gMDtcblxuICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgIHZhciB6ZXJvID0gdHJ1ZTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgICB0bXBbal0gPSBuYWZbal1baV0gfCAwO1xuICAgICAgICBpZiAodG1wW2pdICE9PSAwKVxuICAgICAgICAgIHplcm8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghemVybylcbiAgICAgICAgYnJlYWs7XG4gICAgICBrKys7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGlmIChpID49IDApXG4gICAgICBrKys7XG4gICAgYWNjID0gYWNjLmRibHAoayk7XG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIHZhciB6ID0gdG1wW2pdO1xuICAgICAgcDtcbiAgICAgIGlmICh6ID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGVsc2UgaWYgKHogPiAwKVxuICAgICAgICBwID0gd25kW2pdWyh6IC0gMSkgPj4gMV07XG4gICAgICBlbHNlIGlmICh6IDwgMClcbiAgICAgICAgcCA9IHduZFtqXVsoLXogLSAxKSA+PiAxXS5uZWcoKTtcblxuICAgICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZChwKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgLy8gWmVyb2lmeSByZWZlcmVuY2VzXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICB3bmRbaV0gPSBudWxsO1xuXG4gIGlmIChqYWNvYmlhblJlc3VsdClcbiAgICByZXR1cm4gYWNjO1xuICBlbHNlXG4gICAgcmV0dXJuIGFjYy50b1AoKTtcbn07XG5cbmZ1bmN0aW9uIEJhc2VQb2ludChjdXJ2ZSwgdHlwZSkge1xuICB0aGlzLmN1cnZlID0gY3VydmU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBudWxsO1xufVxuQmFzZUN1cnZlLkJhc2VQb2ludCA9IEJhc2VQb2ludDtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKC8qb3RoZXIqLykge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS52YWxpZGF0ZSh0aGlzKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIGJ5dGVzID0gdXRpbHMudG9BcnJheShieXRlcywgZW5jKTtcblxuICB2YXIgbGVuID0gdGhpcy5wLmJ5dGVMZW5ndGgoKTtcblxuICAvLyB1bmNvbXByZXNzZWQsIGh5YnJpZC1vZGQsIGh5YnJpZC1ldmVuXG4gIGlmICgoYnl0ZXNbMF0gPT09IDB4MDQgfHwgYnl0ZXNbMF0gPT09IDB4MDYgfHwgYnl0ZXNbMF0gPT09IDB4MDcpICYmXG4gICAgICBieXRlcy5sZW5ndGggLSAxID09PSAyICogbGVuKSB7XG4gICAgaWYgKGJ5dGVzWzBdID09PSAweDA2KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMCk7XG4gICAgZWxzZSBpZiAoYnl0ZXNbMF0gPT09IDB4MDcpXG4gICAgICBhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gJSAyID09PSAxKTtcblxuICAgIHZhciByZXMgPSAgdGhpcy5wb2ludChieXRlcy5zbGljZSgxLCAxICsgbGVuKSxcbiAgICAgIGJ5dGVzLnNsaWNlKDEgKyBsZW4sIDEgKyAyICogbGVuKSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKChieXRlc1swXSA9PT0gMHgwMiB8fCBieXRlc1swXSA9PT0gMHgwMykgJiZcbiAgICAgICAgICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gbGVuKSB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRGcm9tWChieXRlcy5zbGljZSgxLCAxICsgbGVuKSwgYnl0ZXNbMF0gPT09IDB4MDMpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwb2ludCBmb3JtYXQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlQ29tcHJlc3NlZCA9IGZ1bmN0aW9uIGVuY29kZUNvbXByZXNzZWQoZW5jKSB7XG4gIHJldHVybiB0aGlzLmVuY29kZShlbmMsIHRydWUpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZShjb21wYWN0KSB7XG4gIHZhciBsZW4gPSB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpO1xuICB2YXIgeCA9IHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgbGVuKTtcblxuICBpZiAoY29tcGFjdClcbiAgICByZXR1cm4gWyB0aGlzLmdldFkoKS5pc0V2ZW4oKSA/IDB4MDIgOiAweDAzIF0uY29uY2F0KHgpO1xuXG4gIHJldHVybiBbIDB4MDQgXS5jb25jYXQoeCwgdGhpcy5nZXRZKCkudG9BcnJheSgnYmUnLCBsZW4pKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGVuYywgY29tcGFjdCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuX2VuY29kZShjb21wYWN0KSwgZW5jKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUocG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHByZWNvbXB1dGVkID0ge1xuICAgIGRvdWJsZXM6IG51bGwsXG4gICAgbmFmOiBudWxsLFxuICAgIGJldGE6IG51bGwsXG4gIH07XG4gIHByZWNvbXB1dGVkLm5hZiA9IHRoaXMuX2dldE5BRlBvaW50cyg4KTtcbiAgcHJlY29tcHV0ZWQuZG91YmxlcyA9IHRoaXMuX2dldERvdWJsZXMoNCwgcG93ZXIpO1xuICBwcmVjb21wdXRlZC5iZXRhID0gdGhpcy5fZ2V0QmV0YSgpO1xuICB0aGlzLnByZWNvbXB1dGVkID0gcHJlY29tcHV0ZWQ7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9oYXNEb3VibGVzID0gZnVuY3Rpb24gX2hhc0RvdWJsZXMoaykge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBkb3VibGVzID0gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuICBpZiAoIWRvdWJsZXMpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb3VibGVzLnBvaW50cy5sZW5ndGggPj0gTWF0aC5jZWlsKChrLmJpdExlbmd0aCgpICsgMSkgLyBkb3VibGVzLnN0ZXApO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0RG91YmxlcyA9IGZ1bmN0aW9uIF9nZXREb3VibGVzKHN0ZXAsIHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuXG4gIHZhciBkb3VibGVzID0gWyB0aGlzIF07XG4gIHZhciBhY2MgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvd2VyOyBpICs9IHN0ZXApIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ZXA7IGorKylcbiAgICAgIGFjYyA9IGFjYy5kYmwoKTtcbiAgICBkb3VibGVzLnB1c2goYWNjKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXA6IHN0ZXAsXG4gICAgcG9pbnRzOiBkb3VibGVzLFxuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzID0gZnVuY3Rpb24gX2dldE5BRlBvaW50cyh3bmQpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5uYWYpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQubmFmO1xuXG4gIHZhciByZXMgPSBbIHRoaXMgXTtcbiAgdmFyIG1heCA9ICgxIDw8IHduZCkgLSAxO1xuICB2YXIgZGJsID0gbWF4ID09PSAxID8gbnVsbCA6IHRoaXMuZGJsKCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbWF4OyBpKyspXG4gICAgcmVzW2ldID0gcmVzW2kgLSAxXS5hZGQoZGJsKTtcbiAgcmV0dXJuIHtcbiAgICB3bmQ6IHduZCxcbiAgICBwb2ludHM6IHJlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKGspIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGs7IGkrKylcbiAgICByID0gci5kYmwoKTtcbiAgcmV0dXJuIHI7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNob3J0Q3VydmUoY29uZikge1xuICBCYXNlLmNhbGwodGhpcywgJ3Nob3J0JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50aW52ID0gdGhpcy50d28ucmVkSW52bSgpO1xuXG4gIHRoaXMuemVyb0EgPSB0aGlzLmEuZnJvbVJlZCgpLmNtcG4oMCkgPT09IDA7XG4gIHRoaXMudGhyZWVBID0gdGhpcy5hLmZyb21SZWQoKS5zdWIodGhpcy5wKS5jbXBuKC0zKSA9PT0gMDtcblxuICAvLyBJZiB0aGUgY3VydmUgaXMgZW5kb21vcnBoaWMsIHByZWNhbGN1bGF0ZSBiZXRhIGFuZCBsYW1iZGFcbiAgdGhpcy5lbmRvID0gdGhpcy5fZ2V0RW5kb21vcnBoaXNtKGNvbmYpO1xuICB0aGlzLl9lbmRvV25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl9lbmRvV25hZlQyID0gbmV3IEFycmF5KDQpO1xufVxuaW5oZXJpdHMoU2hvcnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IFNob3J0Q3VydmU7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvbW9ycGhpc20gPSBmdW5jdGlvbiBfZ2V0RW5kb21vcnBoaXNtKGNvbmYpIHtcbiAgLy8gTm8gZWZmaWNpZW50IGVuZG9tb3JwaGlzbVxuICBpZiAoIXRoaXMuemVyb0EgfHwgIXRoaXMuZyB8fCAhdGhpcy5uIHx8IHRoaXMucC5tb2RuKDMpICE9PSAxKVxuICAgIHJldHVybjtcblxuICAvLyBDb21wdXRlIGJldGEgYW5kIGxhbWJkYSwgdGhhdCBsYW1iZGEgKiBQID0gKGJldGEgKiBQeDsgUHkpXG4gIHZhciBiZXRhO1xuICB2YXIgbGFtYmRhO1xuICBpZiAoY29uZi5iZXRhKSB7XG4gICAgYmV0YSA9IG5ldyBCTihjb25mLmJldGEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJldGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMucCk7XG4gICAgLy8gQ2hvb3NlIHRoZSBzbWFsbGVzdCBiZXRhXG4gICAgYmV0YSA9IGJldGFzWzBdLmNtcChiZXRhc1sxXSkgPCAwID8gYmV0YXNbMF0gOiBiZXRhc1sxXTtcbiAgICBiZXRhID0gYmV0YS50b1JlZCh0aGlzLnJlZCk7XG4gIH1cbiAgaWYgKGNvbmYubGFtYmRhKSB7XG4gICAgbGFtYmRhID0gbmV3IEJOKGNvbmYubGFtYmRhLCAxNik7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2hvb3NlIHRoZSBsYW1iZGEgdGhhdCBpcyBtYXRjaGluZyBzZWxlY3RlZCBiZXRhXG4gICAgdmFyIGxhbWJkYXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5uKTtcbiAgICBpZiAodGhpcy5nLm11bChsYW1iZGFzWzBdKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoYmV0YSkpID09PSAwKSB7XG4gICAgICBsYW1iZGEgPSBsYW1iZGFzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYW1iZGEgPSBsYW1iZGFzWzFdO1xuICAgICAgYXNzZXJ0KHRoaXMuZy5tdWwobGFtYmRhKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoYmV0YSkpID09PSAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgYmFzaXMgdmVjdG9ycywgdXNlZCBmb3IgYmFsYW5jZWQgbGVuZ3RoLXR3byByZXByZXNlbnRhdGlvblxuICB2YXIgYmFzaXM7XG4gIGlmIChjb25mLmJhc2lzKSB7XG4gICAgYmFzaXMgPSBjb25mLmJhc2lzLm1hcChmdW5jdGlvbih2ZWMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGE6IG5ldyBCTih2ZWMuYSwgMTYpLFxuICAgICAgICBiOiBuZXcgQk4odmVjLmIsIDE2KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYmFzaXMgPSB0aGlzLl9nZXRFbmRvQmFzaXMobGFtYmRhKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmV0YTogYmV0YSxcbiAgICBsYW1iZGE6IGxhbWJkYSxcbiAgICBiYXNpczogYmFzaXMsXG4gIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzID0gZnVuY3Rpb24gX2dldEVuZG9Sb290cyhudW0pIHtcbiAgLy8gRmluZCByb290cyBvZiBmb3IgeF4yICsgeCArIDEgaW4gRlxuICAvLyBSb290ID0gKC0xICstIFNxcnQoLTMpKSAvIDJcbiAgLy9cbiAgdmFyIHJlZCA9IG51bSA9PT0gdGhpcy5wID8gdGhpcy5yZWQgOiBCTi5tb250KG51bSk7XG4gIHZhciB0aW52ID0gbmV3IEJOKDIpLnRvUmVkKHJlZCkucmVkSW52bSgpO1xuICB2YXIgbnRpbnYgPSB0aW52LnJlZE5lZygpO1xuXG4gIHZhciBzID0gbmV3IEJOKDMpLnRvUmVkKHJlZCkucmVkTmVnKCkucmVkU3FydCgpLnJlZE11bCh0aW52KTtcblxuICB2YXIgbDEgPSBudGludi5yZWRBZGQocykuZnJvbVJlZCgpO1xuICB2YXIgbDIgPSBudGludi5yZWRTdWIocykuZnJvbVJlZCgpO1xuICByZXR1cm4gWyBsMSwgbDIgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvQmFzaXMgPSBmdW5jdGlvbiBfZ2V0RW5kb0Jhc2lzKGxhbWJkYSkge1xuICAvLyBhcHJ4U3FydCA+PSBzcXJ0KHRoaXMubilcbiAgdmFyIGFwcnhTcXJ0ID0gdGhpcy5uLnVzaHJuKE1hdGguZmxvb3IodGhpcy5uLmJpdExlbmd0aCgpIC8gMikpO1xuXG4gIC8vIDMuNzRcbiAgLy8gUnVuIEVHQ0QsIHVudGlsIHIoTCArIDEpIDwgYXByeFNxcnRcbiAgdmFyIHUgPSBsYW1iZGE7XG4gIHZhciB2ID0gdGhpcy5uLmNsb25lKCk7XG4gIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgdmFyIHkxID0gbmV3IEJOKDApO1xuICB2YXIgeDIgPSBuZXcgQk4oMCk7XG4gIHZhciB5MiA9IG5ldyBCTigxKTtcblxuICAvLyBOT1RFOiBhbGwgdmVjdG9ycyBhcmUgcm9vdHMgb2Y6IGEgKyBiICogbGFtYmRhID0gMCAobW9kIG4pXG4gIHZhciBhMDtcbiAgdmFyIGIwO1xuICAvLyBGaXJzdCB2ZWN0b3JcbiAgdmFyIGExO1xuICB2YXIgYjE7XG4gIC8vIFNlY29uZCB2ZWN0b3JcbiAgdmFyIGEyO1xuICB2YXIgYjI7XG5cbiAgdmFyIHByZXZSO1xuICB2YXIgaSA9IDA7XG4gIHZhciByO1xuICB2YXIgeDtcbiAgd2hpbGUgKHUuY21wbigwKSAhPT0gMCkge1xuICAgIHZhciBxID0gdi5kaXYodSk7XG4gICAgciA9IHYuc3ViKHEubXVsKHUpKTtcbiAgICB4ID0geDIuc3ViKHEubXVsKHgxKSk7XG4gICAgdmFyIHkgPSB5Mi5zdWIocS5tdWwoeTEpKTtcblxuICAgIGlmICghYTEgJiYgci5jbXAoYXByeFNxcnQpIDwgMCkge1xuICAgICAgYTAgPSBwcmV2Ui5uZWcoKTtcbiAgICAgIGIwID0geDE7XG4gICAgICBhMSA9IHIubmVnKCk7XG4gICAgICBiMSA9IHg7XG4gICAgfSBlbHNlIGlmIChhMSAmJiArK2kgPT09IDIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2UiA9IHI7XG5cbiAgICB2ID0gdTtcbiAgICB1ID0gcjtcbiAgICB4MiA9IHgxO1xuICAgIHgxID0geDtcbiAgICB5MiA9IHkxO1xuICAgIHkxID0geTtcbiAgfVxuICBhMiA9IHIubmVnKCk7XG4gIGIyID0geDtcblxuICB2YXIgbGVuMSA9IGExLnNxcigpLmFkZChiMS5zcXIoKSk7XG4gIHZhciBsZW4yID0gYTIuc3FyKCkuYWRkKGIyLnNxcigpKTtcbiAgaWYgKGxlbjIuY21wKGxlbjEpID49IDApIHtcbiAgICBhMiA9IGEwO1xuICAgIGIyID0gYjA7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgc2lnbnNcbiAgaWYgKGExLm5lZ2F0aXZlKSB7XG4gICAgYTEgPSBhMS5uZWcoKTtcbiAgICBiMSA9IGIxLm5lZygpO1xuICB9XG4gIGlmIChhMi5uZWdhdGl2ZSkge1xuICAgIGEyID0gYTIubmVnKCk7XG4gICAgYjIgPSBiMi5uZWcoKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyBhOiBhMSwgYjogYjEgfSxcbiAgICB7IGE6IGEyLCBiOiBiMiB9LFxuICBdO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2VuZG9TcGxpdCA9IGZ1bmN0aW9uIF9lbmRvU3BsaXQoaykge1xuICB2YXIgYmFzaXMgPSB0aGlzLmVuZG8uYmFzaXM7XG4gIHZhciB2MSA9IGJhc2lzWzBdO1xuICB2YXIgdjIgPSBiYXNpc1sxXTtcblxuICB2YXIgYzEgPSB2Mi5iLm11bChrKS5kaXZSb3VuZCh0aGlzLm4pO1xuICB2YXIgYzIgPSB2MS5iLm5lZygpLm11bChrKS5kaXZSb3VuZCh0aGlzLm4pO1xuXG4gIHZhciBwMSA9IGMxLm11bCh2MS5hKTtcbiAgdmFyIHAyID0gYzIubXVsKHYyLmEpO1xuICB2YXIgcTEgPSBjMS5tdWwodjEuYik7XG4gIHZhciBxMiA9IGMyLm11bCh2Mi5iKTtcblxuICAvLyBDYWxjdWxhdGUgYW5zd2VyXG4gIHZhciBrMSA9IGsuc3ViKHAxKS5zdWIocDIpO1xuICB2YXIgazIgPSBxMS5hZGQocTIpLm5lZygpO1xuICByZXR1cm4geyBrMTogazEsIGsyOiBrMiB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeTIgPSB4LnJlZFNxcigpLnJlZE11bCh4KS5yZWRJQWRkKHgucmVkTXVsKHRoaXMuYSkpLnJlZElBZGQodGhpcy5iKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgLy8gWFhYIElzIHRoZXJlIGFueSB3YXkgdG8gdGVsbCBpZiB0aGUgbnVtYmVyIGlzIG9kZCB3aXRob3V0IGNvbnZlcnRpbmcgaXRcbiAgLy8gdG8gbm9uLXJlZCBmb3JtP1xuICB2YXIgaXNPZGQgPSB5LmZyb21SZWQoKS5pc09kZCgpO1xuICBpZiAob2RkICYmICFpc09kZCB8fCAhb2RkICYmIGlzT2RkKVxuICAgIHkgPSB5LnJlZE5lZygpO1xuXG4gIHJldHVybiB0aGlzLnBvaW50KHgsIHkpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICBpZiAocG9pbnQuaW5mKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4ID0gcG9pbnQueDtcbiAgdmFyIHkgPSBwb2ludC55O1xuXG4gIHZhciBheCA9IHRoaXMuYS5yZWRNdWwoeCk7XG4gIHZhciByaHMgPSB4LnJlZFNxcigpLnJlZE11bCh4KS5yZWRJQWRkKGF4KS5yZWRJQWRkKHRoaXMuYik7XG4gIHJldHVybiB5LnJlZFNxcigpLnJlZElTdWIocmhzKS5jbXBuKDApID09PSAwO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2VuZG9XbmFmTXVsQWRkID1cbiAgICBmdW5jdGlvbiBfZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMsIGphY29iaWFuUmVzdWx0KSB7XG4gICAgICB2YXIgbnBvaW50cyA9IHRoaXMuX2VuZG9XbmFmVDE7XG4gICAgICB2YXIgbmNvZWZmcyA9IHRoaXMuX2VuZG9XbmFmVDI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3BsaXQgPSB0aGlzLl9lbmRvU3BsaXQoY29lZmZzW2ldKTtcbiAgICAgICAgdmFyIHAgPSBwb2ludHNbaV07XG4gICAgICAgIHZhciBiZXRhID0gcC5fZ2V0QmV0YSgpO1xuXG4gICAgICAgIGlmIChzcGxpdC5rMS5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsxLmluZWcoKTtcbiAgICAgICAgICBwID0gcC5uZWcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwbGl0LmsyLm5lZ2F0aXZlKSB7XG4gICAgICAgICAgc3BsaXQuazIuaW5lZygpO1xuICAgICAgICAgIGJldGEgPSBiZXRhLm5lZyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5wb2ludHNbaSAqIDJdID0gcDtcbiAgICAgICAgbnBvaW50c1tpICogMiArIDFdID0gYmV0YTtcbiAgICAgICAgbmNvZWZmc1tpICogMl0gPSBzcGxpdC5rMTtcbiAgICAgICAgbmNvZWZmc1tpICogMiArIDFdID0gc3BsaXQuazI7XG4gICAgICB9XG4gICAgICB2YXIgcmVzID0gdGhpcy5fd25hZk11bEFkZCgxLCBucG9pbnRzLCBuY29lZmZzLCBpICogMiwgamFjb2JpYW5SZXN1bHQpO1xuXG4gICAgICAvLyBDbGVhbi11cCByZWZlcmVuY2VzIHRvIHBvaW50cyBhbmQgY29lZmZpY2llbnRzXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGkgKiAyOyBqKyspIHtcbiAgICAgICAgbnBvaW50c1tqXSA9IG51bGw7XG4gICAgICAgIG5jb2VmZnNbal0gPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgaXNSZWQpIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2FmZmluZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gbnVsbDtcbiAgICB0aGlzLnkgPSBudWxsO1xuICAgIHRoaXMuaW5mID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgLy8gRm9yY2UgcmVkZ29tZXJ5IHJlcHJlc2VudGF0aW9uIHdoZW4gbG9hZGluZyBmcm9tIEpTT05cbiAgICBpZiAoaXNSZWQpIHtcbiAgICAgIHRoaXMueC5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgICB0aGlzLnkuZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy55LnJlZClcbiAgICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy5pbmYgPSBmYWxzZTtcbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB5LCBpc1JlZCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIGlzUmVkKTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaiwgcmVkKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmosIHJlZCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuO1xuXG4gIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICBpZiAocHJlICYmIHByZS5iZXRhKVxuICAgIHJldHVybiBwcmUuYmV0YTtcblxuICB2YXIgYmV0YSA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE11bCh0aGlzLmN1cnZlLmVuZG8uYmV0YSksIHRoaXMueSk7XG4gIGlmIChwcmUpIHtcbiAgICB2YXIgY3VydmUgPSB0aGlzLmN1cnZlO1xuICAgIHZhciBlbmRvTXVsID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIGN1cnZlLnBvaW50KHAueC5yZWRNdWwoY3VydmUuZW5kby5iZXRhKSwgcC55KTtcbiAgICB9O1xuICAgIHByZS5iZXRhID0gYmV0YTtcbiAgICBiZXRhLnByZWNvbXB1dGVkID0ge1xuICAgICAgYmV0YTogbnVsbCxcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKGVuZG9NdWwpLFxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKGVuZG9NdWwpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBiZXRhO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBbIHRoaXMueCwgdGhpcy55IF07XG5cbiAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnksIHRoaXMucHJlY29tcHV0ZWQgJiYge1xuICAgIGRvdWJsZXM6IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnBvaW50cy5zbGljZSgxKSxcbiAgICB9LFxuICAgIG5hZjogdGhpcy5wcmVjb21wdXRlZC5uYWYgJiYge1xuICAgICAgd25kOiB0aGlzLnByZWNvbXB1dGVkLm5hZi53bmQsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQubmFmLnBvaW50cy5zbGljZSgxKSxcbiAgICB9LFxuICB9IF07XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmosIHJlZCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgb2JqID0gSlNPTi5wYXJzZShvYmopO1xuICB2YXIgcmVzID0gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIGlmICghb2JqWzJdKVxuICAgIHJldHVybiByZXM7XG5cbiAgZnVuY3Rpb24gb2JqMnBvaW50KG9iaikge1xuICAgIHJldHVybiBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgfVxuXG4gIHZhciBwcmUgPSBvYmpbMl07XG4gIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICBiZXRhOiBudWxsLFxuICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5kb3VibGVzLnBvaW50cy5tYXAob2JqMnBvaW50KSksXG4gICAgfSxcbiAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLm5hZi5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gIH07XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIHJldHVybiB0aGlzLmluZjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gUCArIFAgPSAyUFxuICBpZiAodGhpcy5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICAvLyBQICsgKC1QKSA9IE9cbiAgaWYgKHRoaXMubmVnKCkuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgLy8gUCArIFEgPSBPXG4gIGlmICh0aGlzLnguY21wKHAueCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGMgPSB0aGlzLnkucmVkU3ViKHAueSk7XG4gIGlmIChjLmNtcG4oMCkgIT09IDApXG4gICAgYyA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIocC54KS5yZWRJbnZtKCkpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54KS5yZWRJU3ViKHAueCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMlAgPSBPXG4gIHZhciB5czEgPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIGlmICh5czEuY21wbigwKSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICB2YXIgeDIgPSB0aGlzLngucmVkU3FyKCk7XG4gIHZhciBkeWludiA9IHlzMS5yZWRJbnZtKCk7XG4gIHZhciBjID0geDIucmVkQWRkKHgyKS5yZWRJQWRkKHgyKS5yZWRJQWRkKGEpLnJlZE11bChkeWludik7XG5cbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiBnZXRZKCkge1xuICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBrID0gbmV3IEJOKGssIDE2KTtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBlbHNlIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChbIHRoaXMgXSwgWyBrIF0pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIHJldHVybiB0aGlzID09PSBwIHx8XG4gICAgICAgICB0aGlzLmluZiA9PT0gcC5pbmYgJiZcbiAgICAgICAgICAgICAodGhpcy5pbmYgfHwgdGhpcy54LmNtcChwLngpID09PSAwICYmIHRoaXMueS5jbXAocC55KSA9PT0gMCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKF9wcmVjb21wdXRlKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7XG4gIGlmIChfcHJlY29tcHV0ZSAmJiB0aGlzLnByZWNvbXB1dGVkKSB7XG4gICAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gICAgdmFyIG5lZ2F0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBwLm5lZygpO1xuICAgIH07XG4gICAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChuZWdhdGUpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24gdG9KKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy5jdXJ2ZS5vbmUpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gSlBvaW50KGN1cnZlLCB4LCB5LCB6KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdqYWNvYmlhbicpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSBuZXcgQk4oMCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gIH1cbiAgaWYgKCF0aGlzLngucmVkKVxuICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy55LnJlZClcbiAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMuei5yZWQpXG4gICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcblxuICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xufVxuaW5oZXJpdHMoSlBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLmpwb2ludCA9IGZ1bmN0aW9uIGpwb2ludCh4LCB5LCB6KSB7XG4gIHJldHVybiBuZXcgSlBvaW50KHRoaXMsIHgsIHksIHopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50b1AgPSBmdW5jdGlvbiB0b1AoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgemludiA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHZhciB6aW52MiA9IHppbnYucmVkU3FyKCk7XG4gIHZhciBheCA9IHRoaXMueC5yZWRNdWwoemludjIpO1xuICB2YXIgYXkgPSB0aGlzLnkucmVkTXVsKHppbnYyKS5yZWRNdWwoemludik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQoYXgsIGF5KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCksIHRoaXMueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAxMk0gKyA0UyArIDdBXG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54LnJlZE11bChwejIpO1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55LnJlZE11bChwejIucmVkTXVsKHAueikpO1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyLnJlZE11bCh0aGlzLnopKTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChwLnopLnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm1peGVkQWRkID0gZnVuY3Rpb24gbWl4ZWRBZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwLnRvSigpO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gOE0gKyAzUyArIDdBXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54O1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55O1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyKS5yZWRNdWwodGhpcy56KTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKHBvdykge1xuICBpZiAocG93ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICghcG93KVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIHZhciBpO1xuICBpZiAodGhpcy5jdXJ2ZS56ZXJvQSB8fCB0aGlzLmN1cnZlLnRocmVlQSkge1xuICAgIHZhciByID0gdGhpcztcbiAgICBmb3IgKGkgPSAwOyBpIDwgcG93OyBpKyspXG4gICAgICByID0gci5kYmwoKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIDFNICsgMlMgKyAxQSArIE4gKiAoNFMgKyA1TSArIDhBKVxuICAvLyBOID0gMSA9PiA2TSArIDZTICsgOUFcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG4gIHZhciB0aW52ID0gdGhpcy5jdXJ2ZS50aW52O1xuXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICAvLyBSZXVzZSByZXN1bHRzXG4gIHZhciBqeWQgPSBqeS5yZWRBZGQoankpO1xuICBmb3IgKGkgPSAwOyBpIDwgcG93OyBpKyspIHtcbiAgICB2YXIgangyID0gangucmVkU3FyKCk7XG4gICAgdmFyIGp5ZDIgPSBqeWQucmVkU3FyKCk7XG4gICAgdmFyIGp5ZDQgPSBqeWQyLnJlZFNxcigpO1xuICAgIHZhciBjID0gangyLnJlZEFkZChqeDIpLnJlZElBZGQoangyKS5yZWRJQWRkKGEucmVkTXVsKGp6NCkpO1xuXG4gICAgdmFyIHQxID0gangucmVkTXVsKGp5ZDIpO1xuICAgIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgICB2YXIgdDIgPSB0MS5yZWRJU3ViKG54KTtcbiAgICB2YXIgZG55ID0gYy5yZWRNdWwodDIpO1xuICAgIGRueSA9IGRueS5yZWRJQWRkKGRueSkucmVkSVN1YihqeWQ0KTtcbiAgICB2YXIgbnogPSBqeWQucmVkTXVsKGp6KTtcbiAgICBpZiAoaSArIDEgPCBwb3cpXG4gICAgICBqejQgPSBqejQucmVkTXVsKGp5ZDQpO1xuXG4gICAganggPSBueDtcbiAgICBqeiA9IG56O1xuICAgIGp5ZCA9IGRueTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChqeCwganlkLnJlZE11bCh0aW52KSwganopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5femVyb0RibCgpO1xuICBlbHNlIGlmICh0aGlzLmN1cnZlLnRocmVlQSlcbiAgICByZXR1cm4gdGhpcy5fdGhyZWVEYmwoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9kYmwoKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3plcm9EYmwgPSBmdW5jdGlvbiBfemVyb0RibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTRBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYTsgYSA9IDBcbiAgICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gICAgLy8gVCA9IE0gXiAyIC0gMipTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcblxuICAgIC8vIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcblxuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyKlkxXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA5LWxcbiAgICAvLyAyTSArIDVTICsgMTNBXG5cbiAgICAvLyBBID0gWDFeMlxuICAgIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIEIgPSBZMV4yXG4gICAgdmFyIGIgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gQyA9IEJeMlxuICAgIHZhciBjID0gYi5yZWRTcXIoKTtcbiAgICAvLyBEID0gMiAqICgoWDEgKyBCKV4yIC0gQSAtIEMpXG4gICAgdmFyIGQgPSB0aGlzLngucmVkQWRkKGIpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihjKTtcbiAgICBkID0gZC5yZWRJQWRkKGQpO1xuICAgIC8vIEUgPSAzICogQVxuICAgIHZhciBlID0gYS5yZWRBZGQoYSkucmVkSUFkZChhKTtcbiAgICAvLyBGID0gRV4yXG4gICAgdmFyIGYgPSBlLnJlZFNxcigpO1xuXG4gICAgLy8gOCAqIENcbiAgICB2YXIgYzggPSBjLnJlZElBZGQoYyk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuXG4gICAgLy8gWDMgPSBGIC0gMiAqIERcbiAgICBueCA9IGYucmVkSVN1YihkKS5yZWRJU3ViKGQpO1xuICAgIC8vIFkzID0gRSAqIChEIC0gWDMpIC0gOCAqIENcbiAgICBueSA9IGUucmVkTXVsKGQucmVkSVN1YihueCkpLnJlZElTdWIoYzgpO1xuICAgIC8vIFozID0gMiAqIFkxICogWjFcbiAgICBueiA9IHRoaXMueS5yZWRNdWwodGhpcy56KTtcbiAgICBueiA9IG56LnJlZElBZGQobnopO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fdGhyZWVEYmwgPSBmdW5jdGlvbiBfdGhyZWVEYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE1QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGFcbiAgICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCkucmVkSUFkZCh0aGlzLmN1cnZlLmEpO1xuICAgIC8vIFQgPSBNXjIgLSAyICogU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMiAqIFkxXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWwjZG91YmxpbmctZGJsLTIwMDEtYlxuICAgIC8vIDNNICsgNVNcblxuICAgIC8vIGRlbHRhID0gWjFeMlxuICAgIHZhciBkZWx0YSA9IHRoaXMuei5yZWRTcXIoKTtcbiAgICAvLyBnYW1tYSA9IFkxXjJcbiAgICB2YXIgZ2FtbWEgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gYmV0YSA9IFgxICogZ2FtbWFcbiAgICB2YXIgYmV0YSA9IHRoaXMueC5yZWRNdWwoZ2FtbWEpO1xuICAgIC8vIGFscGhhID0gMyAqIChYMSAtIGRlbHRhKSAqIChYMSArIGRlbHRhKVxuICAgIHZhciBhbHBoYSA9IHRoaXMueC5yZWRTdWIoZGVsdGEpLnJlZE11bCh0aGlzLngucmVkQWRkKGRlbHRhKSk7XG4gICAgYWxwaGEgPSBhbHBoYS5yZWRBZGQoYWxwaGEpLnJlZElBZGQoYWxwaGEpO1xuICAgIC8vIFgzID0gYWxwaGFeMiAtIDggKiBiZXRhXG4gICAgdmFyIGJldGE0ID0gYmV0YS5yZWRJQWRkKGJldGEpO1xuICAgIGJldGE0ID0gYmV0YTQucmVkSUFkZChiZXRhNCk7XG4gICAgdmFyIGJldGE4ID0gYmV0YTQucmVkQWRkKGJldGE0KTtcbiAgICBueCA9IGFscGhhLnJlZFNxcigpLnJlZElTdWIoYmV0YTgpO1xuICAgIC8vIFozID0gKFkxICsgWjEpXjIgLSBnYW1tYSAtIGRlbHRhXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihnYW1tYSkucmVkSVN1YihkZWx0YSk7XG4gICAgLy8gWTMgPSBhbHBoYSAqICg0ICogYmV0YSAtIFgzKSAtIDggKiBnYW1tYV4yXG4gICAgdmFyIGdnYW1tYTggPSBnYW1tYS5yZWRTcXIoKTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBueSA9IGFscGhhLnJlZE11bChiZXRhNC5yZWRJU3ViKG54KSkucmVkSVN1YihnZ2FtbWE4KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX2RibCA9IGZ1bmN0aW9uIF9kYmwoKSB7XG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIC8vIDRNICsgNlMgKyAxMEFcbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgdmFyIGp5MiA9IGp5LnJlZFNxcigpO1xuXG4gIHZhciBjID0gangyLnJlZEFkZChqeDIpLnJlZElBZGQoangyKS5yZWRJQWRkKGEucmVkTXVsKGp6NCkpO1xuXG4gIHZhciBqeGQ0ID0gangucmVkQWRkKGp4KTtcbiAganhkNCA9IGp4ZDQucmVkSUFkZChqeGQ0KTtcbiAgdmFyIHQxID0ganhkNC5yZWRNdWwoankyKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICB2YXIgdDIgPSB0MS5yZWRJU3ViKG54KTtcblxuICB2YXIganlkOCA9IGp5Mi5yZWRTcXIoKTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodDIpLnJlZElTdWIoanlkOCk7XG4gIHZhciBueiA9IGp5LnJlZEFkZChqeSkucmVkTXVsKGp6KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRycGwgPSBmdW5jdGlvbiB0cnBsKCkge1xuICBpZiAoIXRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCkuYWRkKHRoaXMpO1xuXG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sI3RyaXBsaW5nLXRwbC0yMDA3LWJsXG4gIC8vIDVNICsgMTBTICsgLi4uXG5cbiAgLy8gWFggPSBYMV4yXG4gIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gWVkgPSBZMV4yXG4gIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gWlogPSBaMV4yXG4gIHZhciB6eiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgLy8gWVlZWSA9IFlZXjJcbiAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgLy8gTSA9IDMgKiBYWCArIGEgKiBaWjI7IGEgPSAwXG4gIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgLy8gTU0gPSBNXjJcbiAgdmFyIG1tID0gbS5yZWRTcXIoKTtcbiAgLy8gRSA9IDYgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpIC0gTU1cbiAgdmFyIGUgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICBlID0gZS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRBZGQoZSkucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkSVN1YihtbSk7XG4gIC8vIEVFID0gRV4yXG4gIHZhciBlZSA9IGUucmVkU3FyKCk7XG4gIC8vIFQgPSAxNipZWVlZXG4gIHZhciB0ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICAvLyBVID0gKE0gKyBFKV4yIC0gTU0gLSBFRSAtIFRcbiAgdmFyIHUgPSBtLnJlZElBZGQoZSkucmVkU3FyKCkucmVkSVN1YihtbSkucmVkSVN1YihlZSkucmVkSVN1Yih0KTtcbiAgLy8gWDMgPSA0ICogKFgxICogRUUgLSA0ICogWVkgKiBVKVxuICB2YXIgeXl1NCA9IHl5LnJlZE11bCh1KTtcbiAgeXl1NCA9IHl5dTQucmVkSUFkZCh5eXU0KTtcbiAgeXl1NCA9IHl5dTQucmVkSUFkZCh5eXU0KTtcbiAgdmFyIG54ID0gdGhpcy54LnJlZE11bChlZSkucmVkSVN1Yih5eXU0KTtcbiAgbnggPSBueC5yZWRJQWRkKG54KTtcbiAgbnggPSBueC5yZWRJQWRkKG54KTtcbiAgLy8gWTMgPSA4ICogWTEgKiAoVSAqIChUIC0gVSkgLSBFICogRUUpXG4gIHZhciBueSA9IHRoaXMueS5yZWRNdWwodS5yZWRNdWwodC5yZWRJU3ViKHUpKS5yZWRJU3ViKGUucmVkTXVsKGVlKSkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICAvLyBaMyA9IChaMSArIEUpXjIgLSBaWiAtIEVFXG4gIHZhciBueiA9IHRoaXMuei5yZWRBZGQoZSkucmVkU3FyKCkucmVkSVN1Yih6eikucmVkSVN1YihlZSk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaywga2Jhc2UpIHtcbiAgayA9IG5ldyBCTihrLCBrYmFzZSk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICByZXR1cm4gdGhpcy5lcShwLnRvSigpKTtcblxuICBpZiAodGhpcyA9PT0gcClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyB4MSAqIHoyXjIgPT0geDIgKiB6MV4yXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgaWYgKHRoaXMueC5yZWRNdWwocHoyKS5yZWRJU3ViKHAueC5yZWRNdWwoejIpKS5jbXBuKDApICE9PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyB5MSAqIHoyXjMgPT0geTIgKiB6MV4zXG4gIHZhciB6MyA9IHoyLnJlZE11bCh0aGlzLnopO1xuICB2YXIgcHozID0gcHoyLnJlZE11bChwLnopO1xuICByZXR1cm4gdGhpcy55LnJlZE11bChwejMpLnJlZElTdWIocC55LnJlZE11bCh6MykpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmVxWFRvUCA9IGZ1bmN0aW9uIGVxWFRvUCh4KSB7XG4gIHZhciB6cyA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHpzKTtcbiAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4YyA9IHguY2xvbmUoKTtcbiAgdmFyIHQgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHpzKTtcbiAgZm9yICg7Oykge1xuICAgIHhjLmlhZGQodGhpcy5jdXJ2ZS5uKTtcbiAgICBpZiAoeGMuY21wKHRoaXMuY3VydmUucCkgPj0gMClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJ4LnJlZElBZGQodCk7XG4gICAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbkpQb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBKUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgSlBvaW50IHg6ICcgKyB0aGlzLngudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB6OiAnICsgdGhpcy56LnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIC8vIFhYWCBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHplcm8gaXMgYWx3YXlzIHplcm8gaW4gcmVkXG4gIHJldHVybiB0aGlzLnouY21wbigwKSA9PT0gMDtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBNb250Q3VydmUoY29uZikge1xuICBCYXNlLmNhbGwodGhpcywgJ21vbnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmk0ID0gbmV3IEJOKDQpLnRvUmVkKHRoaXMucmVkKS5yZWRJbnZtKCk7XG4gIHRoaXMudHdvID0gbmV3IEJOKDIpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5hMjQgPSB0aGlzLmk0LnJlZE11bCh0aGlzLmEucmVkQWRkKHRoaXMudHdvKSk7XG59XG5pbmhlcml0cyhNb250Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBNb250Q3VydmU7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICB2YXIgeCA9IHBvaW50Lm5vcm1hbGl6ZSgpLng7XG4gIHZhciB4MiA9IHgucmVkU3FyKCk7XG4gIHZhciByaHMgPSB4Mi5yZWRNdWwoeCkucmVkQWRkKHgyLnJlZE11bCh0aGlzLmEpKS5yZWRBZGQoeCk7XG4gIHZhciB5ID0gcmhzLnJlZFNxcnQoKTtcblxuICByZXR1cm4geS5yZWRTcXIoKS5jbXAocmhzKSA9PT0gMDtcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB6KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdwcm9qZWN0aXZlJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSB0aGlzLmN1cnZlLnplcm87XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnogPSBuZXcgQk4oeiwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnoucmVkKVxuICAgICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLCBlbmMpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQodXRpbHMudG9BcnJheShieXRlcywgZW5jKSwgMSk7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeikge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHopO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUoKSB7XG4gIC8vIE5vLW9wXG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkpO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoY3VydmUsIG9ialswXSwgb2JqWzFdIHx8IGN1cnZlLm9uZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB6OiAnICsgdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIC8vIFhYWCBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHplcm8gaXMgYWx3YXlzIHplcm8gaW4gcmVkXG4gIHJldHVybiB0aGlzLnouY21wbigwKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RvdWJsaW5nLWRibC0xOTg3LW0tM1xuICAvLyAyTSArIDJTICsgNEFcblxuICAvLyBBID0gWDEgKyBaMVxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQUEgPSBBXjJcbiAgdmFyIGFhID0gYS5yZWRTcXIoKTtcbiAgLy8gQiA9IFgxIC0gWjFcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEJCID0gQl4yXG4gIHZhciBiYiA9IGIucmVkU3FyKCk7XG4gIC8vIEMgPSBBQSAtIEJCXG4gIHZhciBjID0gYWEucmVkU3ViKGJiKTtcbiAgLy8gWDMgPSBBQSAqIEJCXG4gIHZhciBueCA9IGFhLnJlZE11bChiYik7XG4gIC8vIFozID0gQyAqIChCQiArIEEyNCAqIEMpXG4gIHZhciBueiA9IGMucmVkTXVsKGJiLnJlZEFkZCh0aGlzLmN1cnZlLmEyNC5yZWRNdWwoYykpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGlmZkFkZCA9IGZ1bmN0aW9uIGRpZmZBZGQocCwgZGlmZikge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkaWZmYWRkLWRhZGQtMTk4Ny1tLTNcbiAgLy8gNE0gKyAyUyArIDZBXG5cbiAgLy8gQSA9IFgyICsgWjJcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEIgPSBYMiAtIFoyXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBDID0gWDMgKyBaM1xuICB2YXIgYyA9IHAueC5yZWRBZGQocC56KTtcbiAgLy8gRCA9IFgzIC0gWjNcbiAgdmFyIGQgPSBwLngucmVkU3ViKHAueik7XG4gIC8vIERBID0gRCAqIEFcbiAgdmFyIGRhID0gZC5yZWRNdWwoYSk7XG4gIC8vIENCID0gQyAqIEJcbiAgdmFyIGNiID0gYy5yZWRNdWwoYik7XG4gIC8vIFg1ID0gWjEgKiAoREEgKyBDQileMlxuICB2YXIgbnggPSBkaWZmLnoucmVkTXVsKGRhLnJlZEFkZChjYikucmVkU3FyKCkpO1xuICAvLyBaNSA9IFgxICogKERBIC0gQ0IpXjJcbiAgdmFyIG56ID0gZGlmZi54LnJlZE11bChkYS5yZWRJU3ViKGNiKS5yZWRTcXIoKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgdmFyIHQgPSBrLmNsb25lKCk7XG4gIHZhciBhID0gdGhpczsgLy8gKE4gLyAyKSAqIFEgKyBRXG4gIHZhciBiID0gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTsgLy8gKE4gLyAyKSAqIFFcbiAgdmFyIGMgPSB0aGlzOyAvLyBRXG5cbiAgZm9yICh2YXIgYml0cyA9IFtdOyB0LmNtcG4oMCkgIT09IDA7IHQuaXVzaHJuKDEpKVxuICAgIGJpdHMucHVzaCh0LmFuZGxuKDEpKTtcblxuICBmb3IgKHZhciBpID0gYml0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChiaXRzW2ldID09PSAwKSB7XG4gICAgICAvLyBOICogUSArIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSkgKyAoTiAvIDIpICogUVxuICAgICAgYSA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRID0gMiAqICgoTiAvIDIpICogUSArIFEpKVxuICAgICAgYiA9IGIuZGJsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE4gKiBRID0gKChOIC8gMikgKiBRICsgUSkgKyAoKE4gLyAyKSAqIFEpXG4gICAgICBiID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgKyBRID0gMiAqICgoTiAvIDIpICogUSArIFEpXG4gICAgICBhID0gYS5kYmwoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGI7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmp1bWxBZGQgPSBmdW5jdGlvbiBqdW1sQWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLmNtcChvdGhlci5nZXRYKCkpID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdGhpcy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gRWR3YXJkc0N1cnZlKGNvbmYpIHtcbiAgLy8gTk9URTogSW1wb3J0YW50IGFzIHdlIGFyZSBjcmVhdGluZyBwb2ludCBpbiBCYXNlLmNhbGwoKVxuICB0aGlzLnR3aXN0ZWQgPSAoY29uZi5hIHwgMCkgIT09IDE7XG4gIHRoaXMubU9uZUEgPSB0aGlzLnR3aXN0ZWQgJiYgKGNvbmYuYSB8IDApID09PSAtMTtcbiAgdGhpcy5leHRlbmRlZCA9IHRoaXMubU9uZUE7XG5cbiAgQmFzZS5jYWxsKHRoaXMsICdlZHdhcmRzJywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnVtb2QodGhpcy5yZWQubSk7XG4gIHRoaXMuYSA9IHRoaXMuYS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYyA9IG5ldyBCTihjb25mLmMsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYzIgPSB0aGlzLmMucmVkU3FyKCk7XG4gIHRoaXMuZCA9IG5ldyBCTihjb25mLmQsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuZGQgPSB0aGlzLmQucmVkQWRkKHRoaXMuZCk7XG5cbiAgYXNzZXJ0KCF0aGlzLnR3aXN0ZWQgfHwgdGhpcy5jLmZyb21SZWQoKS5jbXBuKDEpID09PSAwKTtcbiAgdGhpcy5vbmVDID0gKGNvbmYuYyB8IDApID09PSAxO1xufVxuaW5oZXJpdHMoRWR3YXJkc0N1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gRWR3YXJkc0N1cnZlO1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxBID0gZnVuY3Rpb24gX211bEEobnVtKSB7XG4gIGlmICh0aGlzLm1PbmVBKVxuICAgIHJldHVybiBudW0ucmVkTmVnKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5hLnJlZE11bChudW0pO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQyA9IGZ1bmN0aW9uIF9tdWxDKG51bSkge1xuICBpZiAodGhpcy5vbmVDKVxuICAgIHJldHVybiBudW07XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jLnJlZE11bChudW0pO1xufTtcblxuLy8gSnVzdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNob3J0IGN1cnZlXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLmpwb2ludCA9IGZ1bmN0aW9uIGpwb2ludCh4LCB5LCB6LCB0KSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHgsIHksIHosIHQpO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB4MiA9IHgucmVkU3FyKCk7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZFN1Yih0aGlzLmEucmVkTXVsKHgyKSk7XG4gIHZhciBsaHMgPSB0aGlzLm9uZS5yZWRTdWIodGhpcy5jMi5yZWRNdWwodGhpcy5kKS5yZWRNdWwoeDIpKTtcblxuICB2YXIgeTIgPSByaHMucmVkTXVsKGxocy5yZWRJbnZtKCkpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICB2YXIgaXNPZGQgPSB5LmZyb21SZWQoKS5pc09kZCgpO1xuICBpZiAob2RkICYmICFpc09kZCB8fCAhb2RkICYmIGlzT2RkKVxuICAgIHkgPSB5LnJlZE5lZygpO1xuXG4gIHJldHVybiB0aGlzLnBvaW50KHgsIHkpO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21ZID0gZnVuY3Rpb24gcG9pbnRGcm9tWSh5LCBvZGQpIHtcbiAgeSA9IG5ldyBCTih5LCAxNik7XG4gIGlmICgheS5yZWQpXG4gICAgeSA9IHkudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIHheMiA9ICh5XjIgLSBjXjIpIC8gKGNeMiBkIHleMiAtIGEpXG4gIHZhciB5MiA9IHkucmVkU3FyKCk7XG4gIHZhciBsaHMgPSB5Mi5yZWRTdWIodGhpcy5jMik7XG4gIHZhciByaHMgPSB5Mi5yZWRNdWwodGhpcy5kKS5yZWRNdWwodGhpcy5jMikucmVkU3ViKHRoaXMuYSk7XG4gIHZhciB4MiA9IGxocy5yZWRNdWwocmhzLnJlZEludm0oKSk7XG5cbiAgaWYgKHgyLmNtcCh0aGlzLnplcm8pID09PSAwKSB7XG4gICAgaWYgKG9kZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLnBvaW50KHRoaXMuemVybywgeSk7XG4gIH1cblxuICB2YXIgeCA9IHgyLnJlZFNxcnQoKTtcbiAgaWYgKHgucmVkU3FyKCkucmVkU3ViKHgyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICBpZiAoeC5mcm9tUmVkKCkuaXNPZGQoKSAhPT0gb2RkKVxuICAgIHggPSB4LnJlZE5lZygpO1xuXG4gIHJldHVybiB0aGlzLnBvaW50KHgsIHkpO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8gQ3VydmU6IEEgKiBYXjIgKyBZXjIgPSBDXjIgKiAoMSArIEQgKiBYXjIgKiBZXjIpXG4gIHBvaW50Lm5vcm1hbGl6ZSgpO1xuXG4gIHZhciB4MiA9IHBvaW50LngucmVkU3FyKCk7XG4gIHZhciB5MiA9IHBvaW50LnkucmVkU3FyKCk7XG4gIHZhciBsaHMgPSB4Mi5yZWRNdWwodGhpcy5hKS5yZWRBZGQoeTIpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRNdWwodGhpcy5vbmUucmVkQWRkKHRoaXMuZC5yZWRNdWwoeDIpLnJlZE11bCh5MikpKTtcblxuICByZXR1cm4gbGhzLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIHosIHQpIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMudCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnpPbmUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSB6ID8gbmV3IEJOKHosIDE2KSA6IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMudCA9IHQgJiYgbmV3IEJOKHQsIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy55LnJlZClcbiAgICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnoucmVkKVxuICAgICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAodGhpcy50ICYmICF0aGlzLnQucmVkKVxuICAgICAgdGhpcy50ID0gdGhpcy50LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xuXG4gICAgLy8gVXNlIGV4dGVuZGVkIGNvb3JkaW5hdGVzXG4gICAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQgJiYgIXRoaXMudCkge1xuICAgICAgdGhpcy50ID0gdGhpcy54LnJlZE11bCh0aGlzLnkpO1xuICAgICAgaWYgKCF0aGlzLnpPbmUpXG4gICAgICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gICAgfVxuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB5LCB6LCB0KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgeiwgdCk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB6OiAnICsgdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIC8vIFhYWCBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHplcm8gaXMgYWx3YXlzIHplcm8gaW4gcmVkXG4gIHJldHVybiB0aGlzLnguY21wbigwKSA9PT0gMCAmJlxuICAgICh0aGlzLnkuY21wKHRoaXMueikgPT09IDAgfHxcbiAgICAodGhpcy56T25lICYmIHRoaXMueS5jbXAodGhpcy5jdXJ2ZS5jKSA9PT0gMCkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHREYmwgPSBmdW5jdGlvbiBfZXh0RGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1od2NkXG4gIC8vIDRNICsgNFNcblxuICAvLyBBID0gWDFeMlxuICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gQiA9IFkxXjJcbiAgdmFyIGIgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIEMgPSAyICogWjFeMlxuICB2YXIgYyA9IHRoaXMuei5yZWRTcXIoKTtcbiAgYyA9IGMucmVkSUFkZChjKTtcbiAgLy8gRCA9IGEgKiBBXG4gIHZhciBkID0gdGhpcy5jdXJ2ZS5fbXVsQShhKTtcbiAgLy8gRSA9IChYMSArIFkxKV4yIC0gQSAtIEJcbiAgdmFyIGUgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGIpO1xuICAvLyBHID0gRCArIEJcbiAgdmFyIGcgPSBkLnJlZEFkZChiKTtcbiAgLy8gRiA9IEcgLSBDXG4gIHZhciBmID0gZy5yZWRTdWIoYyk7XG4gIC8vIEggPSBEIC0gQlxuICB2YXIgaCA9IGQucmVkU3ViKGIpO1xuICAvLyBYMyA9IEUgKiBGXG4gIHZhciBueCA9IGUucmVkTXVsKGYpO1xuICAvLyBZMyA9IEcgKiBIXG4gIHZhciBueSA9IGcucmVkTXVsKGgpO1xuICAvLyBUMyA9IEUgKiBIXG4gIHZhciBudCA9IGUucmVkTXVsKGgpO1xuICAvLyBaMyA9IEYgKiBHXG4gIHZhciBueiA9IGYucmVkTXVsKGcpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56LCBudCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX3Byb2pEYmwgPSBmdW5jdGlvbiBfcHJvakRibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtYmJqbHBcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwNy1ibFxuICAvLyBhbmQgb3RoZXJzXG4gIC8vIEdlbmVyYWxseSAzTSArIDRTIG9yIDJNICsgNFNcblxuICAvLyBCID0gKFgxICsgWTEpXjJcbiAgdmFyIGIgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkU3FyKCk7XG4gIC8vIEMgPSBYMV4yXG4gIHZhciBjID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBEID0gWTFeMlxuICB2YXIgZCA9IHRoaXMueS5yZWRTcXIoKTtcblxuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICB2YXIgZTtcbiAgdmFyIGg7XG4gIHZhciBqO1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gRSA9IGEgKiBDXG4gICAgZSA9IHRoaXMuY3VydmUuX211bEEoYyk7XG4gICAgLy8gRiA9IEUgKyBEXG4gICAgdmFyIGYgPSBlLnJlZEFkZChkKTtcbiAgICBpZiAodGhpcy56T25lKSB7XG4gICAgICAvLyBYMyA9IChCIC0gQyAtIEQpICogKEYgLSAyKVxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRTdWIoZCkucmVkTXVsKGYucmVkU3ViKHRoaXMuY3VydmUudHdvKSk7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRl4yIC0gMiAqIEZcbiAgICAgIG56ID0gZi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIID0gWjFeMlxuICAgICAgaCA9IHRoaXMuei5yZWRTcXIoKTtcbiAgICAgIC8vIEogPSBGIC0gMiAqIEhcbiAgICAgIGogPSBmLnJlZFN1YihoKS5yZWRJU3ViKGgpO1xuICAgICAgLy8gWDMgPSAoQi1DLUQpKkpcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkSVN1YihkKS5yZWRNdWwoaik7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRiAqIEpcbiAgICAgIG56ID0gZi5yZWRNdWwoaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEUgPSBDICsgRFxuICAgIGUgPSBjLnJlZEFkZChkKTtcbiAgICAvLyBIID0gKGMgKiBaMSleMlxuICAgIGggPSB0aGlzLmN1cnZlLl9tdWxDKHRoaXMueikucmVkU3FyKCk7XG4gICAgLy8gSiA9IEUgLSAyICogSFxuICAgIGogPSBlLnJlZFN1YihoKS5yZWRTdWIoaCk7XG4gICAgLy8gWDMgPSBjICogKEIgLSBFKSAqIEpcbiAgICBueCA9IHRoaXMuY3VydmUuX211bEMoYi5yZWRJU3ViKGUpKS5yZWRNdWwoaik7XG4gICAgLy8gWTMgPSBjICogRSAqIChDIC0gRClcbiAgICBueSA9IHRoaXMuY3VydmUuX211bEMoZSkucmVkTXVsKGMucmVkSVN1YihkKSk7XG4gICAgLy8gWjMgPSBFICogSlxuICAgIG56ID0gZS5yZWRNdWwoaik7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRG91YmxlIGluIGV4dGVuZGVkIGNvb3JkaW5hdGVzXG4gIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkKVxuICAgIHJldHVybiB0aGlzLl9leHREYmwoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qRGJsKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dEFkZCA9IGZ1bmN0aW9uIF9leHRBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1od2NkLTNcbiAgLy8gOE1cblxuICAvLyBBID0gKFkxIC0gWDEpICogKFkyIC0gWDIpXG4gIHZhciBhID0gdGhpcy55LnJlZFN1Yih0aGlzLngpLnJlZE11bChwLnkucmVkU3ViKHAueCkpO1xuICAvLyBCID0gKFkxICsgWDEpICogKFkyICsgWDIpXG4gIHZhciBiID0gdGhpcy55LnJlZEFkZCh0aGlzLngpLnJlZE11bChwLnkucmVkQWRkKHAueCkpO1xuICAvLyBDID0gVDEgKiBrICogVDJcbiAgdmFyIGMgPSB0aGlzLnQucmVkTXVsKHRoaXMuY3VydmUuZGQpLnJlZE11bChwLnQpO1xuICAvLyBEID0gWjEgKiAyICogWjJcbiAgdmFyIGQgPSB0aGlzLnoucmVkTXVsKHAuei5yZWRBZGQocC56KSk7XG4gIC8vIEUgPSBCIC0gQVxuICB2YXIgZSA9IGIucmVkU3ViKGEpO1xuICAvLyBGID0gRCAtIENcbiAgdmFyIGYgPSBkLnJlZFN1YihjKTtcbiAgLy8gRyA9IEQgKyBDXG4gIHZhciBnID0gZC5yZWRBZGQoYyk7XG4gIC8vIEggPSBCICsgQVxuICB2YXIgaCA9IGIucmVkQWRkKGEpO1xuICAvLyBYMyA9IEUgKiBGXG4gIHZhciBueCA9IGUucmVkTXVsKGYpO1xuICAvLyBZMyA9IEcgKiBIXG4gIHZhciBueSA9IGcucmVkTXVsKGgpO1xuICAvLyBUMyA9IEUgKiBIXG4gIHZhciBudCA9IGUucmVkTXVsKGgpO1xuICAvLyBaMyA9IEYgKiBHXG4gIHZhciBueiA9IGYucmVkTXVsKGcpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56LCBudCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX3Byb2pBZGQgPSBmdW5jdGlvbiBfcHJvakFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWJiamxwXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDctYmxcbiAgLy8gMTBNICsgMVNcblxuICAvLyBBID0gWjEgKiBaMlxuICB2YXIgYSA9IHRoaXMuei5yZWRNdWwocC56KTtcbiAgLy8gQiA9IEFeMlxuICB2YXIgYiA9IGEucmVkU3FyKCk7XG4gIC8vIEMgPSBYMSAqIFgyXG4gIHZhciBjID0gdGhpcy54LnJlZE11bChwLngpO1xuICAvLyBEID0gWTEgKiBZMlxuICB2YXIgZCA9IHRoaXMueS5yZWRNdWwocC55KTtcbiAgLy8gRSA9IGQgKiBDICogRFxuICB2YXIgZSA9IHRoaXMuY3VydmUuZC5yZWRNdWwoYykucmVkTXVsKGQpO1xuICAvLyBGID0gQiAtIEVcbiAgdmFyIGYgPSBiLnJlZFN1YihlKTtcbiAgLy8gRyA9IEIgKyBFXG4gIHZhciBnID0gYi5yZWRBZGQoZSk7XG4gIC8vIFgzID0gQSAqIEYgKiAoKFgxICsgWTEpICogKFgyICsgWTIpIC0gQyAtIEQpXG4gIHZhciB0bXAgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkTXVsKHAueC5yZWRBZGQocC55KSkucmVkSVN1YihjKS5yZWRJU3ViKGQpO1xuICB2YXIgbnggPSBhLnJlZE11bChmKS5yZWRNdWwodG1wKTtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBhICogQylcbiAgICBueSA9IGEucmVkTXVsKGcpLnJlZE11bChkLnJlZFN1Yih0aGlzLmN1cnZlLl9tdWxBKGMpKSk7XG4gICAgLy8gWjMgPSBGICogR1xuICAgIG56ID0gZi5yZWRNdWwoZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gQylcbiAgICBueSA9IGEucmVkTXVsKGcpLnJlZE11bChkLnJlZFN1YihjKSk7XG4gICAgLy8gWjMgPSBjICogRiAqIEdcbiAgICBueiA9IHRoaXMuY3VydmUuX211bEMoZikucmVkTXVsKGcpO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkKVxuICAgIHJldHVybiB0aGlzLl9leHRBZGQocCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakFkZChwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoazEsIHAsIGsyKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIFsgdGhpcywgcCBdLCBbIGsxLCBrMiBdLCAyLCBmYWxzZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuam11bEFkZCA9IGZ1bmN0aW9uIGptdWxBZGQoazEsIHAsIGsyKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIFsgdGhpcywgcCBdLCBbIGsxLCBrMiBdLCAyLCB0cnVlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIGlmICh0aGlzLnpPbmUpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHZhciB6aSA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwoemkpO1xuICB0aGlzLnkgPSB0aGlzLnkucmVkTXVsKHppKTtcbiAgaWYgKHRoaXMudClcbiAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHppKTtcbiAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gIHRoaXMuek9uZSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE5lZygpLFxuICAgIHRoaXMueSxcbiAgICB0aGlzLnosXG4gICAgdGhpcy50ICYmIHRoaXMudC5yZWROZWcoKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiBnZXRZKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzID09PSBvdGhlciB8fFxuICAgICAgICAgdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDAgJiZcbiAgICAgICAgIHRoaXMuZ2V0WSgpLmNtcChvdGhlci5nZXRZKCkpID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxWFRvUCA9IGZ1bmN0aW9uIGVxWFRvUCh4KSB7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh0aGlzLnopO1xuICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHhjID0geC5jbG9uZSgpO1xuICB2YXIgdCA9IHRoaXMuY3VydmUucmVkTi5yZWRNdWwodGhpcy56KTtcbiAgZm9yICg7Oykge1xuICAgIHhjLmlhZGQodGhpcy5jdXJ2ZS5uKTtcbiAgICBpZiAoeGMuY21wKHRoaXMuY3VydmUucCkgPj0gMClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJ4LnJlZElBZGQodCk7XG4gICAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8vIENvbXBhdGliaWxpdHkgd2l0aCBCYXNlQ3VydmVcblBvaW50LnByb3RvdHlwZS50b1AgPSBQb2ludC5wcm90b3R5cGUubm9ybWFsaXplO1xuUG9pbnQucHJvdG90eXBlLm1peGVkQWRkID0gUG9pbnQucHJvdG90eXBlLmFkZDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSBleHBvcnRzO1xuXG5jdXJ2ZS5iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5jdXJ2ZS5zaG9ydCA9IHJlcXVpcmUoJy4vc2hvcnQnKTtcbmN1cnZlLm1vbnQgPSByZXF1aXJlKCcuL21vbnQnKTtcbmN1cnZlLmVkd2FyZHMgPSByZXF1aXJlKCcuL2Vkd2FyZHMnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5pbmhlcml0cyA9IGluaGVyaXRzO1xuXG5mdW5jdGlvbiBpc1N1cnJvZ2F0ZVBhaXIobXNnLCBpKSB7XG4gIGlmICgobXNnLmNoYXJDb2RlQXQoaSkgJiAweEZDMDApICE9PSAweEQ4MDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGkgPCAwIHx8IGkgKyAxID49IG1zZy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChtc2cuY2hhckNvZGVBdChpICsgMSkgJiAweEZDMDApID09PSAweERDMDA7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWVuYykge1xuICAgICAgLy8gSW5zcGlyZWQgYnkgc3RyaW5nVG9VdGY4Qnl0ZUFycmF5KCkgaW4gY2xvc3VyZS1saWJyYXJ5IGJ5IEdvb2dsZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvYmxvYi84NTk4ZDg3MjQyYWY1OWFhYzIzMzI3MDc0MmM4OTg0ZTJiMmJkYmUwL2Nsb3N1cmUvZ29vZy9jcnlwdC9jcnlwdC5qcyNMMTE3LUwxNDNcbiAgICAgIC8vIEFwYWNoZSBMaWNlbnNlIDIuMFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICAgICAgdmFyIHAgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICByZXNbcCsrXSA9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoYyA8IDIwNDgpIHtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDYpIHwgMTkyO1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNTdXJyb2dhdGVQYWlyKG1zZywgaSkpIHtcbiAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAmIDB4MDNGRikgPDwgMTApICsgKG1zZy5jaGFyQ29kZUF0KCsraSkgJiAweDAzRkYpO1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gMTgpIHwgMjQwO1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuYyA9PT0gJ2hleCcpIHtcbiAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICAgIG1zZyA9ICcwJyArIG1zZztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIHJlcy5wdXNoKHBhcnNlSW50KG1zZ1tpXSArIG1zZ1tpICsgMV0sIDE2KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgICByZXNbaV0gPSBtc2dbaV0gfCAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4ID0gdG9IZXg7XG5cbmZ1bmN0aW9uIGh0b25sKHcpIHtcbiAgdmFyIHJlcyA9ICh3ID4+PiAyNCkgfFxuICAgICAgICAgICAgKCh3ID4+PiA4KSAmIDB4ZmYwMCkgfFxuICAgICAgICAgICAgKCh3IDw8IDgpICYgMHhmZjAwMDApIHxcbiAgICAgICAgICAgICgodyAmIDB4ZmYpIDw8IDI0KTtcbiAgcmV0dXJuIHJlcyA+Pj4gMDtcbn1cbmV4cG9ydHMuaHRvbmwgPSBodG9ubDtcblxuZnVuY3Rpb24gdG9IZXgzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHcgPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2xpdHRsZScpXG4gICAgICB3ID0gaHRvbmwodyk7XG4gICAgcmVzICs9IHplcm84KHcudG9TdHJpbmcoMTYpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleDMyID0gdG9IZXgzMjtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbmV4cG9ydHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gemVybzgod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDcpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA2KVxuICAgIHJldHVybiAnMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDUpXG4gICAgcmV0dXJuICcwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDQpXG4gICAgcmV0dXJuICcwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAzKVxuICAgIHJldHVybiAnMDAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDIpXG4gICAgcmV0dXJuICcwMDAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbmV4cG9ydHMuemVybzggPSB6ZXJvODtcblxuZnVuY3Rpb24gam9pbjMyKG1zZywgc3RhcnQsIGVuZCwgZW5kaWFuKSB7XG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgYXNzZXJ0KGxlbiAlIDQgPT09IDApO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbiAvIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IHN0YXJ0OyBpIDwgcmVzLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJylcbiAgICAgIHcgPSAobXNnW2tdIDw8IDI0KSB8IChtc2dbayArIDFdIDw8IDE2KSB8IChtc2dbayArIDJdIDw8IDgpIHwgbXNnW2sgKyAzXTtcbiAgICBlbHNlXG4gICAgICB3ID0gKG1zZ1trICsgM10gPDwgMjQpIHwgKG1zZ1trICsgMl0gPDwgMTYpIHwgKG1zZ1trICsgMV0gPDwgOCkgfCBtc2dba107XG4gICAgcmVzW2ldID0gdyA+Pj4gMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5qb2luMzIgPSBqb2luMzI7XG5cbmZ1bmN0aW9uIHNwbGl0MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShtc2cubGVuZ3RoICogNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIG0gPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICAgIHJlc1trXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDNdID0gbSAmIDB4ZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1trICsgM10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2tdID0gbSAmIDB4ZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnNwbGl0MzIgPSBzcGxpdDMyO1xuXG5mdW5jdGlvbiByb3RyMzIodywgYikge1xuICByZXR1cm4gKHcgPj4+IGIpIHwgKHcgPDwgKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RyMzIgPSByb3RyMzI7XG5cbmZ1bmN0aW9uIHJvdGwzMih3LCBiKSB7XG4gIHJldHVybiAodyA8PCBiKSB8ICh3ID4+PiAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdGwzMiA9IHJvdGwzMjtcblxuZnVuY3Rpb24gc3VtMzIoYSwgYikge1xuICByZXR1cm4gKGEgKyBiKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzIgPSBzdW0zMjtcblxuZnVuY3Rpb24gc3VtMzJfMyhhLCBiLCBjKSB7XG4gIHJldHVybiAoYSArIGIgKyBjKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfMyA9IHN1bTMyXzM7XG5cbmZ1bmN0aW9uIHN1bTMyXzQoYSwgYiwgYywgZCkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl80ID0gc3VtMzJfNDtcblxuZnVuY3Rpb24gc3VtMzJfNShhLCBiLCBjLCBkLCBlKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCArIGUpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl81ID0gc3VtMzJfNTtcblxuZnVuY3Rpb24gc3VtNjQoYnVmLCBwb3MsIGFoLCBhbCkge1xuICB2YXIgYmggPSBidWZbcG9zXTtcbiAgdmFyIGJsID0gYnVmW3BvcyArIDFdO1xuXG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICBidWZbcG9zXSA9IGhpID4+PiAwO1xuICBidWZbcG9zICsgMV0gPSBsbztcbn1cbmV4cG9ydHMuc3VtNjQgPSBzdW02NDtcblxuZnVuY3Rpb24gc3VtNjRfaGkoYWgsIGFsLCBiaCwgYmwpIHtcbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfaGkgPSBzdW02NF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfbG8oYWgsIGFsLCBiaCwgYmwpIHtcbiAgdmFyIGxvID0gYWwgKyBibDtcbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9sbyA9IHN1bTY0X2xvO1xuXG5mdW5jdGlvbiBzdW02NF80X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgbG8gPSBhbDtcbiAgbG8gPSAobG8gKyBibCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgYWwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBjbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgY2wgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBkbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZGwgPyAxIDogMDtcblxuICB2YXIgaGkgPSBhaCArIGJoICsgY2ggKyBkaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfaGkgPSBzdW02NF80X2hpO1xuXG5mdW5jdGlvbiBzdW02NF80X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbDtcbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2xvID0gc3VtNjRfNF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNV9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgbG8gPSBhbDtcbiAgbG8gPSAobG8gKyBibCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgYWwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBjbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgY2wgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBkbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZGwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBlbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZWwgPyAxIDogMDtcblxuICB2YXIgaGkgPSBhaCArIGJoICsgY2ggKyBkaCArIGVoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9oaSA9IHN1bTY0XzVfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzVfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGwgKyBlbDtcblxuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfbG8gPSBzdW02NF81X2xvO1xuXG5mdW5jdGlvbiByb3RyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWwgPDwgKDMyIC0gbnVtKSkgfCAoYWggPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfaGkgPSByb3RyNjRfaGk7XG5cbmZ1bmN0aW9uIHJvdHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9sbyA9IHJvdHI2NF9sbztcblxuZnVuY3Rpb24gc2hyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgcmV0dXJuIGFoID4+PiBudW07XG59XG5leHBvcnRzLnNocjY0X2hpID0gc2hyNjRfaGk7XG5cbmZ1bmN0aW9uIHNocjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMuc2hyNjRfbG8gPSBzaHI2NF9sbztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBCbG9ja0hhc2goKSB7XG4gIHRoaXMucGVuZGluZyA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1RvdGFsID0gMDtcbiAgdGhpcy5ibG9ja1NpemUgPSB0aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZTtcbiAgdGhpcy5vdXRTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplO1xuICB0aGlzLmhtYWNTdHJlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoO1xuICB0aGlzLnBhZExlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoIC8gODtcbiAgdGhpcy5lbmRpYW4gPSAnYmlnJztcblxuICB0aGlzLl9kZWx0YTggPSB0aGlzLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMuX2RlbHRhMzIgPSB0aGlzLmJsb2NrU2l6ZSAvIDMyO1xufVxuZXhwb3J0cy5CbG9ja0hhc2ggPSBCbG9ja0hhc2g7XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIC8vIENvbnZlcnQgbWVzc2FnZSB0byBhcnJheSwgcGFkIGl0LCBhbmQgam9pbiBpbnRvIDMyYml0IGJsb2Nrc1xuICBtc2cgPSB1dGlscy50b0FycmF5KG1zZywgZW5jKTtcbiAgaWYgKCF0aGlzLnBlbmRpbmcpXG4gICAgdGhpcy5wZW5kaW5nID0gbXNnO1xuICBlbHNlXG4gICAgdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpO1xuICB0aGlzLnBlbmRpbmdUb3RhbCArPSBtc2cubGVuZ3RoO1xuXG4gIC8vIEVub3VnaCBkYXRhLCB0cnkgdXBkYXRpbmdcbiAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPj0gdGhpcy5fZGVsdGE4KSB7XG4gICAgbXNnID0gdGhpcy5wZW5kaW5nO1xuXG4gICAgLy8gUHJvY2VzcyBwZW5kaW5nIGRhdGEgaW4gYmxvY2tzXG4gICAgdmFyIHIgPSBtc2cubGVuZ3RoICUgdGhpcy5fZGVsdGE4O1xuICAgIHRoaXMucGVuZGluZyA9IG1zZy5zbGljZShtc2cubGVuZ3RoIC0gciwgbXNnLmxlbmd0aCk7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuXG4gICAgbXNnID0gdXRpbHMuam9pbjMyKG1zZywgMCwgbXNnLmxlbmd0aCAtIHIsIHRoaXMuZW5kaWFuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gdGhpcy5fZGVsdGEzMilcbiAgICAgIHRoaXMuX3VwZGF0ZShtc2csIGksIGkgKyB0aGlzLl9kZWx0YTMyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKTtcbiAgYXNzZXJ0KHRoaXMucGVuZGluZyA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIHRoaXMuX2RpZ2VzdChlbmMpO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gcGFkKCkge1xuICB2YXIgbGVuID0gdGhpcy5wZW5kaW5nVG90YWw7XG4gIHZhciBieXRlcyA9IHRoaXMuX2RlbHRhODtcbiAgdmFyIGsgPSBieXRlcyAtICgobGVuICsgdGhpcy5wYWRMZW5ndGgpICUgYnl0ZXMpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGsgKyB0aGlzLnBhZExlbmd0aCk7XG4gIHJlc1swXSA9IDB4ODA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgazsgaSsrKVxuICAgIHJlc1tpXSA9IDA7XG5cbiAgLy8gQXBwZW5kIGxlbmd0aFxuICBsZW4gPDw9IDM7XG4gIGlmICh0aGlzLmVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG5cbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gIH0gZWxzZSB7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuXG4gICAgZm9yICh0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHJvdHIzMiA9IHV0aWxzLnJvdHIzMjtcblxuZnVuY3Rpb24gZnRfMShzLCB4LCB5LCB6KSB7XG4gIGlmIChzID09PSAwKVxuICAgIHJldHVybiBjaDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMSB8fCBzID09PSAzKVxuICAgIHJldHVybiBwMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAyKVxuICAgIHJldHVybiBtYWozMih4LCB5LCB6KTtcbn1cbmV4cG9ydHMuZnRfMSA9IGZ0XzE7XG5cbmZ1bmN0aW9uIGNoMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICgofngpICYgeik7XG59XG5leHBvcnRzLmNoMzIgPSBjaDMyO1xuXG5mdW5jdGlvbiBtYWozMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG59XG5leHBvcnRzLm1hajMyID0gbWFqMzI7XG5cbmZ1bmN0aW9uIHAzMih4LCB5LCB6KSB7XG4gIHJldHVybiB4IF4geSBeIHo7XG59XG5leHBvcnRzLnAzMiA9IHAzMjtcblxuZnVuY3Rpb24gczBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpO1xufVxuZXhwb3J0cy5zMF8yNTYgPSBzMF8yNTY7XG5cbmZ1bmN0aW9uIHMxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KTtcbn1cbmV4cG9ydHMuczFfMjU2ID0gczFfMjU2O1xuXG5mdW5jdGlvbiBnMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDcpIF4gcm90cjMyKHgsIDE4KSBeICh4ID4+PiAzKTtcbn1cbmV4cG9ydHMuZzBfMjU2ID0gZzBfMjU2O1xuXG5mdW5jdGlvbiBnMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDE3KSBeIHJvdHIzMih4LCAxOSkgXiAoeCA+Pj4gMTApO1xufVxuZXhwb3J0cy5nMV8yNTYgPSBnMV8yNTY7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgZnRfMSA9IHNoYUNvbW1vbi5mdF8xO1xudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGExX0sgPSBbXG4gIDB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsXG4gIDB4OEYxQkJDREMsIDB4Q0E2MkMxRDZcbl07XG5cbmZ1bmN0aW9uIFNIQTEoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEExKSlcbiAgICByZXR1cm4gbmV3IFNIQTEoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsXG4gICAgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoODApO1xufVxuXG51dGlscy5pbmhlcml0cyhTSEExLCBCbG9ja0hhc2gpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEExO1xuXG5TSEExLmJsb2NrU2l6ZSA9IDUxMjtcblNIQTEub3V0U2l6ZSA9IDE2MDtcblNIQTEuaG1hY1N0cmVuZ3RoID0gODA7XG5TSEExLnBhZExlbmd0aCA9IDY0O1xuXG5TSEExLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG5cbiAgZm9yKDsgaSA8IFcubGVuZ3RoOyBpKyspXG4gICAgV1tpXSA9IHJvdGwzMihXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdLCAxKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG5cbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IH5+KGkgLyAyMCk7XG4gICAgdmFyIHQgPSBzdW0zMl81KHJvdGwzMihhLCA1KSwgZnRfMShzLCBiLCBjLCBkKSwgZSwgV1tpXSwgc2hhMV9LW3NdKTtcbiAgICBlID0gZDtcbiAgICBkID0gYztcbiAgICBjID0gcm90bDMyKGIsIDMwKTtcbiAgICBiID0gYTtcbiAgICBhID0gdDtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG59O1xuXG5TSEExLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl80ID0gdXRpbHMuc3VtMzJfNDtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBjaDMyID0gc2hhQ29tbW9uLmNoMzI7XG52YXIgbWFqMzIgPSBzaGFDb21tb24ubWFqMzI7XG52YXIgczBfMjU2ID0gc2hhQ29tbW9uLnMwXzI1NjtcbnZhciBzMV8yNTYgPSBzaGFDb21tb24uczFfMjU2O1xudmFyIGcwXzI1NiA9IHNoYUNvbW1vbi5nMF8yNTY7XG52YXIgZzFfMjU2ID0gc2hhQ29tbW9uLmcxXzI1NjtcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXTtcblxuZnVuY3Rpb24gU0hBMjU2KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMjU2KSlcbiAgICByZXR1cm4gbmV3IFNIQTI1NigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgICAweDUxMGU1MjdmLCAweDliMDU2ODhjLCAweDFmODNkOWFiLCAweDViZTBjZDE5XG4gIF07XG4gIHRoaXMuayA9IHNoYTI1Nl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoNjQpO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjU2LCBCbG9ja0hhc2gpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEyNTY7XG5cblNIQTI1Ni5ibG9ja1NpemUgPSA1MTI7XG5TSEEyNTYub3V0U2l6ZSA9IDI1NjtcblNIQTI1Ni5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyNTYucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTI1Ni5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuICBmb3IgKDsgaSA8IFcubGVuZ3RoOyBpKyspXG4gICAgV1tpXSA9IHN1bTMyXzQoZzFfMjU2KFdbaSAtIDJdKSwgV1tpIC0gN10sIGcwXzI1NihXW2kgLSAxNV0pLCBXW2kgLSAxNl0pO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcbiAgdmFyIGYgPSB0aGlzLmhbNV07XG4gIHZhciBnID0gdGhpcy5oWzZdO1xuICB2YXIgaCA9IHRoaXMuaFs3XTtcblxuICBhc3NlcnQodGhpcy5rLmxlbmd0aCA9PT0gVy5sZW5ndGgpO1xuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBUMSA9IHN1bTMyXzUoaCwgczFfMjU2KGUpLCBjaDMyKGUsIGYsIGcpLCB0aGlzLmtbaV0sIFdbaV0pO1xuICAgIHZhciBUMiA9IHN1bTMyKHMwXzI1NihhKSwgbWFqMzIoYSwgYiwgYykpO1xuICAgIGggPSBnO1xuICAgIGcgPSBmO1xuICAgIGYgPSBlO1xuICAgIGUgPSBzdW0zMihkLCBUMSk7XG4gICAgZCA9IGM7XG4gICAgYyA9IGI7XG4gICAgYiA9IGE7XG4gICAgYSA9IHN1bTMyKFQxLCBUMik7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xuICB0aGlzLmhbNV0gPSBzdW0zMih0aGlzLmhbNV0sIGYpO1xuICB0aGlzLmhbNl0gPSBzdW0zMih0aGlzLmhbNl0sIGcpO1xuICB0aGlzLmhbN10gPSBzdW0zMih0aGlzLmhbN10sIGgpO1xufTtcblxuU0hBMjU2LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNIQTI1NiA9IHJlcXVpcmUoJy4vMjU2Jyk7XG5cbmZ1bmN0aW9uIFNIQTIyNCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTIyNCkpXG4gICAgcmV0dXJuIG5ldyBTSEEyMjQoKTtcblxuICBTSEEyNTYuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG4gICAgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjI0LCBTSEEyNTYpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEyMjQ7XG5cblNIQTIyNC5ibG9ja1NpemUgPSA1MTI7XG5TSEEyMjQub3V0U2l6ZSA9IDIyNDtcblNIQTIyNC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyMjQucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgLy8gSnVzdCB0cnVuY2F0ZSBvdXRwdXRcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbn07XG5cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHJvdHI2NF9oaSA9IHV0aWxzLnJvdHI2NF9oaTtcbnZhciByb3RyNjRfbG8gPSB1dGlscy5yb3RyNjRfbG87XG52YXIgc2hyNjRfaGkgPSB1dGlscy5zaHI2NF9oaTtcbnZhciBzaHI2NF9sbyA9IHV0aWxzLnNocjY0X2xvO1xudmFyIHN1bTY0ID0gdXRpbHMuc3VtNjQ7XG52YXIgc3VtNjRfaGkgPSB1dGlscy5zdW02NF9oaTtcbnZhciBzdW02NF9sbyA9IHV0aWxzLnN1bTY0X2xvO1xudmFyIHN1bTY0XzRfaGkgPSB1dGlscy5zdW02NF80X2hpO1xudmFyIHN1bTY0XzRfbG8gPSB1dGlscy5zdW02NF80X2xvO1xudmFyIHN1bTY0XzVfaGkgPSB1dGlscy5zdW02NF81X2hpO1xudmFyIHN1bTY0XzVfbG8gPSB1dGlscy5zdW02NF81X2xvO1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTUxMl9LID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dO1xuXG5mdW5jdGlvbiBTSEE1MTIoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEE1MTIpKVxuICAgIHJldHVybiBuZXcgU0hBNTEyKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGYzYmNjOTA4LFxuICAgIDB4YmI2N2FlODUsIDB4ODRjYWE3M2IsXG4gICAgMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYixcbiAgICAweGE1NGZmNTNhLCAweDVmMWQzNmYxLFxuICAgIDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEsXG4gICAgMHg5YjA1Njg4YywgMHgyYjNlNmMxZixcbiAgICAweDFmODNkOWFiLCAweGZiNDFiZDZiLFxuICAgIDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkgXTtcbiAgdGhpcy5rID0gc2hhNTEyX0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSgxNjApO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBNTEyLCBCbG9ja0hhc2gpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEE1MTI7XG5cblNIQTUxMi5ibG9ja1NpemUgPSAxMDI0O1xuU0hBNTEyLm91dFNpemUgPSA1MTI7XG5TSEE1MTIuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBNTEyLnBhZExlbmd0aCA9IDEyODtcblxuU0hBNTEyLnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrID0gZnVuY3Rpb24gX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIC8vIDMyIHggMzJiaXQgd29yZHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gZzFfNTEyX2hpKFdbaSAtIDRdLCBXW2kgLSAzXSk7ICAvLyBpIC0gMlxuICAgIHZhciBjMF9sbyA9IGcxXzUxMl9sbyhXW2kgLSA0XSwgV1tpIC0gM10pO1xuICAgIHZhciBjMV9oaSA9IFdbaSAtIDE0XTsgIC8vIGkgLSA3XG4gICAgdmFyIGMxX2xvID0gV1tpIC0gMTNdO1xuICAgIHZhciBjMl9oaSA9IGcwXzUxMl9oaShXW2kgLSAzMF0sIFdbaSAtIDI5XSk7ICAvLyBpIC0gMTVcbiAgICB2YXIgYzJfbG8gPSBnMF81MTJfbG8oV1tpIC0gMzBdLCBXW2kgLSAyOV0pO1xuICAgIHZhciBjM19oaSA9IFdbaSAtIDMyXTsgIC8vIGkgLSAxNlxuICAgIHZhciBjM19sbyA9IFdbaSAtIDMxXTtcblxuICAgIFdbaV0gPSBzdW02NF80X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgICBXW2kgKyAxXSA9IHN1bTY0XzRfbG8oXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8pO1xuICB9XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdGhpcy5fcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpO1xuXG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIHZhciBhaCA9IHRoaXMuaFswXTtcbiAgdmFyIGFsID0gdGhpcy5oWzFdO1xuICB2YXIgYmggPSB0aGlzLmhbMl07XG4gIHZhciBibCA9IHRoaXMuaFszXTtcbiAgdmFyIGNoID0gdGhpcy5oWzRdO1xuICB2YXIgY2wgPSB0aGlzLmhbNV07XG4gIHZhciBkaCA9IHRoaXMuaFs2XTtcbiAgdmFyIGRsID0gdGhpcy5oWzddO1xuICB2YXIgZWggPSB0aGlzLmhbOF07XG4gIHZhciBlbCA9IHRoaXMuaFs5XTtcbiAgdmFyIGZoID0gdGhpcy5oWzEwXTtcbiAgdmFyIGZsID0gdGhpcy5oWzExXTtcbiAgdmFyIGdoID0gdGhpcy5oWzEyXTtcbiAgdmFyIGdsID0gdGhpcy5oWzEzXTtcbiAgdmFyIGhoID0gdGhpcy5oWzE0XTtcbiAgdmFyIGhsID0gdGhpcy5oWzE1XTtcblxuICBhc3NlcnQodGhpcy5rLmxlbmd0aCA9PT0gVy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBoaDtcbiAgICB2YXIgYzBfbG8gPSBobDtcbiAgICB2YXIgYzFfaGkgPSBzMV81MTJfaGkoZWgsIGVsKTtcbiAgICB2YXIgYzFfbG8gPSBzMV81MTJfbG8oZWgsIGVsKTtcbiAgICB2YXIgYzJfaGkgPSBjaDY0X2hpKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjMl9sbyA9IGNoNjRfbG8oZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMzX2hpID0gdGhpcy5rW2ldO1xuICAgIHZhciBjM19sbyA9IHRoaXMua1tpICsgMV07XG4gICAgdmFyIGM0X2hpID0gV1tpXTtcbiAgICB2YXIgYzRfbG8gPSBXW2kgKyAxXTtcblxuICAgIHZhciBUMV9oaSA9IHN1bTY0XzVfaGkoXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8sXG4gICAgICBjNF9oaSwgYzRfbG8pO1xuICAgIHZhciBUMV9sbyA9IHN1bTY0XzVfbG8oXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8sXG4gICAgICBjNF9oaSwgYzRfbG8pO1xuXG4gICAgYzBfaGkgPSBzMF81MTJfaGkoYWgsIGFsKTtcbiAgICBjMF9sbyA9IHMwXzUxMl9sbyhhaCwgYWwpO1xuICAgIGMxX2hpID0gbWFqNjRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG4gICAgYzFfbG8gPSBtYWo2NF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcblxuICAgIHZhciBUMl9oaSA9IHN1bTY0X2hpKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcbiAgICB2YXIgVDJfbG8gPSBzdW02NF9sbyhjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG5cbiAgICBoaCA9IGdoO1xuICAgIGhsID0gZ2w7XG5cbiAgICBnaCA9IGZoO1xuICAgIGdsID0gZmw7XG5cbiAgICBmaCA9IGVoO1xuICAgIGZsID0gZWw7XG5cbiAgICBlaCA9IHN1bTY0X2hpKGRoLCBkbCwgVDFfaGksIFQxX2xvKTtcbiAgICBlbCA9IHN1bTY0X2xvKGRsLCBkbCwgVDFfaGksIFQxX2xvKTtcblxuICAgIGRoID0gY2g7XG4gICAgZGwgPSBjbDtcblxuICAgIGNoID0gYmg7XG4gICAgY2wgPSBibDtcblxuICAgIGJoID0gYWg7XG4gICAgYmwgPSBhbDtcblxuICAgIGFoID0gc3VtNjRfaGkoVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICAgIGFsID0gc3VtNjRfbG8oVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICB9XG5cbiAgc3VtNjQodGhpcy5oLCAwLCBhaCwgYWwpO1xuICBzdW02NCh0aGlzLmgsIDIsIGJoLCBibCk7XG4gIHN1bTY0KHRoaXMuaCwgNCwgY2gsIGNsKTtcbiAgc3VtNjQodGhpcy5oLCA2LCBkaCwgZGwpO1xuICBzdW02NCh0aGlzLmgsIDgsIGVoLCBlbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTAsIGZoLCBmbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTIsIGdoLCBnbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTQsIGhoLCBobCk7XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG5mdW5jdGlvbiBjaDY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICgofnhoKSAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBjaDY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoKH54bCkgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKHhoICYgemgpIF4gKHloICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoeGwgJiB6bCkgXiAoeWwgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDgpO1xuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDgpO1xuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxudmFyIFNIQTUxMiA9IHJlcXVpcmUoJy4vNTEyJyk7XG5cbmZ1bmN0aW9uIFNIQTM4NCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTM4NCkpXG4gICAgcmV0dXJuIG5ldyBTSEEzODQoKTtcblxuICBTSEE1MTIuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgsXG4gICAgMHg2MjlhMjkyYSwgMHgzNjdjZDUwNyxcbiAgICAweDkxNTkwMTVhLCAweDMwNzBkZDE3LFxuICAgIDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzksXG4gICAgMHg2NzMzMjY2NywgMHhmZmMwMGIzMSxcbiAgICAweDhlYjQ0YTg3LCAweDY4NTgxNTExLFxuICAgIDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcsXG4gICAgMHg0N2I1NDgxZCwgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMzg0LCBTSEE1MTIpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEzODQ7XG5cblNIQTM4NC5ibG9ja1NpemUgPSAxMDI0O1xuU0hBMzg0Lm91dFNpemUgPSAzODQ7XG5TSEEzODQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMzg0LnBhZExlbmd0aCA9IDEyODtcblxuU0hBMzg0LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgMTIpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgMTIpLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuc2hhMSA9IHJlcXVpcmUoJy4vc2hhLzEnKTtcbmV4cG9ydHMuc2hhMjI0ID0gcmVxdWlyZSgnLi9zaGEvMjI0Jyk7XG5leHBvcnRzLnNoYTI1NiA9IHJlcXVpcmUoJy4vc2hhLzI1NicpO1xuZXhwb3J0cy5zaGEzODQgPSByZXF1aXJlKCcuL3NoYS8zODQnKTtcbmV4cG9ydHMuc2hhNTEyID0gcmVxdWlyZSgnLi9zaGEvNTEyJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl8zID0gdXRpbHMuc3VtMzJfMztcbnZhciBzdW0zMl80ID0gdXRpbHMuc3VtMzJfNDtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG5mdW5jdGlvbiBSSVBFTUQxNjAoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSSVBFTUQxNjApKVxuICAgIHJldHVybiBuZXcgUklQRU1EMTYwKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5oID0gWyAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuZW5kaWFuID0gJ2xpdHRsZSc7XG59XG51dGlscy5pbmhlcml0cyhSSVBFTUQxNjAsIEJsb2NrSGFzaCk7XG5leHBvcnRzLnJpcGVtZDE2MCA9IFJJUEVNRDE2MDtcblxuUklQRU1EMTYwLmJsb2NrU2l6ZSA9IDUxMjtcblJJUEVNRDE2MC5vdXRTaXplID0gMTYwO1xuUklQRU1EMTYwLmhtYWNTdHJlbmd0aCA9IDE5MjtcblJJUEVNRDE2MC5wYWRMZW5ndGggPSA2NDtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIEEgPSB0aGlzLmhbMF07XG4gIHZhciBCID0gdGhpcy5oWzFdO1xuICB2YXIgQyA9IHRoaXMuaFsyXTtcbiAgdmFyIEQgPSB0aGlzLmhbM107XG4gIHZhciBFID0gdGhpcy5oWzRdO1xuICB2YXIgQWggPSBBO1xuICB2YXIgQmggPSBCO1xuICB2YXIgQ2ggPSBDO1xuICB2YXIgRGggPSBEO1xuICB2YXIgRWggPSBFO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDgwOyBqKyspIHtcbiAgICB2YXIgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEEsIGYoaiwgQiwgQywgRCksIG1zZ1tyW2pdICsgc3RhcnRdLCBLKGopKSxcbiAgICAgICAgc1tqXSksXG4gICAgICBFKTtcbiAgICBBID0gRTtcbiAgICBFID0gRDtcbiAgICBEID0gcm90bDMyKEMsIDEwKTtcbiAgICBDID0gQjtcbiAgICBCID0gVDtcbiAgICBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQWgsIGYoNzkgLSBqLCBCaCwgQ2gsIERoKSwgbXNnW3JoW2pdICsgc3RhcnRdLCBLaChqKSksXG4gICAgICAgIHNoW2pdKSxcbiAgICAgIEVoKTtcbiAgICBBaCA9IEVoO1xuICAgIEVoID0gRGg7XG4gICAgRGggPSByb3RsMzIoQ2gsIDEwKTtcbiAgICBDaCA9IEJoO1xuICAgIEJoID0gVDtcbiAgfVxuICBUID0gc3VtMzJfMyh0aGlzLmhbMV0sIEMsIERoKTtcbiAgdGhpcy5oWzFdID0gc3VtMzJfMyh0aGlzLmhbMl0sIEQsIEVoKTtcbiAgdGhpcy5oWzJdID0gc3VtMzJfMyh0aGlzLmhbM10sIEUsIEFoKTtcbiAgdGhpcy5oWzNdID0gc3VtMzJfMyh0aGlzLmhbNF0sIEEsIEJoKTtcbiAgdGhpcy5oWzRdID0gc3VtMzJfMyh0aGlzLmhbMF0sIEIsIENoKTtcbiAgdGhpcy5oWzBdID0gVDtcbn07XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnbGl0dGxlJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdsaXR0bGUnKTtcbn07XG5cbmZ1bmN0aW9uIGYoaiwgeCwgeSwgeikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4geCBeIHkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAoeCAmIHkpIHwgKCh+eCkgJiB6KTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gKHggfCAofnkpKSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuICh4ICYgeikgfCAoeSAmICh+eikpO1xuICBlbHNlXG4gICAgcmV0dXJuIHggXiAoeSB8ICh+eikpO1xufVxuXG5mdW5jdGlvbiBLKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWE4Mjc5OTk7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmVkOWViYTE7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4OGYxYmJjZGM7XG4gIGVsc2VcbiAgICByZXR1cm4gMHhhOTUzZmQ0ZTtcbn1cblxuZnVuY3Rpb24gS2goaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHg1MGEyOGJlNjtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YzRkZDEyNDtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZDcwM2VmMztcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg3YTZkNzZlOTtcbiAgZWxzZVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xufVxuXG52YXIgciA9IFtcbiAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSxcbiAgNywgNCwgMTMsIDEsIDEwLCA2LCAxNSwgMywgMTIsIDAsIDksIDUsIDIsIDE0LCAxMSwgOCxcbiAgMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMixcbiAgMSwgOSwgMTEsIDEwLCAwLCA4LCAxMiwgNCwgMTMsIDMsIDcsIDE1LCAxNCwgNSwgNiwgMixcbiAgNCwgMCwgNSwgOSwgNywgMTIsIDIsIDEwLCAxNCwgMSwgMywgOCwgMTEsIDYsIDE1LCAxM1xuXTtcblxudmFyIHJoID0gW1xuICA1LCAxNCwgNywgMCwgOSwgMiwgMTEsIDQsIDEzLCA2LCAxNSwgOCwgMSwgMTAsIDMsIDEyLFxuICA2LCAxMSwgMywgNywgMCwgMTMsIDUsIDEwLCAxNCwgMTUsIDgsIDEyLCA0LCA5LCAxLCAyLFxuICAxNSwgNSwgMSwgMywgNywgMTQsIDYsIDksIDExLCA4LCAxMiwgMiwgMTAsIDAsIDQsIDEzLFxuICA4LCA2LCA0LCAxLCAzLCAxMSwgMTUsIDAsIDUsIDEyLCAyLCAxMywgOSwgNywgMTAsIDE0LFxuICAxMiwgMTUsIDEwLCA0LCAxLCA1LCA4LCA3LCA2LCAyLCAxMywgMTQsIDAsIDMsIDksIDExXG5dO1xuXG52YXIgcyA9IFtcbiAgMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4LFxuICA3LCA2LCA4LCAxMywgMTEsIDksIDcsIDE1LCA3LCAxMiwgMTUsIDksIDExLCA3LCAxMywgMTIsXG4gIDExLCAxMywgNiwgNywgMTQsIDksIDEzLCAxNSwgMTQsIDgsIDEzLCA2LCA1LCAxMiwgNywgNSxcbiAgMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgOSwgOCwgOSwgMTQsIDUsIDYsIDgsIDYsIDUsIDEyLFxuICA5LCAxNSwgNSwgMTEsIDYsIDgsIDEzLCAxMiwgNSwgMTIsIDEzLCAxNCwgMTEsIDgsIDUsIDZcbl07XG5cbnZhciBzaCA9IFtcbiAgOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LFxuICA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsXG4gIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSxcbiAgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LFxuICA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFcbl07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hYyhoYXNoLCBrZXksIGVuYykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpXG4gICAgcmV0dXJuIG5ldyBIbWFjKGhhc2gsIGtleSwgZW5jKTtcbiAgdGhpcy5IYXNoID0gaGFzaDtcbiAgdGhpcy5ibG9ja1NpemUgPSBoYXNoLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMub3V0U2l6ZSA9IGhhc2gub3V0U2l6ZSAvIDg7XG4gIHRoaXMuaW5uZXIgPSBudWxsO1xuICB0aGlzLm91dGVyID0gbnVsbDtcblxuICB0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LCBlbmMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hYztcblxuSG1hYy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGtleSkge1xuICAvLyBTaG9ydGVuIGtleSwgaWYgbmVlZGVkXG4gIGlmIChrZXkubGVuZ3RoID4gdGhpcy5ibG9ja1NpemUpXG4gICAga2V5ID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpO1xuICBhc3NlcnQoa2V5Lmxlbmd0aCA8PSB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gQWRkIHBhZGRpbmcgdG8ga2V5XG4gIGZvciAodmFyIGkgPSBrZXkubGVuZ3RoOyBpIDwgdGhpcy5ibG9ja1NpemU7IGkrKylcbiAgICBrZXkucHVzaCgwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDM2O1xuICB0aGlzLmlubmVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xuXG4gIC8vIDB4MzYgXiAweDVjID0gMHg2YVxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDZhO1xuICB0aGlzLm91dGVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xufTtcblxuSG1hYy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIHRoaXMuaW5uZXIudXBkYXRlKG1zZywgZW5jKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5IbWFjLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpO1xuICByZXR1cm4gdGhpcy5vdXRlci5kaWdlc3QoZW5jKTtcbn07XG4iLAogICAgInZhciBoYXNoID0gZXhwb3J0cztcblxuaGFzaC51dGlscyA9IHJlcXVpcmUoJy4vaGFzaC91dGlscycpO1xuaGFzaC5jb21tb24gPSByZXF1aXJlKCcuL2hhc2gvY29tbW9uJyk7XG5oYXNoLnNoYSA9IHJlcXVpcmUoJy4vaGFzaC9zaGEnKTtcbmhhc2gucmlwZW1kID0gcmVxdWlyZSgnLi9oYXNoL3JpcGVtZCcpO1xuaGFzaC5obWFjID0gcmVxdWlyZSgnLi9oYXNoL2htYWMnKTtcblxuLy8gUHJveHkgaGFzaCBmdW5jdGlvbnMgdG8gdGhlIG1haW4gb2JqZWN0XG5oYXNoLnNoYTEgPSBoYXNoLnNoYS5zaGExO1xuaGFzaC5zaGEyNTYgPSBoYXNoLnNoYS5zaGEyNTY7XG5oYXNoLnNoYTIyNCA9IGhhc2guc2hhLnNoYTIyNDtcbmhhc2guc2hhMzg0ID0gaGFzaC5zaGEuc2hhMzg0O1xuaGFzaC5zaGE1MTIgPSBoYXNoLnNoYS5zaGE1MTI7XG5oYXNoLnJpcGVtZDE2MCA9IGhhc2gucmlwZW1kLnJpcGVtZDE2MDtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRvdWJsZXM6IHtcbiAgICBzdGVwOiA0LFxuICAgIHBvaW50czogW1xuICAgICAgW1xuICAgICAgICAnZTYwZmNlOTNiNTllOWVjNTMwMTFhYWJjMjFjMjNlOTdiMmEzMTM2OWI4N2E1YWU5YzQ0ZWU4OWUyYTZkZWMwYScsXG4gICAgICAgICdmN2UzNTA3Mzk5ZTU5NTkyOWRiOTlmMzRmNTc5MzcxMDEyOTY4OTFlNDRkMjNmMGJlMWYzMmNjZTY5NjE2ODIxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjgyMjYzMjEyYzYwOWQ5ZWEyYTZlM2UxNzJkZTIzOGQ4YzM5Y2FiZDVhYzFjYTEwNjQ2ZTIzZmQ1ZjUxNTA4JyxcbiAgICAgICAgJzExZjhhODA5ODU1N2RmZTQ1ZTgyNTZlODMwYjYwYWNlNjJkNjEzYWMyZjdiMTdiZWQzMWI2ZWFmZjZlMjZjYWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NWUxNTlmNzI4Yjg2NWE3MmY5OWNjNmM2ZmM4NDZkZTBiOTM4MzNmZDIyMjJlZDczZmNlNWI1NTFlNWI3MzknLFxuICAgICAgICAnZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzYzZDkwZDQ0N2IwMGM5Yzk5Y2VhYzA1YjYyNjJlZTA1MzQ0MWM3ZTU1NTUyZmZlNTI2YmFkOGY4M2ZmNDY0MCcsXG4gICAgICAgICc0ZTI3M2FkZmM3MzIyMjE5NTNiNDQ1Mzk3ZjMzNjMxNDViOWE4OTAwODE5OWVjYjYyMDAzYzdmM2JlZTlkZTknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhiNGI1ZjE2NWRmM2MyYmU4YzYyNDRiNWI3NDU2Mzg4NDNlNGE3ODFhMTViY2QxYjY5Zjc5YTU1ZGZmZGY4MGMnLFxuICAgICAgICAnNGFhZDBhNmY2OGQzMDhiNGIzZmJkNzgxM2FiMGRhMDRmOWUzMzY1NDYxNjJlZTU2YjNlZmYwYzY1ZmQ0ZmQzNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzIzY2JhYTZlNWRiOTk2ZDZiZjc3MWMwMGJkNTQ4YzdiNzAwZGJmZmE2YzBlNzdiY2I2MTE1OTI1MjMyZmNkYScsXG4gICAgICAgICc5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZWJmYTRkNDkzYmViZjk4YmE1ZmVlYzgxMmMyZDNiNTA5NDc5NjEyMzdhOTE5ODM5YTUzM2VjYTBlN2RkN2ZhJyxcbiAgICAgICAgJzVkOWE4Y2EzOTcwZWYwZjI2OWVlN2VkYWYxNzgwODlkOWFlNGNkYzNhNzExZjcxMmRkZmQ0ZmRhZTFkZTg5OTknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEwMGY0NGRhNjk2ZTcxNjcyNzkxZDBhMDliN2JkZTQ1OWYxMjE1YTI5YjNjMDNiZmVmZDc4MzViMzlhNDhkYjAnLFxuICAgICAgICAnY2RkOWUxMzE5MmEwMGI3NzJlYzhmMzMwMGMwOTA2NjZiN2ZmNGExOGZmNTE5NWFjMGZiZDVjZDYyYmM2NWEwOScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTEwMzFiZTI2MmM3ZWQxYjFkYzkyMjdhNGEwNGMwMTdhNzdmOGQ0NDY0ZjNiMzg1MmM4YWNkZTZlNTM0ZmQyZCcsXG4gICAgICAgICc5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZWVhNmNhZTQ2ZDU1YjUzMGFjMjgzOWYxNDNiZDdlYzVjZjhiMjY2YTQxZDZhZjUyZDVlNjg4ZDkwOTQ2OTZkJyxcbiAgICAgICAgJ2U1N2M2YjZjOTdkY2UxYmFiMDZlNGUxMmJmM2VjZDVjOTgxYzg5NTdjYzQxNDQyZDMxNTVkZWJmMTgwOTAwODgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjdhOTFkOTEwNDljZGNiMzY3YmU0YmU2ZmZjYTNjZmVlZDY1N2Q4MDg1ODNkZTMzZmE5NzhiYzFlYzZjYjEnLFxuICAgICAgICAnOWJhY2FhMzU0ODE2NDJiYzQxZjQ2M2Y3ZWM5NzgwZTVkZWM3YWRjNTA4Zjc0MGExN2U5ZWE4ZTI3YTY4YmUxZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTM5MDRmYWEwYjMzNGNkZGE2ZTAwMDkzNWVmMjIxNTFlYzA4ZDBmN2JiMTEwNjlmNTc1NDVjY2MxYTM3YjdjMCcsXG4gICAgICAgICc1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZTdiY2QwYmQzNTk4M2E3NzE5Y2NhNzc2NGNhOTA2Nzc5YjUzYTA0M2E5YjhiY2FlZmY5NTlmNDNhZDg2MDQ3JyxcbiAgICAgICAgJzEwYjc3NzBiMmEzZGE0YjM5NDAzMTA0MjBjYTk1MTQ1NzllODhlMmU0N2ZkNjhiM2VhMTAwNDdlODQ2MDM3MmEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM4NWVlZDM0YzFjZGZmMjFlNmQwODE4Njg5YjgxYmRlNzFhN2Y0ZjE4Mzk3ZTY2OTBhODQxZTE1OTljNDM4NjInLFxuICAgICAgICAnMjgzYmViYzNlOGVhMjNmNTY3MDFkZTE5ZTllYmY0NTc2YjMwNGVlYzIwODZkYzhjYzA0NThmZTU1NDJlNTQ1MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmY5ZDliODAzZWNmMTkxNjM3YzczYTQ0MTNkZmExODBmZGRmODRhNTk0N2ZiYzljNjA2ZWQ4NmMzZmFjM2E3JyxcbiAgICAgICAgJzdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzMjJkNDAxMjQzYzRlMjU4MmEyMTQ3YzEwNGQ2ZWNiZjc3NGQxNjNkYjBmNWU1MzEzYjdlMGU3NDJkMGU2YmQnLFxuICAgICAgICAnNTZlNzA3OTdlOTY2NGVmNWJmYjAxOWJjNGRkYWY5YjcyODA1ZjYzZWEyODczYWY2MjRmM2EyZTk2YzI4YjJhMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODU2NzJjN2QyZGUwYjdkYTJiZDE3NzBkODk2NjU4Njg3NDFiM2Y5YWY3NjQzMzk3NzIxZDc0ZDI4MTM0YWI4MycsXG4gICAgICAgICc3YzQ4MWI5YjViNDNiMmViNjM3NDA0OWJmYTYyYzJlNWU3N2YxN2ZjYzUyOThmNDRjOGUzMDk0Zjc5MDMxM2E2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhiZjgwOWIxOTg4YTQ2YjA2YzlmMTkxOTQxM2IxMGY5MjI2YzYwZjY2ODgzMmZmZDk1OWFmNjBjODJhMGEnLFxuICAgICAgICAnNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjI2MGNlN2Y0NjE4MDFjMzRmMDY3Y2UwZjAyODczYThmMWIwZTQ0ZGZjNjk3NTJhY2NlY2Q4MTlmMzhmZDhlOCcsXG4gICAgICAgICdiYzJkYTgyYjZmYTViNTcxYTdmMDkwNDk3NzZhMWVmN2VjZDI5MjIzODA1MWMxOThjMWE4NGU5NWIyYjRhZTE3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNTAzN2RlMGFmYzFkOGQ0M2Q4MzQ4NDE0YmJmNDEwMzA0M2VjOGY1NzViZmRjNDMyOTUzY2M4ZDIwMzdmYTJkJyxcbiAgICAgICAgJzQ1NzE1MzRiYWE5NGQzYjVmOWY5OGQwOWZiOTkwYmRkYmQ1ZjViMDNlYzQ4MWYxMGUwZTVkYzg0MWQ3NTViZGEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UwNjM3MmIwZjRhMjA3YWRmNWVhOTA1ZThmMTc3MWI0ZTdlOGRiZDFjNmE2YzViNzI1ODY2YTBhZTRmY2U3MjUnLFxuICAgICAgICAnN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjEzYzdhNzE1Y2Q1ZDQ1MzU4ZDBiYmY5ZGMwY2UwMjIwNGIxMGJkZGUyYTNmNTg1NDBhZDY5MDhkMDU1OTc1NCcsXG4gICAgICAgICc0YjZkYWQwYjVhZTQ2MjUwNzAxM2FkMDYyNDViYTE5MGJiNDg1MGY1ZjM2YTdlZWRkZmYyYzI3NTM0YjQ1OGYyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTdjMjcyYTdhZjRiMzRlOGRiYjkzNTJhNTQxOWE4N2UyODM4YzcwYWRjNjJjZGRmMGNjM2EzYjA4ZmJkNTNjJyxcbiAgICAgICAgJzE3NzQ5Yzc2NmM5ZDBiMThlMTZmZDA5ZjZkZWY2ODFiNTMwYjk2MTRiZmY3ZGQzM2UwYjM5NDE4MTdkY2FhZTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlYTc0ZTNkYmU3NzhiMWIxMGYyMzhhZDYxNjg2YWE1Yzc2ZTNkYjJiZTQzMDU3NjMyNDI3ZTI4NDBmYjI3YjYnLFxuICAgICAgICAnNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzZlNjQxMTNmNjc3Y2YwZTEwYTI1NzBkNTk5OTY4ZDMxNTQ0ZTE3OWI3NjA0MzI5NTJjMDJhNDQxN2JkZGUzOScsXG4gICAgICAgICdjOTBkZGY4ZGVlNGU5NWNmNTc3MDY2ZDcwNjgxZjBkMzVlMmEzM2QyYjU2ZDIwMzJiNGIxNzUyZDE5MDFhYzAxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNzM4YzU2YjAzYjJhYmUxZTgyODFiYWE3NDNmOGY5YThmN2NjNjQzZGYyNmNiZWUzYWIxNTAyNDJiY2JiODkxJyxcbiAgICAgICAgJzg5M2ZiNTc4OTUxYWQyNTM3ZjcxOGYyZWFjYmZiYmJiODIzMTRlZWY3ODgwY2ZlOTE3ZTczNWQ5Njk5YTg0YzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q4OTU2MjY1NDhiNjViODFlMjY0Yzc2MzdjOTcyODc3ZDFkNzJlNWYzYTkyNTAxNDM3MmU5ZjY1ODhmNmMxNGInLFxuICAgICAgICAnZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjhkYTk0MDMyYTk1NzUxOGViMGY2NDMzNTcxZTg3NjFjZWZmYzczNjkzZTg0ZWRkNDkxNTBhNTY0ZjY3NmUwMycsXG4gICAgICAgICcyODA0ZGZhNDQ4MDVhMWU0ZDdjOTljYzk3NjI4MDhiMDkyY2M1ODRkOTVmZjNiNTExNDg4ZTRlNzRlZmRmNmU3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlODBmZWExNDQ0MWZiMzNhN2Q4YWRhYjk0NzVkN2ZhYjIwMTllZmZiNTE1NmE3OTJmMWExMTc3OGUzYzBkZjVkJyxcbiAgICAgICAgJ2VlZDFkZTdmNjM4ZTAwNzcxZTg5NzY4Y2EzY2E5NDQ3MmQxNTVlODBhZjMyMmVhOWZjYjQyOTFiNmFjOWVjNzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EzMDE2OTdiZGZjZDcwNDMxM2JhNDhlNTFkNTY3NTQzZjJhMTgyMDMxZWZkNjkxNWRkYzA3YmJjYzRlMTYwNzAnLFxuICAgICAgICAnNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTBhZDg1YjM4OWQ2YjkzNjQ2M2Y5ZDA1MTI2NzhkZTIwOGNjMzMwYjExMzA3ZmZmYWI3YWM2M2UzZmIwNGVkNCcsXG4gICAgICAgICdlNTA3YTM2MjBhMzgyNjFhZmZkY2JkOTQyNzIyMmI4MzlhZWZhYmUxNTgyODk0ZDk5MWQ0ZDQ4Y2I2ZWYxNTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhmNjhiOWQyZjYzYjVmMzM5MjM5YzFhZDk4MWYxNjJlZTg4YzU2Nzg3MjNlYTMzNTFiN2I0NDRjOWVjNGMwZGEnLFxuICAgICAgICAnNjYyYTlmMmRiYTA2Mzk4NmRlMWQ5MGMyYjZiZTIxNWRiYmVhMmNmZTk1NTEwYmZkZjIzY2JmNzk1MDFmZmY4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRmM2ZiMDE3NmFmODVkNjVmZjk5ZmY5MTk4YzM2MDkxZjQ4ZTg2NTAzNjgxZTNlNjY4NmZkNTA1MzIzMWUxMScsXG4gICAgICAgICcxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YzAwZmE5YjE4ZWJmMzMxZWI5NjE1MzdhNDVhNDI2NmM3MDM0ZjJmMGQ0ZTFkMDcxNmZiNmVhZTIwZWFlMjllJyxcbiAgICAgICAgJ2VmYTQ3MjY3ZmVhNTIxYTFhOWRjMzQzYTM3MzZjOTc0YzJmYWRhZmE4MWUzNmM1NGU3ZDJhNGM2NjcwMjQxNGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3YTI2Y2U2OWRkNDgyOWYzZTEwY2VjMGE5ZTk4ZWQzMTQzZDA4NGYzMDhiOTJjMDk5N2ZkZGZjNjBjYjNlNDEnLFxuICAgICAgICAnMmE3NThlMzAwZmE3OTg0YjQ3MWIwMDZhMWFhZmJiMThkMGE2YjJjMDQyMGU4M2UyMGU4YTk0MjFjZjJjZmQ1MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjY0NTllMGVlMzY2MmVjOGQyMzU0MGMyMjNiY2JkYzU3MWNiY2I5NjdkNzk0MjRmM2NmMjllYjNkZTZiODBlZicsXG4gICAgICAgICc2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q2OGE4MGM4MjgwYmI4NDA3OTMyMzRhYTExOGYwNjIzMWQ2ZjFmYzY3ZTczYzVhNWRlZGEwZjViNDk2OTQzZTgnLFxuICAgICAgICAnZGI4YmE5ZmZmNGI1ODZkMDBjNGIxZjkxNzdiMGUyOGI1YjBlN2I4Zjc4NDUyOTVhMjk0Yzg0MjY2YjEzMzEyMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzI0YWVkN2RmNjVjODA0MjUyZGMwMjcwOTA3YTMwYjA5NjEyYWViOTczNDQ5Y2VhNDA5NTk4MGZjMjhkM2Q1ZCcsXG4gICAgICAgICc2NDhhMzY1Nzc0YjYxZjJmZjEzMGMwYzM1YWVjMWY0ZjE5MjEzYjBjN2UzMzI4NDM5NjcyMjRhZjk2YWI3Yzg0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZGY5YzE0OTE5Y2RlNjFmNmQ1MWRmZGJlNWZlZTVkY2VlYzQxNDNiYThkMWNhODg4ZThiZDM3M2ZkMDU0Yzk2JyxcbiAgICAgICAgJzM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5YzM5MTlhODRhNDc0ODcwZmFlZDhhOWMxY2M2NjAyMTUyMzQ4OTA1NGQ3ZjAzMDhjYmZjOTljOGFjMWY5OGNkJyxcbiAgICAgICAgJ2RkYjg0ZjBmNGE0ZGRkNTc1ODRmMDQ0YmYyNjBlNjQxOTA1MzI2Zjc2YzY0YzhlNmJlN2U1ZTAzZDRmYzU5OWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNTcxNzBiMWRkMTJmZGY4ZGUwNWYyODFkOGUwNmJiOTFlMTQ5M2E4YjkxZDRjYzVhMjEzODIxMjBhOTU5ZTUnLFxuICAgICAgICAnOWExYWYwYjI2YTZhNDgwN2FkZDlhMmRhZjcxZGYyNjI0NjUxNTJiYzNlZTI0YzY1ZTg5OWJlOTMyMzg1YTJhOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU3NmRmOGUyM2EwODQxMTQyMTQzOWE0NTE4ZGEzMTg4MGNlZjBmYmE3ZDRkZjEyYjFhNjk3M2VlY2I5NDI2NicsXG4gICAgICAgICc0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3Nzc4YTc4YzI4ZGVjM2UzMGEwNWZlOTYyOWRlOGMzOGJiMzBkMWY1Y2Y5YTNhMjA4Zjc2Mzg4OWJlNThhZDcxJyxcbiAgICAgICAgJzM0NjI2ZDlhYjVhNWIyMmZmNzA5OGUxMmYyZmY1ODAwODdiMzg0MTFmZjI0YWM1NjNiNTEzZmMxZmQ5ZjQzYWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyODk1NWVlNjM3YTg0NDYzNzI5ZmQzMGU3YWZkMmVkNWY5NjI3NGU1YWQ3ZTVjYjA5ZWRhOWMwNmQ5MDNhYycsXG4gICAgICAgICdjMjU2MjEwMDNkM2Y0MmE4MjdiNzhhMTMwOTNhOTVlZWFjM2QyNmVmYThhOGQ4M2ZjNTE4MGU5MzViY2QwOTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWQwZmVmM2VjNmRiMTA5Mzk5MDY0ZjNhMGUzYjI4NTU2NDViNGE5MDdhZDM1NDUyN2FhZTc1MTYzZDgyNzUxJyxcbiAgICAgICAgJzFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZmMmIwZGNlOTdlZWNlOTdjMWM5YjYwNDE3OThiODVkZmRmYjZkODg4MmRhMjAzMDhmNTQwNDgyNDUyNjA4N2UnLFxuICAgICAgICAnNDkzZDEzZmVmNTI0YmExODhhZjRjNGRjNTRkMDc5MzZjN2I3ZWQ2ZmI5MGUyY2ViMmM5NTFlMDFmMGMyOTkwNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI3ZmJiZTRiMWU4ODBlYTllZDJiMmU2MzAxYjIxMmI1N2YxZWUxNDhjZDZkZDI4NzgwZTVlMmNmODU2ZTI0MScsXG4gICAgICAgICdjNjBmOWM5MjNjNzI3YjBiNzFiZWYyYzY3ZDFkMTI2ODdmZjdhNjMxODY5MDMxNjZkNjA1YjY4YmFlYzI5M2VjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE2NDlmMjFmNTFiZGJhZTdiZTRhZTM0Y2U2ZTUyMTdhNThmZGNlN2Y0N2Y5YWE3ZjNiNThmYTIxMjBlMmIzJyxcbiAgICAgICAgJ2JlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U0YTQyZDQzYzVjZjE2OWQ5MzkxZGY2ZGVjZjQyZWU1NDFiNmQ4ZjBjOWExMzc0MDFlMjM2MzJkZGEzNGQyNGYnLFxuICAgICAgICAnNGQ5ZjkyZTcxNmQxYzczNTI2ZmM5OWNjZmI4YWQzNGNlODg2ZWVkZmE4ZDhlNGYxM2E3ZjcxMzFkZWJhOTQxNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWVjODBmZWYzNjBjYmRkOTU0MTYwZmFkYWIzNTJiNmI5MmI1MzU3NmE4OGZlYTQ5NDcxNzNiOWQ0MzAwYmYxOScsXG4gICAgICAgICdhZWVmZTkzNzU2YjUzNDBkMmYzYTQ5NThhN2FiYmY1ZTAxNDZlNzdmNjI5NWEwN2I2NzFjZGMxY2MxMDdjZWZkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNDZhNzc4YzA0NjcwYzJmOTFiMDBhZjQ2ODBkZmE4YmNlMzQ5MDcxN2Q1OGJhODg5ZGRiNTkyODM2NjY0MmJlJyxcbiAgICAgICAgJ2IzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZhNTBjMGY2MWQyMmU1ZjA3ZTNhY2ViYjFhYTA3YjEyOGQwMDEyMjA5YTI4Yjk3NzZkNzZhODc5MzE4MGVlZjknLFxuICAgICAgICAnNmI4NGM2OTIyMzk3ZWJhOWI3MmNkMjg3MjI4MWE2OGE1ZTY4MzI5M2E1N2EyMTNiMzhjZDhkN2QzZjRmMjgxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGExZDYxZDBjYTcyMWExMWIxYTViZjZiN2Q4OGU4NDIxYTI4OGFiNWQ1YmJhNTIyMGU1M2QzMmI1ZjA2N2VjMicsXG4gICAgICAgICc4MTU3ZjU1YTdjOTkzMDZjNzljMDc2NjE2MWM5MWUyOTY2YTczODk5ZDI3OWI0OGE2NTVmYmEwZjFhZDgzNmYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhOGUyODJmZjBjOTcwNjkwNzIxNWZmOThlOGZkNDE2NjE1MzExZGUwNDQ2ZjFlMDYyYTczYjA2MTBkMDY0ZTEzJyxcbiAgICAgICAgJzdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NGE1M2I5YzlhMjg1ODcyZDM5ZTU2ZTY5MTNjYWIxNWQ1OWIxZmE1MTI1MDhjMDIyZjM4MmRlODMxOTQ5N2MnLFxuICAgICAgICAnY2NjOWRjMzdhYmZjOWMxNjU3YjQxNTVmMmM0N2Y5ZTY2NDZiM2ExZDhjYjk4NTQzODNkYTEzYWMwNzlhZmE3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTU5Mzk2OTgxOTQzNzg1YzNkM2U1N2VkZjUwMThjZGJlMDM5ZTczMGU0OTE4YjNkODg0ZmRmZjA5NDc1YjdiYScsXG4gICAgICAgICcyZTdlNTUyODg4YzMzMWRkOGJhMDM4NmE0YjljZDY4NDljNjUzZjY0Yzg3MDkzODVlOWI4YWJmODc1MjRmMmZkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMmE2M2E1MGFlNDAxZTU2ZDY0NWExMTUzYjEwOWE4ZmNjYTBhNDNkNTYxZmJhMmRiYjUxMzQwYzlkODJiMTUxJyxcbiAgICAgICAgJ2U4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY0NTg3ZTIzMzU0NzFlYjg5MGVlNzg5NmQ3Y2ZkYzg2NmJhY2JkYmQzODM5MzE3YjM0MzZmOWI0NTYxN2UwNzMnLFxuICAgICAgICAnZDk5ZmNkZDViZjY5MDJlMmFlOTZkZDY0NDdjMjk5YTE4NWI5MGEzOTEzM2FlYWIzNTgyOTllNWU5ZmFmNjU4OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQ4MWJkZTBlNGU0ZDg4NWIzYTU0NmQzZTU0OWRlMDQyZjBhYTZjZWEyNTBlN2ZkMzU4ZDZjODZkZDQ1ZTQ1OCcsXG4gICAgICAgICczOGVlN2I4Y2JhNTQwNGRkODRhMjViZjM5Y2VjYjJjYTkwMGE3OWM0MmIyNjJlNTU2ZDY0YjFiNTk3NzkwNTdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMzQ2NGE1N2E3ODEwMmFhNjJiNjk3OWFlODE3ZjQ2MzdmZmNmZWQzYzRiMWNlMzBiY2Q2MzAzZjZjYWY2NjZiJyxcbiAgICAgICAgJzY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JjNGE5ZGY1YjcxM2ZlMmU5YWVmNDMwYmNjMWRjOTdhMGNkOWNjZWRlMmYyODU4OGNhZGEzYTBkMmQ4M2YzNjYnLFxuICAgICAgICAnZDNhODFjYTZlNzg1YzA2MzgzOTM3YWRmNGI3OThjYWE2ZThhOWZiZmE1NDdiMTZkNzU4ZDY2NjU4MWYzM2MxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YzI4YTk3YmY4Mjk4YmMwZDIzZDhjNzQ5NDUyYTMyZTY5NGI2NWUzMGE5NDcyYTM5NTRhYjMwZmU1MzI0Y2FhJyxcbiAgICAgICAgJzQwYTMwNDYzYTMzMDUxOTMzNzhmZWRmMzFmN2NjMGViN2FlNzg0ZjA0NTFjYjk0NTllNzFkYzczY2JlZjk0ODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlYTk2NjYxMzk1MjdhOGMxZGQ5NGNlNGYwNzFmZDIzYzhiMzUwYzVhNGJiMzM3NDhjNGJhMTExZmFjY2FlMCcsXG4gICAgICAgICc2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZDM2MjVmYWVmNWJhMDYwNzQ2Njk3MTZiYmQzNzg4ZDg5YmRkZTgxNTk1OTk2ODA5MmY3NmNjNGViOWE5Nzg3JyxcbiAgICAgICAgJzdhMTg4ZmEzNTIwZTMwZDQ2MWRhMjUwMTA0NTczMWNhOTQxNDYxOTgyODgzMzk1OTM3ZjY4ZDAwYzY0NGE1NzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Y3MTBkNzlkOWViOTYyMjk3ZTRmNjIzMmI0MGU4ZjdmZWIyYmM2MzgxNDYxNGQ2OTJjMTJkZTc1MjQwODIyMWUnLFxuICAgICAgICAnZWE5OGU2NzIzMmQzYjMyOTVkM2I1MzU1MzIxMTVjY2FjODYxMmM3MjE4NTE2MTc1MjZhZTQ3YTljNzdiZmM4MicsXG4gICAgICBdLFxuICAgIF0sXG4gIH0sXG4gIG5hZjoge1xuICAgIHduZDogNyxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2Y5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjknLFxuICAgICAgICAnMzg4ZjdiMGY2MzJkZTgxNDBmZTMzN2U2MmEzN2YzNTY2NTAwYTk5OTM0YzIyMzFiNmNiOWZkNzU4NGI4ZTY3MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmY4YmRlNGQxYTA3MjA5MzU1YjRhNzI1MGE1YzUxMjhlODhiODRiZGRjNjE5YWI3Y2JhOGQ1NjliMjQwZWZlNCcsXG4gICAgICAgICdkOGFjMjIyNjM2ZTVlM2Q2ZDRkYmE5ZGRhNmM5YzQyNmY3ODgyNzFiYWIwZDY4NDBkY2E4N2QzYWE2YWM2MmQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1Y2JkZjA2NDZlNWRiNGVhYTM5OGYzNjVmMmVhN2EwZTNkNDE5YjdlMDMzMGUzOWNlOTJiZGRlZGNhYzRmOWJjJyxcbiAgICAgICAgJzZhZWJjYTQwYmEyNTU5NjBhMzE3OGQ2ZDg2MWE1NGRiYTgxM2QwYjgxM2ZkZTdiNWE1MDgyNjI4MDg3MjY0ZGEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2FjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUnLFxuICAgICAgICAnY2MzMzg5MjFiMGE3ZDlmZDY0MzgwOTcxNzYzYjYxZTlhZGQ4ODhhNDM3NWY4ZTBmMDVjYzI2MmFjNjRmOWMzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc0YWU3Zjg1OGE5NDExZTVlZjQyNDZiNzBjNjVhYWM1NjQ5OTgwYmU1YzE3ODkxYmJlYzE3ODk1ZGEwMDhjYicsXG4gICAgICAgICdkOTg0YTAzMmViNmI1ZTE5MDI0M2RkNTZkN2I3YjM2NTM3MmRiMWUyZGZmOWQ2YTgzMDFkNzRjOWM5NTNjNjFiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjg3NzNjMmQ5NzUyODhiYzdkMWQyMDVjMzc0ODY1MWIwNzVmYmM2NjEwZTU4Y2RkZWVkZGY4ZjE5NDA1YWE4JyxcbiAgICAgICAgJ2FiMDkwMmU4ZDg4MGE4OTc1ODIxMmViNjVjZGFmNDczYTFhMDZkYTUyMWZhOTFmMjliNWNiNTJkYjAzZWQ4MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZScsXG4gICAgICAgICc1ODFlMjg3MmE4NmM3MmE2ODM4NDJlYzIyOGNjNmRlZmVhNDBhZjJiZDg5NmQzYTVjNTA0ZGM5ZmY2YTI2YjU4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZWZkZWE0Y2RiNjc3NzUwYTQyMGZlZTgwN2VhY2YyMWViOTg5OGFlNzliOTc2ODc2NmU0ZmFhMDRhMmQ0YTM0JyxcbiAgICAgICAgJzQyMTFhYjA2OTQ2MzUxNjhlOTk3YjBlYWQyYTkzZGFlY2VkMWY0YTA0YTk1YzBmNmNmYjE5OWY2OWU1NmViNzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJiNGVhMGE3OTdhNDQzZDI5M2VmNWNmZjQ0NGY0OTc5ZjA2YWNmZWJkN2U4NmQyNzc0NzU2NTYxMzgzODViNmMnLFxuICAgICAgICAnODVlODliYzAzNzk0NWQ5M2IzNDMwODNiNWExYzg2MTMxYTAxZjYwYzUwMjY5NzYzYjU3MGM4NTRlNWMwOWI3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNScsXG4gICAgICAgICczMjFlYjQwNzUzNDhmNTM0ZDU5YzE4MjU5ZGRhM2UxZjRhMWIzYjJlNzFiMTAzOWM2N2JkM2Q4YmNmODE5OThjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZmEyMTA0ZDZiMzhkMTFiMDIzMDAxMDU1OTg3OTEyNGU0MmFiOGRmZWZmNWZmMjlkYzljZGFkZDRlY2FjYzNmJyxcbiAgICAgICAgJzJkZTEwNjgyOTVkZDg2NWI2NDU2OTMzNWJkNWRkODAxODFkNzBlY2ZjODgyNjQ4NDIzYmE3NmI1MzJiN2Q2NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTI0ODI3OWIwOWI0ZDY4ZGFiMjFhOWIwNjZlZGRhODMyNjNjM2Q4NGUwOTU3MmUyNjljYTBjZDdmNTQ1MzcxNCcsXG4gICAgICAgICc3MzAxNmY3YmYyMzRhYWRlNWQxYWE3MWJkZWEyYjFmZjNmYzBkZTJhODg3OTEyZmZlNTRhMzJjZTk3Y2IzNDAyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5JyxcbiAgICAgICAgJ2E2OWRjZTRhN2Q2Yzk4ZThkNGExYWNhODdlZjhkNzAwM2Y4M2MyMzBmM2FmYTcyNmFiNDBlNTIyOTBiZTFjNTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0NGQxMmM3MDY1ZDgxMmU4YWNmMjhkN2NiYjE5ZjkwMTFlY2Q5ZTlmZGYyODFiMGU2YTNiNWU4N2QyMmU3ZGInLFxuICAgICAgICAnMjExOWE0NjBjZTMyNmNkYzc2YzQ1OTI2Yzk4MmZkYWMwZTEwNmU4NjFlZGY2MWM1YTAzOTA2M2YwZTBlNjQ4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmEyNDViZjZkYzY5ODUwNGM4OWEyMGNmZGVkNjA4NTMxNTJiNjk1MzM2YzI4MDYzYjYxYzY1Y2JkMjY5ZTZiNCcsXG4gICAgICAgICdlMDIyY2Y0MmMyYmQ0YTcwOGIzZjUxMjZmMTZhMjRhZDhiMzNiYTQ4ZDA0MjNiNmVmZDVlNjM0ODEwMGQ4YTgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1JyxcbiAgICAgICAgJ2I5YzM5OGYxODY4MDZmNWQyNzU2MTUwNmU0NTU3NDMzYTJjZjE1MDA5ZTQ5OGFlN2FkZWU5ZDYzZDAxYjIzOTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNWJkYjAxOTk4MTcxOGI5ODZkMGYwN2U4MzRjYjBkOWRlYjgzNjBmZmI3ZjYxZGY5ODIzNDVlZjI3YTc0NzknLFxuICAgICAgICAnMjk3MmQyZGU0ZjhkMjA2ODFhNzhkOTNlYzk2ZmUyM2MyNmJmYWU4NGZiMTRkYjQzYjAxZTFlOTA1NmI4YzQ5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MmQxNGRhYjQxNTBiZjQ5NzQwMmZkYzQ1YTIxNWUxMGRjYjAxYzM1NDk1OWIxMGNmZTMxYzdlOWQ4N2ZmMzNkJyxcbiAgICAgICAgJzgwZmMwNmJkOGNjNWIwMTA5ODA4OGExOTUwZWVkMGRiMDFhYTEzMjk2N2FiNDcyMjM1ZjU2NDI0ODNiMjVlYWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYnLFxuICAgICAgICAnMWMzODMwM2YxY2M1YzMwZjI2ZTY2YmFkN2ZlNzJmNzBhNjVlZWQ0Y2JlNzAyNGViMWFhMDFmNTY0MzBiZDU3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2E5Mzc1YWQ2MTY3YWQ1NGFhNzRjNjM0OGNjNTRkMzQ0Y2M1ZGM5NDg3ZDg0NzA0OWQ1ZWFiYjBmYTAzYzhmYicsXG4gICAgICAgICdkMGUzZmE5ZWNhODcyNjkwOTU1OWUwZDc5MjY5MDQ2YmRjNTllYTEwYzcwY2UyYjAyZDQ5OWVjMjI0ZGM3ZjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1MjhlY2Q5YjY5NmI1NGM5MDdhOWVkMDQ1NDQ3YTc5YmI0MDhlYzM5YjY4ZGY1MDRiYjUxZjQ1OWJjM2ZmYzknLFxuICAgICAgICAnZWVjZjQxMjUzMTM2ZTVmOTk5NjZmMjE4ODFmZDY1NmViYzQzNDU0MDVjNTIwZGJjMDYzNDY1YjUyMTQwOTkzMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzJyxcbiAgICAgICAgJzc1OGYzZjQxYWZkNmVkNDI4YjMwODFiMDUxMmZkNjJhNTRjM2YzYWZiYjViNjc2NGI2NTMwNTJhMTI5NDljOWEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3ZjIzMDkzNmVlODhjYmJkNzNkZjkzMGQ2NDcwMmVmODgxZDgxMWUwZTE0OThlMmYxYzEzZWIxZmMzNDVkNzQnLFxuICAgICAgICAnOTU4ZWY0MmE3ODg2YjY0MDBhMDgyNjZlOWJhMWIzNzg5NmM5NTMzMGQ5NzA3N2NiYmU4ZWIzYzc2NzFjNjBkNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjJkYWM5OTFjYzRjZTRiOWVhNDQ4ODdlNWM3YzBiY2U1OGM4MDA3NGFiOWQ0ZGJhZWIyODUzMWI3NzM5ZjUzMCcsXG4gICAgICAgICdlMGRlZGM5YjNiMmY4ZGFkNGRhMWYzMmRlYzI1MzFkZjllYjVmYmViMDU5OGU0ZmQxYTExN2RiYTcwM2EzYzM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViJyxcbiAgICAgICAgJzVlZDQzMGQ3OGMyOTZjMzU0MzExNDMwNmRkODYyMmQ3YzYyMmUyN2M5NzBhMWRlMzFjYjM3N2IwMWFmNzMwN2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YxNmY4MDQyNDRlNDZlMmEwOTIzMmQ0YWZmM2I1OTk3NmI5OGZhYzE0MzI4YTJkMWEzMjQ5NmI0OTk5OGYyNDcnLFxuICAgICAgICAnY2VkYWJkOWI4MjIwM2Y3ZTEzZDIwNmZjZGY0ZTMzZDkyYTZjNTNjMjZlNWNjZTI2ZDY1Nzk5NjJjNGUzMWRmNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2FmNzU0MjcyZGM4NDU2M2IwMzUyYjdhMTQzMTFhZjU1ZDI0NTMxNWFjZTI3YzY1MzY5ZTE1ZjcxNTFkNDFkMScsXG4gICAgICAgICdjYjQ3NDY2MGVmMzVmNWYyYTQxYjY0M2ZhNWU0NjA1NzVmNGZhOWI3OTYyMjMyYTVjMzJmOTA4MzE4YTA0NDc2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwJyxcbiAgICAgICAgJzQxMTliODg3NTNjMTViZDZhNjkzYjAzZmNkZGJiNDVkNWFjNmJlNzRhYjVmMGVmNDRiMGJlOTQ3NWE3ZTRiNDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2MzVjYTcyZDdlODQzMmMzMzhlYzUzY2QxMjIyMGJjMDFjNDg2ODVlMjRmN2RjOGM2MDJhNzc0Njk5OGU0MzUnLFxuICAgICAgICAnOTFiNjQ5NjA5NDg5ZDYxM2QxZDVlNTkwZjc4ZTZkNzRlY2ZjMDYxZDU3MDQ4YmFkOWU3NmYzMDJjNWI5YzYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NTRlMzIzOWYzMjU1NzBjZGJiZjRhODdkZWVlOGE2NmI3ZjJiMzM0NzlkNDY4ZmJjMWE1MDc0M2JmNTZjYzE4JyxcbiAgICAgICAgJzY3M2ZiODZlNWJkYTMwZmIzY2QwZWQzMDRlYTQ5YTAyM2VlMzNkMDE5N2E2OTVkMGM1ZDk4MDkzYzUzNjY4MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCcsXG4gICAgICAgICc1OWM5ZTBiYmEzOTRlNzZmNDBjMGFhNTgzNzlhM2NiNmE1YTIyODM5OTNlOTBjNDE2NzAwMmFmNDkyMGUzN2Y1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxODZiNDgzZDA1NmEwMzM4MjZhZTczZDg4ZjczMjk4NWM0Y2NiMWYzMmJhMzVmNGI0Y2M0N2ZkY2YwNGFhNmViJyxcbiAgICAgICAgJzNiOTUyZDMyYzY3Y2Y3N2UyZTE3NDQ2ZTIwNDE4MGFiMjFmYjgwOTA4OTUxMzhiNGE0YTc5N2Y4NmU4MDg4OGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmOWQ3MGE2Yjk4NzZjZTU0NGM5ODU2MWY0YmU0ZjcyNTQ0MmU2ZDJiNzM3ZDljOTFhODMyMTcyNGNlMDk2M2YnLFxuICAgICAgICAnNTVlYjJkYWZkODRkNmNjZDVmODYyYjc4NWRjMzlkNGFiMTU3MjIyNzIwZWY5ZGEyMTdiOGM0NWNmMmJhMjQxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MycsXG4gICAgICAgICdlZmFlOWM4ZGJjMTQxMzA2NjFlOGNlYzAzMGM4OWFkMGMxM2M2NmMwZDE3YTI5MDVjZGM3MDZhYjczOTlhODY4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOTA3OThjMmI2NDc2ODMwZGExMmZlMDIyODdlOWU3NzdhYTNmYmExYzM1NWIxN2E3MjJkMzYyZjg0NjE0ZmJhJyxcbiAgICAgICAgJ2UzOGRhNzZkY2Q0NDA2MjE5ODhkMDBiY2Y3OWFmMjVkNWIyOWMwOTRkYjJhMjMxNDZkMDAzYWZkNDE5NDNlN2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2FmM2M0MjNhOTVkOWY1YjMwNTQ3NTRlZmExNTBhYzM5Y2QyOTU1MmZlMzYwMjU3MzYyZGZkZWNlZjQwNTNiNDUnLFxuICAgICAgICAnZjk4YTNmZDgzMWViMmI3NDlhOTNiMGU2ZjM1Y2ZiNDBjOGNkNWFhNjY3YTE1NTgxYmMyZmVkZWQ0OThmZDljNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YScsXG4gICAgICAgICc3NDRiMTE1MmVhY2JlNWUzOGRjYzg4Nzk4MGRhMzhiODk3NTg0YTY1ZmEwNmNlZGQyYzkyNGY5N2NiYWM1OTk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OWRiZjQ2ZjhjOTQ3NTliYTIxMjc3YzMzNzg0ZjQxNjQ1ZjdiNDRmNmM1OTZhNThjZTkyZTY2NjE5MWFiZTNlJyxcbiAgICAgICAgJ2M1MzRhZDQ0MTc1ZmJjMzAwZjRlYTZjZTY0ODMwOWEwNDJjZTczOWE3OTE5Nzk4Y2Q4NWUyMTZjNGEzMDdmNmUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YxM2FkYTk1MTAzYzQ1MzczMDVlNjkxZTc0ZTlhNGE4ZGQ2NDdlNzExYTk1ZTczY2I2MmRjNjAxOGNmZDg3YjgnLFxuICAgICAgICAnZTEzODE3YjQ0ZWUxNGRlNjYzYmY0YmM4MDgzNDFmMzI2OTQ5ZTIxYTZhNzVjMjU3MDc3ODQxOWJkYWY1NzMzZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYycsXG4gICAgICAgICczMGU5M2U4NjRlNjY5ZDgyMjI0Yjk2N2MzMDIwYjhmYThkMWU0ZTM1MGI2Y2JjYzUzN2E0OGI1Nzg0MTE2M2EyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhkY2FkZjU5OTBlMDQ4YWEzODc0ZDQ2YWJlZjlkNzAxODU4Zjk1ZGU4MDQxZDJhNjgyOGM5OWUyMjYyNTE5JyxcbiAgICAgICAgJ2U0OTFhNDI1MzdmNmU1OTdkNWQyOGEzMjI0YjFiYzI1ZGY5MTU0ZWZiZDJlZjFkMmNiYmEyY2FlNTM0N2Q1N2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5NjI0MTQ0NTBjNzZjMTY4OWM3YjQ4ZjgyMDJlYzM3ZmIyMjRjZjVhYzBiZmExNTcwMzI4YThhM2Q3Yzc3YWInLFxuICAgICAgICAnMTAwYjYxMGVjNGZmYjQ3NjBkNWMxZmMxMzNlZjZmNmIxMjUwN2EwNTFmMDRhYzU3NjBhZmE1YjI5ZGI4MzQzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYScsXG4gICAgICAgICdlZjBhZmJiMjA1NjIwNTQ0OGUxNjUyYzQ4ZTgxMjdmYzYwMzllNzdjMTVjMjM3OGI3ZTdkMTVhMGRlMjkzMzExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2NjMzBhZDZiNDgzZTRiYzc5Y2UyYzlkZDhiYzU0OTkzZTk0N2ViOGRmNzg3YjQ0Mjk0M2QzZjdiNTI3ZWFmJyxcbiAgICAgICAgJzhiMzc4YTIyZDgyNzI3OGQ4OWM1ZTliZThmOTUwOGFlM2MyYWQ0NjI5MDM1ODYzMGFmYjM0ZGIwNGVlZGUwYTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2MjRkODQ3ODA3MzI4NjBjZTFjNzhmY2JmZWZlMDhiMmIyOTgyM2RiOTEzZjY0OTM5NzViYTBmZjQ4NDc2MTAnLFxuICAgICAgICAnNjg2NTFjZjliNmRhOTAzZTA5MTQ0NDhjNmNkOWQ0Y2E4OTY4NzhmNTI4MmJlNGM4Y2MwNmUyYTQwNDA3ODU3NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCcsXG4gICAgICAgICdmNTQzNWEyYmQyYmFkZjdkNDg1YTRkOGI4ZGI5ZmNjZTNlMWVmOGUwMjAxZTQ1NzhjNTQ2NzNiYzFkYzVlYTFkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNWQ5NDQxMjU0OTQ1MDY0Y2YxYTFjMzNiYmQzYjQ5Zjg5NjZjNTA5MjE3MWU2OTllZjI1OGRmYWI4MWMwNDVjJyxcbiAgICAgICAgJ2Q1NmViMzBiNjk0NjNlNzIzNGY1MTM3YjczYjg0MTc3NDM0ODAwYmFjZWJmYzY4NWZjMzdiYmU5ZWZlNDA3MGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ExZDBmY2YyZWM5ZGU2NzViNjEyMTM2ZTVjZTcwZDI3MWMyMTQxN2M5ZDJiOGFhYWFjMTM4NTk5ZDA3MTc5NDAnLFxuICAgICAgICAnZWRkNzdmNTBiY2I1YTNjYWIyZTkwNzM3MzA5NjY3ZjI2NDE0NjJhNTQwNzBmM2Q1MTkyMTJkMzljMTk3YTYyOScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCcsXG4gICAgICAgICdhODU1YmFiYWQ1Y2Q2MGM4OGI0MzBhNjlmNTNhMWE3YTM4Mjg5MTU0OTY0Nzk5YmU0M2QwNmQ3N2QzMWRhMDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMxMTA5MWRkOTg2MGU4ZTIwZWUxMzQ3M2MxMTU1ZjVmNjk2MzVlMzk0NzA0ZWFhNzQwMDk0NTIyNDZjZmE5YjMnLFxuICAgICAgICAnNjZkYjY1NmY4N2QxZjA0ZmZmZDFmMDQ3ODhjMDY4MzA4NzFlYzVhNjRmZWVlNjg1YmQ4MGYwYjEyODZkODM3NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzRjMWZkMDRkMzAxYmU4OWIzMWMwNDQyZDNlNmFjMjQ4ODM5MjhiNDVhOTM0MDc4MTg2N2Q0MjMyZWMyZGJkZicsXG4gICAgICAgICc5NDE0Njg1ZTk3YjFiNTk1NGJkNDZmNzMwMTc0MTM2ZDU3ZjFjZWViNDg3NDQzZGM1MzIxODU3YmE3M2FiZWUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMnLFxuICAgICAgICAnNGNiOTU5NTdlODNkNDBiMGY3M2FmNDU0NGNjY2Y2YjFmNGIwOGQzYzA3YjI3ZmI4ZDhjMjk2MmE0MDA3NjZkMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDdiODc0MGY3NGE4ZmJhYWIxZjY4M2RiOGY0NWRlMjY1NDNhNTQ5MGJjYTYyNzA4NzIzNjkxMjQ2OWEwYjQ0OCcsXG4gICAgICAgICdmYTc3OTY4MTI4ZDljOTJlZTEwMTBmMzM3YWQ0NzE3ZWZmMTVkYjVlZDNjMDQ5YjM0MTFlMDMxNWVhYTQ1OTNiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMmQzMWMyMjJmOGY2ZjBlZjg2ZjdjOThkM2EzMzM1ZWFkNWJjZDMyYWJkZDk0Mjg5ZmU0ZDMwOTFhYTgyNGJmJyxcbiAgICAgICAgJzVmMzAzMmY1ODkyMTU2ZTM5Y2NkM2Q3OTE1YjllMWRhMmU2ZGFjOWU2ZjI2ZTk2MTExOGQxNGI4NDYyZTE2NjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUnLFxuICAgICAgICAnOGVjMGJhMjM4Yjk2YmVjMGNiZGRkY2FlMGFhNDQyNTQyZWVlMWZmNTBjOTg2ZWE2YjM5ODQ3YjNjYzA5MmZmNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUwNzlhZGIxZGYxODYwMDc0MzU2YTI1YWEzODIwNmE2ZDcxNmIyYzNlNjc0NTNkMjg3Njk4YmFkN2IyYjJkNicsXG4gICAgICAgICc4ZGMyNDEyYWFmZTNiZTVjNGM1ZjM3ZTBlY2M1ZjlmNmE0NDY5ODlhZjA0YzRlMjVlYmFhYzQ3OWVjMWM4YzFlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNmVjOTNlNDQ3ZWM4M2YwNDY3YjE4MzAyZWU2MjBmN2U2NWRlMzMxODc0YzlkYzcyYmZkODYxNmJhOWRhNmI1JyxcbiAgICAgICAgJzVlNDYzMTE1MGU2MmZiNDBkMGU4YzJhN2NhNTgwNGEzOWQ1ODE4NmE1MGU0OTcxMzk2MjY3NzhlMjViMDY3NGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTknLFxuICAgICAgICAnZjY1ZjVkM2UyOTJjMmUwODE5YTUyODM5MWM5OTQ2MjRkNzg0ODY5ZDdlNmVhNjdmYjE4MDQxMDI0ZWRjMDdkYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzhjOTQwNzU0NGFjMTMyNjkyZWUxOTEwYTAyNDM5OTU4YWUwNDg3NzE1MTM0MmVhOTZjNGI2YjM1YTQ5ZjUxJyxcbiAgICAgICAgJ2YzZTAzMTkxNjllYjliODVkNTQwNDc5NTUzOWE1ZTY4ZmExZmJkNTgzYzA2NGQyNDYyYjY3NWYxOTRhM2RkYjQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5NGY0YmUyMTlhMWE3NzAxNmRjZDgzODQzMWFlYTAwMDFjZGM4YWU3YTZmYzY4ODcyNjU3OGQ5NzAyODU3YTUnLFxuICAgICAgICAnNDIyNDJhOTY5MjgzYTVmMzM5YmE3ZjA3NWUzNmJhMmFmOTI1Y2UzMGQ3NjdlZDZlNTVmNGIwMzE4ODBkNTYyYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNScsXG4gICAgICAgICcyMDRiNWQ2Zjg0ODIyYzMwN2U0YjRhNzE0MDczN2FlYzIzZmM2M2I2NWIzNWY4NmExMDAyNmRiZDJkODY0ZTZiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDE5MTYzNjVhYmIyYjVkMDkxOTJmNWYyZGJlYWZlYzIwOGYwMjBmMTI1NzBhMTg0ZGJhZGMzZTU4NTk1OTk3JyxcbiAgICAgICAgJzRmMTQzNTFkMDA4N2VmYTQ5ZDI0NWIzMjg5ODQ5ODlkNWNhZjk0NTBmMzRiZmMwZWQxNmU5NmI1OGZhOTkxMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQxZDYwNjNhNTg2ZmE0NzVhNzI0NjA0ZGEwM2JjNWI5MmEyZTBkMmUwYTM2YWNmZTRjNzNhNTUxNDc0Mjg4MScsXG4gICAgICAgICc3Mzg2N2Y1OWMwNjU5ZTgxOTA0ZjlhMWM3NTQzNjk4ZTYyNTYyZDY3NDRjMTY5Y2U3YTM2ZGUwMWE4ZDYxNTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUnLFxuICAgICAgICAnMzlmMjNmMzY2ODA5MDg1YmVlYmZjNzExODEzMTM3NzVhOTljOWFlZDdkOGJhMzhiMTYxMzg0Yzc0NjAxMjg2NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzZlNDY0MWE1Mzk0OGZkNDc2YzM5ZjhhOTlmZDk3NGU1ZWMwNzU2NGI1MzE1ZDhiZjk5NDcxYmNhMGVmMmY2NicsXG4gICAgICAgICdkMjQyNGIxYjFhYmU0ZWI4MTY0MjI3YjA4NWM5YWE5NDU2ZWExMzQ5M2ZkNTYzZTA2ZmQ1MWNmNTY5NGM3OGZjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzY1ODFlYTdiZmJiYjI5MGMxOTFhMmY1MDdhNDFjZjU2NDM4NDIxNzBlOTE0ZmFlYWIyN2MyYzU3OWY3MjYnLFxuICAgICAgICAnZWFkMTIxNjg1OTVmZTFiZTk5MjUyMTI5YjZlNTZiMzM5MWY3YWIxNDEwY2QxZTBlZjNkY2RjYWJkMmZkYTIyNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZScsXG4gICAgICAgICc2ZmRjZWYwOWYyZjZkMGEwNDRlNjU0YWVmNjI0MTM2ZjUwM2Q0NTljM2U4OTg0NTg1OGE0N2E5MTI5Y2RkMjRlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZTMzZjFhNzQ2YzljNTc3ODEzMzM0NGQ5Mjk5ZmNhYTIwYjA5MzhlOGFjZmYyNTQ0YmI0MDI4NGI4YzVmYjk0JyxcbiAgICAgICAgJzYwNjYwMjU3ZGQxMWIzYWE5YzhlZDYxOGQyNGVkZmYyMzA2ZDMyMGYxZDAzMDEwZTMzYTdkMjA1N2YzYjNiNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODViN2MxZGNiM2NlYzFiN2VlN2YzMGRlZDc5ZGQyMGEwZWQxZjRjYzE4Y2JjZmNmYTQxMDM2MWZkOGYwOGYzMScsXG4gICAgICAgICczZDk4YTljZGQwMjZkZDQzZjM5MDQ4ZjI1YTg4NDdmNGZjYWZhZDE4OTVkN2E2MzNjNmZlZDNjMzVlOTk5NTExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxJyxcbiAgICAgICAgJ2I0YzRmZTk5Yzc3NWE2MDZlMmQ4ODYyMTc5MTM5ZmZkYTYxZGM4NjFjMDE5ZTU1Y2QyODc2ZWIyYTI3ZDg0YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTBiMWNhZTA2YjBhODQ3YTNmZWE2ZTY3MWFhZjhhZGZkZmU1OGNhMmY3NjgxMDVjODA4MmIyZTQ0OWZjZTI1MicsXG4gICAgICAgICdhZTQzNDEwMmVkZGUwOTU4ZWM0YjE5ZDkxN2E2YTI4ZTZiNzJkYTE4MzRhZmYwZTY1MGYwNDk1MDNhMjk2Y2YyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZThjZWFmYjliM2U5YTEzNmRjN2ZmNjdlODQwMjk1YjQ5OWRmYjNiMjEzM2U0YmExMTNmMmU0YzBlMTIxZTUnLFxuICAgICAgICAnY2YyMTc0MTE4YzhiNmQ3YTRiNDhmNmQ1MzRjZTVjNzk0MjJjMDg2YTYzNDYwNTAyYjgyN2NlNjJhMzI2NjgzYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYicsXG4gICAgICAgICc2ZmI4ZDU1OTFiNDY2ZjhmYzYzZGI1MGYxYzBmMWM2OTAxM2Y5OTY4ODdiODI0NGQyY2RlYzQxN2FmZWE4ZmEzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYTAxNjA2YTdhNmM5Y2RkMjQ5ZmRmY2ZhY2I5OTU4NDAwMWVkZDI4YWJiYWI3N2I1MTA0ZTk4ZThlM2IzNWQ0JyxcbiAgICAgICAgJzMyMmFmNDkwOGM3MzEyYjBjZmJmZTM2OWY3YTdiM2NkYjdkNDQ5NGJjMjgyMzcwMGNmZDY1MjE4OGEzZWE5OGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2FmOGFkZGJmMmI2NjFjOGE2YzYzMjg2NTVlYjk2NjUxMjUyMDA3ZDhjNWVhMzFiZTRhZDE5NmRlOGNlMjEzMWYnLFxuICAgICAgICAnNjc0OWU2N2MwMjliODVmNTJhMDM0ZWFmZDA5NjgzNmIyNTIwODE4NjgwZTI2YWM4ZjNkZmJjZGI3MTc0OTcwMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODknLFxuICAgICAgICAnMmFlYWJlN2U0NTMxNTEwMTE2MjE3ZjA3YmY0ZDA3MzAwZGU5N2U0ODc0ZjgxZjUzMzQyMGE3MmVlYjBiZDZhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTkxZWUzNTUzMTNkOTk3MjFjZjY5OTNmZmVkMWUzZTMwMTk5M2ZmM2VkMjU4ODAyMDc1ZWE4Y2VkMzk3ZTI0NicsXG4gICAgICAgICdiMGVhNTU4YTExM2MzMGJlYTYwZmM0Nzc1NDYwYzc5MDFmZjBiMDUzZDI1Y2EyYmRlZWU5OGYxYTRiZTVkMTk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMTM5NmQ1NWZkYTU0YzQ5ZjE5YWE5NzMxOGQ4ZGE2MWZhODU4NGU0N2IwODQ5NDUwNzdjZjAzMjU1YjUyOTg0JyxcbiAgICAgICAgJzk5OGM3NGE4Y2Q0NWFjMDEyODlkNTgzM2E3YmViNDc0NGZmNTM2YjAxYjI1N2JlNGM1NzY3YmVhOTNlYTU3YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EnLFxuICAgICAgICAnYjIyODQyNzk5OTVhMzRlMmY5ZDRkZTczOTZmYzE4YjgwZjliOGI5ZmRkMjcwZjY2NjFmNzljYTRjODFiZDI1NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2M4NzA0YjhhNjBhMGRlZmEzYTk5YTcyOTlmMmU5YzNmYmMzOTVhZmIwNGFjMDc4NDI1ZWY4YTE3OTNjYzAzMCcsXG4gICAgICAgICdiZGQ0NjAzOWZlZWQxNzg4MWQxZTA4NjJkYjM0N2Y4Y2YzOTViNzRmYzRiY2RjNGU5NDBiNzRlM2FjMWYxYjEzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNTMzZTRmN2VhODU1NWFhY2Q5Nzc3YWM1Y2FkMjliOTdkZDRkZWZjY2M1M2VlN2VhMjA0MTE5YjI4ODliMTk3JyxcbiAgICAgICAgJzZmMGEyNTZiYzVlZmRmNDI5YTJmYjYyNDJmMWE0M2EyZDliOTI1YmI0YTRiM2EyNmJiOGUwZjQ1ZWI1OTYwOTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2MxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MycsXG4gICAgICAgICdjMzU5ZDY5MjNiYjM5OGY3ZmQ0NDczZTE2ZmUxYzI4NDc1Yjc0MGRkMDk4MDc1ZTZjMGU4NjQ5MTEzZGMzYTM4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNmNiYzMwNDZiYzZhNDUwYmFjMjQ3ODlmYTE3MTE1YTRjOTczOWVkNzVmOGYyMWNlNDQxZjcyZTBiOTBlNmVmJyxcbiAgICAgICAgJzIxYWU3ZjQ2ODBlODg5YmIxMzA2MTllMmMwZjk1YTM2MGNlYjU3M2M3MDYwMzEzOTg2MmFmZDYxN2ZhOWI5ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzQ3ZDZkOWEwMmM0ODkyN2ViZmI4NmMxMzU5YjFjYWYxMzBhM2MwMjY3ZDExY2U2MzQ0YjM5Zjk5ZDQzY2MzOCcsXG4gICAgICAgICc2MGVhN2Y2MWEzNTM1MjRkMWM5ODdmNmVjZWM5MmYwODZkNTY1YWI2ODc4NzBjYjEyNjg5ZmYxZTMxYzc0NDQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhJyxcbiAgICAgICAgJzQ5Yjk2NzE1YWI2ODc4YTc5ZTc4ZjA3Y2U1NjgwYzVkNjY3MzA1MWI0OTM1YmQ4OTdmZWE4MjRiNzdkYzIwOGEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MDc0N2NjOWQwMTJjYjFhMTNiODE0ODMwOWM2ZGU3ZWMyNWQ2OTQ1ZDY1NzE0NmI5ZDU5OTRiOGZlYjExMTEnLFxuICAgICAgICAnNWNhNTYwNzUzYmUyYTEyZmM2ZGU2Y2FmMmNiNDg5NTY1ZGI5MzYxNTZiOTUxNGUxYmI1ZTgzMDM3ZTBmYTJkNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU0MmM4ZWM4MmM5OTc5OGNjZjNhNjEwYmU4NzBlNzgzMzhjN2Y3MTMzNDhiZDM0YzgyMDNlZjQwMzdmMzUwMicsXG4gICAgICAgICc3NTcxZDc0ZWU1ZTBmYjkyYTdhOGIzM2EwNzc4MzM0MWE1NDkyMTQ0Y2M1NGJjYzQwYTk0NDczNjkzNjA2NDM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhJyxcbiAgICAgICAgJ2JlNTJkMTA3YmNmYTA5ZDhiY2I5NzM2YTgyOGNmYTdmYWM4ZGIxN2JmN2E3NmEyYzQyYWQ5NjE0MDkwMThjZjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NlZTMxY2JmN2UzNGVjMzc5ZDk0ZmI4MTRkM2Q3NzVhZDk1NDU5NWQxMzE0YmE4ODQ2OTU5ZTNlODJmNzRlMjYnLFxuICAgICAgICAnOGZkNjRhMTRjMDZiNTg5YzI2Yjk0N2FlMmJjZjZiZmEwMTQ5ZWYwYmUxNGVkNGQ4MGY0NDhhMDFjNDNiMWM2ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjRmOWVhZWEwOWI2OTE3NjE5ZjZlYTZhNGViNTQ2NGVmZGRiNThmZDQ1YjFlYmVmY2RjMWEwMWQwOGI0Nzk4NicsXG4gICAgICAgICczOWU1Yzk5MjViNWE1NGIwNzQzM2E0ZjE4YzYxNzI2ZjhiYjEzMWMwMTJjYTU0MmViMjRhOGFjMDcyMDA2ODJhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlJyxcbiAgICAgICAgJzYyZGZhZjA3YTBmNzhmZWIzMGUzMGQ2Mjk1ODUzY2UxODllMTI3NzYwYWQ2Y2Y3ZmFlMTY0ZTEyMmEyMDhkNTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ4NDU3NTI0ODIwZmE2NWE0ZjhkMzVlYjY5MzA4NTdjMDAzMmFjYzBhNGEyZGU0MjIyMzNlZWRhODk3NjEyYzQnLFxuICAgICAgICAnMjVhNzQ4YWIzNjc5NzlkOTg3MzNjMzhhMWZhMWMyZTdkYzZjYzA3ZGIyZDYwYTlhZTdhNzZhYWE0OWJkMGY3NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGZlZWVmMTg4MTEwMWYyY2IxMTY0NGYzYTJhZmRmYzIwNDVlMTk5MTkxNTI5MjNmMzY3YTE3NjdjMTFjY2VkYScsXG4gICAgICAgICdlY2ZiNzA1NmNmMWRlMDQyZjk0MjBiYWIzOTY3OTNjMGMzOTBiZGU3NGI0YmJkZmYxNmE4M2FlMDlhOWE3NTE3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5JyxcbiAgICAgICAgJ2NkNDUwZWMzMzU0Mzg5ODZkZmVmYTEwYzU3ZmVhOWJjYzUyMWEwOTU5YjJkODBiYmY3NGIxOTBkY2E3MTJkMTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3NTYwNWQ1OTEwMmE1YTI2ODQ1MDBkM2I5OTFmMmUzZjNjODhiOTMyMjU1NDcwMzVhZjI1YWY2NmUwNDU0MWYnLFxuICAgICAgICAnZjVjNTQ3NTRhOGY3MWVlNTQwYjliNDg3Mjg0NzNlMzE0ZjcyOWFjNTMwOGIwNjkzODM2MDk5MGUyYmZhZDEyNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWI5ODY2MGY0YzRkZmFhMDZhMmJlNDUzZDUwMjBiYzk5YTBjMmU2MGFiZTM4ODQ1N2RkNDNmZWZiMWVkNjIwYycsXG4gICAgICAgICc2Y2I5YTg4NzZkOWNiODUyMDYwOWFmM2FkZDI2Y2QyMGEwYTdjZDhhOTQxMTEzMWNlODVmNDQxMDAwOTkyMjNlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyJyxcbiAgICAgICAgJ2ZlZjVhM2M2ODA1OWE2ZGVjNWQ2MjQxMTRiZjFlOTFhYWMyYjlkYTU2OGQ2YWJlYjI1NzBkNTU2NDZiOGFkZjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMTYzMDI2ZTlmZDZmZTAxN2MzOGYwNmE1YmU2ZmMxMjU0MjRiMzcxY2UyNzA4ZTdiZjQ0OTE2OTFlNTc2NGEnLFxuICAgICAgICAnMWFjYjI1MGYyNTVkZDYxYzQzZDk0Y2NjNjcwZDBmNThmNDlhZTNmYTE1Yjk2NjIzZTU0MzBkYTBhZDZjNjJiMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjI2OGY1ZWY5YWQ1MWU0ZDc4ZGUzYTc1MGMyZGM4OWIxZTYyNmQ0MzUwNTg2Nzk5OTkzMmU1ZGIzM2FmM2Q4MCcsXG4gICAgICAgICc1ZjMxMGQ0YjNjOTliOWViYjE5Zjc3ZDQxYzFkZWUwMThjZjBkMzRmZDQxOTE2MTQwMDNlOTQ1YTEyMTZlNDIzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkJyxcbiAgICAgICAgJzQzODEzNmQ2MDNlODU4YTNhNWM0NDBjMzhlY2NiYWRkYzFkMjk0MjExNGUyZWRkZDQ3NDBkMDk4Y2VkMWYwZDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhkOGI5ODU1YzdjMDUyYTM0MTQ2ZmQyMGZmYjY1OGJlYTRiOWY2OWUwZDgyNWViZWMxNmU4YzNjZTJiNTI2YTEnLFxuICAgICAgICAnY2RiNTU5ZWVkYzJkNzlmOTI2YmFmNDRmYjg0ZWE0ZDQ0YmNmNTBmZWU1MWQ3Y2ViMzBlMmU3ZjQ2MzAzNjc1OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTJkYjBiNTM4NGRmYmYwNWJmYTlkNDcyZDdhZTI2ZGZlNGI4NTFjZWNhOTFiMWViYTU0MjYzMTgwZGEzMmI2MycsXG4gICAgICAgICdjM2I5OTdkMDUwZWU1ZDQyM2ViYWY2NmE2ZGI5ZjU3YjMxODBjOTAyODc1Njc5ZGU5MjRiNjlkODRhN2IzNzUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTInLFxuICAgICAgICAnNmQ4OWFkN2JhNDg3NmIwYjIyYzJjYTI4MGM2ODI4NjJmMzQyYzg1OTFmMWRhZjUxNzBlMDdiZmQ5Y2NhZmE3ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2YzMGVhMjQ3NmIzOTliNDk1NzUwOWM4OGY3N2QwMTkxYWZhMmZmNWNiN2IxNGZkNmQ4ZTdkNjVhYWFiMTE5MycsXG4gICAgICAgICdjYTVlZjdkNGIyMzFjOTRjM2IxNTM4OWE1ZjYzMTFlOWRhZmY3YmI2N2IxMDNlOTg4MGVmNGJmZjYzN2FjYWVjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MDk4ZmYxZTFkOWYxNGZiNDZhMjEwZmFkYTZjOTAzZmVmMGZiN2I0YTFkZDFkOWFjNjBhMDM2MTgwMGI3YTAwJyxcbiAgICAgICAgJzk3MzExNDFkODFmYzhmODA4NGQzN2M2ZTc1NDIwMDZiM2VlMWI0MGQ2MGRmZTUzNjJhNWIxMzJmZDE3ZGRjMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCcsXG4gICAgICAgICdlZTE4NDlmNTEzZGY3MWUzMmVmYzM4OTZlZTI4MjYwYzczYmI4MDU0N2FlMjI3NWJhNDk3MjM3Nzk0Yzg3NTNjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMmNiNzRmZGRjOGU5ZmJjZDA3NmVlZjJhN2M3MmIwY2UzN2Q1MGYwODI2OWRmYzA3NGI1ODE1NTA1NDdhNGY3JyxcbiAgICAgICAgJ2QzYWEyZWQ3MWM5ZGQyMjQ3YTYyZGYwNjI3MzZlYjBiYWRkZWE5ZTM2MTIyZDJiZTg2NDFhYmNiMDA1Y2M0YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0Mzg0NDc1NjZkNGQ3YmVkYWRjMjk5NDk2YWIzNTc0MjYwMDlhMzVmMjM1Y2IxNDFiZTBkOTljZDEwYWUzYTgnLFxuICAgICAgICAnYzRlMTAyMDkxNjk4MGE0ZGE1ZDAxYWM1ZTZhZDMzMDczNGVmMGQ3OTA2NjMxYzRmMjM5MDQyNmIyZWRkNzkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZScsXG4gICAgICAgICc2NzE2M2U5MDMyMzYyODlmNzc2ZjIyYzI1ZmI4YTNhZmMxNzMyZjJiODRiNGU5NWRiZGE0N2FlNWEwODUyNjQ5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczZmFkM2ZhODRjYWYwZjM0ZjBmODliZmQyZGNmNTRmYzE3NWQ3NjdhZWMzZTUwNjg0ZjNiYTRhNGJmNWY2ODNkJyxcbiAgICAgICAgJ2NkMWJjN2NiNmNjNDA3YmIyZjBjYTY0N2M3MThhNzMwY2Y3MTg3MmU3ZDBkMmE1M2ZhMjBlZmNkZmU2MTgyNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjc0ZjI2MDBhMzAwN2EwMDU2OGMxYTdjZTA1ZDA4MTZjMWZiODRiZjEzNzA3OThmMWM2OTUzMmZhZWIxYTg2YicsXG4gICAgICAgICcyOTlkMjFmOTQxM2YzM2IzZWRmNDNiMjU3MDA0NTgwYjcwZGI1N2RhMGIxODIyNTllMDllZWNjNjllMGQzOGE1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmJyxcbiAgICAgICAgJ2Y5NDI5ZTczOGI4ZTUzYjk2OGU5OTAxNmMwNTk3MDc3ODJlMTRmNDUzNTM1OWQ1ODJmYzQxNjkxMGIzZWVhODcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwZTRlNjcwNDM1Mzg1NTU2ZTU5MzY1NzEzNTg0NWQzNmZiYjY5MzFmNzJiMDhjYjFlZDk1NGYxZTNjZTNmZjYnLFxuICAgICAgICAnNDYyZjliY2U2MTk4OTg2Mzg0OTkzNTAxMTNiYmM5YjEwYTg3OGQzNWRhNzA3NDBkYzY5NWE1NTllYjg4ZGI3YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmUyMDYyMDAzYzUxY2MzMDA0NjgyOTA0MzMwZTRkZWU3ZjNkY2QxMGIwMWU1ODBiZjE5NzFiMDRkNGNhZDI5NycsXG4gICAgICAgICc2MjE4OGJjNDlkNjFlNTQyODU3M2Q0OGE3NGUxYzY1NWIxYzYxMDkwOTA1NjgyYTBkNTU1OGVkNzJkY2NiOWJjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhJyxcbiAgICAgICAgJzdjMTBkZmIxNjRjMzQyNWY1YzcxYTNmOWQ3OTkyMDM4ZjEwNjUyMjRmNzJiYjlkMWQ5MDJhNmQxMzAzN2I0N2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IwMTVmODA0NGY1ZmNiZGNmMjFjYTI2ZDZjMzRmYjgxOTc4MjkyMDVjN2I3ZDJhN2NiNjY0MThjMTU3YjExMmMnLFxuICAgICAgICAnYWI4YzFlMDg2ZDA0ZTgxMzc0NGE2NTViMmRmOGQ1ZjgzYjNjZGM2ZmFhMzA4OGMxZDNhZWExNDU0ZTNhMWQ1ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDVlOWUxZGE2NDlkOTdkODllNDg2ODExN2E0NjVhM2E0ZjhhMThkZTU3YTE0MGQzNmIzZjJhZjM0MWEyMWI1MicsXG4gICAgICAgICc0Y2IwNDQzN2YzOTFlZDczMTExYTEzY2MxZDRkZDBkYjE2OTM0NjVjMjI0MDQ4MGQ4OTU1ZTg1OTJmMjc0NDdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiJyxcbiAgICAgICAgJ2JkMWFlYjIxYWQyMmViYjIyYTEwZjAzMDM0MTdjNmQ5NjRmOGNkZDdkZjBhY2E2MTRiMTBkYzE0ZDEyNWFjNDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2UyNzYzZDg4NWY5NThmYzY2Y2RkMjI4MDBmMGE0ODcxOTdkMGE4MmUzNzdiNDlmODBhZjg3Yzg5N2IwNjUnLFxuICAgICAgICAnYmZlZmFjZGIwZTVkMGZkN2RmM2EzMTFhOTRkZTA2MmIyNmI4MGM2MWZiYzk3NTA4Yjc5OTkyNjcxZWY3Y2E3ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk4NWZkZmQxMjdjMDU2N2M2ZjUzZWMxYmI2M2VjMzE1OGU1OTdjNDBiZmU3NDdjODNjZGRmYzkxMDY0MTkxNycsXG4gICAgICAgICc2MDNjMTJkYWYzZDk4NjJlZjJiMjVmZTFkZTI4OWFlZDI0ZWQyOTFlMGVjNjcwODcwM2E1YmQ1NjdmMzJlZDAzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5JyxcbiAgICAgICAgJ2NjNjE1N2VmMThjOWM2M2NkNjE5M2Q4MzYzMWJiZWEwMDkzZTA5Njg5NDJlOGMzM2Q1NzM3ZmQ3OTBlMGRiMDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwNjgyYTUwNzAzMzc1ZjYwMmQ0MTY2NjRiYTE5YjdmYzliYWI0MmM3Mjc0NzQ2M2E3MWQwODk2YjIyZjZkYTMnLFxuICAgICAgICAnNTUzZTA0ZjZiMDE4YjRmYTZjOGYzOWU3ZjMxMWQzMTc2MjkwZDBlMGYxOWNhNzNmMTc3MTRkOTk3N2EyMmZmOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWUyMTU4ZjBkN2MwZDVmMjZjMzc5MWVmZWZhNzk1OTc2NTRlN2EyYjI0NjRmNTJiMWVlNmMxMzQ3NzY5ZWY1NycsXG4gICAgICAgICc3MTJmY2RkMWI5MDUzZjA5MDAzYTM0ODFmYTc3NjJlOWZmZDdjOGVmMzVhMzg1MDllMmZiZjI2MjkwMDgzNzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYnLFxuICAgICAgICAnZWQ4Y2M5ZDA0YjI5ZWI4NzdkMjcwYjQ4NzhkYzQzYzE5YWVmZDMxZjRlZWUwOWVlN2I0NzgzNGMxZmE0YjFjMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzVkNDZlZmVhMzc3MWU2ZTY4YWJiODlhMTNhZDc0N2VjZjE4OTIzOTNkZmM0ZjFiNzAwNDc4OGM1MDM3NGRhOCcsXG4gICAgICAgICc5ODUyMzkwYTk5NTA3Njc5ZmQwYjg2ZmQyYjM5YTg2OGQ3ZWZjMjIxNTEzNDZlMWEzY2E0NzI2NTg2YTZiZWQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MDlhMjBjNjdkNjQ5MDBmZmI2OThjNGM4MjVmNmQ1ZjIzMTBmYjA0NTFjODY5MzQ1YjczMTlmNjQ1NjA1NzIxJyxcbiAgICAgICAgJzllOTk0OTgwZDk5MTdlMjJiNzZiMDYxOTI3ZmEwNDE0M2QwOTZjY2M1NDk2M2U2YTVlYmZhNWYzZjhlMjg2YzEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAnLFxuICAgICAgICAnNDAzNmVkYzkzMWE2MGFlODg5MzUzZjc3ZmQ1M2RlNGEyNzA4YjI2YjZmNWRhNzJhZDMzOTQxMTlkYWY0MDhmOScsXG4gICAgICBdLFxuICAgIF0sXG4gIH0sXG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZXMgPSBleHBvcnRzO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2hhc2guanMnKTtcbnZhciBjdXJ2ZSA9IHJlcXVpcmUoJy4vY3VydmUnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gUHJlc2V0Q3VydmUob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlID09PSAnc2hvcnQnKVxuICAgIHRoaXMuY3VydmUgPSBuZXcgY3VydmUuc2hvcnQob3B0aW9ucyk7XG4gIGVsc2UgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ2Vkd2FyZHMnKVxuICAgIHRoaXMuY3VydmUgPSBuZXcgY3VydmUuZWR3YXJkcyhvcHRpb25zKTtcbiAgZWxzZVxuICAgIHRoaXMuY3VydmUgPSBuZXcgY3VydmUubW9udChvcHRpb25zKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuICB0aGlzLm4gPSB0aGlzLmN1cnZlLm47XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcblxuICBhc3NlcnQodGhpcy5nLnZhbGlkYXRlKCksICdJbnZhbGlkIGN1cnZlJyk7XG4gIGFzc2VydCh0aGlzLmcubXVsKHRoaXMubikuaXNJbmZpbml0eSgpLCAnSW52YWxpZCBjdXJ2ZSwgRypOICE9IE8nKTtcbn1cbmN1cnZlcy5QcmVzZXRDdXJ2ZSA9IFByZXNldEN1cnZlO1xuXG5mdW5jdGlvbiBkZWZpbmVDdXJ2ZShuYW1lLCBvcHRpb25zKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGN1cnZlID0gbmV3IFByZXNldEN1cnZlKG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBjdXJ2ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGN1cnZlO1xuICAgIH0sXG4gIH0pO1xufVxuXG5kZWZpbmVDdXJ2ZSgncDE5MicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMTkyJyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzE4OGRhODBlIGIwMzA5MGY2IDdjYmYyMGViIDQzYTE4ODAwIGY0ZmYwYWZkIDgyZmYxMDEyJyxcbiAgICAnMDcxOTJiOTUgZmZjOGRhNzggNjMxMDExZWQgNmIyNGNkZDUgNzNmOTc3YTEgMWU3OTQ4MTEnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjI0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AyMjQnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUnLFxuICBiOiAnYjQwNTBhODUgMGMwNGIzYWIgZjU0MTMyNTYgNTA0NGIwYjcgZDdiZmQ4YmEgMjcwYjM5NDMgMjM1NWZmYjQnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZjE2YTIgZTBiOGYwM2UgMTNkZDI5NDUgNWM1YzJhM2QnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjEnLFxuICAgICdiZDM3NjM4OCBiNWY3MjNmYiA0YzIyZGZlNiBjZDQzNzVhMCA1YTA3NDc2NCA0NGQ1ODE5OSA4NTAwN2UzNCcsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyNTYnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNWFjNjM1ZDggYWEzYTkzZTcgYjNlYmJkNTUgNzY5ODg2YmMgNjUxZDA2YjAgY2M1M2IwZjYgM2JjZTNjM2UgMjdkMjYwNGInLFxuICBuOiAnZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNmIxN2QxZjIgZTEyYzQyNDcgZjhiY2U2ZTUgNjNhNDQwZjIgNzcwMzdkODEgMmRlYjMzYTAgZjRhMTM5NDUgZDg5OGMyOTYnLFxuICAgICc0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AzODQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZjJyxcbiAgYjogJ2IzMzEyZmE3IGUyM2VlN2U0IDk4OGUwNTZiIGUzZjgyZDE5IDE4MWQ5YzZlIGZlODE0MTEyIDAzMTQwODhmICcgK1xuICAgICAnNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgYzc2MzRkODEgJyArXG4gICAgICdmNDM3MmRkZiA1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycsXG4gIGhhc2g6IGhhc2guc2hhMzg0LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdhYTg3Y2EyMiBiZThiMDUzNyA4ZWIxYzcxZSBmMzIwYWQ3NCA2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCAnICtcbiAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnLFxuICAgICczNjE3ZGU0YSA5NjI2MmM2ZiA1ZDllOThiZiA5MjkyZGMyOSBmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCAnICtcbiAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwNTIxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnMDAwMDAwNTEgOTUzZWI5NjEgOGUxYzlhMWYgOTI5YTIxYTAgYjY4NTQwZWUgYTJkYTcyNWIgJyArXG4gICAgICc5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMSA1NjE5Mzk1MSBlYzdlOTM3YiAxNjUyYzBiZCAnICtcbiAgICAgJzNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwJyxcbiAgbjogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmEgNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggJyArXG4gICAgICdmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOScsXG4gIGhhc2g6IGhhc2guc2hhNTEyLFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAnICtcbiAgICAnMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgJyArXG4gICAgJ2EyZmZhOGRlIDMzNDhiM2MxIDg1NmE0MjliIGY5N2U3ZTMxIGMyZTViZDY2JyxcbiAgICAnMDAwMDAxMTggMzkyOTZhNzggOWEzYmMwMDQgNWM4YTVmYjQgMmM3ZDFiZDkgOThmNTQ0NDkgJyArXG4gICAgJzU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxICcgK1xuICAgICczZmFkMDc2MSAzNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCcsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ2N1cnZlMjU1MTknLCB7XG4gIHR5cGU6ICdtb250JyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICc3NmQwNicsXG4gIGI6ICcxJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnOScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ2VkMjU1MTknLCB7XG4gIHR5cGU6ICdlZHdhcmRzJyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICctMScsXG4gIGM6ICcxJyxcbiAgLy8gLTEyMTY2NSAqICgxMjE2NjZeKC0xKSkgKG1vZCBQKVxuICBkOiAnNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMycsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEnLFxuXG4gICAgLy8gNC81XG4gICAgJzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NTgnLFxuICBdLFxufSk7XG5cbnZhciBwcmU7XG50cnkge1xuICBwcmUgPSByZXF1aXJlKCcuL3ByZWNvbXB1dGVkL3NlY3AyNTZrMScpO1xufSBjYXRjaCAoZSkge1xuICBwcmUgPSB1bmRlZmluZWQ7XG59XG5cbmRlZmluZUN1cnZlKCdzZWNwMjU2azEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAnazI1NicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicsXG4gIGE6ICcwJyxcbiAgYjogJzcnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEnLFxuICBoOiAnMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuXG4gIC8vIFByZWNvbXB1dGVkIGVuZG9tb3JwaGlzbVxuICBiZXRhOiAnN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZScsXG4gIGxhbWJkYTogJzUzNjNhZDRjYzA1YzMwZTBhNTI2MWMwMjg4MTI2NDVhMTIyZTIyZWEyMDgxNjY3OGRmMDI5NjdjMWIyM2JkNzInLFxuICBiYXNpczogW1xuICAgIHtcbiAgICAgIGE6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgICBiOiAnLWU0NDM3ZWQ2MDEwZTg4Mjg2ZjU0N2ZhOTBhYmZlNGMzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGE6ICcxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDgnLFxuICAgICAgYjogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICB9LFxuICBdLFxuXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTgnLFxuICAgICc0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4JyxcbiAgICBwcmUsXG4gIF0sXG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2hhc2guanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWNEUkJHKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWNEUkJHKSlcbiAgICByZXR1cm4gbmV3IEhtYWNEUkJHKG9wdGlvbnMpO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG4gIHRoaXMucHJlZFJlc2lzdCA9ICEhb3B0aW9ucy5wcmVkUmVzaXN0O1xuXG4gIHRoaXMub3V0TGVuID0gdGhpcy5oYXNoLm91dFNpemU7XG4gIHRoaXMubWluRW50cm9weSA9IG9wdGlvbnMubWluRW50cm9weSB8fCB0aGlzLmhhc2guaG1hY1N0cmVuZ3RoO1xuXG4gIHRoaXMuX3Jlc2VlZCA9IG51bGw7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSBudWxsO1xuICB0aGlzLksgPSBudWxsO1xuICB0aGlzLlYgPSBudWxsO1xuXG4gIHZhciBlbnRyb3B5ID0gdXRpbHMudG9BcnJheShvcHRpb25zLmVudHJvcHksIG9wdGlvbnMuZW50cm9weUVuYyB8fCAnaGV4Jyk7XG4gIHZhciBub25jZSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5ub25jZSwgb3B0aW9ucy5ub25jZUVuYyB8fCAnaGV4Jyk7XG4gIHZhciBwZXJzID0gdXRpbHMudG9BcnJheShvcHRpb25zLnBlcnMsIG9wdGlvbnMucGVyc0VuYyB8fCAnaGV4Jyk7XG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG4gIHRoaXMuX2luaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjRFJCRztcblxuSG1hY0RSQkcucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChlbnRyb3B5LCBub25jZSwgcGVycykge1xuICB2YXIgc2VlZCA9IGVudHJvcHkuY29uY2F0KG5vbmNlKS5jb25jYXQocGVycyk7XG5cbiAgdGhpcy5LID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIHRoaXMuViA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuVi5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuS1tpXSA9IDB4MDA7XG4gICAgdGhpcy5WW2ldID0gMHgwMTtcbiAgfVxuXG4gIHRoaXMuX3VwZGF0ZShzZWVkKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IDB4MTAwMDAwMDAwMDAwMDsgIC8vIDJeNDhcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faG1hYyA9IGZ1bmN0aW9uIGhtYWMoKSB7XG4gIHJldHVybiBuZXcgaGFzaC5obWFjKHRoaXMuaGFzaCwgdGhpcy5LKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWQpIHtcbiAgdmFyIGttYWMgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAwIF0pO1xuICBpZiAoc2VlZClcbiAgICBrbWFjID0ga21hYy51cGRhdGUoc2VlZCk7XG4gIHRoaXMuSyA9IGttYWMuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgaWYgKCFzZWVkKVxuICAgIHJldHVybjtcblxuICB0aGlzLksgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDEgXSlcbiAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcbiAgICAgICAgICAgICAgIC5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLnJlc2VlZCA9IGZ1bmN0aW9uIHJlc2VlZChlbnRyb3B5LCBlbnRyb3B5RW5jLCBhZGQsIGFkZEVuYykge1xuICAvLyBPcHRpb25hbCBlbnRyb3B5IGVuY1xuICBpZiAodHlwZW9mIGVudHJvcHlFbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVudHJvcHlFbmM7XG4gICAgZW50cm9weUVuYyA9IG51bGw7XG4gIH1cblxuICBlbnRyb3B5ID0gdXRpbHMudG9BcnJheShlbnRyb3B5LCBlbnRyb3B5RW5jKTtcbiAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyk7XG5cbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcblxuICB0aGlzLl91cGRhdGUoZW50cm9weS5jb25jYXQoYWRkIHx8IFtdKSk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiBnZW5lcmF0ZShsZW4sIGVuYywgYWRkLCBhZGRFbmMpIHtcbiAgaWYgKHRoaXMuX3Jlc2VlZCA+IHRoaXMucmVzZWVkSW50ZXJ2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXNlZWQgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBPcHRpb25hbCBlbmNvZGluZ1xuICBpZiAodHlwZW9mIGVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cblxuICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGFcbiAgaWYgKGFkZCkge1xuICAgIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMgfHwgJ2hleCcpO1xuICAgIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB9XG5cbiAgdmFyIHRlbXAgPSBbXTtcbiAgd2hpbGUgKHRlbXAubGVuZ3RoIDwgbGVuKSB7XG4gICAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICAgIHRlbXAgPSB0ZW1wLmNvbmNhdCh0aGlzLlYpO1xuICB9XG5cbiAgdmFyIHJlcyA9IHRlbXAuc2xpY2UoMCwgbGVuKTtcbiAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIHRoaXMuX3Jlc2VlZCsrO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHJlcywgZW5jKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBLZXlQYWlyKGVjLCBvcHRpb25zKSB7XG4gIHRoaXMuZWMgPSBlYztcbiAgdGhpcy5wcml2ID0gbnVsbDtcbiAgdGhpcy5wdWIgPSBudWxsO1xuXG4gIC8vIEtleVBhaXIoZWMsIHsgcHJpdjogLi4uLCBwdWI6IC4uLiB9KVxuICBpZiAob3B0aW9ucy5wcml2KVxuICAgIHRoaXMuX2ltcG9ydFByaXZhdGUob3B0aW9ucy5wcml2LCBvcHRpb25zLnByaXZFbmMpO1xuICBpZiAob3B0aW9ucy5wdWIpXG4gICAgdGhpcy5faW1wb3J0UHVibGljKG9wdGlvbnMucHViLCBvcHRpb25zLnB1YkVuYyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWMsIHB1YiwgZW5jKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHViOiBwdWIsXG4gICAgcHViRW5jOiBlbmMsXG4gIH0pO1xufTtcblxuS2V5UGFpci5mcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGZyb21Qcml2YXRlKGVjLCBwcml2LCBlbmMpIHtcbiAgaWYgKHByaXYgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwcml2O1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHByaXY6IHByaXYsXG4gICAgcHJpdkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHZhciBwdWIgPSB0aGlzLmdldFB1YmxpYygpO1xuXG4gIGlmIChwdWIuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ0ludmFsaWQgcHVibGljIGtleScgfTtcbiAgaWYgKCFwdWIudmFsaWRhdGUoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50JyB9O1xuICBpZiAoIXB1Yi5tdWwodGhpcy5lYy5jdXJ2ZS5uKS5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSAqIE4gIT0gTycgfTtcblxuICByZXR1cm4geyByZXN1bHQ6IHRydWUsIHJlYXNvbjogbnVsbCB9O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGNvbXBhY3QsIGVuYykge1xuICAvLyBjb21wYWN0IGlzIG9wdGlvbmFsIGFyZ3VtZW50XG4gIGlmICh0eXBlb2YgY29tcGFjdCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmMgPSBjb21wYWN0O1xuICAgIGNvbXBhY3QgPSBudWxsO1xuICB9XG5cbiAgaWYgKCF0aGlzLnB1YilcbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuZy5tdWwodGhpcy5wcml2KTtcblxuICBpZiAoIWVuYylcbiAgICByZXR1cm4gdGhpcy5wdWI7XG5cbiAgcmV0dXJuIHRoaXMucHViLmVuY29kZShlbmMsIGNvbXBhY3QpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHJpdmF0ZSA9IGZ1bmN0aW9uIGdldFByaXZhdGUoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMucHJpdjtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlID0gZnVuY3Rpb24gX2ltcG9ydFByaXZhdGUoa2V5LCBlbmMpIHtcbiAgdGhpcy5wcml2ID0gbmV3IEJOKGtleSwgZW5jIHx8IDE2KTtcblxuICAvLyBFbnN1cmUgdGhhdCB0aGUgcHJpdiB3b24ndCBiZSBiaWdnZXIgdGhhbiBuLCBvdGhlcndpc2Ugd2UgbWF5IGZhaWxcbiAgLy8gaW4gZml4ZWQgbXVsdGlwbGljYXRpb24gbWV0aG9kXG4gIHRoaXMucHJpdiA9IHRoaXMucHJpdi51bW9kKHRoaXMuZWMuY3VydmUubik7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHVibGljID0gZnVuY3Rpb24gX2ltcG9ydFB1YmxpYyhrZXksIGVuYykge1xuICBpZiAoa2V5LnggfHwga2V5LnkpIHtcbiAgICAvLyBNb250Z29tZXJ5IHBvaW50cyBvbmx5IGhhdmUgYW4gYHhgIGNvb3JkaW5hdGUuXG4gICAgLy8gV2VpZXJzdHJhc3MvRWR3YXJkcyBwb2ludHMgb24gdGhlIG90aGVyIGhhbmQgaGF2ZSBib3RoIGB4YCBhbmRcbiAgICAvLyBgeWAgY29vcmRpbmF0ZXMuXG4gICAgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ21vbnQnKSB7XG4gICAgICBhc3NlcnQoa2V5LngsICdOZWVkIHggY29vcmRpbmF0ZScpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnc2hvcnQnIHx8XG4gICAgICAgICAgICAgICB0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdlZHdhcmRzJykge1xuICAgICAgYXNzZXJ0KGtleS54ICYmIGtleS55LCAnTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZScpO1xuICAgIH1cbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUucG9pbnQoa2V5LngsIGtleS55KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLmRlY29kZVBvaW50KGtleSwgZW5jKTtcbn07XG5cbi8vIEVDREhcbktleVBhaXIucHJvdG90eXBlLmRlcml2ZSA9IGZ1bmN0aW9uIGRlcml2ZShwdWIpIHtcbiAgaWYoIXB1Yi52YWxpZGF0ZSgpKSB7XG4gICAgYXNzZXJ0KHB1Yi52YWxpZGF0ZSgpLCAncHVibGljIHBvaW50IG5vdCB2YWxpZGF0ZWQnKTtcbiAgfVxuICByZXR1cm4gcHViLm11bCh0aGlzLnByaXYpLmdldFgoKTtcbn07XG5cbi8vIEVDRFNBXG5LZXlQYWlyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5lYy5zaWduKG1zZywgdGhpcywgZW5jLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5lYy52ZXJpZnkobXNnLCBzaWduYXR1cmUsIHRoaXMsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgcmV0dXJuICc8S2V5IHByaXY6ICcgKyAodGhpcy5wcml2ICYmIHRoaXMucHJpdi50b1N0cmluZygxNiwgMikpICtcbiAgICAgICAgICcgcHViOiAnICsgKHRoaXMucHViICYmIHRoaXMucHViLmluc3BlY3QoKSkgKyAnID4nO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2lnbmF0dXJlKG9wdGlvbnMsIGVuYykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gb3B0aW9ucztcblxuICBpZiAodGhpcy5faW1wb3J0REVSKG9wdGlvbnMsIGVuYykpXG4gICAgcmV0dXJuO1xuXG4gIGFzc2VydChvcHRpb25zLnIgJiYgb3B0aW9ucy5zLCAnU2lnbmF0dXJlIHdpdGhvdXQgciBvciBzJyk7XG4gIHRoaXMuciA9IG5ldyBCTihvcHRpb25zLnIsIDE2KTtcbiAgdGhpcy5zID0gbmV3IEJOKG9wdGlvbnMucywgMTYpO1xuICBpZiAob3B0aW9ucy5yZWNvdmVyeVBhcmFtID09PSB1bmRlZmluZWQpXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gbnVsbDtcbiAgZWxzZVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG9wdGlvbnMucmVjb3ZlcnlQYXJhbTtcbn1cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuXG5mdW5jdGlvbiBQb3NpdGlvbigpIHtcbiAgdGhpcy5wbGFjZSA9IDA7XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aChidWYsIHApIHtcbiAgdmFyIGluaXRpYWwgPSBidWZbcC5wbGFjZSsrXTtcbiAgaWYgKCEoaW5pdGlhbCAmIDB4ODApKSB7XG4gICAgcmV0dXJuIGluaXRpYWw7XG4gIH1cbiAgdmFyIG9jdGV0TGVuID0gaW5pdGlhbCAmIDB4ZjtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aCBvciBvdmVyZmxvd1xuICBpZiAob2N0ZXRMZW4gPT09IDAgfHwgb2N0ZXRMZW4gPiA0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYoYnVmW3AucGxhY2VdID09PSAweDAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHZhbCA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBvZmYgPSBwLnBsYWNlOyBpIDwgb2N0ZXRMZW47IGkrKywgb2ZmKyspIHtcbiAgICB2YWwgPDw9IDg7XG4gICAgdmFsIHw9IGJ1ZltvZmZdO1xuICAgIHZhbCA+Pj49IDA7XG4gIH1cblxuICAvLyBMZWFkaW5nIHplcm9lc1xuICBpZiAodmFsIDw9IDB4N2YpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwLnBsYWNlID0gb2ZmO1xuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBybVBhZGRpbmcoYnVmKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGggLSAxO1xuICB3aGlsZSAoIWJ1ZltpXSAmJiAhKGJ1ZltpICsgMV0gJiAweDgwKSAmJiBpIDwgbGVuKSB7XG4gICAgaSsrO1xuICB9XG4gIGlmIChpID09PSAwKSB7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuICByZXR1cm4gYnVmLnNsaWNlKGkpO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLl9pbXBvcnRERVIgPSBmdW5jdGlvbiBfaW1wb3J0REVSKGRhdGEsIGVuYykge1xuICBkYXRhID0gdXRpbHMudG9BcnJheShkYXRhLCBlbmMpO1xuICB2YXIgcCA9IG5ldyBQb3NpdGlvbigpO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDMwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgobGVuICsgcC5wbGFjZSkgIT09IGRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHJsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChybGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGRhdGFbcC5wbGFjZV0gJiAxMjgpICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciByID0gZGF0YS5zbGljZShwLnBsYWNlLCBybGVuICsgcC5wbGFjZSk7XG4gIHAucGxhY2UgKz0gcmxlbjtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc2xlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHNsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc2xlbiArIHAucGxhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChkYXRhW3AucGxhY2VdICYgMTI4KSAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcyA9IGRhdGEuc2xpY2UocC5wbGFjZSwgc2xlbiArIHAucGxhY2UpO1xuICBpZiAoclswXSA9PT0gMCkge1xuICAgIGlmIChyWzFdICYgMHg4MCkge1xuICAgICAgciA9IHIuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChzWzBdID09PSAwKSB7XG4gICAgaWYgKHNbMV0gJiAweDgwKSB7XG4gICAgICBzID0gcy5zbGljZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnIgPSBuZXcgQk4ocik7XG4gIHRoaXMucyA9IG5ldyBCTihzKTtcbiAgdGhpcy5yZWNvdmVyeVBhcmFtID0gbnVsbDtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdExlbmd0aChhcnIsIGxlbikge1xuICBpZiAobGVuIDwgMHg4MCkge1xuICAgIGFyci5wdXNoKGxlbik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBvY3RldHMgPSAxICsgKE1hdGgubG9nKGxlbikgLyBNYXRoLkxOMiA+Pj4gMyk7XG4gIGFyci5wdXNoKG9jdGV0cyB8IDB4ODApO1xuICB3aGlsZSAoLS1vY3RldHMpIHtcbiAgICBhcnIucHVzaCgobGVuID4+PiAob2N0ZXRzIDw8IDMpKSAmIDB4ZmYpO1xuICB9XG4gIGFyci5wdXNoKGxlbik7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9ERVIgPSBmdW5jdGlvbiB0b0RFUihlbmMpIHtcbiAgdmFyIHIgPSB0aGlzLnIudG9BcnJheSgpO1xuICB2YXIgcyA9IHRoaXMucy50b0FycmF5KCk7XG5cbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoclswXSAmIDB4ODApXG4gICAgciA9IFsgMCBdLmNvbmNhdChyKTtcbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoc1swXSAmIDB4ODApXG4gICAgcyA9IFsgMCBdLmNvbmNhdChzKTtcblxuICByID0gcm1QYWRkaW5nKHIpO1xuICBzID0gcm1QYWRkaW5nKHMpO1xuXG4gIHdoaWxlICghc1swXSAmJiAhKHNbMV0gJiAweDgwKSkge1xuICAgIHMgPSBzLnNsaWNlKDEpO1xuICB9XG4gIHZhciBhcnIgPSBbIDB4MDIgXTtcbiAgY29uc3RydWN0TGVuZ3RoKGFyciwgci5sZW5ndGgpO1xuICBhcnIgPSBhcnIuY29uY2F0KHIpO1xuICBhcnIucHVzaCgweDAyKTtcbiAgY29uc3RydWN0TGVuZ3RoKGFyciwgcy5sZW5ndGgpO1xuICB2YXIgYmFja0hhbGYgPSBhcnIuY29uY2F0KHMpO1xuICB2YXIgcmVzID0gWyAweDMwIF07XG4gIGNvbnN0cnVjdExlbmd0aChyZXMsIGJhY2tIYWxmLmxlbmd0aCk7XG4gIHJlcyA9IHJlcy5jb25jYXQoYmFja0hhbGYpO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHJlcywgZW5jKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBIbWFjRFJCRyA9IHJlcXVpcmUoJ2htYWMtZHJiZycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjdXJ2ZXMgPSByZXF1aXJlKCcuLi9jdXJ2ZXMnKTtcbnZhciByYW5kID0gcmVxdWlyZSgnYnJvcmFuZCcpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxudmFyIEtleVBhaXIgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIEVDKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVDKSlcbiAgICByZXR1cm4gbmV3IEVDKG9wdGlvbnMpO1xuXG4gIC8vIFNob3J0Y3V0IGBlbGxpcHRpYy5lYyhjdXJ2ZS1uYW1lKWBcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIGFzc2VydChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VydmVzLCBvcHRpb25zKSxcbiAgICAgICdVbmtub3duIGN1cnZlICcgKyBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBjdXJ2ZXNbb3B0aW9uc107XG4gIH1cblxuICAvLyBTaG9ydGN1dCBmb3IgYGVsbGlwdGljLmVjKGVsbGlwdGljLmN1cnZlcy5jdXJ2ZU5hbWUpYFxuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIGN1cnZlcy5QcmVzZXRDdXJ2ZSlcbiAgICBvcHRpb25zID0geyBjdXJ2ZTogb3B0aW9ucyB9O1xuXG4gIHRoaXMuY3VydmUgPSBvcHRpb25zLmN1cnZlLmN1cnZlO1xuICB0aGlzLm4gPSB0aGlzLmN1cnZlLm47XG4gIHRoaXMubmggPSB0aGlzLm4udXNocm4oMSk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcblxuICAvLyBQb2ludCBvbiBjdXJ2ZVxuICB0aGlzLmcgPSBvcHRpb25zLmN1cnZlLmc7XG4gIHRoaXMuZy5wcmVjb21wdXRlKG9wdGlvbnMuY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIC8vIEhhc2ggZm9yIGZ1bmN0aW9uIGZvciBEUkJHXG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaCB8fCBvcHRpb25zLmN1cnZlLmhhc2g7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEVDO1xuXG5FQy5wcm90b3R5cGUua2V5UGFpciA9IGZ1bmN0aW9uIGtleVBhaXIob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEtleVBhaXIodGhpcywgb3B0aW9ucyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVByaXZhdGUgPSBmdW5jdGlvbiBrZXlGcm9tUHJpdmF0ZShwcml2LCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVByaXZhdGUodGhpcywgcHJpdiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1YiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24gZ2VuS2V5UGFpcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gICAgZW50cm9weTogb3B0aW9ucy5lbnRyb3B5IHx8IHJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksXG4gICAgZW50cm9weUVuYzogb3B0aW9ucy5lbnRyb3B5ICYmIG9wdGlvbnMuZW50cm9weUVuYyB8fCAndXRmOCcsXG4gICAgbm9uY2U6IHRoaXMubi50b0FycmF5KCksXG4gIH0pO1xuXG4gIHZhciBieXRlcyA9IHRoaXMubi5ieXRlTGVuZ3RoKCk7XG4gIHZhciBuczIgPSB0aGlzLm4uc3ViKG5ldyBCTigyKSk7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgcHJpdiA9IG5ldyBCTihkcmJnLmdlbmVyYXRlKGJ5dGVzKSk7XG4gICAgaWYgKHByaXYuY21wKG5zMikgPiAwKVxuICAgICAgY29udGludWU7XG5cbiAgICBwcml2LmlhZGRuKDEpO1xuICAgIHJldHVybiB0aGlzLmtleUZyb21Qcml2YXRlKHByaXYpO1xuICB9XG59O1xuXG5FQy5wcm90b3R5cGUuX3RydW5jYXRlVG9OID0gZnVuY3Rpb24gX3RydW5jYXRlVG9OKG1zZywgdHJ1bmNPbmx5LCBiaXRMZW5ndGgpIHtcbiAgdmFyIGJ5dGVMZW5ndGg7XG4gIGlmIChCTi5pc0JOKG1zZykgfHwgdHlwZW9mIG1zZyA9PT0gJ251bWJlcicpIHtcbiAgICBtc2cgPSBuZXcgQk4obXNnLCAxNik7XG4gICAgYnl0ZUxlbmd0aCA9IG1zZy5ieXRlTGVuZ3RoKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1zZyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBCTiBhc3N1bWVzIGFuIGFycmF5LWxpa2UgaW5wdXQgYW5kIGFzc2VydHMgbGVuZ3RoXG4gICAgYnl0ZUxlbmd0aCA9IG1zZy5sZW5ndGg7XG4gICAgbXNnID0gbmV3IEJOKG1zZywgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJOIGNvbnZlcnRzIHRoZSB2YWx1ZSB0byBzdHJpbmdcbiAgICB2YXIgc3RyID0gbXNnLnRvU3RyaW5nKCk7XG4gICAgLy8gSEVYIGVuY29kaW5nXG4gICAgYnl0ZUxlbmd0aCA9IChzdHIubGVuZ3RoICsgMSkgPj4+IDE7XG4gICAgbXNnID0gbmV3IEJOKHN0ciwgMTYpO1xuICB9XG4gIC8vIEFsbG93IG92ZXJyaWRpbmdcbiAgaWYgKHR5cGVvZiBiaXRMZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgYml0TGVuZ3RoID0gYnl0ZUxlbmd0aCAqIDg7XG4gIH1cbiAgdmFyIGRlbHRhID0gYml0TGVuZ3RoIC0gdGhpcy5uLmJpdExlbmd0aCgpO1xuICBpZiAoZGVsdGEgPiAwKVxuICAgIG1zZyA9IG1zZy51c2hybihkZWx0YSk7XG4gIGlmICghdHJ1bmNPbmx5ICYmIG1zZy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBtc2cuc3ViKHRoaXMubik7XG4gIGVsc2VcbiAgICByZXR1cm4gbXNnO1xufTtcblxuRUMucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBlbmMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBtc2cgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBtc2cgIT09ICdudW1iZXInICYmICFCTi5pc0JOKG1zZykpIHtcbiAgICBhc3NlcnQodHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgbXNnICYmIHR5cGVvZiBtc2cubGVuZ3RoID09PSAnbnVtYmVyJyxcbiAgICAgICdFeHBlY3RlZCBtZXNzYWdlIHRvIGJlIGFuIGFycmF5LWxpa2UsIGEgaGV4IHN0cmluZywgb3IgYSBCTiBpbnN0YW5jZScpO1xuICAgIGFzc2VydCgobXNnLmxlbmd0aCA+Pj4gMCkgPT09IG1zZy5sZW5ndGgpOyAvLyBub24tbmVnYXRpdmUgMzItYml0IGludGVnZXJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykgYXNzZXJ0KChtc2dbaV0gJiAyNTUpID09PSBtc2dbaV0pO1xuICB9XG5cbiAga2V5ID0gdGhpcy5rZXlGcm9tUHJpdmF0ZShrZXksIGVuYyk7XG4gIG1zZyA9IHRoaXMuX3RydW5jYXRlVG9OKG1zZywgZmFsc2UsIG9wdGlvbnMubXNnQml0TGVuZ3RoKTtcblxuICAvLyBXb3VsZCBmYWlsIGZ1cnRoZXIgY2hlY2tzLCBidXQgbGV0J3MgbWFrZSB0aGUgZXJyb3IgbWVzc2FnZSBjbGVhclxuICBhc3NlcnQoIW1zZy5pc05lZygpLCAnQ2FuIG5vdCBzaWduIGEgbmVnYXRpdmUgbWVzc2FnZScpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIGtleSB0byBwcm92aWRlIGVub3VnaCBlbnRyb3B5XG4gIHZhciBieXRlcyA9IHRoaXMubi5ieXRlTGVuZ3RoKCk7XG4gIHZhciBia2V5ID0ga2V5LmdldFByaXZhdGUoKS50b0FycmF5KCdiZScsIGJ5dGVzKTtcblxuICAvLyBaZXJvLWV4dGVuZCBub25jZSB0byBoYXZlIHRoZSBzYW1lIGJ5dGUgc2l6ZSBhcyBOXG4gIHZhciBub25jZSA9IG1zZy50b0FycmF5KCdiZScsIGJ5dGVzKTtcblxuICAvLyBSZWNoZWNrIG5vbmNlIHRvIGJlIGJpamVjdGl2ZSB0byBtc2dcbiAgYXNzZXJ0KChuZXcgQk4obm9uY2UpKS5lcShtc2cpLCAnQ2FuIG5vdCBzaWduIG1lc3NhZ2UnKTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgSG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBlbnRyb3B5OiBia2V5LFxuICAgIG5vbmNlOiBub25jZSxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jIHx8ICd1dGY4JyxcbiAgfSk7XG5cbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRvIGdlbmVyYXRlXG4gIHZhciBuczEgPSB0aGlzLm4uc3ViKG5ldyBCTigxKSk7XG5cbiAgZm9yICh2YXIgaXRlciA9IDA7IDsgaXRlcisrKSB7XG4gICAgdmFyIGsgPSBvcHRpb25zLmsgP1xuICAgICAgb3B0aW9ucy5rKGl0ZXIpIDpcbiAgICAgIG5ldyBCTihkcmJnLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTtcbiAgICBrID0gdGhpcy5fdHJ1bmNhdGVUb04oaywgdHJ1ZSk7XG4gICAgaWYgKGsuY21wbigxKSA8PSAwIHx8IGsuY21wKG5zMSkgPj0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwID0gdGhpcy5nLm11bChrKTtcbiAgICBpZiAoa3AuaXNJbmZpbml0eSgpKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3BYID0ga3AuZ2V0WCgpO1xuICAgIHZhciByID0ga3BYLnVtb2QodGhpcy5uKTtcbiAgICBpZiAoci5jbXBuKDApID09PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIgcyA9IGsuaW52bSh0aGlzLm4pLm11bChyLm11bChrZXkuZ2V0UHJpdmF0ZSgpKS5pYWRkKG1zZykpO1xuICAgIHMgPSBzLnVtb2QodGhpcy5uKTtcbiAgICBpZiAocy5jbXBuKDApID09PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIgcmVjb3ZlcnlQYXJhbSA9IChrcC5nZXRZKCkuaXNPZGQoKSA/IDEgOiAwKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAoa3BYLmNtcChyKSAhPT0gMCA/IDIgOiAwKTtcblxuICAgIC8vIFVzZSBjb21wbGVtZW50IG9mIGBzYCwgaWYgaXQgaXMgPiBgbiAvIDJgXG4gICAgaWYgKG9wdGlvbnMuY2Fub25pY2FsICYmIHMuY21wKHRoaXMubmgpID4gMCkge1xuICAgICAgcyA9IHRoaXMubi5zdWIocyk7XG4gICAgICByZWNvdmVyeVBhcmFtIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoeyByOiByLCBzOiBzLCByZWNvdmVyeVBhcmFtOiByZWNvdmVyeVBhcmFtIH0pO1xuICB9XG59O1xuXG5FQy5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIG1zZyA9IHRoaXMuX3RydW5jYXRlVG9OKG1zZywgZmFsc2UsIG9wdGlvbnMubXNnQml0TGVuZ3RoKTtcbiAga2V5ID0gdGhpcy5rZXlGcm9tUHVibGljKGtleSwgZW5jKTtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsICdoZXgnKTtcblxuICAvLyBQZXJmb3JtIHByaW1pdGl2ZSB2YWx1ZXMgdmFsaWRhdGlvblxuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuICBpZiAoci5jbXBuKDEpIDwgMCB8fCByLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAocy5jbXBuKDEpIDwgMCB8fCBzLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIFZhbGlkYXRlIHNpZ25hdHVyZVxuICB2YXIgc2ludiA9IHMuaW52bSh0aGlzLm4pO1xuICB2YXIgdTEgPSBzaW52Lm11bChtc2cpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHUyID0gc2ludi5tdWwocikudW1vZCh0aGlzLm4pO1xuICB2YXIgcDtcblxuICBpZiAoIXRoaXMuY3VydmUuX21heHdlbGxUcmljaykge1xuICAgIHAgPSB0aGlzLmcubXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gcC5nZXRYKCkudW1vZCh0aGlzLm4pLmNtcChyKSA9PT0gMDtcbiAgfVxuXG4gIC8vIE5PVEU6IEdyZWcgTWF4d2VsbCdzIHRyaWNrLCBpbnNwaXJlZCBieTpcbiAgLy8gaHR0cHM6Ly9naXQuaW8vdmFkM0tcblxuICBwID0gdGhpcy5nLmptdWxBZGQodTEsIGtleS5nZXRQdWJsaWMoKSwgdTIpO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIENvbXBhcmUgYHAueGAgb2YgSmFjb2JpYW4gcG9pbnQgd2l0aCBgcmAsXG4gIC8vIHRoaXMgd2lsbCBkbyBgcC54ID09IHIgKiBwLnpeMmAgaW5zdGVhZCBvZiBtdWx0aXBseWluZyBgcC54YCBieSB0aGVcbiAgLy8gaW52ZXJzZSBvZiBgcC56XjJgXG4gIHJldHVybiBwLmVxWFRvUChyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5ID0gZnVuY3Rpb24obXNnLCBzaWduYXR1cmUsIGosIGVuYykge1xuICBhc3NlcnQoKDMgJiBqKSA9PT0gaiwgJ1RoZSByZWNvdmVyeSBwYXJhbSBpcyBtb3JlIHRoYW4gdHdvIGJpdHMnKTtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG5cbiAgdmFyIG4gPSB0aGlzLm47XG4gIHZhciBlID0gbmV3IEJOKG1zZyk7XG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG5cbiAgLy8gQSBzZXQgTFNCIHNpZ25pZmllcyB0aGF0IHRoZSB5LWNvb3JkaW5hdGUgaXMgb2RkXG4gIHZhciBpc1lPZGQgPSBqICYgMTtcbiAgdmFyIGlzU2Vjb25kS2V5ID0gaiA+PiAxO1xuICBpZiAoci5jbXAodGhpcy5jdXJ2ZS5wLnVtb2QodGhpcy5jdXJ2ZS5uKSkgPj0gMCAmJiBpc1NlY29uZEtleSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZScpO1xuXG4gIC8vIDEuMS4gTGV0IHggPSByICsgam4uXG4gIGlmIChpc1NlY29uZEtleSlcbiAgICByID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKHIuYWRkKHRoaXMuY3VydmUubiksIGlzWU9kZCk7XG4gIGVsc2VcbiAgICByID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKHIsIGlzWU9kZCk7XG5cbiAgdmFyIHJJbnYgPSBzaWduYXR1cmUuci5pbnZtKG4pO1xuICB2YXIgczEgPSBuLnN1YihlKS5tdWwockludikudW1vZChuKTtcbiAgdmFyIHMyID0gcy5tdWwockludikudW1vZChuKTtcblxuICAvLyAxLjYuMSBDb21wdXRlIFEgPSByXi0xIChzUiAtICBlRylcbiAgLy8gICAgICAgICAgICAgICBRID0gcl4tMSAoc1IgKyAtZUcpXG4gIHJldHVybiB0aGlzLmcubXVsQWRkKHMxLCByLCBzMik7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2V0S2V5UmVjb3ZlcnlQYXJhbSA9IGZ1bmN0aW9uKGUsIHNpZ25hdHVyZSwgUSwgZW5jKSB7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuICBpZiAoc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW0gIT09IG51bGwpXG4gICAgcmV0dXJuIHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgdmFyIFFwcmltZTtcbiAgICB0cnkge1xuICAgICAgUXByaW1lID0gdGhpcy5yZWNvdmVyUHViS2V5KGUsIHNpZ25hdHVyZSwgaSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFFwcmltZS5lcShRKSlcbiAgICAgIHJldHVybiBpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgdmFsaWQgcmVjb3ZlcnkgZmFjdG9yJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGluc3RhbmNlXG4qIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFyYW1ldGVyc1xuKlxuKiBAcGFyYW0ge0FycmF5PEJ5dGU+fSBbcGFyYW1zLnNlY3JldF0gLSBzZWNyZXQgc2VlZCBieXRlc1xuKiBAcGFyYW0ge1BvaW50fSBbcGFyYW1zLnB1Yl0gLSBwdWJsaWMga2V5IHBvaW50IChha2EgYEFgIGluIGVkZHNhIHRlcm1zKVxuKiBAcGFyYW0ge0FycmF5PEJ5dGU+fSBbcGFyYW1zLnB1Yl0gLSBwdWJsaWMga2V5IHBvaW50IGVuY29kZWQgYXMgYnl0ZXNcbipcbiovXG5mdW5jdGlvbiBLZXlQYWlyKGVkZHNhLCBwYXJhbXMpIHtcbiAgdGhpcy5lZGRzYSA9IGVkZHNhO1xuICB0aGlzLl9zZWNyZXQgPSBwYXJzZUJ5dGVzKHBhcmFtcy5zZWNyZXQpO1xuICBpZiAoZWRkc2EuaXNQb2ludChwYXJhbXMucHViKSlcbiAgICB0aGlzLl9wdWIgPSBwYXJhbXMucHViO1xuICBlbHNlXG4gICAgdGhpcy5fcHViQnl0ZXMgPSBwYXJzZUJ5dGVzKHBhcmFtcy5wdWIpO1xufVxuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVkZHNhLCBwdWIpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHB1YjogcHViIH0pO1xufTtcblxuS2V5UGFpci5mcm9tU2VjcmV0ID0gZnVuY3Rpb24gZnJvbVNlY3JldChlZGRzYSwgc2VjcmV0KSB7XG4gIGlmIChzZWNyZXQgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBzZWNyZXQ7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBzZWNyZXQ6IHNlY3JldCB9KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnNlY3JldCA9IGZ1bmN0aW9uIHNlY3JldCgpIHtcbiAgcmV0dXJuIHRoaXMuX3NlY3JldDtcbn07XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwdWJCeXRlcycsIGZ1bmN0aW9uIHB1YkJ5dGVzKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLnB1YigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViJywgZnVuY3Rpb24gcHViKCkge1xuICBpZiAodGhpcy5fcHViQnl0ZXMpXG4gICAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5fcHViQnl0ZXMpO1xuICByZXR1cm4gdGhpcy5lZGRzYS5nLm11bCh0aGlzLnByaXYoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3ByaXZCeXRlcycsIGZ1bmN0aW9uIHByaXZCeXRlcygpIHtcbiAgdmFyIGVkZHNhID0gdGhpcy5lZGRzYTtcbiAgdmFyIGhhc2ggPSB0aGlzLmhhc2goKTtcbiAgdmFyIGxhc3RJeCA9IGVkZHNhLmVuY29kaW5nTGVuZ3RoIC0gMTtcblxuICB2YXIgYSA9IGhhc2guc2xpY2UoMCwgZWRkc2EuZW5jb2RpbmdMZW5ndGgpO1xuICBhWzBdICY9IDI0ODtcbiAgYVtsYXN0SXhdICY9IDEyNztcbiAgYVtsYXN0SXhdIHw9IDY0O1xuXG4gIHJldHVybiBhO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2JywgZnVuY3Rpb24gcHJpdigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMucHJpdkJ5dGVzKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdoYXNoJywgZnVuY3Rpb24gaGFzaCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuaGFzaCgpLnVwZGF0ZSh0aGlzLnNlY3JldCgpKS5kaWdlc3QoKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnbWVzc2FnZVByZWZpeCcsIGZ1bmN0aW9uIG1lc3NhZ2VQcmVmaXgoKSB7XG4gIHJldHVybiB0aGlzLmhhc2goKS5zbGljZSh0aGlzLmVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbn0pO1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtZXNzYWdlKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGNhbiBvbmx5IHZlcmlmeScpO1xuICByZXR1cm4gdGhpcy5lZGRzYS5zaWduKG1lc3NhZ2UsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZykge1xuICByZXR1cm4gdGhpcy5lZGRzYS52ZXJpZnkobWVzc2FnZSwgc2lnLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFNlY3JldCA9IGZ1bmN0aW9uIGdldFNlY3JldChlbmMpIHtcbiAgYXNzZXJ0KHRoaXMuX3NlY3JldCwgJ0tleVBhaXIgaXMgcHVibGljIG9ubHknKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnNlY3JldCgpLCBlbmMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGVuYykge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMucHViQnl0ZXMoKSwgZW5jKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gZWRkc2EgaW5zdGFuY2VcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58T2JqZWN0fSBzaWcgLVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxQb2ludH0gW3NpZy5SXSAtIFIgcG9pbnQgYXMgUG9pbnQgb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58Ym59IFtzaWcuU10gLSBTIHNjYWxhciBhcyBibiBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5SZW5jb2RlZF0gLSBSIHBvaW50IGVuY29kZWRcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuU2VuY29kZWRdIC0gUyBzY2FsYXIgZW5jb2RlZFxuKi9cbmZ1bmN0aW9uIFNpZ25hdHVyZShlZGRzYSwgc2lnKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcblxuICBpZiAodHlwZW9mIHNpZyAhPT0gJ29iamVjdCcpXG4gICAgc2lnID0gcGFyc2VCeXRlcyhzaWcpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNpZykpIHtcbiAgICBhc3NlcnQoc2lnLmxlbmd0aCA9PT0gZWRkc2EuZW5jb2RpbmdMZW5ndGggKiAyLCAnU2lnbmF0dXJlIGhhcyBpbnZhbGlkIHNpemUnKTtcbiAgICBzaWcgPSB7XG4gICAgICBSOiBzaWcuc2xpY2UoMCwgZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgICAgUzogc2lnLnNsaWNlKGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICB9O1xuICB9XG5cbiAgYXNzZXJ0KHNpZy5SICYmIHNpZy5TLCAnU2lnbmF0dXJlIHdpdGhvdXQgUiBvciBTJyk7XG5cbiAgaWYgKGVkZHNhLmlzUG9pbnQoc2lnLlIpKVxuICAgIHRoaXMuX1IgPSBzaWcuUjtcbiAgaWYgKHNpZy5TIGluc3RhbmNlb2YgQk4pXG4gICAgdGhpcy5fUyA9IHNpZy5TO1xuXG4gIHRoaXMuX1JlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUikgPyBzaWcuUiA6IHNpZy5SZW5jb2RlZDtcbiAgdGhpcy5fU2VuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5TKSA/IHNpZy5TIDogc2lnLlNlbmNvZGVkO1xufVxuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTJywgZnVuY3Rpb24gUygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMuU2VuY29kZWQoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUicsIGZ1bmN0aW9uIFIoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuUmVuY29kZWQoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUmVuY29kZWQnLCBmdW5jdGlvbiBSZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5SKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1NlbmNvZGVkJywgZnVuY3Rpb24gU2VuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZUludCh0aGlzLlMoKSk7XG59KTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuUmVuY29kZWQoKS5jb25jYXQodGhpcy5TZW5jb2RlZCgpKTtcbn07XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9IZXggPSBmdW5jdGlvbiB0b0hleCgpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnRvQnl0ZXMoKSwgJ2hleCcpLnRvVXBwZXJDYXNlKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2hhc2guanMnKTtcbnZhciBjdXJ2ZXMgPSByZXF1aXJlKCcuLi9jdXJ2ZXMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xudmFyIEtleVBhaXIgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIEVERFNBKGN1cnZlKSB7XG4gIGFzc2VydChjdXJ2ZSA9PT0gJ2VkMjU1MTknLCAnb25seSB0ZXN0ZWQgd2l0aCBlZDI1NTE5IHNvIGZhcicpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFRERTQSkpXG4gICAgcmV0dXJuIG5ldyBFRERTQShjdXJ2ZSk7XG5cbiAgY3VydmUgPSBjdXJ2ZXNbY3VydmVdLmN1cnZlO1xuICB0aGlzLmN1cnZlID0gY3VydmU7XG4gIHRoaXMuZyA9IGN1cnZlLmc7XG4gIHRoaXMuZy5wcmVjb21wdXRlKGN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICB0aGlzLnBvaW50Q2xhc3MgPSBjdXJ2ZS5wb2ludCgpLmNvbnN0cnVjdG9yO1xuICB0aGlzLmVuY29kaW5nTGVuZ3RoID0gTWF0aC5jZWlsKGN1cnZlLm4uYml0TGVuZ3RoKCkgLyA4KTtcbiAgdGhpcy5oYXNoID0gaGFzaC5zaGE1MTI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRUREU0E7XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gbWVzc2FnZSAtIG1lc3NhZ2UgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8S2V5UGFpcn0gc2VjcmV0IC0gc2VjcmV0IGJ5dGVzIG9yIGEga2V5cGFpclxuKiBAcmV0dXJucyB7U2lnbmF0dXJlfSAtIHNpZ25hdHVyZVxuKi9cbkVERFNBLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtZXNzYWdlLCBzZWNyZXQpIHtcbiAgbWVzc2FnZSA9IHBhcnNlQnl0ZXMobWVzc2FnZSk7XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21TZWNyZXQoc2VjcmV0KTtcbiAgdmFyIHIgPSB0aGlzLmhhc2hJbnQoa2V5Lm1lc3NhZ2VQcmVmaXgoKSwgbWVzc2FnZSk7XG4gIHZhciBSID0gdGhpcy5nLm11bChyKTtcbiAgdmFyIFJlbmNvZGVkID0gdGhpcy5lbmNvZGVQb2ludChSKTtcbiAgdmFyIHNfID0gdGhpcy5oYXNoSW50KFJlbmNvZGVkLCBrZXkucHViQnl0ZXMoKSwgbWVzc2FnZSlcbiAgICAubXVsKGtleS5wcml2KCkpO1xuICB2YXIgUyA9IHIuYWRkKHNfKS51bW9kKHRoaXMuY3VydmUubik7XG4gIHJldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoeyBSOiBSLCBTOiBTLCBSZW5jb2RlZDogUmVuY29kZWQgfSk7XG59O1xuXG4vKipcbiogQHBhcmFtIHtBcnJheX0gbWVzc2FnZSAtIG1lc3NhZ2UgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8U2lnbmF0dXJlfSBzaWcgLSBzaWcgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8UG9pbnR8S2V5UGFpcn0gcHViIC0gcHVibGljIGtleVxuKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlIGlmIHB1YmxpYyBrZXkgbWF0Y2hlcyBzaWcgb2YgbWVzc2FnZVxuKi9cbkVERFNBLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSwgc2lnLCBwdWIpIHtcbiAgbWVzc2FnZSA9IHBhcnNlQnl0ZXMobWVzc2FnZSk7XG4gIHNpZyA9IHRoaXMubWFrZVNpZ25hdHVyZShzaWcpO1xuICBpZiAoc2lnLlMoKS5ndGUoc2lnLmVkZHNhLmN1cnZlLm4pIHx8IHNpZy5TKCkuaXNOZWcoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tUHVibGljKHB1Yik7XG4gIHZhciBoID0gdGhpcy5oYXNoSW50KHNpZy5SZW5jb2RlZCgpLCBrZXkucHViQnl0ZXMoKSwgbWVzc2FnZSk7XG4gIHZhciBTRyA9IHRoaXMuZy5tdWwoc2lnLlMoKSk7XG4gIHZhciBScGx1c0FoID0gc2lnLlIoKS5hZGQoa2V5LnB1YigpLm11bChoKSk7XG4gIHJldHVybiBScGx1c0FoLmVxKFNHKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5oYXNoSW50ID0gZnVuY3Rpb24gaGFzaEludCgpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLmhhc2goKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgaGFzaC51cGRhdGUoYXJndW1lbnRzW2ldKTtcbiAgcmV0dXJuIHV0aWxzLmludEZyb21MRShoYXNoLmRpZ2VzdCgpKS51bW9kKHRoaXMuY3VydmUubik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tU2VjcmV0ID0gZnVuY3Rpb24ga2V5RnJvbVNlY3JldChzZWNyZXQpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVNlY3JldCh0aGlzLCBzZWNyZXQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLm1ha2VTaWduYXR1cmUgPSBmdW5jdGlvbiBtYWtlU2lnbmF0dXJlKHNpZykge1xuICBpZiAoc2lnIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBzaWc7XG4gIHJldHVybiBuZXcgU2lnbmF0dXJlKHRoaXMsIHNpZyk7XG59O1xuXG4vKipcbiogKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtam9zZWZzc29uLWVkZHNhLWVkMjU1MTktMDMjc2VjdGlvbi01LjJcbipcbiogRUREU0EgZGVmaW5lcyBtZXRob2RzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcG9pbnRzIGFuZCBpbnRlZ2Vycy4gVGhlc2UgYXJlXG4qIGhlbHBlciBjb252ZW5pZW5jZSBtZXRob2RzLCB0aGF0IHBhc3MgYWxvbmcgdG8gdXRpbGl0eSBmdW5jdGlvbnMgaW1wbGllZFxuKiBwYXJhbWV0ZXJzLlxuKlxuKi9cbkVERFNBLnByb3RvdHlwZS5lbmNvZGVQb2ludCA9IGZ1bmN0aW9uIGVuY29kZVBvaW50KHBvaW50KSB7XG4gIHZhciBlbmMgPSBwb2ludC5nZXRZKCkudG9BcnJheSgnbGUnLCB0aGlzLmVuY29kaW5nTGVuZ3RoKTtcbiAgZW5jW3RoaXMuZW5jb2RpbmdMZW5ndGggLSAxXSB8PSBwb2ludC5nZXRYKCkuaXNPZGQoKSA/IDB4ODAgOiAwO1xuICByZXR1cm4gZW5jO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMpIHtcbiAgYnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzKGJ5dGVzKTtcblxuICB2YXIgbGFzdEl4ID0gYnl0ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIG5vcm1lZCA9IGJ5dGVzLnNsaWNlKDAsIGxhc3RJeCkuY29uY2F0KGJ5dGVzW2xhc3RJeF0gJiB+MHg4MCk7XG4gIHZhciB4SXNPZGQgPSAoYnl0ZXNbbGFzdEl4XSAmIDB4ODApICE9PSAwO1xuXG4gIHZhciB5ID0gdXRpbHMuaW50RnJvbUxFKG5vcm1lZCk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50RnJvbVkoeSwgeElzT2RkKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtKSB7XG4gIHJldHVybiBudW0udG9BcnJheSgnbGUnLCB0aGlzLmVuY29kaW5nTGVuZ3RoKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnl0ZXMpIHtcbiAgcmV0dXJuIHV0aWxzLmludEZyb21MRShieXRlcyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaXNQb2ludCA9IGZ1bmN0aW9uIGlzUG9pbnQodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiB0aGlzLnBvaW50Q2xhc3M7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBlbGxpcHRpYyA9IGV4cG9ydHM7XG5cbmVsbGlwdGljLnZlcnNpb24gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuZWxsaXB0aWMudXRpbHMgPSByZXF1aXJlKCcuL2VsbGlwdGljL3V0aWxzJyk7XG5lbGxpcHRpYy5yYW5kID0gcmVxdWlyZSgnYnJvcmFuZCcpO1xuZWxsaXB0aWMuY3VydmUgPSByZXF1aXJlKCcuL2VsbGlwdGljL2N1cnZlJyk7XG5lbGxpcHRpYy5jdXJ2ZXMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2N1cnZlcycpO1xuXG4vLyBQcm90b2NvbHNcbmVsbGlwdGljLmVjID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lYycpO1xuZWxsaXB0aWMuZWRkc2EgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VkZHNhJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYXNuMS5qcycpLmJpZ251bSxcblx0QnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmFzZTY0VG9CaWdOdW0odmFsLCB6ZXJvKSB7XG5cdHZhciBidWYgPSBCdWZmZXIuZnJvbSh2YWwsICdiYXNlNjQnKTtcblx0dmFyIGJuID0gdmFsID0gbmV3IEJOKGJ1ZiwgMTAsICdiZScpLmlhYnMoKTtcblx0aWYgKHplcm8pIHtcblx0XHRidWYuZmlsbCgwKTtcblx0fVxuXHRyZXR1cm4gYm47XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnQWxnb3JpdGhtSWRlbnRpZmVyJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdhbGdvcml0aG0nKS5vYmppZCgpLFxuXHRcdHRoaXMua2V5KCdwYXJhbWV0ZXJzJykub3B0aW9uYWwoKS5hbnkoKVxuXHQpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSByZXF1aXJlKCcuL2FsZ29yaXRobS1pZGVudGlmaWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnUHVibGljS2V5SW5mbycsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnYWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuXHRcdHRoaXMua2V5KCdQdWJsaWNLZXknKS5iaXRzdHIoKVxuXHQpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdWZXJzaW9uJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuaW50KCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IHJlcXVpcmUoJy4vYWxnb3JpdGhtLWlkZW50aWZpZXInKTtcbnZhciBWZXJzaW9uID0gcmVxdWlyZSgnLi92ZXJzaW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnUHJpdmF0ZUtleUluZm8nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVLZXlBbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVLZXknKS5vY3RzdHIoKSxcblx0XHR0aGlzLmtleSgnYXR0cmlidXRlcycpLm9wdGlvbmFsKCkuYW55KClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMS5qcycpLFxuXHRCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcixcblx0RUMgPSByZXF1aXJlKCdlbGxpcHRpYycpLmVjO1xuXG52YXIgYjY0VG9CbiA9IHJlcXVpcmUoJy4vYjY0LXRvLWJuJyk7XG5cbnZhciBQdWJsaWNLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3B1YmxpYy1rZXktaW5mbycpLFxuXHRQcml2YXRlS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wcml2YXRlLWtleS1pbmZvJyksXG5cdFZlcnNpb24gPSByZXF1aXJlKCcuL2FzbjEvdmVyc2lvbicpO1xuXG52YXIgRUNQYXJhbWV0ZXJzID0gYXNuMS5kZWZpbmUoJ0VDUGFyYW1ldGVycycsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLmNob2ljZSh7XG5cdFx0bmFtZWRDdXJ2ZTogdGhpcy5vYmppZCgpXG5cdH0pO1xufSk7XG5cbnZhciBlY1ByaXZrZXlWZXIxID0gMTtcblxudmFyIEVDUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdFQ1ByaXZhdGVLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVLZXknKS5vY3RzdHIoKSxcblx0XHR0aGlzLmtleSgncGFyYW1ldGVycycpLmV4cGxpY2l0KDApLm9wdGlvbmFsKCkuYW55KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0tleScpLmV4cGxpY2l0KDEpLm9wdGlvbmFsKCkuYml0c3RyKClcblx0KTtcbn0pO1xuXG52YXIgY3VydmVzID0ge1xuXHQnUC0yNTYnOiAncDI1NicsXG5cdCdQLTM4NCc6ICdwMzg0Jyxcblx0J1AtNTIxJzogJ3A1MjEnXG59O1xuXG52YXIgb2lkcyA9IHtcblx0J1AtMjU2JzogWzEsIDIsIDg0MCwgMTAwNDUsIDMsIDEsIDddLFxuXHQnUC0zODQnOiBbMSwgMywgMTMyLCAwLCAzNF0sXG5cdCdQLTUyMSc6IFsxLCAzLCAxMzIsIDAsIDM1XVxufTtcbnZhciBwYXJhbWV0ZXJzID0ge307XG52YXIgYWxnb3JpdGhtcyA9IHt9O1xuT2JqZWN0LmtleXMob2lkcykuZm9yRWFjaChmdW5jdGlvbihjcnYpIHtcblx0cGFyYW1ldGVyc1tjcnZdID0gRUNQYXJhbWV0ZXJzLmVuY29kZSh7XG5cdFx0dHlwZTogJ25hbWVkQ3VydmUnLFxuXHRcdHZhbHVlOiBvaWRzW2Nydl1cblx0fSwgJ2RlcicpO1xuXHRhbGdvcml0aG1zW2Nydl0gPSB7XG5cdFx0YWxnb3JpdGhtOiAgWzEsIDIsIDg0MCwgMTAwNDUsIDIsIDFdLFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNbY3J2XVxuXHR9O1xufSk7XG5vaWRzID0gbnVsbDtcblxuZnVuY3Rpb24gZWNKd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmNydikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmNydlwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHR2YXIgaGFzRCA9ICdzdHJpbmcnID09PSB0eXBlb2YgandrLmQ7XG5cdHZhciB4eVR5cGVzID0gaGFzRFxuXHRcdD8gWyd1bmRlZmluZWQnLCAnc3RyaW5nJ11cblx0XHQ6IFsnc3RyaW5nJ107XG5cblx0aWYgKC0xID09PSB4eVR5cGVzLmluZGV4T2YodHlwZW9mIGp3ay54KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnhcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKC0xID09PSB4eVR5cGVzLmluZGV4T2YodHlwZW9mIGp3ay55KSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnlcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSAmJiAhaGFzRCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0dmFyIGN1cnZlTmFtZSA9IGN1cnZlc1tqd2suY3J2XTtcblx0aWYgKCFjdXJ2ZU5hbWUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGN1cnZlIFwiJyArIGp3ay5jcnYgKyAnXCInKTtcblx0fVxuXG5cdHZhciBjdXJ2ZSA9IG5ldyBFQyhjdXJ2ZU5hbWUpO1xuXG5cdHZhciBrZXkgPSB7fTtcblxuXHR2YXIgaGFzUHViID0gandrLnggJiYgandrLnk7XG5cdGlmIChoYXNQdWIpIHtcblx0XHRrZXkucHViID0ge1xuXHRcdFx0eDogYjY0VG9Cbihqd2sueCwgZmFsc2UpLFxuXHRcdFx0eTogYjY0VG9Cbihqd2sueSwgZmFsc2UpXG5cdFx0fTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUgfHwgIWhhc1B1Yikge1xuXHRcdGtleS5wcml2ID0gYjY0VG9Cbihqd2suZCwgdHJ1ZSk7XG5cdH1cblxuXHRrZXkgPSBjdXJ2ZS5rZXlQYWlyKGtleSk7XG5cblx0dmFyIGtleVZhbGlkYXRpb24gPSBrZXkudmFsaWRhdGUoKTtcblx0aWYgKCFrZXlWYWxpZGF0aW9uLnJlc3VsdCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgZm9yIGN1cnZlOiBcIicgKyBrZXlWYWxpZGF0aW9uLnJlYXNvbiArICdcIicpO1xuXHR9XG5cblx0dmFyIHJlc3VsdCA9IGtleVRvUGVtKGp3ay5jcnYsIGtleSwgb3B0cyk7XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24ga2V5VG9QZW0oY3J2LCBrZXksIG9wdHMpIHtcblx0dmFyIGNvbXBhY3QgPSBmYWxzZTtcblx0dmFyIHB1YmxpY0tleSA9IGtleS5nZXRQdWJsaWMoY29tcGFjdCwgJ2hleCcpO1xuXHRwdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXksICdoZXgnKTtcblx0cHVibGljS2V5ID0ge1xuXHRcdHVudXNlZDogMCxcblx0XHRkYXRhOiBwdWJsaWNLZXlcblx0fTtcblxuXHR2YXIgcmVzdWx0O1xuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0dmFyIHByaXZhdGVLZXkgPSBrZXkuZ2V0UHJpdmF0ZSgnaGV4Jyk7XG5cdFx0cHJpdmF0ZUtleSA9IEJ1ZmZlci5mcm9tKHByaXZhdGVLZXksICdoZXgnKTtcblxuXHRcdHJlc3VsdCA9IFByaXZhdGVLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0cHJpdmF0ZUtleUFsZ29yaXRobTogYWxnb3JpdGhtc1tjcnZdLFxuXHRcdFx0cHJpdmF0ZUtleTogRUNQcml2YXRlS2V5LmVuY29kZSh7XG5cdFx0XHRcdHZlcnNpb246IGVjUHJpdmtleVZlcjEsXG5cdFx0XHRcdHByaXZhdGVLZXk6IHByaXZhdGVLZXksXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNbY3J2XSxcblx0XHRcdFx0cHVibGljS2V5OiBwdWJsaWNLZXlcblx0XHRcdH0sICdkZXInKVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BSSVZBVEUgS0VZJ1xuXHRcdH0pO1xuXG5cdFx0cHJpdmF0ZUtleS5maWxsKDApO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IFB1YmxpY0tleUluZm8uZW5jb2RlKHtcblx0XHRcdGFsZ29yaXRobTogYWxnb3JpdGhtc1tjcnZdLFxuXHRcdFx0UHVibGljS2V5OiBwdWJsaWNLZXlcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQVUJMSUMgS0VZJ1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhpcyBpcyBpbiBhbiBpZiBpbmNhc2UgYXNuMS5qcyBhZGRzIGEgdHJhaWxpbmcgXFxuXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICgnXFxuJyAhPT0gcmVzdWx0LnNsaWNlKC0xKSkge1xuXHRcdHJlc3VsdCArPSAnXFxuJztcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZWNKd2tUb0J1ZmZlcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKTtcblxudmFyIGI2NFRvQm4gPSByZXF1aXJlKCcuL2I2NC10by1ibicpO1xuXG52YXIgUHVibGljS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wdWJsaWMta2V5LWluZm8nKSxcblx0UHJpdmF0ZUtleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHJpdmF0ZS1rZXktaW5mbycpLFxuXHRWZXJzaW9uID0gcmVxdWlyZSgnLi9hc24xL3ZlcnNpb24nKTtcblxudmFyIFJTQVByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnUlNBUHJpdmF0ZUtleScsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgnbW9kdWx1cycpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNFeHBvbmVudCcpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlRXhwb25lbnQnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpbWUxJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaW1lMicpLmludCgpLFxuXHRcdHRoaXMua2V5KCdleHBvbmVudDEnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnZXhwb25lbnQyJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2NvZWZmaWNpZW50JykuaW50KClcblx0KTtcbn0pO1xuXG52YXIgUlNBUHVibGljS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVB1YmxpY0tleScsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnbW9kdWx1cycpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNFeHBvbmVudCcpLmludCgpXG5cdCk7XG59KTtcblxudmFyIGFsZ29yaXRobSA9IHtcblx0YWxnb3JpdGhtOiBbMSwgMiwgODQwLCAxMTM1NDksIDEsIDEsIDFdLFxuXHRwYXJhbWV0ZXJzOiBbNSwgMF1cbn07XG5cbmZ1bmN0aW9uIHJzYUp3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suZSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmVcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLm4pIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5uXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suZCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnBcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5xKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5xXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suZHApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRwXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suZHEpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRxXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucWkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnFpXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgcGVtO1xuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0cGVtID0gUHJpdmF0ZUtleUluZm8uZW5jb2RlKHtcblx0XHRcdHZlcnNpb246IDAsXG5cdFx0XHRwcml2YXRlS2V5QWxnb3JpdGhtOiBhbGdvcml0aG0sXG5cdFx0XHRwcml2YXRlS2V5OiBSU0FQcml2YXRlS2V5LmVuY29kZSh7XG5cdFx0XHRcdHZlcnNpb246IDAsXG5cdFx0XHRcdG1vZHVsdXM6IGI2NFRvQm4oandrLm4sIGZhbHNlKSxcblx0XHRcdFx0cHVibGljRXhwb25lbnQ6IGI2NFRvQm4oandrLmUsIGZhbHNlKSxcblx0XHRcdFx0cHJpdmF0ZUV4cG9uZW50OiBiNjRUb0JuKGp3ay5kLCB0cnVlKSxcblx0XHRcdFx0cHJpbWUxOiBiNjRUb0JuKGp3ay5wLCB0cnVlKSxcblx0XHRcdFx0cHJpbWUyOiBiNjRUb0JuKGp3ay5xLCB0cnVlKSxcblx0XHRcdFx0ZXhwb25lbnQxOiBiNjRUb0JuKGp3ay5kcCwgdHJ1ZSksXG5cdFx0XHRcdGV4cG9uZW50MjogYjY0VG9Cbihqd2suZHEsIHRydWUpLFxuXHRcdFx0XHRjb2VmZmljaWVudDogYjY0VG9Cbihqd2sucWksIHRydWUpXG5cdFx0XHR9LCAnZGVyJylcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQUklWQVRFIEtFWSdcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRwZW0gPSBQdWJsaWNLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHRhbGdvcml0aG06IGFsZ29yaXRobSxcblx0XHRcdFB1YmxpY0tleToge1xuXHRcdFx0XHR1bnVzZWQ6IDAsXG5cdFx0XHRcdGRhdGE6IFJTQVB1YmxpY0tleS5lbmNvZGUoe1xuXHRcdFx0XHRcdG1vZHVsdXM6IGI2NFRvQm4oandrLm4sIGZhbHNlKSxcblx0XHRcdFx0XHRwdWJsaWNFeHBvbmVudDogYjY0VG9Cbihqd2suZSwgZmFsc2UpXG5cdFx0XHRcdH0sICdkZXInKVxuXHRcdFx0fVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BVQkxJQyBLRVknXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBUaGlzIGlzIGluIGFuIGlmIGluY2FzZSBhc24xLmpzIGFkZHMgYSB0cmFpbGluZyBcXG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGVsc2Vcblx0aWYgKCdcXG4nICE9PSBwZW0uc2xpY2UoLTEpKSB7XG5cdFx0cGVtICs9ICdcXG4nO1xuXHR9XG5cblx0cmV0dXJuIHBlbTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByc2FKd2tUb0J1ZmZlcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWMgPSByZXF1aXJlKCcuL2VjJyksXG5cdHJzYSA9IHJlcXVpcmUoJy4vcnNhJyk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7e2t0eTonRUMnLCBjcnY6c3RyaW5nLCBkOnN0cmluZywgeD86c3RyaW5nLCB5PzpzdHJpbmd9IHwge2t0eTonRUMnLCBjcnY6c3RyaW5nLCB4OnN0cmluZywgeTpzdHJpbmd9IHwge2t0eTonUlNBJywgZTpzdHJpbmcsIG46c3RyaW5nLCBkPzpzdHJpbmcsIHA/OnN0cmluZywgcT86c3RyaW5nLCBkcD86c3RyaW5nLCBkcT86c3RyaW5nLCBxaT86c3RyaW5nfX0gandrXG4gKiBAcGFyYW0ge3twcml2YXRlOmJvb2xlYW59PX0gb3B0c1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gandrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIGp3ayB8fCBudWxsID09PSBqd2spIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3a1wiIHRvIGJlIGFuIE9iamVjdCcpO1xuXHR9XG5cblx0dmFyIGt0eSA9IGp3ay5rdHk7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGt0eSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmt0eVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRvcHRzID0gb3B0cyB8fCB7fTtcblx0b3B0cy5wcml2YXRlID0gb3B0cy5wcml2YXRlID09PSB0cnVlO1xuXG5cdHN3aXRjaCAoa3R5KSB7XG5cdFx0Y2FzZSAnRUMnOiB7XG5cdFx0XHRyZXR1cm4gZWMoandrLCBvcHRzKTtcblx0XHR9XG5cdFx0Y2FzZSAnUlNBJzoge1xuXHRcdFx0cmV0dXJuIHJzYShqd2ssIG9wdHMpO1xuXHRcdH1cblx0XHRkZWZhdWx0OiB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGtleSB0eXBlIFwiJyArIGt0eSArICdcIicpO1xuXHRcdH1cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGp3a1RvQnVmZmVyO1xuIiwKICAgICIvLyBAdHMtc2VsZi10eXBlcz1cIi4vZGVmcy5kLnRzXCJcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBub25lID0gU3ltYm9sLmZvcignb2JqZWN0LXN0cmVhbS5ub25lJyk7XG5jb25zdCBzdG9wID0gU3ltYm9sLmZvcignb2JqZWN0LXN0cmVhbS5zdG9wJyk7XG5cbmNvbnN0IGZpbmFsU3ltYm9sID0gU3ltYm9sLmZvcignb2JqZWN0LXN0cmVhbS5maW5hbCcpO1xuY29uc3QgbWFueVN5bWJvbCA9IFN5bWJvbC5mb3IoJ29iamVjdC1zdHJlYW0ubWFueScpO1xuY29uc3QgZmx1c2hTeW1ib2wgPSBTeW1ib2wuZm9yKCdvYmplY3Qtc3RyZWFtLmZsdXNoJyk7XG5jb25zdCBmTGlzdFN5bWJvbCA9IFN5bWJvbC5mb3IoJ29iamVjdC1zdHJlYW0uZkxpc3QnKTtcblxuY29uc3QgZmluYWxWYWx1ZSA9IHZhbHVlID0+ICh7W2ZpbmFsU3ltYm9sXTogMSwgdmFsdWV9KTtcbmNvbnN0IG1hbnkgPSB2YWx1ZXMgPT4gKHtbbWFueVN5bWJvbF06IDEsIHZhbHVlc30pO1xuXG5jb25zdCBpc0ZpbmFsVmFsdWUgPSBvID0+IG8gJiYgb1tmaW5hbFN5bWJvbF0gPT09IDE7XG5jb25zdCBpc01hbnkgPSBvID0+IG8gJiYgb1ttYW55U3ltYm9sXSA9PT0gMTtcbmNvbnN0IGlzRmx1c2hhYmxlID0gbyA9PiBvICYmIG9bZmx1c2hTeW1ib2xdID09PSAxO1xuY29uc3QgaXNGdW5jdGlvbkxpc3QgPSBvID0+IG8gJiYgb1tmTGlzdFN5bWJvbF0gPT09IDE7XG5cbmNvbnN0IGdldEZpbmFsVmFsdWUgPSBvID0+IG8udmFsdWU7XG5jb25zdCBnZXRNYW55VmFsdWVzID0gbyA9PiBvLnZhbHVlcztcbmNvbnN0IGdldEZ1bmN0aW9uTGlzdCA9IG8gPT4gby5mTGlzdDtcblxuY29uc3QgZmx1c2hhYmxlID0gKHdyaXRlLCBmaW5hbCA9IG51bGwpID0+IHtcbiAgY29uc3QgZm4gPSBmaW5hbCA/IHZhbHVlID0+ICh2YWx1ZSA9PT0gbm9uZSA/IGZpbmFsKCkgOiB3cml0ZSh2YWx1ZSkpIDogd3JpdGU7XG4gIGZuW2ZsdXNoU3ltYm9sXSA9IDE7XG4gIHJldHVybiBmbjtcbn07XG5cbmNvbnN0IHNldEZ1bmN0aW9uTGlzdCA9IChvLCBmbnMpID0+IHtcbiAgby5mTGlzdCA9IGZucztcbiAgb1tmTGlzdFN5bWJvbF0gPSAxO1xuICByZXR1cm4gbztcbn07XG5cbmNvbnN0IGNsZWFyRnVuY3Rpb25MaXN0ID0gbyA9PiB7XG4gIGRlbGV0ZSBvLmZMaXN0O1xuICBkZWxldGUgb1tmTGlzdFN5bWJvbF07XG4gIHJldHVybiBvO1xufTtcblxuY2xhc3MgU3RvcCBleHRlbmRzIEVycm9yIHt9XG5cbmNvbnN0IHRvTWFueSA9IHZhbHVlID0+XG4gIHZhbHVlID09PSBub25lID8gbWFueShbXSkgOiB2YWx1ZSAmJiB2YWx1ZVttYW55U3ltYm9sXSA9PT0gMSA/IHZhbHVlIDogbWFueShbdmFsdWVdKTtcblxuY29uc3Qgbm9ybWFsaXplTWFueSA9IG8gPT4ge1xuICBpZiAobz8uW21hbnlTeW1ib2xdID09PSAxKSB7XG4gICAgc3dpdGNoIChvLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIG5vbmU7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBvLnZhbHVlc1swXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59O1xuXG5jb25zdCBjb21iaW5lTWFueSA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHZhbHVlcyA9IGEgPT09IG5vbmUgPyBbXSA6IGE/LlttYW55U3ltYm9sXSA9PT0gMSA/IGEudmFsdWVzLnNsaWNlKCkgOiBbYV07XG4gIGlmIChiID09PSBub25lKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9IGVsc2UgaWYgKGI/LlttYW55U3ltYm9sXSA9PT0gMSkge1xuICAgIHZhbHVlcy5wdXNoKC4uLmIudmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZXMucHVzaChiKTtcbiAgfVxuICByZXR1cm4gbWFueSh2YWx1ZXMpO1xufTtcblxuY29uc3QgY29tYmluZU1hbnlNdXQgPSAoYSwgYikgPT4ge1xuICBjb25zdCB2YWx1ZXMgPSBhID09PSBub25lID8gW10gOiBhPy5bbWFueVN5bWJvbF0gPT09IDEgPyBhLnZhbHVlcyA6IFthXTtcbiAgaWYgKGIgPT09IG5vbmUpIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0gZWxzZSBpZiAoYj8uW21hbnlTeW1ib2xdID09PSAxKSB7XG4gICAgdmFsdWVzLnB1c2goLi4uYi52YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlcy5wdXNoKGIpO1xuICB9XG4gIHJldHVybiBtYW55KHZhbHVlcyk7XG59O1xuXG4vLyBvbGQgYWxpYXNlc1xuY29uc3QgZmluYWwgPSBmaW5hbFZhbHVlO1xuXG5tb2R1bGUuZXhwb3J0cy5ub25lID0gbm9uZTtcbm1vZHVsZS5leHBvcnRzLnN0b3AgPSBzdG9wO1xubW9kdWxlLmV4cG9ydHMuU3RvcCA9IFN0b3A7XG5cbm1vZHVsZS5leHBvcnRzLmZpbmFsU3ltYm9sID0gZmluYWxTeW1ib2w7XG5tb2R1bGUuZXhwb3J0cy5maW5hbFZhbHVlID0gZmluYWxWYWx1ZTtcbm1vZHVsZS5leHBvcnRzLmZpbmFsID0gZmluYWw7XG5tb2R1bGUuZXhwb3J0cy5pc0ZpbmFsVmFsdWUgPSBpc0ZpbmFsVmFsdWU7XG5tb2R1bGUuZXhwb3J0cy5nZXRGaW5hbFZhbHVlID0gZ2V0RmluYWxWYWx1ZTtcblxubW9kdWxlLmV4cG9ydHMubWFueVN5bWJvbCA9IG1hbnlTeW1ib2w7XG5tb2R1bGUuZXhwb3J0cy5tYW55ID0gbWFueTtcbm1vZHVsZS5leHBvcnRzLmlzTWFueSA9IGlzTWFueTtcbm1vZHVsZS5leHBvcnRzLmdldE1hbnlWYWx1ZXMgPSBnZXRNYW55VmFsdWVzO1xubW9kdWxlLmV4cG9ydHMuZ2V0RnVuY3Rpb25MaXN0ID0gZ2V0RnVuY3Rpb25MaXN0O1xuXG5tb2R1bGUuZXhwb3J0cy5mbHVzaFN5bWJvbCA9IGZsdXNoU3ltYm9sO1xubW9kdWxlLmV4cG9ydHMuZmx1c2hhYmxlID0gZmx1c2hhYmxlO1xubW9kdWxlLmV4cG9ydHMuaXNGbHVzaGFibGUgPSBpc0ZsdXNoYWJsZTtcblxubW9kdWxlLmV4cG9ydHMuZkxpc3RTeW1ib2wgPSBmTGlzdFN5bWJvbDtcbm1vZHVsZS5leHBvcnRzLmlzRnVuY3Rpb25MaXN0ID0gaXNGdW5jdGlvbkxpc3Q7XG5tb2R1bGUuZXhwb3J0cy5nZXRGdW5jdGlvbkxpc3QgPSBnZXRGdW5jdGlvbkxpc3Q7XG5tb2R1bGUuZXhwb3J0cy5zZXRGdW5jdGlvbkxpc3QgPSBzZXRGdW5jdGlvbkxpc3Q7XG5tb2R1bGUuZXhwb3J0cy5jbGVhckZ1bmN0aW9uTGlzdCA9IGNsZWFyRnVuY3Rpb25MaXN0O1xuXG5tb2R1bGUuZXhwb3J0cy50b01hbnkgPSB0b01hbnk7XG5tb2R1bGUuZXhwb3J0cy5ub3JtYWxpemVNYW55ID0gbm9ybWFsaXplTWFueTtcbm1vZHVsZS5leHBvcnRzLmNvbWJpbmVNYW55ID0gY29tYmluZU1hbnk7XG5tb2R1bGUuZXhwb3J0cy5jb21iaW5lTWFueU11dCA9IGNvbWJpbmVNYW55TXV0O1xuIiwKICAgICIvLyBAdHMtc2VsZi10eXBlcz1cIi4vZ2VuLmQudHNcIlxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlZnMgPSByZXF1aXJlKCcuL2RlZnMnKTtcblxuY29uc3QgbmV4dCA9IGFzeW5jIGZ1bmN0aW9uKiAodmFsdWUsIGZucywgaW5kZXgpIHtcbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDw9IGZucy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyB0aGVuYWJsZVxuICAgICAgdmFsdWUgPSBhd2FpdCB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBkZWZzLm5vbmUpIGJyZWFrO1xuICAgIGlmICh2YWx1ZSA9PT0gZGVmcy5zdG9wKSB0aHJvdyBuZXcgZGVmcy5TdG9wKCk7XG4gICAgaWYgKGRlZnMuaXNGaW5hbFZhbHVlKHZhbHVlKSkge1xuICAgICAgeWllbGQgZGVmcy5nZXRGaW5hbFZhbHVlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoZGVmcy5pc01hbnkodmFsdWUpKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBkZWZzLmdldE1hbnlWYWx1ZXModmFsdWUpO1xuICAgICAgaWYgKGkgPT0gZm5zLmxlbmd0aCkge1xuICAgICAgICB5aWVsZCogdmFsdWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICB5aWVsZCogbmV4dCh2YWx1ZXNbal0sIGZucywgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLm5leHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gZ2VuZXJhdG9yXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBkYXRhID0gdmFsdWUubmV4dCgpO1xuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS50aGVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkYXRhID0gYXdhaXQgZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5kb25lKSBicmVhaztcbiAgICAgICAgaWYgKGkgPT0gZm5zLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGRhdGEudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgeWllbGQqIG5leHQoZGF0YS52YWx1ZSwgZm5zLCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChpID09IGZucy5sZW5ndGgpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGYgPSBmbnNbaV07XG4gICAgdmFsdWUgPSBmKHZhbHVlKTtcbiAgfVxufTtcblxuY29uc3QgZ2VuID0gKC4uLmZucykgPT4ge1xuICBmbnMgPSBmbnNcbiAgICAuZmlsdGVyKGZuID0+IGZuKVxuICAgIC5mbGF0KEluZmluaXR5KVxuICAgIC5tYXAoZm4gPT4gKGRlZnMuaXNGdW5jdGlvbkxpc3QoZm4pID8gZGVmcy5nZXRGdW5jdGlvbkxpc3QoZm4pIDogZm4pKVxuICAgIC5mbGF0KEluZmluaXR5KTtcbiAgaWYgKCFmbnMubGVuZ3RoKSB7XG4gICAgZm5zID0gW3ggPT4geF07XG4gIH1cbiAgbGV0IGZsdXNoZWQgPSBmYWxzZTtcbiAgbGV0IGcgPSBhc3luYyBmdW5jdGlvbiogKHZhbHVlKSB7XG4gICAgaWYgKGZsdXNoZWQpIHRocm93IEVycm9yKCdDYWxsIHRvIGEgZmx1c2hlZCBwaXBlLicpO1xuICAgIGlmICh2YWx1ZSAhPT0gZGVmcy5ub25lKSB7XG4gICAgICB5aWVsZCogbmV4dCh2YWx1ZSwgZm5zLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmx1c2hlZCA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBmID0gZm5zW2ldO1xuICAgICAgICBpZiAoZGVmcy5pc0ZsdXNoYWJsZShmKSkge1xuICAgICAgICAgIHlpZWxkKiBuZXh0KGYoZGVmcy5ub25lKSwgZm5zLCBpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG5lZWRUb0ZsdXNoID0gZm5zLnNvbWUoZm4gPT4gZGVmcy5pc0ZsdXNoYWJsZShmbikpO1xuICBpZiAobmVlZFRvRmx1c2gpIGcgPSBkZWZzLmZsdXNoYWJsZShnKTtcbiAgcmV0dXJuIGRlZnMuc2V0RnVuY3Rpb25MaXN0KGcsIGZucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlbjtcblxubW9kdWxlLmV4cG9ydHMubmV4dCA9IG5leHQ7XG4iLAogICAgIi8vIEB0cy1zZWxmLXR5cGVzPVwiLi9hc1N0cmVhbS5kLnRzXCJcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7RHVwbGV4fSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJyk7XG5jb25zdCBkZWZzID0gcmVxdWlyZSgnLi9kZWZzJyk7XG5cbmNvbnN0IGFzU3RyZWFtID0gKGZuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgZm4gIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnT25seSBhIGZ1bmN0aW9uIGlzIGFjY2VwdGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCdcbiAgICApO1xuXG4gIC8vIHB1bXAgdmFyaWFibGVzXG4gIGxldCBwYXVzZWQgPSBQcm9taXNlLnJlc29sdmUoKSxcbiAgICByZXNvbHZlUGF1c2VkID0gbnVsbDtcbiAgY29uc3QgcXVldWUgPSBbXTtcblxuICAvLyBwYXVzZS9yZXN1bWVcbiAgY29uc3QgcmVzdW1lID0gKCkgPT4ge1xuICAgIGlmICghcmVzb2x2ZVBhdXNlZCkgcmV0dXJuO1xuICAgIHJlc29sdmVQYXVzZWQoKTtcbiAgICByZXNvbHZlUGF1c2VkID0gbnVsbDtcbiAgICBwYXVzZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgfTtcbiAgY29uc3QgcGF1c2UgPSAoKSA9PiB7XG4gICAgaWYgKHJlc29sdmVQYXVzZWQpIHJldHVybjtcbiAgICBwYXVzZWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IChyZXNvbHZlUGF1c2VkID0gcmVzb2x2ZSkpO1xuICB9O1xuXG4gIGxldCBzdHJlYW0gPSBudWxsOyAvLyB3aWxsIGJlIGFzc2lnbmVkIGxhdGVyXG5cbiAgLy8gZGF0YSBwcm9jZXNzaW5nXG4gIGNvbnN0IHB1c2hSZXN1bHRzID0gdmFsdWVzID0+IHtcbiAgICBpZiAodmFsdWVzICYmIHR5cGVvZiB2YWx1ZXMubmV4dCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBnZW5lcmF0b3JcbiAgICAgIHF1ZXVlLnB1c2godmFsdWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXJyYXlcbiAgICBxdWV1ZS5wdXNoKHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICB9O1xuICBjb25zdCBwdW1wID0gYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHBhdXNlZDtcbiAgICAgIGNvbnN0IGdlbiA9IHF1ZXVlW3F1ZXVlLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IHJlc3VsdCA9IGdlbi5uZXh0KCk7XG4gICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICBxdWV1ZS5wb3AoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IGF3YWl0IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2FuaXRpemUodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2FuaXRpemUgPSBhc3luYyB2YWx1ZSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IGRlZnMubm9uZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSA9PT0gZGVmcy5zdG9wKSB0aHJvdyBuZXcgZGVmcy5TdG9wKCk7XG5cbiAgICBpZiAoZGVmcy5pc01hbnkodmFsdWUpKSB7XG4gICAgICBwdXNoUmVzdWx0cyhkZWZzLmdldE1hbnlWYWx1ZXModmFsdWUpKTtcbiAgICAgIHJldHVybiBwdW1wKCk7XG4gICAgfVxuXG4gICAgaWYgKGRlZnMuaXNGaW5hbFZhbHVlKHZhbHVlKSkge1xuICAgICAgLy8gYSBmaW5hbCB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkLCBpdCBpcyB0cmVhdGVkIGFzIGEgcmVndWxhciB2YWx1ZVxuICAgICAgdmFsdWUgPSBkZWZzLmdldEZpbmFsVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHByb2Nlc3NWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzdHJlYW0ucHVzaCh2YWx1ZSkpIHtcbiAgICAgIHBhdXNlKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ2h1bmsgPSBhc3luYyAoY2h1bmssIGVuY29kaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZm4oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGF3YWl0IHByb2Nlc3NWYWx1ZSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGRlZnMuU3RvcCkge1xuICAgICAgICBzdHJlYW0ucHVzaChudWxsKTtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzVmFsdWUgPSBhc3luYyB2YWx1ZSA9PiB7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIHRoZW5hYmxlXG4gICAgICByZXR1cm4gdmFsdWUudGhlbih2YWx1ZSA9PiBwcm9jZXNzVmFsdWUodmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5uZXh0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGdlbmVyYXRvclxuICAgICAgcHVzaFJlc3VsdHModmFsdWUpO1xuICAgICAgcmV0dXJuIHB1bXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhbml0aXplKHZhbHVlKTtcbiAgfTtcblxuICBzdHJlYW0gPSBuZXcgRHVwbGV4KFxuICAgIE9iamVjdC5hc3NpZ24oe3dyaXRhYmxlT2JqZWN0TW9kZTogdHJ1ZSwgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlfSwgb3B0aW9ucywge1xuICAgICAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoY2h1bmssIGVuY29kaW5nKS50aGVuKFxuICAgICAgICAgICgpID0+IGNhbGxiYWNrKG51bGwpLFxuICAgICAgICAgIGVycm9yID0+IGNhbGxiYWNrKGVycm9yKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGZpbmFsKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghZGVmcy5pc0ZsdXNoYWJsZShmbikpIHtcbiAgICAgICAgICBzdHJlYW0ucHVzaChudWxsKTtcbiAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0NodW5rKGRlZnMubm9uZSwgbnVsbCkudGhlbihcbiAgICAgICAgICAoKSA9PiAoc3RyZWFtLnB1c2gobnVsbCksIGNhbGxiYWNrKG51bGwpKSxcbiAgICAgICAgICBlcnJvciA9PiBjYWxsYmFjayhlcnJvcilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICByZWFkKCkge1xuICAgICAgICByZXN1bWUoKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xuXG4gIHJldHVybiBzdHJlYW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzU3RyZWFtO1xuIiwKICAgICIvLyBAdHMtc2VsZi10eXBlcz1cIi4vaW5kZXguZC50c1wiXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3Qge1JlYWRhYmxlLCBXcml0YWJsZSwgRHVwbGV4fSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJyk7XG5jb25zdCBkZWZzID0gcmVxdWlyZSgnLi9kZWZzJyk7XG5jb25zdCBnZW4gPSByZXF1aXJlKCcuL2dlbicpO1xuY29uc3QgYXNTdHJlYW0gPSByZXF1aXJlKCcuL2FzU3RyZWFtJyk7XG5cbi8vIGlzKk5vZGVTdHJlYW0gZnVuY3Rpb25zIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzLmpzXG5jb25zdCBpc1JlYWRhYmxlTm9kZVN0cmVhbSA9IG9iaiA9PlxuICBvYmogJiZcbiAgdHlwZW9mIG9iai5waXBlID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgKCFvYmouX3dyaXRhYmxlU3RhdGUgfHxcbiAgICAodHlwZW9mIG9iai5fcmVhZGFibGVTdGF0ZSA9PT0gJ29iamVjdCcgPyBvYmouX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgOiBudWxsKSAhPT0gZmFsc2UpICYmIC8vIER1cGxleFxuICAoIW9iai5fd3JpdGFibGVTdGF0ZSB8fCBvYmouX3JlYWRhYmxlU3RhdGUpOyAvLyBXcml0YWJsZSBoYXMgLnBpcGUuXG5cbmNvbnN0IGlzV3JpdGFibGVOb2RlU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJlxuICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgKCFvYmouX3JlYWRhYmxlU3RhdGUgfHxcbiAgICAodHlwZW9mIG9iai5fd3JpdGFibGVTdGF0ZSA9PT0gJ29iamVjdCcgPyBvYmouX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgOiBudWxsKSAhPT0gZmFsc2UpOyAvLyBEdXBsZXhcblxuY29uc3QgaXNEdXBsZXhOb2RlU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJlxuICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgb2JqLl9yZWFkYWJsZVN0YXRlICYmXG4gIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgaXNSZWFkYWJsZVdlYlN0cmVhbSA9IG9iaiA9PlxuICBvYmogJiYgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSAmJiBvYmogaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtO1xuXG5jb25zdCBpc1dyaXRhYmxlV2ViU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJiBnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtICYmIG9iaiBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW07XG5cbmNvbnN0IGlzRHVwbGV4V2ViU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJlxuICBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtICYmXG4gIG9iai5yZWFkYWJsZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gJiZcbiAgZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbSAmJlxuICBvYmoud3JpdGFibGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtO1xuXG5jb25zdCBncm91cEZ1bmN0aW9ucyA9IChvdXRwdXQsIGZuLCBpbmRleCwgZm5zKSA9PiB7XG4gIGlmIChcbiAgICBpc0R1cGxleE5vZGVTdHJlYW0oZm4pIHx8XG4gICAgKCFpbmRleCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShmbikpIHx8XG4gICAgKGluZGV4ID09PSBmbnMubGVuZ3RoIC0gMSAmJiBpc1dyaXRhYmxlTm9kZVN0cmVhbShmbikpXG4gICkge1xuICAgIG91dHB1dC5wdXNoKGZuKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIGlmIChpc0R1cGxleFdlYlN0cmVhbShmbikpIHtcbiAgICBvdXRwdXQucHVzaChEdXBsZXguZnJvbVdlYihmbiwge29iamVjdE1vZGU6IHRydWV9KSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBpZiAoIWluZGV4ICYmIGlzUmVhZGFibGVXZWJTdHJlYW0oZm4pKSB7XG4gICAgb3V0cHV0LnB1c2goUmVhZGFibGUuZnJvbVdlYihmbiwge29iamVjdE1vZGU6IHRydWV9KSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBpZiAoaW5kZXggPT09IGZucy5sZW5ndGggLSAxICYmIGlzV3JpdGFibGVXZWJTdHJlYW0oZm4pKSB7XG4gICAgb3V0cHV0LnB1c2goV3JpdGFibGUuZnJvbVdlYihmbiwge29iamVjdE1vZGU6IHRydWV9KSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBpZiAodHlwZW9mIGZuICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdJdGVtICMnICsgaW5kZXggKyAnIGlzIG5vdCBhIHByb3BlciBzdHJlYW0sIG5vciBhIGZ1bmN0aW9uLicpO1xuICBpZiAoIW91dHB1dC5sZW5ndGgpIG91dHB1dC5wdXNoKFtdKTtcbiAgY29uc3QgbGFzdCA9IG91dHB1dFtvdXRwdXQubGVuZ3RoIC0gMV07XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgbGFzdC5wdXNoKGZuKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQucHVzaChbZm5dKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuY29uc3QgcHJvZHVjZVN0cmVhbXMgPSBpdGVtID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICBpZiAoIWl0ZW0ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXRlbS5sZW5ndGggPT0gMSkgcmV0dXJuIGl0ZW1bMF0gJiYgY2hhaW4uYXNTdHJlYW0oaXRlbVswXSk7XG4gICAgcmV0dXJuIGNoYWluLmFzU3RyZWFtKGNoYWluLmdlbiguLi5pdGVtKSk7XG4gIH1cbiAgcmV0dXJuIGl0ZW07XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb25zID0gKGZuLCBpbmRleCwgZm5zKSA9PiB7XG4gIGlmIChcbiAgICBpc0R1cGxleE5vZGVTdHJlYW0oZm4pIHx8XG4gICAgKCFpbmRleCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShmbikpIHx8XG4gICAgKGluZGV4ID09PSBmbnMubGVuZ3RoIC0gMSAmJiBpc1dyaXRhYmxlTm9kZVN0cmVhbShmbikpXG4gICkge1xuICAgIHJldHVybiBmbjsgLy8gYW4gYWNjZXB0YWJsZSBzdHJlYW1cbiAgfVxuICBpZiAoaXNEdXBsZXhXZWJTdHJlYW0oZm4pKSB7XG4gICAgcmV0dXJuIER1cGxleC5mcm9tV2ViKGZuLCB7b2JqZWN0TW9kZTogdHJ1ZX0pO1xuICB9XG4gIGlmICghaW5kZXggJiYgaXNSZWFkYWJsZVdlYlN0cmVhbShmbikpIHtcbiAgICByZXR1cm4gUmVhZGFibGUuZnJvbVdlYihmbiwge29iamVjdE1vZGU6IHRydWV9KTtcbiAgfVxuICBpZiAoaW5kZXggPT09IGZucy5sZW5ndGggLSAxICYmIGlzV3JpdGFibGVXZWJTdHJlYW0oZm4pKSB7XG4gICAgcmV0dXJuIFdyaXRhYmxlLmZyb21XZWIoZm4sIHtvYmplY3RNb2RlOiB0cnVlfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nKSByZXR1cm4gY2hhaW4uYXNTdHJlYW0oZm4pOyAvLyBhIGZ1bmN0aW9uXG4gIHRocm93IFR5cGVFcnJvcignSXRlbSAjJyArIGluZGV4ICsgJyBpcyBub3QgYSBwcm9wZXIgc3RyZWFtLCBub3IgYSBmdW5jdGlvbi4nKTtcbn07XG5cbi8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVxdWlyZWQgc3RyZWFtIG1ldGhvZHNcblxuY29uc3Qgd3JpdGUgPSAoaW5wdXQsIGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgbGV0IGVycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpbnB1dC53cml0ZShjaHVuaywgZW5jb2RpbmcsIGUgPT4gY2FsbGJhY2soZSB8fCBlcnJvcikpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG59O1xuXG5jb25zdCBmaW5hbCA9IChpbnB1dCwgY2FsbGJhY2spID0+IHtcbiAgbGV0IGVycm9yID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpbnB1dC5lbmQobnVsbCwgbnVsbCwgZSA9PiBjYWxsYmFjayhlIHx8IGVycm9yKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWQgPSBvdXRwdXQgPT4ge1xuICBvdXRwdXQucmVzdW1lKCk7XG59O1xuXG4vLyB0aGUgY2hhaW4gY3JlYXRvclxuXG5jb25zdCBjaGFpbiA9IChmbnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGZucykgfHwgIWZucy5sZW5ndGgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDaGFpbidzIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhIG5vbi1lbXB0eSBhcnJheS5cIik7XG4gIH1cblxuICBmbnMgPSBmbnMuZmxhdChJbmZpbml0eSkuZmlsdGVyKGZuID0+IGZuKTtcblxuICBjb25zdCBzdHJlYW1zID0gKFxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLm5vR3JvdXBpbmdcbiAgICAgICAgPyBmbnMubWFwKHdyYXBGdW5jdGlvbnMpXG4gICAgICAgIDogZm5zXG4gICAgICAgICAgICAubWFwKGZuID0+IChkZWZzLmlzRnVuY3Rpb25MaXN0KGZuKSA/IGRlZnMuZ2V0RnVuY3Rpb25MaXN0KGZuKSA6IGZuKSlcbiAgICAgICAgICAgIC5mbGF0KEluZmluaXR5KVxuICAgICAgICAgICAgLnJlZHVjZShncm91cEZ1bmN0aW9ucywgW10pXG4gICAgICAgICAgICAubWFwKHByb2R1Y2VTdHJlYW1zKVxuICAgICkuZmlsdGVyKHMgPT4gcyksXG4gICAgaW5wdXQgPSBzdHJlYW1zWzBdLFxuICAgIG91dHB1dCA9IHN0cmVhbXMucmVkdWNlKChvdXRwdXQsIGl0ZW0pID0+IChvdXRwdXQgJiYgb3V0cHV0LnBpcGUoaXRlbSkpIHx8IGl0ZW0pO1xuXG4gIGxldCBzdHJlYW0gPSBudWxsOyAvLyB3aWxsIGJlIGFzc2lnbmVkIGxhdGVyXG5cbiAgbGV0IHdyaXRlTWV0aG9kID0gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHdyaXRlKGlucHV0LCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSxcbiAgICBmaW5hbE1ldGhvZCA9IGNhbGxiYWNrID0+IGZpbmFsKGlucHV0LCBjYWxsYmFjayksXG4gICAgcmVhZE1ldGhvZCA9ICgpID0+IHJlYWQob3V0cHV0KTtcblxuICBpZiAoIWlzV3JpdGFibGVOb2RlU3RyZWFtKGlucHV0KSkge1xuICAgIHdyaXRlTWV0aG9kID0gKF8xLCBfMiwgY2FsbGJhY2spID0+IGNhbGxiYWNrKG51bGwpO1xuICAgIGZpbmFsTWV0aG9kID0gY2FsbGJhY2sgPT4gY2FsbGJhY2sobnVsbCk7XG4gICAgaW5wdXQub24oJ2VuZCcsICgpID0+IHN0cmVhbS5lbmQoKSk7XG4gIH1cblxuICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ob3V0cHV0KSkge1xuICAgIG91dHB1dC5vbignZGF0YScsIGNodW5rID0+ICFzdHJlYW0ucHVzaChjaHVuaykgJiYgb3V0cHV0LnBhdXNlKCkpO1xuICAgIG91dHB1dC5vbignZW5kJywgKCkgPT4gc3RyZWFtLnB1c2gobnVsbCkpO1xuICB9IGVsc2Uge1xuICAgIHJlYWRNZXRob2QgPSAoKSA9PiB7fTsgLy8gbm9wXG4gICAgb3V0cHV0Lm9uKCdmaW5pc2gnLCAoKSA9PiBzdHJlYW0ucHVzaChudWxsKSk7XG4gIH1cblxuICBzdHJlYW0gPSBuZXcgRHVwbGV4KFxuICAgIE9iamVjdC5hc3NpZ24oe3dyaXRhYmxlT2JqZWN0TW9kZTogdHJ1ZSwgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlfSwgb3B0aW9ucywge1xuICAgICAgcmVhZGFibGU6IGlzUmVhZGFibGVOb2RlU3RyZWFtKG91dHB1dCksXG4gICAgICB3cml0YWJsZTogaXNXcml0YWJsZU5vZGVTdHJlYW0oaW5wdXQpLFxuICAgICAgd3JpdGU6IHdyaXRlTWV0aG9kLFxuICAgICAgZmluYWw6IGZpbmFsTWV0aG9kLFxuICAgICAgcmVhZDogcmVhZE1ldGhvZFxuICAgIH0pXG4gICk7XG4gIHN0cmVhbS5zdHJlYW1zID0gc3RyZWFtcztcbiAgc3RyZWFtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cmVhbS5vdXRwdXQgPSBvdXRwdXQ7XG5cbiAgaWYgKCFpc1JlYWRhYmxlTm9kZVN0cmVhbShvdXRwdXQpKSB7XG4gICAgc3RyZWFtLnJlc3VtZSgpO1xuICB9XG5cbiAgLy8gY29ubmVjdCBldmVudHNcbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnNraXBFdmVudHMpIHtcbiAgICBzdHJlYW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLm9uKCdlcnJvcicsIGVycm9yID0+IHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKSkpO1xuICB9XG5cbiAgcmV0dXJuIHN0cmVhbTtcbn07XG5cbmNvbnN0IGRhdGFTb3VyY2UgPSBmbiA9PiB7XG4gIGlmICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZuO1xuICBpZiAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLmJpbmQoZm4pO1xuICAgIGlmICh0eXBlb2YgZm5bU3ltYm9sLml0ZXJhdG9yXSA9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm5bU3ltYm9sLml0ZXJhdG9yXS5iaW5kKGZuKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYXJndW1lbnQgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gaXRlcmFibGUgb2JqZWN0LicpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjaGFpbjtcblxuLy8gZnJvbSBkZWZzLmpzXG5tb2R1bGUuZXhwb3J0cy5ub25lID0gZGVmcy5ub25lO1xubW9kdWxlLmV4cG9ydHMuc3RvcCA9IGRlZnMuc3RvcDtcbm1vZHVsZS5leHBvcnRzLlN0b3AgPSBkZWZzLlN0b3A7XG5cbm1vZHVsZS5leHBvcnRzLmZpbmFsU3ltYm9sID0gZGVmcy5maW5hbFN5bWJvbDtcbm1vZHVsZS5leHBvcnRzLmZpbmFsVmFsdWUgPSBkZWZzLmZpbmFsVmFsdWU7XG5tb2R1bGUuZXhwb3J0cy5maW5hbCA9IGRlZnMuZmluYWw7XG5tb2R1bGUuZXhwb3J0cy5pc0ZpbmFsVmFsdWUgPSBkZWZzLmlzRmluYWxWYWx1ZTtcbm1vZHVsZS5leHBvcnRzLmdldEZpbmFsVmFsdWUgPSBkZWZzLmdldEZpbmFsVmFsdWU7XG5cbm1vZHVsZS5leHBvcnRzLm1hbnlTeW1ib2wgPSBkZWZzLm1hbnlTeW1ib2w7XG5tb2R1bGUuZXhwb3J0cy5tYW55ID0gZGVmcy5tYW55O1xubW9kdWxlLmV4cG9ydHMuaXNNYW55ID0gZGVmcy5pc01hbnk7XG5tb2R1bGUuZXhwb3J0cy5nZXRNYW55VmFsdWVzID0gZGVmcy5nZXRNYW55VmFsdWVzO1xubW9kdWxlLmV4cG9ydHMuZ2V0RnVuY3Rpb25MaXN0ID0gZGVmcy5nZXRGdW5jdGlvbkxpc3Q7XG5cbm1vZHVsZS5leHBvcnRzLmZsdXNoU3ltYm9sID0gZGVmcy5mbHVzaFN5bWJvbDtcbm1vZHVsZS5leHBvcnRzLmZsdXNoYWJsZSA9IGRlZnMuZmx1c2hhYmxlO1xubW9kdWxlLmV4cG9ydHMuaXNGbHVzaGFibGUgPSBkZWZzLmlzRmx1c2hhYmxlO1xuXG5tb2R1bGUuZXhwb3J0cy5mTGlzdFN5bWJvbCA9IGRlZnMuZkxpc3RTeW1ib2w7XG5tb2R1bGUuZXhwb3J0cy5pc0Z1bmN0aW9uTGlzdCA9IGRlZnMuaXNGdW5jdGlvbkxpc3Q7XG5tb2R1bGUuZXhwb3J0cy5nZXRGdW5jdGlvbkxpc3QgPSBkZWZzLmdldEZ1bmN0aW9uTGlzdDtcbm1vZHVsZS5leHBvcnRzLnNldEZ1bmN0aW9uTGlzdCA9IGRlZnMuc2V0RnVuY3Rpb25MaXN0O1xubW9kdWxlLmV4cG9ydHMuY2xlYXJGdW5jdGlvbkxpc3QgPSBkZWZzLmNsZWFyRnVuY3Rpb25MaXN0O1xuXG5tb2R1bGUuZXhwb3J0cy50b01hbnkgPSBkZWZzLnRvTWFueTtcbm1vZHVsZS5leHBvcnRzLm5vcm1hbGl6ZU1hbnkgPSBkZWZzLm5vcm1hbGl6ZU1hbnk7XG5tb2R1bGUuZXhwb3J0cy5jb21iaW5lTWFueSA9IGRlZnMuY29tYmluZU1hbnk7XG5tb2R1bGUuZXhwb3J0cy5jb21iaW5lTWFueU11dCA9IGRlZnMuY29tYmluZU1hbnlNdXQ7XG5cbm1vZHVsZS5leHBvcnRzLmNoYWluID0gY2hhaW47ICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMi54XG5tb2R1bGUuZXhwb3J0cy5jaGFpblVuY2hlY2tlZCA9IGNoYWluOyAvLyBmb3IgVHlwZVNjcmlwdCB0byBieXBhc3MgdHlwZSBjaGVja3Ncbm1vZHVsZS5leHBvcnRzLmdlbiA9IGdlbjtcbm1vZHVsZS5leHBvcnRzLmFzU3RyZWFtID0gYXNTdHJlYW07XG5cbm1vZHVsZS5leHBvcnRzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHtUcmFuc2Zvcm19ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7U3RyaW5nRGVjb2Rlcn0gPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpO1xuXG5jbGFzcyBVdGY4U3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHt3cml0YWJsZU9iamVjdE1vZGU6IGZhbHNlfSkpO1xuICAgIHRoaXMuX2J1ZmZlciA9ICcnO1xuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fdHJhbnNmb3JtU3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdHJpbmdEZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoKTtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRoaXMuX3RyYW5zZm9ybUJ1ZmZlcjtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG5cbiAgX3RyYW5zZm9ybUJ1ZmZlcihjaHVuaywgXywgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9idWZmZXIgKz0gdGhpcy5fc3RyaW5nRGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcihjYWxsYmFjayk7XG4gIH1cblxuICBfdHJhbnNmb3JtU3RyaW5nKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2J1ZmZlciArPSBjaHVuay50b1N0cmluZygpO1xuICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoY2FsbGJhY2spO1xuICB9XG5cbiAgX3Byb2Nlc3NCdWZmZXIoY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyKSB7XG4gICAgICB0aGlzLnB1c2godGhpcy5fYnVmZmVyLCAndXRmOCcpO1xuICAgICAgdGhpcy5fYnVmZmVyID0gJyc7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwpO1xuICB9XG5cbiAgX2ZsdXNoSW5wdXQoKSB7XG4gICAgLy8gbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gX2ZsdXNoKClcbiAgICBpZiAodGhpcy5fc3RyaW5nRGVjb2Rlcikge1xuICAgICAgdGhpcy5fYnVmZmVyICs9IHRoaXMuX3N0cmluZ0RlY29kZXIuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fZmx1c2hJbnB1dCgpO1xuICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoY2FsbGJhY2spO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVXRmOFN0cmVhbTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBVdGY4U3RyZWFtID0gcmVxdWlyZSgnLi91dGlscy9VdGY4U3RyZWFtJyk7XG5cbmNvbnN0IHBhdHRlcm5zID0ge1xuICB2YWx1ZTE6IC9eKD86W1xcXCJcXHtcXFtcXF1cXC1cXGRdfHRydWVcXGJ8ZmFsc2VcXGJ8bnVsbFxcYnxcXHN7MSwyNTZ9KS8sXG4gIHN0cmluZzogL14oPzpbXlxceDAwLVxceDFmXFxcIlxcXFxdezEsMjU2fXxcXFxcW2JmbnJ0XFxcIlxcXFxcXC9dfFxcXFx1W1xcZGEtZkEtRl17NH18XFxcIikvLFxuICBrZXkxOiAvXig/OltcXFwiXFx9XXxcXHN7MSwyNTZ9KS8sXG4gIGNvbG9uOiAvXig/OlxcOnxcXHN7MSwyNTZ9KS8sXG4gIGNvbW1hOiAvXig/OltcXCxcXF1cXH1dfFxcc3sxLDI1Nn0pLyxcbiAgd3M6IC9eXFxzezEsMjU2fS8sXG4gIG51bWJlclN0YXJ0OiAvXlxcZC8sXG4gIG51bWJlckRpZ2l0OiAvXlxcZHswLDI1Nn0vLFxuICBudW1iZXJGcmFjdGlvbjogL15bXFwuZUVdLyxcbiAgbnVtYmVyRXhwb25lbnQ6IC9eW2VFXS8sXG4gIG51bWJlckV4cFNpZ246IC9eWy0rXS9cbn07XG5jb25zdCBNQVhfUEFUVEVSTl9TSVpFID0gMTY7XG5cbmxldCBub1N0aWNreSA9IHRydWU7XG50cnkge1xuICBuZXcgUmVnRXhwKCcuJywgJ3knKTtcbiAgbm9TdGlja3kgPSBmYWxzZTtcbn0gY2F0Y2ggKGUpIHtcbiAgLy8gc3VwcHJlc3Ncbn1cblxuIW5vU3RpY2t5ICYmXG4gIE9iamVjdC5rZXlzKHBhdHRlcm5zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgbGV0IHNyYyA9IHBhdHRlcm5zW2tleV0uc291cmNlLnNsaWNlKDEpOyAvLyBsb3Agb2ZmIF5cbiAgICBpZiAoc3JjLnNsaWNlKDAsIDMpID09PSAnKD86JyAmJiBzcmMuc2xpY2UoLTEpID09PSAnKScpIHtcbiAgICAgIHNyYyA9IHNyYy5zbGljZSgzLCAtMSk7XG4gICAgfVxuICAgIHBhdHRlcm5zW2tleV0gPSBuZXcgUmVnRXhwKHNyYywgJ3knKTtcbiAgfSk7XG5cbnBhdHRlcm5zLm51bWJlckZyYWNTdGFydCA9IHBhdHRlcm5zLm51bWJlckV4cFN0YXJ0ID0gcGF0dGVybnMubnVtYmVyU3RhcnQ7XG5wYXR0ZXJucy5udW1iZXJGcmFjRGlnaXQgPSBwYXR0ZXJucy5udW1iZXJFeHBEaWdpdCA9IHBhdHRlcm5zLm51bWJlckRpZ2l0O1xuXG5jb25zdCB2YWx1ZXMgPSB7dHJ1ZTogdHJ1ZSwgZmFsc2U6IGZhbHNlLCBudWxsOiBudWxsfSxcbiAgZXhwZWN0ZWQgPSB7b2JqZWN0OiAnb2JqZWN0U3RvcCcsIGFycmF5OiAnYXJyYXlTdG9wJywgJyc6ICdkb25lJ307XG5cbi8vIGxvbmcgaGV4YWRlY2ltYWwgY29kZXM6IFxcdVhYWFhcbmNvbnN0IGZyb21IZXggPSBzID0+IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQocy5zbGljZSgyKSwgMTYpKTtcblxuLy8gc2hvcnQgY29kZXM6IFxcYiBcXGYgXFxuIFxcciBcXHQgXFxcIiBcXFxcIFxcL1xuY29uc3QgY29kZXMgPSB7YjogJ1xcYicsIGY6ICdcXGYnLCBuOiAnXFxuJywgcjogJ1xccicsIHQ6ICdcXHQnLCAnXCInOiAnXCInLCAnXFxcXCc6ICdcXFxcJywgJy8nOiAnLyd9O1xuXG5jbGFzcyBQYXJzZXIgZXh0ZW5kcyBVdGY4U3RyZWFtIHtcbiAgc3RhdGljIG1ha2Uob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtyZWFkYWJsZU9iamVjdE1vZGU6IHRydWV9KSk7XG5cbiAgICB0aGlzLl9wYWNrS2V5cyA9IHRoaXMuX3BhY2tTdHJpbmdzID0gdGhpcy5fcGFja051bWJlcnMgPSB0aGlzLl9zdHJlYW1LZXlzID0gdGhpcy5fc3RyZWFtU3RyaW5ncyA9IHRoaXMuX3N0cmVhbU51bWJlcnMgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAncGFja1ZhbHVlcycgaW4gb3B0aW9ucyAmJiAodGhpcy5fcGFja0tleXMgPSB0aGlzLl9wYWNrU3RyaW5ncyA9IHRoaXMuX3BhY2tOdW1iZXJzID0gb3B0aW9ucy5wYWNrVmFsdWVzKTtcbiAgICAgICdwYWNrS2V5cycgaW4gb3B0aW9ucyAmJiAodGhpcy5fcGFja0tleXMgPSBvcHRpb25zLnBhY2tLZXlzKTtcbiAgICAgICdwYWNrU3RyaW5ncycgaW4gb3B0aW9ucyAmJiAodGhpcy5fcGFja1N0cmluZ3MgPSBvcHRpb25zLnBhY2tTdHJpbmdzKTtcbiAgICAgICdwYWNrTnVtYmVycycgaW4gb3B0aW9ucyAmJiAodGhpcy5fcGFja051bWJlcnMgPSBvcHRpb25zLnBhY2tOdW1iZXJzKTtcbiAgICAgICdzdHJlYW1WYWx1ZXMnIGluIG9wdGlvbnMgJiYgKHRoaXMuX3N0cmVhbUtleXMgPSB0aGlzLl9zdHJlYW1TdHJpbmdzID0gdGhpcy5fc3RyZWFtTnVtYmVycyA9IG9wdGlvbnMuc3RyZWFtVmFsdWVzKTtcbiAgICAgICdzdHJlYW1LZXlzJyBpbiBvcHRpb25zICYmICh0aGlzLl9zdHJlYW1LZXlzID0gb3B0aW9ucy5zdHJlYW1LZXlzKTtcbiAgICAgICdzdHJlYW1TdHJpbmdzJyBpbiBvcHRpb25zICYmICh0aGlzLl9zdHJlYW1TdHJpbmdzID0gb3B0aW9ucy5zdHJlYW1TdHJpbmdzKTtcbiAgICAgICdzdHJlYW1OdW1iZXJzJyBpbiBvcHRpb25zICYmICh0aGlzLl9zdHJlYW1OdW1iZXJzID0gb3B0aW9ucy5zdHJlYW1OdW1iZXJzKTtcbiAgICAgIHRoaXMuX2pzb25TdHJlYW1pbmcgPSBvcHRpb25zLmpzb25TdHJlYW1pbmc7XG4gICAgfVxuICAgICF0aGlzLl9wYWNrS2V5cyAmJiAodGhpcy5fc3RyZWFtS2V5cyA9IHRydWUpO1xuICAgICF0aGlzLl9wYWNrU3RyaW5ncyAmJiAodGhpcy5fc3RyZWFtU3RyaW5ncyA9IHRydWUpO1xuICAgICF0aGlzLl9wYWNrTnVtYmVycyAmJiAodGhpcy5fc3RyZWFtTnVtYmVycyA9IHRydWUpO1xuXG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX2V4cGVjdCA9IHRoaXMuX2pzb25TdHJlYW1pbmcgPyAnZG9uZScgOiAndmFsdWUnO1xuICAgIHRoaXMuX3N0YWNrID0gW107XG4gICAgdGhpcy5fcGFyZW50ID0gJyc7XG4gICAgdGhpcy5fb3Blbl9udW1iZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9hY2N1bXVsYXRvciA9ICcnO1xuICB9XG5cbiAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgc3VwZXIuX2ZsdXNoKGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgIGlmICh0aGlzLl9vcGVuX251bWJlcikge1xuICAgICAgICBpZiAodGhpcy5fc3RyZWFtTnVtYmVycykge1xuICAgICAgICAgIHRoaXMucHVzaCh7bmFtZTogJ2VuZE51bWJlcid9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuX251bWJlciA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fcGFja051bWJlcnMpIHtcbiAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJWYWx1ZScsIHZhbHVlOiB0aGlzLl9hY2N1bXVsYXRvcn0pO1xuICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgX3Byb2Nlc3NCdWZmZXIoY2FsbGJhY2spIHtcbiAgICBsZXQgbWF0Y2gsXG4gICAgICB2YWx1ZSxcbiAgICAgIGluZGV4ID0gMDtcbiAgICBtYWluOiBmb3IgKDs7KSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX2V4cGVjdCkge1xuICAgICAgICBjYXNlICd2YWx1ZTEnOlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgcGF0dGVybnMudmFsdWUxLmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMudmFsdWUxLmV4ZWModGhpcy5fYnVmZmVyKTtcbiAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9uZSB8fCBpbmRleCArIE1BWF9QQVRURVJOX1NJWkUgPCB0aGlzLl9idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGgpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ1BhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IGV4cGVjdGVkIGEgdmFsdWUnKSk7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ1BhcnNlciBoYXMgZXhwZWN0ZWQgYSB2YWx1ZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICAgIHRoaXMuX3N0cmVhbVN0cmluZ3MgJiYgdGhpcy5wdXNoKHtuYW1lOiAnc3RhcnRTdHJpbmcnfSk7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9ICdzdHJpbmcnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdzdGFydE9iamVjdCd9KTtcbiAgICAgICAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0aGlzLl9wYXJlbnQpO1xuICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSAnb2JqZWN0JztcbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gJ2tleTEnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdzdGFydEFycmF5J30pO1xuICAgICAgICAgICAgICB0aGlzLl9zdGFjay5wdXNoKHRoaXMuX3BhcmVudCk7XG4gICAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9ICdhcnJheSc7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9ICd2YWx1ZTEnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgICAgICBpZiAodGhpcy5fZXhwZWN0ICE9PSAndmFsdWUxJykgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIlBhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IHVuZXhwZWN0ZWQgdG9rZW4gJ10nXCIpKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX29wZW5fbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RyZWFtTnVtYmVycyAmJiB0aGlzLnB1c2goe25hbWU6ICdlbmROdW1iZXInfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3Blbl9udW1iZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFja051bWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucHVzaCh7bmFtZTogJ251bWJlclZhbHVlJywgdmFsdWU6IHRoaXMuX2FjY3VtdWxhdG9yfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdlbmRBcnJheSd9KTtcbiAgICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9IGV4cGVjdGVkW3RoaXMuX3BhcmVudF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgIHRoaXMuX29wZW5fbnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0cmVhbU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdzdGFydE51bWJlcid9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiAnLSd9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wYWNrTnVtYmVycyAmJiAodGhpcy5fYWNjdW11bGF0b3IgPSAnLScpO1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnbnVtYmVyU3RhcnQnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgICAgICB0aGlzLl9vcGVuX251bWJlciA9IHRydWU7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9zdHJlYW1OdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiAnc3RhcnROdW1iZXInfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiAnbnVtYmVyQ2h1bmsnLCB2YWx1ZTogJzAnfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fcGFja051bWJlcnMgJiYgKHRoaXMuX2FjY3VtdWxhdG9yID0gJzAnKTtcbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gJ251bWJlckZyYWN0aW9uJztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxJzpcbiAgICAgICAgICAgIGNhc2UgJzInOlxuICAgICAgICAgICAgY2FzZSAnMyc6XG4gICAgICAgICAgICBjYXNlICc0JzpcbiAgICAgICAgICAgIGNhc2UgJzUnOlxuICAgICAgICAgICAgY2FzZSAnNic6XG4gICAgICAgICAgICBjYXNlICc3JzpcbiAgICAgICAgICAgIGNhc2UgJzgnOlxuICAgICAgICAgICAgY2FzZSAnOSc6XG4gICAgICAgICAgICAgIHRoaXMuX29wZW5fbnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0cmVhbU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdzdGFydE51bWJlcid9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX3BhY2tOdW1iZXJzICYmICh0aGlzLl9hY2N1bXVsYXRvciA9IHZhbHVlKTtcbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gJ251bWJlckRpZ2l0JztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0cnVlJzpcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzpcbiAgICAgICAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgICAgICAgICBpZiAodGhpcy5fYnVmZmVyLmxlbmd0aCAtIGluZGV4ID09PSB2YWx1ZS5sZW5ndGggJiYgIXRoaXMuX2RvbmUpIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiB2YWx1ZSArICdWYWx1ZScsIHZhbHVlOiB2YWx1ZXNbdmFsdWVdfSk7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9IGV4cGVjdGVkW3RoaXMuX3BhcmVudF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gZGVmYXVsdDogLy8gd3NcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAna2V5VmFsJzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICBwYXR0ZXJucy5zdHJpbmcubGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJucy5zdHJpbmcuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggJiYgKHRoaXMuX2RvbmUgfHwgdGhpcy5fYnVmZmVyLmxlbmd0aCAtIGluZGV4ID49IDYpKVxuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdQYXJzZXIgY2Fubm90IHBhcnNlIGlucHV0OiBlc2NhcGVkIGNoYXJhY3RlcnMnKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignUGFyc2VyIGhhcyBleHBlY3RlZCBhIHN0cmluZyB2YWx1ZScpKTtcbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9leHBlY3QgPT09ICdrZXlWYWwnKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0cmVhbUtleXMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnZW5kS2V5J30pO1xuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFja0tleXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdrZXlWYWx1ZScsIHZhbHVlOiB0aGlzLl9hY2N1bXVsYXRvcn0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gJ2NvbG9uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0cmVhbVN0cmluZ3MgJiYgdGhpcy5wdXNoKHtuYW1lOiAnZW5kU3RyaW5nJ30pO1xuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFja1N0cmluZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdzdHJpbmdWYWx1ZScsIHZhbHVlOiB0aGlzLl9hY2N1bXVsYXRvcn0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gZXhwZWN0ZWRbdGhpcy5fcGFyZW50XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB2YWx1ZS5sZW5ndGggPT0gMiA/IGNvZGVzW3ZhbHVlLmNoYXJBdCgxKV0gOiBmcm9tSGV4KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9leHBlY3QgPT09ICdrZXlWYWwnID8gdGhpcy5fc3RyZWFtS2V5cyA6IHRoaXMuX3N0cmVhbVN0cmluZ3MpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiAnc3RyaW5nQ2h1bmsnLCB2YWx1ZTogdH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2V4cGVjdCA9PT0gJ2tleVZhbCcgPyB0aGlzLl9wYWNrS2V5cyA6IHRoaXMuX3BhY2tTdHJpbmdzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yICs9IHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9leHBlY3QgPT09ICdrZXlWYWwnID8gdGhpcy5fc3RyZWFtS2V5cyA6IHRoaXMuX3N0cmVhbVN0cmluZ3MpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiAnc3RyaW5nQ2h1bmsnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9leHBlY3QgPT09ICdrZXlWYWwnID8gdGhpcy5fcGFja0tleXMgOiB0aGlzLl9wYWNrU3RyaW5ncykge1xuICAgICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciArPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAna2V5MSc6XG4gICAgICAgIGNhc2UgJ2tleSc6XG4gICAgICAgICAgcGF0dGVybnMua2V5MS5sYXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBtYXRjaCA9IHBhdHRlcm5zLmtleTEuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignUGFyc2VyIGNhbm5vdCBwYXJzZSBpbnB1dDogZXhwZWN0ZWQgYW4gb2JqZWN0IGtleScpKTtcbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbUtleXMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnc3RhcnRLZXknfSk7XG4gICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAna2V5VmFsJztcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnfScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9leHBlY3QgIT09ICdrZXkxJykgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIlBhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IHVuZXhwZWN0ZWQgdG9rZW4gJ30nXCIpKTtcbiAgICAgICAgICAgIHRoaXMucHVzaCh7bmFtZTogJ2VuZE9iamVjdCd9KTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX3N0YWNrLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gZXhwZWN0ZWRbdGhpcy5fcGFyZW50XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29sb24nOlxuICAgICAgICAgIHBhdHRlcm5zLmNvbG9uLmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMuY29sb24uZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIlBhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IGV4cGVjdGVkICc6J1wiKSk7XG4gICAgICAgICAgICBicmVhayBtYWluOyAvLyB3YWl0IGZvciBtb3JlIGlucHV0XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgdmFsdWUgPT09ICc6JyAmJiAodGhpcy5fZXhwZWN0ID0gJ3ZhbHVlJyk7XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXJyYXlTdG9wJzpcbiAgICAgICAgY2FzZSAnb2JqZWN0U3RvcCc6XG4gICAgICAgICAgcGF0dGVybnMuY29tbWEubGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJucy5jb21tYS5leGVjKHRoaXMuX2J1ZmZlcik7XG4gICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCB8fCB0aGlzLl9kb25lKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiUGFyc2VyIGNhbm5vdCBwYXJzZSBpbnB1dDogZXhwZWN0ZWQgJywnXCIpKTtcbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX29wZW5fbnVtYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW1OdW1iZXJzICYmIHRoaXMucHVzaCh7bmFtZTogJ2VuZE51bWJlcid9KTtcbiAgICAgICAgICAgIHRoaXMuX29wZW5fbnVtYmVyID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGFja051bWJlcnMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdXNoKHtuYW1lOiAnbnVtYmVyVmFsdWUnLCB2YWx1ZTogdGhpcy5fYWNjdW11bGF0b3J9KTtcbiAgICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0b3IgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcsJykge1xuICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gdGhpcy5fZXhwZWN0ID09PSAnYXJyYXlTdG9wJyA/ICd2YWx1ZScgOiAna2V5JztcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnfScgfHwgdmFsdWUgPT09ICddJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnfScgPyB0aGlzLl9leHBlY3QgPT09ICdhcnJheVN0b3AnIDogdGhpcy5fZXhwZWN0ICE9PSAnYXJyYXlTdG9wJykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiUGFyc2VyIGNhbm5vdCBwYXJzZSBpbnB1dDogZXhwZWN0ZWQgJ1wiICsgKHRoaXMuX2V4cGVjdCA9PT0gJ2FycmF5U3RvcCcgPyAnXScgOiAnfScpICsgXCInXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHVzaCh7bmFtZTogdmFsdWUgPT09ICd9JyA/ICdlbmRPYmplY3QnIDogJ2VuZEFycmF5J30pO1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9leHBlY3QgPSBleHBlY3RlZFt0aGlzLl9wYXJlbnRdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9TdGlja3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlciA9IHRoaXMuX2J1ZmZlci5zbGljZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBudW1iZXIgY2h1bmtzXG4gICAgICAgIGNhc2UgJ251bWJlclN0YXJ0JzogLy8gWzAtOV1cbiAgICAgICAgICBwYXR0ZXJucy5udW1iZXJTdGFydC5sYXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBtYXRjaCA9IHBhdHRlcm5zLm51bWJlclN0YXJ0LmV4ZWModGhpcy5fYnVmZmVyKTtcbiAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCB0aGlzLl9idWZmZXIubGVuZ3RoIHx8IHRoaXMuX2RvbmUpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ1BhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IGV4cGVjdGVkIGEgc3RhcnRpbmcgZGlnaXQnKSk7XG4gICAgICAgICAgICBicmVhayBtYWluOyAvLyB3YWl0IGZvciBtb3JlIGlucHV0XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgdGhpcy5fc3RyZWFtTnVtYmVycyAmJiB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgIHRoaXMuX3BhY2tOdW1iZXJzICYmICh0aGlzLl9hY2N1bXVsYXRvciArPSB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5fZXhwZWN0ID0gdmFsdWUgPT09ICcwJyA/ICdudW1iZXJGcmFjdGlvbicgOiAnbnVtYmVyRGlnaXQnO1xuICAgICAgICAgIGlmIChub1N0aWNreSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyID0gdGhpcy5fYnVmZmVyLnNsaWNlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlckRpZ2l0JzogLy8gWzAtOV0qXG4gICAgICAgICAgcGF0dGVybnMubnVtYmVyRGlnaXQubGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJucy5udW1iZXJEaWdpdC5leGVjKHRoaXMuX2J1ZmZlcik7XG4gICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCB8fCB0aGlzLl9kb25lKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdQYXJzZXIgY2Fubm90IHBhcnNlIGlucHV0OiBleHBlY3RlZCBhIGRpZ2l0JykpO1xuICAgICAgICAgICAgYnJlYWsgbWFpbjsgLy8gd2FpdCBmb3IgbW9yZSBpbnB1dFxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtTnVtYmVycyAmJiB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgICAgdGhpcy5fcGFja051bWJlcnMgJiYgKHRoaXMuX2FjY3VtdWxhdG9yICs9IHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub1N0aWNreSkge1xuICAgICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGluZGV4ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnbnVtYmVyRnJhY3Rpb24nO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9IGV4cGVjdGVkW3RoaXMuX3BhcmVudF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbWFpbjsgLy8gd2FpdCBmb3IgbW9yZSBpbnB1dFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyRnJhY3Rpb24nOiAvLyBbXFwuZUVdP1xuICAgICAgICAgIHBhdHRlcm5zLm51bWJlckZyYWN0aW9uLmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMubnVtYmVyRnJhY3Rpb24uZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSBleHBlY3RlZFt0aGlzLl9wYXJlbnRdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICB0aGlzLl9zdHJlYW1OdW1iZXJzICYmIHRoaXMucHVzaCh7bmFtZTogJ251bWJlckNodW5rJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgICAgdGhpcy5fcGFja051bWJlcnMgJiYgKHRoaXMuX2FjY3VtdWxhdG9yICs9IHZhbHVlKTtcbiAgICAgICAgICB0aGlzLl9leHBlY3QgPSB2YWx1ZSA9PT0gJy4nID8gJ251bWJlckZyYWNTdGFydCcgOiAnbnVtYmVyRXhwU2lnbic7XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyRnJhY1N0YXJ0JzogLy8gWzAtOV1cbiAgICAgICAgICBwYXR0ZXJucy5udW1iZXJGcmFjU3RhcnQubGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJucy5udW1iZXJGcmFjU3RhcnQuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignUGFyc2VyIGNhbm5vdCBwYXJzZSBpbnB1dDogZXhwZWN0ZWQgYSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBudW1iZXInKSk7XG4gICAgICAgICAgICBicmVhayBtYWluOyAvLyB3YWl0IGZvciBtb3JlIGlucHV0XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgdGhpcy5fc3RyZWFtTnVtYmVycyAmJiB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgIHRoaXMuX3BhY2tOdW1iZXJzICYmICh0aGlzLl9hY2N1bXVsYXRvciArPSB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5fZXhwZWN0ID0gJ251bWJlckZyYWNEaWdpdCc7XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyRnJhY0RpZ2l0JzogLy8gWzAtOV0qXG4gICAgICAgICAgcGF0dGVybnMubnVtYmVyRnJhY0RpZ2l0Lmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMubnVtYmVyRnJhY0RpZ2l0LmV4ZWModGhpcy5fYnVmZmVyKTtcbiAgICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtTnVtYmVycyAmJiB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJDaHVuaycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgICAgICAgdGhpcy5fcGFja051bWJlcnMgJiYgKHRoaXMuX2FjY3VtdWxhdG9yICs9IHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub1N0aWNreSkge1xuICAgICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGluZGV4ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnbnVtYmVyRXhwb25lbnQnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4cGVjdCA9IGV4cGVjdGVkW3RoaXMuX3BhcmVudF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbWFpbjsgLy8gd2FpdCBmb3IgbW9yZSBpbnB1dFxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyRXhwb25lbnQnOiAvLyBbZUVdP1xuICAgICAgICAgIHBhdHRlcm5zLm51bWJlckV4cG9uZW50Lmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMubnVtYmVyRXhwb25lbnQuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhwZWN0ID0gZXhwZWN0ZWRbdGhpcy5fcGFyZW50XTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnZG9uZSc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbWFpbjsgLy8gd2FpdCBmb3IgbW9yZSBpbnB1dFxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAgIHRoaXMuX3N0cmVhbU51bWJlcnMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnbnVtYmVyQ2h1bmsnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgICAgICB0aGlzLl9wYWNrTnVtYmVycyAmJiAodGhpcy5fYWNjdW11bGF0b3IgKz0gdmFsdWUpO1xuICAgICAgICAgIHRoaXMuX2V4cGVjdCA9ICdudW1iZXJFeHBTaWduJztcbiAgICAgICAgICBpZiAobm9TdGlja3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlciA9IHRoaXMuX2J1ZmZlci5zbGljZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdudW1iZXJFeHBTaWduJzogLy8gWy0rXT9cbiAgICAgICAgICBwYXR0ZXJucy5udW1iZXJFeHBTaWduLmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMubnVtYmVyRXhwU2lnbi5leGVjKHRoaXMuX2J1ZmZlcik7XG4gICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnbnVtYmVyRXhwU3RhcnQnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdQYXJzZXIgaGFzIGV4cGVjdGVkIGFuIGV4cG9uZW50IHZhbHVlIG9mIGEgbnVtYmVyJykpO1xuICAgICAgICAgICAgYnJlYWsgbWFpbjsgLy8gd2FpdCBmb3IgbW9yZSBpbnB1dFxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAgIHRoaXMuX3N0cmVhbU51bWJlcnMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnbnVtYmVyQ2h1bmsnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgICAgICB0aGlzLl9wYWNrTnVtYmVycyAmJiAodGhpcy5fYWNjdW11bGF0b3IgKz0gdmFsdWUpO1xuICAgICAgICAgIHRoaXMuX2V4cGVjdCA9ICdudW1iZXJFeHBTdGFydCc7XG4gICAgICAgICAgaWYgKG5vU3RpY2t5KSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIgPSB0aGlzLl9idWZmZXIuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyRXhwU3RhcnQnOiAvLyBbMC05XVxuICAgICAgICAgIHBhdHRlcm5zLm51bWJlckV4cFN0YXJ0Lmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMubnVtYmVyRXhwU3RhcnQuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignUGFyc2VyIGNhbm5vdCBwYXJzZSBpbnB1dDogZXhwZWN0ZWQgYW4gZXhwb25lbnQgcGFydCBvZiBhIG51bWJlcicpKTtcbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICB0aGlzLl9zdHJlYW1OdW1iZXJzICYmIHRoaXMucHVzaCh7bmFtZTogJ251bWJlckNodW5rJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgICAgdGhpcy5fcGFja051bWJlcnMgJiYgKHRoaXMuX2FjY3VtdWxhdG9yICs9IHZhbHVlKTtcbiAgICAgICAgICB0aGlzLl9leHBlY3QgPSAnbnVtYmVyRXhwRGlnaXQnO1xuICAgICAgICAgIGlmIChub1N0aWNreSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyID0gdGhpcy5fYnVmZmVyLnNsaWNlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ251bWJlckV4cERpZ2l0JzogLy8gWzAtOV0qXG4gICAgICAgICAgcGF0dGVybnMubnVtYmVyRXhwRGlnaXQubGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJucy5udW1iZXJFeHBEaWdpdC5leGVjKHRoaXMuX2J1ZmZlcik7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbU51bWJlcnMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnbnVtYmVyQ2h1bmsnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgICAgICAgIHRoaXMuX3BhY2tOdW1iZXJzICYmICh0aGlzLl9hY2N1bXVsYXRvciArPSB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAobm9TdGlja3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyID0gdGhpcy5fYnVmZmVyLnNsaWNlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRleCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGggfHwgdGhpcy5fZG9uZSkge1xuICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSBleHBlY3RlZFt0aGlzLl9wYXJlbnRdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICAgIHBhdHRlcm5zLndzLmxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgIG1hdGNoID0gcGF0dGVybnMud3MuZXhlYyh0aGlzLl9idWZmZXIpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2pzb25TdHJlYW1pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9leHBlY3QgPSAndmFsdWUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ1BhcnNlciBjYW5ub3QgcGFyc2UgaW5wdXQ6IHVuZXhwZWN0ZWQgY2hhcmFjdGVycycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrIG1haW47IC8vIHdhaXQgZm9yIG1vcmUgaW5wdXRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICBpZiAodGhpcy5fb3Blbl9udW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbU51bWJlcnMgJiYgdGhpcy5wdXNoKHtuYW1lOiAnZW5kTnVtYmVyJ30pO1xuICAgICAgICAgICAgdGhpcy5fb3Blbl9udW1iZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWNrTnVtYmVycykge1xuICAgICAgICAgICAgICB0aGlzLnB1c2goe25hbWU6ICdudW1iZXJWYWx1ZScsIHZhbHVlOiB0aGlzLl9hY2N1bXVsYXRvcn0pO1xuICAgICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9TdGlja3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlciA9IHRoaXMuX2J1ZmZlci5zbGljZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAhbm9TdGlja3kgJiYgKHRoaXMuX2J1ZmZlciA9IHRoaXMuX2J1ZmZlci5zbGljZShpbmRleCkpO1xuICAgIGNhbGxiYWNrKG51bGwpO1xuICB9XG59XG5QYXJzZXIucGFyc2VyID0gUGFyc2VyLm1ha2U7XG5QYXJzZXIubWFrZS5Db25zdHJ1Y3RvciA9IFBhcnNlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW1pdCA9IHN0cmVhbSA9PiBzdHJlYW0ub24oJ2RhdGEnLCBpdGVtID0+IHN0cmVhbS5lbWl0KGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtaXQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUGFyc2VyID0gcmVxdWlyZSgnLi9QYXJzZXInKTtcbmNvbnN0IGVtaXQgPSByZXF1aXJlKCcuL3V0aWxzL2VtaXQnKTtcblxuY29uc3QgbWFrZSA9IG9wdGlvbnMgPT4gZW1pdChuZXcgUGFyc2VyKG9wdGlvbnMpKTtcblxubWFrZS5QYXJzZXIgPSBQYXJzZXI7XG5tYWtlLnBhcnNlciA9IFBhcnNlci5wYXJzZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gbWFrZTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcblxuY29uc3Qgc3RhcnRPYmplY3QgPSBDdHIgPT5cbiAgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50LCB0aGlzLmtleSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IG5ldyBDdHIoKTtcbiAgICB0aGlzLmtleSA9IG51bGw7XG4gIH07XG5cbmNsYXNzIEFzc2VtYmxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBjb25uZWN0VG8oc3RyZWFtLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBBc3NlbWJsZXIob3B0aW9ucykuY29ubmVjdFRvKHN0cmVhbSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnN0YWNrID0gW107XG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5rZXkgPSBudWxsO1xuICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucmV2aXZlciA9IHR5cGVvZiBvcHRpb25zLnJldml2ZXIgPT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLnJldml2ZXI7XG4gICAgICBpZiAodGhpcy5yZXZpdmVyKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nVmFsdWUgPSB0aGlzLl9zYXZlVmFsdWUgPSB0aGlzLl9zYXZlVmFsdWVXaXRoUmV2aXZlcjtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLm51bWJlckFzU3RyaW5nKSB7XG4gICAgICAgIHRoaXMubnVtYmVyVmFsdWUgPSB0aGlzLnN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RUbyhzdHJlYW0pIHtcbiAgICBzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICBpZiAodGhpc1tjaHVuay5uYW1lXSkge1xuICAgICAgICB0aGlzW2NodW5rLm5hbWVdKGNodW5rLnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSkgdGhpcy5lbWl0KCdkb25lJywgdGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQgZGVwdGgoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0YWNrLmxlbmd0aCA+PiAxKSArICh0aGlzLmRvbmUgPyAwIDogMSk7XG4gIH1cblxuICBnZXQgcGF0aCgpIHtcbiAgICBjb25zdCBwYXRoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN0YWNrW2kgKyAxXTtcbiAgICAgIHBhdGgucHVzaChrZXkgPT09IG51bGwgPyB0aGlzLnN0YWNrW2ldLmxlbmd0aCA6IGtleSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgZHJvcFRvTGV2ZWwobGV2ZWwpIHtcbiAgICBpZiAobGV2ZWwgPCB0aGlzLmRlcHRoKSB7XG4gICAgICBpZiAobGV2ZWwpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAobGV2ZWwgLSAxKSA8PCAxO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YWNrW2luZGV4XTtcbiAgICAgICAgdGhpcy5rZXkgPSB0aGlzLnN0YWNrW2luZGV4ICsgMV07XG4gICAgICAgIHRoaXMuc3RhY2suc3BsaWNlKGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5rZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbnN1bWUoY2h1bmspIHtcbiAgICB0aGlzW2NodW5rLm5hbWVdICYmIHRoaXNbY2h1bmsubmFtZV0oY2h1bmsudmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAga2V5VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLmtleSA9IHZhbHVlO1xuICB9XG5cbiAgLy9zdHJpbmdWYWx1ZSgpIC0gYWxpYXNlZCBiZWxvdyB0byBfc2F2ZVZhbHVlKClcblxuICBudW1iZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMuX3NhdmVWYWx1ZShwYXJzZUZsb2F0KHZhbHVlKSk7XG4gIH1cbiAgbnVsbFZhbHVlKCkge1xuICAgIHRoaXMuX3NhdmVWYWx1ZShudWxsKTtcbiAgfVxuICB0cnVlVmFsdWUoKSB7XG4gICAgdGhpcy5fc2F2ZVZhbHVlKHRydWUpO1xuICB9XG4gIGZhbHNlVmFsdWUoKSB7XG4gICAgdGhpcy5fc2F2ZVZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIC8vc3RhcnRPYmplY3QoKSAtIGFzc2lnbmVkIGJlbG93XG5cbiAgZW5kT2JqZWN0KCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB0aGlzLmtleSA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5fc2F2ZVZhbHVlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvL3N0YXJ0QXJyYXkoKSAtIGFzc2lnbmVkIGJlbG93XG4gIC8vZW5kQXJyYXkoKSAtIGFsaWFzZWQgYmVsb3cgdG8gZW5kT2JqZWN0KClcblxuICBfc2F2ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB0aGlzLmN1cnJlbnQucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRbdGhpcy5rZXldID0gdmFsdWU7XG4gICAgICAgIHRoaXMua2V5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NhdmVWYWx1ZVdpdGhSZXZpdmVyKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5yZXZpdmVyKCcnLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMucmV2aXZlcignJyArIHRoaXMuY3VycmVudC5sZW5ndGgsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50LnB1c2godmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRbdGhpcy5jdXJyZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRoaXMucmV2aXZlcih0aGlzLmtleSwgdmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFt0aGlzLmtleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkFzc2VtYmxlci5wcm90b3R5cGUuc3RyaW5nVmFsdWUgPSBBc3NlbWJsZXIucHJvdG90eXBlLl9zYXZlVmFsdWU7XG5Bc3NlbWJsZXIucHJvdG90eXBlLnN0YXJ0T2JqZWN0ID0gc3RhcnRPYmplY3QoT2JqZWN0KTtcbkFzc2VtYmxlci5wcm90b3R5cGUuc3RhcnRBcnJheSA9IHN0YXJ0T2JqZWN0KEFycmF5KTtcbkFzc2VtYmxlci5wcm90b3R5cGUuZW5kQXJyYXkgPSBBc3NlbWJsZXIucHJvdG90eXBlLmVuZE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBBc3NlbWJsZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qge1RyYW5zZm9ybX0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IEFzc2VtYmxlciA9IHJlcXVpcmUoJy4uL0Fzc2VtYmxlcicpO1xuXG5jbGFzcyBDb3VudGVyIHtcbiAgY29uc3RydWN0b3IoaW5pdGlhbERlcHRoKSB7XG4gICAgdGhpcy5kZXB0aCA9IGluaXRpYWxEZXB0aDtcbiAgfVxuICBzdGFydE9iamVjdCgpIHtcbiAgICArK3RoaXMuZGVwdGg7XG4gIH1cbiAgZW5kT2JqZWN0KCkge1xuICAgIC0tdGhpcy5kZXB0aDtcbiAgfVxuICBzdGFydEFycmF5KCkge1xuICAgICsrdGhpcy5kZXB0aDtcbiAgfVxuICBlbmRBcnJheSgpIHtcbiAgICAtLXRoaXMuZGVwdGg7XG4gIH1cbn1cblxuY2xhc3MgU3RyZWFtQmFzZSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7d3JpdGFibGVPYmplY3RNb2RlOiB0cnVlLCByZWFkYWJsZU9iamVjdE1vZGU6IHRydWV9KSk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub2JqZWN0RmlsdGVyID0gb3B0aW9ucy5vYmplY3RGaWx0ZXI7XG4gICAgICB0aGlzLmluY2x1ZGVVbmRlY2lkZWQgPSBvcHRpb25zLmluY2x1ZGVVbmRlY2lkZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5vYmplY3RGaWx0ZXIgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fZmlsdGVyID0gdGhpcy5fdHJhbnNmb3JtO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLl93YWl0IHx8IHRoaXMuX2ZpbHRlcjtcbiAgICB0aGlzLl9hc3NlbWJsZXIgPSBuZXcgQXNzZW1ibGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2Fzc2VtYmxlcltjaHVuay5uYW1lXSkge1xuICAgICAgdGhpcy5fYXNzZW1ibGVyW2NodW5rLm5hbWVdKGNodW5rLnZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9hc3NlbWJsZXIuZGVwdGggPT09IHRoaXMuX2xldmVsKSB7XG4gICAgICAgIHRoaXMuX3B1c2goKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCk7XG4gIH1cblxuICBfZmlsdGVyKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYXNzZW1ibGVyW2NodW5rLm5hbWVdKSB7XG4gICAgICB0aGlzLl9hc3NlbWJsZXJbY2h1bmsubmFtZV0oY2h1bmsudmFsdWUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vYmplY3RGaWx0ZXIodGhpcy5fYXNzZW1ibGVyKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Fzc2VtYmxlci5kZXB0aCA9PT0gdGhpcy5fbGV2ZWwpIHtcbiAgICAgICAgICB0aGlzLl9wdXNoKCk7XG4gICAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fZmlsdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRoaXMuX2FjY2VwdDtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fc2F2ZWRfYXNzZW1ibGVyID0gdGhpcy5fYXNzZW1ibGVyO1xuICAgICAgICB0aGlzLl9hc3NlbWJsZXIgPSBuZXcgQ291bnRlcih0aGlzLl9zYXZlZF9hc3NlbWJsZXIuZGVwdGgpO1xuICAgICAgICB0aGlzLl9zYXZlZF9hc3NlbWJsZXIuZHJvcFRvTGV2ZWwodGhpcy5fbGV2ZWwpO1xuICAgICAgICBpZiAodGhpcy5fYXNzZW1ibGVyLmRlcHRoID09PSB0aGlzLl9sZXZlbCkge1xuICAgICAgICAgIHRoaXMuX2Fzc2VtYmxlciA9IHRoaXMuX3NhdmVkX2Fzc2VtYmxlcjtcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLl9maWx0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fcmVqZWN0O1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYXNzZW1ibGVyLmRlcHRoID09PSB0aGlzLl9sZXZlbCkge1xuICAgICAgICB0aGlzLl9wdXNoKCF0aGlzLmluY2x1ZGVVbmRlY2lkZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYWxsYmFjayhudWxsKTtcbiAgfVxuXG4gIF9hY2NlcHQoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9hc3NlbWJsZXJbY2h1bmsubmFtZV0pIHtcbiAgICAgIHRoaXMuX2Fzc2VtYmxlcltjaHVuay5uYW1lXShjaHVuay52YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fYXNzZW1ibGVyLmRlcHRoID09PSB0aGlzLl9sZXZlbCkge1xuICAgICAgICB0aGlzLl9wdXNoKCk7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRoaXMuX2ZpbHRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCk7XG4gIH1cblxuICBfcmVqZWN0KGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYXNzZW1ibGVyW2NodW5rLm5hbWVdKSB7XG4gICAgICB0aGlzLl9hc3NlbWJsZXJbY2h1bmsubmFtZV0oY2h1bmsudmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX2Fzc2VtYmxlci5kZXB0aCA9PT0gdGhpcy5fbGV2ZWwpIHtcbiAgICAgICAgdGhpcy5fYXNzZW1ibGVyID0gdGhpcy5fc2F2ZWRfYXNzZW1ibGVyO1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLl9maWx0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtQmFzZTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7UmVhZGFibGUsIFdyaXRhYmxlLCBEdXBsZXgsIFRyYW5zZm9ybX0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuY29uc3Qgbm9uZSA9IFN5bWJvbC5mb3IoJ29iamVjdC1zdHJlYW0ubm9uZScpO1xuY29uc3QgZmluYWxTeW1ib2wgPSBTeW1ib2wuZm9yKCdvYmplY3Qtc3RyZWFtLmZpbmFsJyk7XG5jb25zdCBtYW55U3ltYm9sID0gU3ltYm9sLmZvcignb2JqZWN0LXN0cmVhbS5tYW55Jyk7XG5cbmNvbnN0IGZpbmFsID0gdmFsdWUgPT4gKHtbZmluYWxTeW1ib2xdOiB2YWx1ZX0pO1xuY29uc3QgbWFueSA9IHZhbHVlcyA9PiAoe1ttYW55U3ltYm9sXTogdmFsdWVzfSk7XG5cbmNvbnN0IGlzRmluYWwgPSBvID0+IG8gJiYgdHlwZW9mIG8gPT0gJ29iamVjdCcgJiYgZmluYWxTeW1ib2wgaW4gbztcbmNvbnN0IGlzTWFueSA9IG8gPT4gbyAmJiB0eXBlb2YgbyA9PSAnb2JqZWN0JyAmJiBtYW55U3ltYm9sIGluIG87XG5cbmNvbnN0IGdldEZpbmFsVmFsdWUgPSBvID0+IG9bZmluYWxTeW1ib2xdO1xuY29uc3QgZ2V0TWFueVZhbHVlcyA9IG8gPT4gb1ttYW55U3ltYm9sXTtcblxuY29uc3QgcnVuQXN5bmNHZW5lcmF0b3IgPSBhc3luYyAoZ2VuLCBzdHJlYW0pID0+IHtcbiAgZm9yICg7Oykge1xuICAgIGxldCBkYXRhID0gZ2VuLm5leHQoKTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS50aGVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRhdGEgPSBhd2FpdCBkYXRhO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kb25lKSBicmVhaztcbiAgICBsZXQgdmFsdWUgPSBkYXRhLnZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YWx1ZSA9IGF3YWl0IHZhbHVlO1xuICAgIH1cbiAgICBDaGFpbi5zYW5pdGl6ZSh2YWx1ZSwgc3RyZWFtKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT5cbiAgbmV3IFRyYW5zZm9ybSh7XG4gICAgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogdHJ1ZSxcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4uY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gdGhlbmFibGVcbiAgICAgICAgICByZXN1bHQudGhlbihcbiAgICAgICAgICAgIHJlc3VsdCA9PiAoQ2hhaW4uc2FuaXRpemUocmVzdWx0LCB0aGlzKSwgY2FsbGJhY2sobnVsbCkpLFxuICAgICAgICAgICAgZXJyb3IgPT4gY2FsbGJhY2soZXJyb3IpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0Lm5leHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIGdlbmVyYXRvclxuICAgICAgICAgIHJ1bkFzeW5jR2VuZXJhdG9yKHJlc3VsdCwgdGhpcykudGhlbihcbiAgICAgICAgICAgICgpID0+IGNhbGxiYWNrKG51bGwpLFxuICAgICAgICAgICAgZXJyb3IgPT4gY2FsbGJhY2soZXJyb3IpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQ2hhaW4uc2FuaXRpemUocmVzdWx0LCB0aGlzKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuY29uc3Qgd3JhcEFycmF5ID0gZm5zID0+XG4gIG5ldyBUcmFuc2Zvcm0oe1xuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogdHJ1ZSxcbiAgICByZWFkYWJsZU9iamVjdE1vZGU6IHRydWUsXG4gICAgdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGNodW5rO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuc1tpXS5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGluZyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gQ2hhaW4ubm9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChDaGFpbi5pc0ZpbmFsKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gQ2hhaW4uZ2V0RmluYWxWYWx1ZShyZXN1bHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIENoYWluLnNhbml0aXplKHZhbHVlLCB0aGlzKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuLy8gaXMqTm9kZVN0cmVhbSBmdW5jdGlvbnMgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL3N0cmVhbXMvdXRpbHMuanNcbmNvbnN0IGlzUmVhZGFibGVOb2RlU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJlxuICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIG9iai5vbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAoIW9iai5fd3JpdGFibGVTdGF0ZSB8fCAodHlwZW9mIG9iai5fcmVhZGFibGVTdGF0ZSA9PT0gJ29iamVjdCcgPyBvYmouX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgOiBudWxsKSAhPT0gZmFsc2UpICYmIC8vIER1cGxleFxuICAoIW9iai5fd3JpdGFibGVTdGF0ZSB8fCBvYmouX3JlYWRhYmxlU3RhdGUpOyAvLyBXcml0YWJsZSBoYXMgLnBpcGUuXG5cbmNvbnN0IGlzV3JpdGFibGVOb2RlU3RyZWFtID0gb2JqID0+XG4gIG9iaiAmJlxuICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgKCFvYmouX3JlYWRhYmxlU3RhdGUgfHwgKHR5cGVvZiBvYmouX3dyaXRhYmxlU3RhdGUgPT09ICdvYmplY3QnID8gb2JqLl93cml0YWJsZVN0YXRlLndyaXRhYmxlIDogbnVsbCkgIT09IGZhbHNlKTsgLy8gRHVwbGV4XG5cbmNvbnN0IGlzRHVwbGV4Tm9kZVN0cmVhbSA9IG9iaiA9PlxuICBvYmogJiYgdHlwZW9mIG9iai5waXBlID09PSAnZnVuY3Rpb24nICYmIG9iai5fcmVhZGFibGVTdGF0ZSAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoud3JpdGUgPT09ICdmdW5jdGlvbic7XG5cbmNsYXNzIENoYWluIGV4dGVuZHMgRHVwbGV4IHtcbiAgY29uc3RydWN0b3IoZm5zLCBvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyB8fCB7d3JpdGFibGVPYmplY3RNb2RlOiB0cnVlLCByZWFkYWJsZU9iamVjdE1vZGU6IHRydWV9KTtcblxuICAgIGlmICghKGZucyBpbnN0YW5jZW9mIEFycmF5KSB8fCAhZm5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJDaGFpbidzIGFyZ3VtZW50IHNob3VsZCBiZSBhIG5vbi1lbXB0eSBhcnJheS5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5zdHJlYW1zID0gZm5zXG4gICAgICAuZmlsdGVyKGZuID0+IGZuKVxuICAgICAgLm1hcCgoZm4sIGluZGV4LCBmbnMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fCBmbiBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gQ2hhaW4uY29udmVydFRvVHJhbnNmb3JtKGZuKTtcbiAgICAgICAgaWYgKGlzRHVwbGV4Tm9kZVN0cmVhbShmbikgfHwgKCFpbmRleCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShmbikpIHx8IChpbmRleCA9PT0gZm5zLmxlbmd0aCAtIDEgJiYgaXNXcml0YWJsZU5vZGVTdHJlYW0oZm4pKSkge1xuICAgICAgICAgIHJldHVybiBmbjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcignQXJndW1lbnRzIHNob3VsZCBiZSBmdW5jdGlvbnMsIGFycmF5cyBvciBzdHJlYW1zLicpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIocyA9PiBzKTtcbiAgICB0aGlzLmlucHV0ID0gdGhpcy5zdHJlYW1zWzBdO1xuICAgIHRoaXMub3V0cHV0ID0gdGhpcy5zdHJlYW1zLnJlZHVjZSgob3V0cHV0LCBzdHJlYW0pID0+IChvdXRwdXQgJiYgb3V0cHV0LnBpcGUoc3RyZWFtKSkgfHwgc3RyZWFtKTtcblxuICAgIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0odGhpcy5pbnB1dCkpIHtcbiAgICAgIHRoaXMuX3dyaXRlID0gKF8xLCBfMiwgY2FsbGJhY2spID0+IGNhbGxiYWNrKG51bGwpO1xuICAgICAgdGhpcy5fZmluYWwgPSBjYWxsYmFjayA9PiBjYWxsYmFjayhudWxsKTsgLy8gdW5hdmFpbGFibGUgaW4gTm9kZSA2XG4gICAgICB0aGlzLmlucHV0Lm9uKCdlbmQnLCAoKSA9PiB0aGlzLmVuZCgpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odGhpcy5vdXRwdXQpKSB7XG4gICAgICB0aGlzLm91dHB1dC5vbignZGF0YScsIGNodW5rID0+ICF0aGlzLnB1c2goY2h1bmspICYmIHRoaXMub3V0cHV0LnBhdXNlKCkpO1xuICAgICAgdGhpcy5vdXRwdXQub24oJ2VuZCcsICgpID0+IHRoaXMucHVzaChudWxsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlYWQgPSAoKSA9PiB7fTsgLy8gbm9wXG4gICAgICB0aGlzLnJlc3VtZSgpO1xuICAgICAgdGhpcy5vdXRwdXQub24oJ2ZpbmlzaCcsICgpID0+IHRoaXMucHVzaChudWxsKSk7XG4gICAgfVxuXG4gICAgLy8gY29ubmVjdCBldmVudHNcbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMuc2tpcEV2ZW50cykge1xuICAgICAgdGhpcy5zdHJlYW1zLmZvckVhY2goc3RyZWFtID0+IHN0cmVhbS5vbignZXJyb3InLCBlcnJvciA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKSk7XG4gICAgfVxuICB9XG4gIF93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnB1dC53cml0ZShjaHVuaywgZW5jb2RpbmcsIGUgPT4gY2FsbGJhY2soZSB8fCBlcnJvcikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgX2ZpbmFsKGNhbGxiYWNrKSB7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnB1dC5lbmQobnVsbCwgbnVsbCwgZSA9PiBjYWxsYmFjayhlIHx8IGVycm9yKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBfcmVhZCgpIHtcbiAgICB0aGlzLm91dHB1dC5yZXN1bWUoKTtcbiAgfVxuICBzdGF0aWMgbWFrZShmbnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENoYWluKGZucywgb3B0aW9ucyk7XG4gIH1cbiAgc3RhdGljIHNhbml0aXplKHJlc3VsdCwgc3RyZWFtKSB7XG4gICAgaWYgKENoYWluLmlzRmluYWwocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gQ2hhaW4uZ2V0RmluYWxWYWx1ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoQ2hhaW4uaXNNYW55KHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IENoYWluLmdldE1hbnlWYWx1ZXMocmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IENoYWluLm5vbmUpIHtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXN1bHQuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHN0cmVhbS5wdXNoKHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJlYW0ucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0aWMgY29udmVydFRvVHJhbnNmb3JtKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHdyYXBGdW5jdGlvbihmbik7XG4gICAgaWYgKGZuIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBmbi5sZW5ndGggPyB3cmFwQXJyYXkoZm4pIDogbnVsbDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5DaGFpbi5ub25lID0gbm9uZTtcbkNoYWluLmZpbmFsID0gZmluYWw7XG5DaGFpbi5pc0ZpbmFsID0gaXNGaW5hbDtcbkNoYWluLmdldEZpbmFsVmFsdWUgPSBnZXRGaW5hbFZhbHVlO1xuQ2hhaW4ubWFueSA9IG1hbnk7XG5DaGFpbi5pc01hbnkgPSBpc01hbnk7XG5DaGFpbi5nZXRNYW55VmFsdWVzID0gZ2V0TWFueVZhbHVlcztcblxuQ2hhaW4uY2hhaW4gPSBDaGFpbi5tYWtlO1xuQ2hhaW4ubWFrZS5Db25zdHJ1Y3RvciA9IENoYWluO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYWluO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHtjaGFpbn0gPSByZXF1aXJlKCdzdHJlYW0tY2hhaW4nKTtcblxuY29uc3QgUGFyc2VyID0gcmVxdWlyZSgnLi4vUGFyc2VyJyk7XG5cbmNvbnN0IHdpdGhQYXJzZXIgPSAoZm4sIG9wdGlvbnMpID0+XG4gIGNoYWluKFtuZXcgUGFyc2VyKG9wdGlvbnMpLCBmbihvcHRpb25zKV0sIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHt3cml0YWJsZU9iamVjdE1vZGU6IGZhbHNlLCByZWFkYWJsZU9iamVjdE1vZGU6IHRydWV9KSk7XG5cbm1vZHVsZS5leHBvcnRzID0gd2l0aFBhcnNlcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTdHJlYW1CYXNlID0gcmVxdWlyZSgnLi9TdHJlYW1CYXNlJyk7XG5jb25zdCB3aXRoUGFyc2VyID0gcmVxdWlyZSgnLi4vdXRpbHMvd2l0aFBhcnNlcicpO1xuXG5jbGFzcyBTdHJlYW1BcnJheSBleHRlbmRzIFN0cmVhbUJhc2Uge1xuICBzdGF0aWMgbWFrZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1BcnJheShvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyB3aXRoUGFyc2VyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gd2l0aFBhcnNlcihTdHJlYW1BcnJheS5tYWtlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLl9sZXZlbCA9IDE7XG4gICAgdGhpcy5fY291bnRlciA9IDA7XG4gIH1cblxuICBfd2FpdChjaHVuaywgXywgY2FsbGJhY2spIHtcbiAgICAvLyBmaXJzdCBjaHVuayBzaG91bGQgb3BlbiBhbiBhcnJheVxuICAgIGlmIChjaHVuay5uYW1lICE9PSAnc3RhcnRBcnJheScpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ1RvcC1sZXZlbCBvYmplY3Qgc2hvdWxkIGJlIGFuIGFycmF5LicpKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fZmlsdGVyO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIF8sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIF9wdXNoKGRpc2NhcmQpIHtcbiAgICBpZiAodGhpcy5fYXNzZW1ibGVyLmN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICBpZiAoZGlzY2FyZCkge1xuICAgICAgICArK3RoaXMuX2NvdW50ZXI7XG4gICAgICAgIHRoaXMuX2Fzc2VtYmxlci5jdXJyZW50LnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoKHtrZXk6IHRoaXMuX2NvdW50ZXIrKywgdmFsdWU6IHRoaXMuX2Fzc2VtYmxlci5jdXJyZW50LnBvcCgpfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5TdHJlYW1BcnJheS5zdHJlYW1BcnJheSA9IFN0cmVhbUFycmF5Lm1ha2U7XG5TdHJlYW1BcnJheS5tYWtlLkNvbnN0cnVjdG9yID0gU3RyZWFtQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtQXJyYXk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgU3RyZWFtQmFzZSA9IHJlcXVpcmUoJy4vU3RyZWFtQmFzZScpO1xuY29uc3Qgd2l0aFBhcnNlciA9IHJlcXVpcmUoJy4uL3V0aWxzL3dpdGhQYXJzZXInKTtcblxuY2xhc3MgU3RyZWFtT2JqZWN0IGV4dGVuZHMgU3RyZWFtQmFzZSB7XG4gIHN0YXRpYyBtYWtlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFN0cmVhbU9iamVjdChvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyB3aXRoUGFyc2VyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gd2l0aFBhcnNlcihTdHJlYW1PYmplY3QubWFrZSwgb3B0aW9ucyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5fbGV2ZWwgPSAxO1xuICAgIHRoaXMuX2xhc3RLZXkgPSBudWxsO1xuICB9XG5cbiAgX3dhaXQoY2h1bmssIF8sIGNhbGxiYWNrKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgc2hvdWxkIG9wZW4gYW4gYXJyYXlcbiAgICBpZiAoY2h1bmsubmFtZSAhPT0gJ3N0YXJ0T2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignVG9wLWxldmVsIG9iamVjdCBzaG91bGQgYmUgYW4gb2JqZWN0LicpKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fZmlsdGVyO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIF8sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIF9wdXNoKGRpc2NhcmQpIHtcbiAgICBpZiAodGhpcy5fbGFzdEtleSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGFzdEtleSA9IHRoaXMuX2Fzc2VtYmxlci5rZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgICFkaXNjYXJkICYmIHRoaXMucHVzaCh7a2V5OiB0aGlzLl9sYXN0S2V5LCB2YWx1ZTogdGhpcy5fYXNzZW1ibGVyLmN1cnJlbnRbdGhpcy5fbGFzdEtleV19KTtcbiAgICAgIHRoaXMuX2Fzc2VtYmxlci5jdXJyZW50ID0ge307XG4gICAgICB0aGlzLl9sYXN0S2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblN0cmVhbU9iamVjdC5zdHJlYW1PYmplY3QgPSBTdHJlYW1PYmplY3QubWFrZTtcblN0cmVhbU9iamVjdC5tYWtlLkNvbnN0cnVjdG9yID0gU3RyZWFtT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbU9iamVjdDtcbiIsCiAgICAidmFyIGNsb25lID0gKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW5zdGFuY2VvZihvYmosIHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiB0eXBlO1xufVxuXG52YXIgbmF0aXZlTWFwO1xudHJ5IHtcbiAgbmF0aXZlTWFwID0gTWFwO1xufSBjYXRjaChfKSB7XG4gIC8vIG1heWJlIGEgcmVmZXJlbmNlIGVycm9yIGJlY2F1c2Ugbm8gYE1hcGAuIEdpdmUgaXQgYSBkdW1teSB2YWx1ZSB0aGF0IG5vXG4gIC8vIHZhbHVlIHdpbGwgZXZlciBiZSBhbiBpbnN0YW5jZW9mLlxuICBuYXRpdmVNYXAgPSBmdW5jdGlvbigpIHt9O1xufVxuXG52YXIgbmF0aXZlU2V0O1xudHJ5IHtcbiAgbmF0aXZlU2V0ID0gU2V0O1xufSBjYXRjaChfKSB7XG4gIG5hdGl2ZVNldCA9IGZ1bmN0aW9uKCkge307XG59XG5cbnZhciBuYXRpdmVQcm9taXNlO1xudHJ5IHtcbiAgbmF0aXZlUHJvbWlzZSA9IFByb21pc2U7XG59IGNhdGNoKF8pIHtcbiAgbmF0aXZlUHJvbWlzZSA9IGZ1bmN0aW9uKCkge307XG59XG5cbi8qKlxuICogQ2xvbmVzIChjb3BpZXMpIGFuIE9iamVjdCB1c2luZyBkZWVwIGNvcHlpbmcuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGRlZmF1bHQsIGJ1dCBpZiB5b3UgYXJlIGNlcnRhaW5cbiAqIHRoZXJlIGFyZSBubyBjaXJjdWxhciByZWZlcmVuY2VzIGluIHlvdXIgb2JqZWN0LCB5b3UgY2FuIHNhdmUgc29tZSBDUFUgdGltZVxuICogYnkgY2FsbGluZyBjbG9uZShvYmosIGZhbHNlKS5cbiAqXG4gKiBDYXV0aW9uOiBpZiBgY2lyY3VsYXJgIGlzIGZhbHNlIGFuZCBgcGFyZW50YCBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2VzLFxuICogeW91ciBwcm9ncmFtIG1heSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGFuZCBjcmFzaC5cbiAqXG4gKiBAcGFyYW0gYHBhcmVudGAgLSB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZFxuICogQHBhcmFtIGBjaXJjdWxhcmAgLSBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZCBtYXkgY29udGFpblxuICogICAgY2lyY3VsYXIgcmVmZXJlbmNlcy4gKG9wdGlvbmFsIC0gdHJ1ZSBieSBkZWZhdWx0KVxuICogQHBhcmFtIGBkZXB0aGAgLSBzZXQgdG8gYSBudW1iZXIgaWYgdGhlIG9iamVjdCBpcyBvbmx5IHRvIGJlIGNsb25lZCB0b1xuICogICAgYSBwYXJ0aWN1bGFyIGRlcHRoLiAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBJbmZpbml0eSlcbiAqIEBwYXJhbSBgcHJvdG90eXBlYCAtIHNldHMgdGhlIHByb3RvdHlwZSB0byBiZSB1c2VkIHdoZW4gY2xvbmluZyBhbiBvYmplY3QuXG4gKiAgICAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBwYXJlbnQgcHJvdG90eXBlKS5cbiAqIEBwYXJhbSBgaW5jbHVkZU5vbkVudW1lcmFibGVgIC0gc2V0IHRvIHRydWUgaWYgdGhlIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqICAgIHNob3VsZCBiZSBjbG9uZWQgYXMgd2VsbC4gTm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlXG4gKiAgICBjaGFpbiB3aWxsIGJlIGlnbm9yZWQuIChvcHRpb25hbCAtIGZhbHNlIGJ5IGRlZmF1bHQpXG4qL1xuZnVuY3Rpb24gY2xvbmUocGFyZW50LCBjaXJjdWxhciwgZGVwdGgsIHByb3RvdHlwZSwgaW5jbHVkZU5vbkVudW1lcmFibGUpIHtcbiAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZXB0aCA9IGNpcmN1bGFyLmRlcHRoO1xuICAgIHByb3RvdHlwZSA9IGNpcmN1bGFyLnByb3RvdHlwZTtcbiAgICBpbmNsdWRlTm9uRW51bWVyYWJsZSA9IGNpcmN1bGFyLmluY2x1ZGVOb25FbnVtZXJhYmxlO1xuICAgIGNpcmN1bGFyID0gY2lyY3VsYXIuY2lyY3VsYXI7XG4gIH1cbiAgLy8gbWFpbnRhaW4gdHdvIGFycmF5cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcywgd2hlcmUgY29ycmVzcG9uZGluZyBwYXJlbnRzXG4gIC8vIGFuZCBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIGluZGV4XG4gIHZhciBhbGxQYXJlbnRzID0gW107XG4gIHZhciBhbGxDaGlsZHJlbiA9IFtdO1xuXG4gIHZhciB1c2VCdWZmZXIgPSB0eXBlb2YgQnVmZmVyICE9ICd1bmRlZmluZWQnO1xuXG4gIGlmICh0eXBlb2YgY2lyY3VsYXIgPT0gJ3VuZGVmaW5lZCcpXG4gICAgY2lyY3VsYXIgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZGVwdGggPT0gJ3VuZGVmaW5lZCcpXG4gICAgZGVwdGggPSBJbmZpbml0eTtcblxuICAvLyByZWN1cnNlIHRoaXMgZnVuY3Rpb24gc28gd2UgZG9uJ3QgcmVzZXQgYWxsUGFyZW50cyBhbmQgYWxsQ2hpbGRyZW5cbiAgZnVuY3Rpb24gX2Nsb25lKHBhcmVudCwgZGVwdGgpIHtcbiAgICAvLyBjbG9uaW5nIG51bGwgYWx3YXlzIHJldHVybnMgbnVsbFxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkZXB0aCA9PT0gMClcbiAgICAgIHJldHVybiBwYXJlbnQ7XG5cbiAgICB2YXIgY2hpbGQ7XG4gICAgdmFyIHByb3RvO1xuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIGlmIChfaW5zdGFuY2VvZihwYXJlbnQsIG5hdGl2ZU1hcCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IG5hdGl2ZU1hcCgpO1xuICAgIH0gZWxzZSBpZiAoX2luc3RhbmNlb2YocGFyZW50LCBuYXRpdmVTZXQpKSB7XG4gICAgICBjaGlsZCA9IG5ldyBuYXRpdmVTZXQoKTtcbiAgICB9IGVsc2UgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgbmF0aXZlUHJvbWlzZSkpIHtcbiAgICAgIGNoaWxkID0gbmV3IG5hdGl2ZVByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwYXJlbnQudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJlc29sdmUoX2Nsb25lKHZhbHVlLCBkZXB0aCAtIDEpKTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KF9jbG9uZShlcnIsIGRlcHRoIC0gMSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2xvbmUuX19pc0FycmF5KHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gW107XG4gICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzUmVnRXhwKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IFJlZ0V4cChwYXJlbnQuc291cmNlLCBfX2dldFJlZ0V4cEZsYWdzKHBhcmVudCkpO1xuICAgICAgaWYgKHBhcmVudC5sYXN0SW5kZXgpIGNoaWxkLmxhc3RJbmRleCA9IHBhcmVudC5sYXN0SW5kZXg7XG4gICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzRGF0ZShwYXJlbnQpKSB7XG4gICAgICBjaGlsZCA9IG5ldyBEYXRlKHBhcmVudC5nZXRUaW1lKCkpO1xuICAgIH0gZWxzZSBpZiAodXNlQnVmZmVyICYmIEJ1ZmZlci5pc0J1ZmZlcihwYXJlbnQpKSB7XG4gICAgICBpZiAoQnVmZmVyLmFsbG9jVW5zYWZlKSB7XG4gICAgICAgIC8vIE5vZGUuanMgPj0gNC41LjBcbiAgICAgICAgY2hpbGQgPSBCdWZmZXIuYWxsb2NVbnNhZmUocGFyZW50Lmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbGRlciBOb2RlLmpzIHZlcnNpb25zXG4gICAgICAgIGNoaWxkID0gbmV3IEJ1ZmZlcihwYXJlbnQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5jb3B5KGNoaWxkKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9IGVsc2UgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgRXJyb3IpKSB7XG4gICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTtcbiAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcbiAgICAgICAgcHJvdG8gPSBwcm90b3R5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICB2YXIgaW5kZXggPSBhbGxQYXJlbnRzLmluZGV4T2YocGFyZW50KTtcblxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgIHJldHVybiBhbGxDaGlsZHJlbltpbmRleF07XG4gICAgICB9XG4gICAgICBhbGxQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICAgIGFsbENoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH1cblxuICAgIGlmIChfaW5zdGFuY2VvZihwYXJlbnQsIG5hdGl2ZU1hcCkpIHtcbiAgICAgIHBhcmVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIGtleUNoaWxkID0gX2Nsb25lKGtleSwgZGVwdGggLSAxKTtcbiAgICAgICAgdmFyIHZhbHVlQ2hpbGQgPSBfY2xvbmUodmFsdWUsIGRlcHRoIC0gMSk7XG4gICAgICAgIGNoaWxkLnNldChrZXlDaGlsZCwgdmFsdWVDaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgbmF0aXZlU2V0KSkge1xuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIGVudHJ5Q2hpbGQgPSBfY2xvbmUodmFsdWUsIGRlcHRoIC0gMSk7XG4gICAgICAgIGNoaWxkLmFkZChlbnRyeUNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgaW4gcGFyZW50KSB7XG4gICAgICB2YXIgYXR0cnM7XG4gICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgYXR0cnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJzICYmIGF0dHJzLnNldCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2hpbGRbaV0gPSBfY2xvbmUocGFyZW50W2ldLCBkZXB0aCAtIDEpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocGFyZW50KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBEb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNsb25pbmcgYSBzeW1ib2wgYmVjYXVzZSBpdCBpcyBhIHByaW1pdGl2ZSxcbiAgICAgICAgLy8gbGlrZSBhIG51bWJlciBvciBzdHJpbmcuXG4gICAgICAgIHZhciBzeW1ib2wgPSBzeW1ib2xzW2ldO1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocGFyZW50LCBzeW1ib2wpO1xuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlICYmICFpbmNsdWRlTm9uRW51bWVyYWJsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkW3N5bWJvbF0gPSBfY2xvbmUocGFyZW50W3N5bWJvbF0sIGRlcHRoIC0gMSk7XG4gICAgICAgIGlmICghZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoaWxkLCBzeW1ib2wsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZU5vbkVudW1lcmFibGUpIHtcbiAgICAgIHZhciBhbGxQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocGFyZW50KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHBhcmVudCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRbcHJvcGVydHlOYW1lXSA9IF9jbG9uZShwYXJlbnRbcHJvcGVydHlOYW1lXSwgZGVwdGggLSAxKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoaWxkLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICByZXR1cm4gX2Nsb25lKHBhcmVudCwgZGVwdGgpO1xufVxuXG4vKipcbiAqIFNpbXBsZSBmbGF0IGNsb25lIHVzaW5nIHByb3RvdHlwZSwgYWNjZXB0cyBvbmx5IG9iamVjdHMsIHVzZWZ1bGwgZm9yIHByb3BlcnR5XG4gKiBvdmVycmlkZSBvbiBGTEFUIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChubyBuZXN0ZWQgcHJvcHMpLlxuICpcbiAqIFVTRSBXSVRIIENBVVRJT04hIFRoaXMgbWF5IG5vdCBiZWhhdmUgYXMgeW91IHdpc2ggaWYgeW91IGRvIG5vdCBrbm93IGhvdyB0aGlzXG4gKiB3b3Jrcy5cbiAqL1xuY2xvbmUuY2xvbmVQcm90b3R5cGUgPSBmdW5jdGlvbiBjbG9uZVByb3RvdHlwZShwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgYyA9IGZ1bmN0aW9uICgpIHt9O1xuICBjLnByb3RvdHlwZSA9IHBhcmVudDtcbiAgcmV0dXJuIG5ldyBjKCk7XG59O1xuXG4vLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIF9fb2JqVG9TdHIobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuY2xvbmUuX19vYmpUb1N0ciA9IF9fb2JqVG9TdHI7XG5cbmZ1bmN0aW9uIF9faXNEYXRlKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5jbG9uZS5fX2lzRGF0ZSA9IF9faXNEYXRlO1xuXG5mdW5jdGlvbiBfX2lzQXJyYXkobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5jbG9uZS5fX2lzQXJyYXkgPSBfX2lzQXJyYXk7XG5cbmZ1bmN0aW9uIF9faXNSZWdFeHAobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuY2xvbmUuX19pc1JlZ0V4cCA9IF9faXNSZWdFeHA7XG5cbmZ1bmN0aW9uIF9fZ2V0UmVnRXhwRmxhZ3MocmUpIHtcbiAgdmFyIGZsYWdzID0gJyc7XG4gIGlmIChyZS5nbG9iYWwpIGZsYWdzICs9ICdnJztcbiAgaWYgKHJlLmlnbm9yZUNhc2UpIGZsYWdzICs9ICdpJztcbiAgaWYgKHJlLm11bHRpbGluZSkgZmxhZ3MgKz0gJ20nO1xuICByZXR1cm4gZmxhZ3M7XG59XG5jbG9uZS5fX2dldFJlZ0V4cEZsYWdzID0gX19nZXRSZWdFeHBGbGFncztcblxucmV0dXJuIGNsb25lO1xufSkoKTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG59XG4iLAogICAgIi8qXG4gKiBub2RlLWNhY2hlIDUuMS4yICggMjAyMC0wNy0wMSApXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1jYWNoZS9ub2RlLWNhY2hlXG4gKlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1jYWNoZS9ub2RlLWNhY2hlL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqXG4gKiBNYWludGFpbmVkIGJ5ICAoICApXG4qL1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgRXZlbnRFbWl0dGVyLCBOb2RlQ2FjaGUsIGNsb25lLFxuICAgIHNwbGljZSA9IFtdLnNwbGljZSxcbiAgICBib3VuZE1ldGhvZENoZWNrID0gZnVuY3Rpb24oaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBFcnJvcignQm91bmQgaW5zdGFuY2UgbWV0aG9kIGFjY2Vzc2VkIGJlZm9yZSBiaW5kaW5nJyk7IH0gfSxcbiAgICBpbmRleE9mID0gW10uaW5kZXhPZjtcblxuICBjbG9uZSA9IHJlcXVpcmUoXCJjbG9uZVwiKTtcblxuICBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5cbiAgLy8gZ2VuZXJhdGUgc3VwZXJjbGFzc1xuICBtb2R1bGUuZXhwb3J0cyA9IE5vZGVDYWNoZSA9IChmdW5jdGlvbigpIHtcbiAgICBjbGFzcyBOb2RlQ2FjaGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vICMjIGdldFxuXG4gICAgICAgIC8vIGdldCBhIGNhY2hlZCBrZXkgYW5kIGNoYW5nZSB0aGUgc3RhdHNcblxuICAgICAgICAvLyAqKlBhcmFtZXRlcnM6KipcblxuICAgICAgICAvLyAqIGBrZXlgICggU3RyaW5nIHwgTnVtYmVyICk6IGNhY2hlIGtleVxuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vXHRteUNhY2hlLmdldCBcIm15S2V5XCIsICggZXJyLCB2YWwgKVxuXG4gICAgICAgIHRoaXMuZ2V0ID0gdGhpcy5nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gIyMgbWdldFxuXG4gICAgICAgIC8vIGdldCBtdWx0aXBsZSBjYWNoZWQga2V5cyBhdCBvbmNlIGFuZCBjaGFuZ2UgdGhlIHN0YXRzXG5cbiAgICAgICAgLy8gKipQYXJhbWV0ZXJzOioqXG5cbiAgICAgICAgLy8gKiBga2V5c2AgKCBTdHJpbmd8TnVtYmVyW10gKTogYW4gYXJyYXkgb2Yga2V5c1xuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vXHRteUNhY2hlLm1nZXQgWyBcImZvb1wiLCBcImJhclwiIF1cblxuICAgICAgICB0aGlzLm1nZXQgPSB0aGlzLm1nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gIyMgc2V0XG5cbiAgICAgICAgLy8gc2V0IGEgY2FjaGVkIGtleSBhbmQgY2hhbmdlIHRoZSBzdGF0c1xuXG4gICAgICAgIC8vICoqUGFyYW1ldGVyczoqKlxuXG4gICAgICAgIC8vICogYGtleWAgKCBTdHJpbmcgfCBOdW1iZXIgKTogY2FjaGUga2V5XG4gICAgICAgIC8vICogYHZhbHVlYCAoIEFueSApOiBBIGVsZW1lbnQgdG8gY2FjaGUuIElmIHRoZSBvcHRpb24gYG9wdGlvbi5mb3JjZVN0cmluZ2AgaXMgYHRydWVgIHRoZSBtb2R1bGUgdHJ5cyB0byB0cmFuc2xhdGUgaXQgdG8gYSBzZXJpYWxpemVkIEpTT05cbiAgICAgICAgLy8gKiBgWyB0dGwgXWAgKCBOdW1iZXIgfCBTdHJpbmcgKTogKCBvcHRpb25hbCApIFRoZSB0aW1lIHRvIGxpdmUgaW4gc2Vjb25kcy5cblxuICAgICAgICAvLyAqKkV4YW1wbGU6KipcblxuICAgICAgICAvL1x0bXlDYWNoZS5zZXQgXCJteUtleVwiLCBcIm15X1N0cmluZyBWYWx1ZVwiXG5cbiAgICAgICAgLy9cdG15Q2FjaGUuc2V0IFwibXlLZXlcIiwgXCJteV9TdHJpbmcgVmFsdWVcIiwgMTBcblxuICAgICAgICB0aGlzLnNldCA9IHRoaXMuc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIFxuICAgICAgICAvLyAjIyBtc2V0XG5cbiAgICAgICAgLy8gc2V0IG11bHRpcGxlIGtleXMgYXQgb25jZVxuXG4gICAgICAgIC8vICoqUGFyYW1ldGVyczoqKlxuXG4gICAgICAgIC8vICogYGtleVZhbHVlU2V0YCAoIE9iamVjdFtdICk6IGFuIGFycmF5IG9mIG9iamVjdCB3aGljaCBpbmNsdWRlcyBrZXksdmFsdWUgYW5kIHR0bFxuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vXHRteUNhY2hlLm1zZXQoXG4gICAgICAgIC8vXHRcdFtcbiAgICAgICAgLy9cdFx0XHR7XG4gICAgICAgIC8vXHRcdFx0XHRrZXk6IFwibXlLZXlcIixcbiAgICAgICAgLy9cdFx0XHRcdHZhbDogXCJteVZhbHVlXCIsXG4gICAgICAgIC8vXHRcdFx0XHR0dGw6IFt0dGwgaW4gc2Vjb25kc11cbiAgICAgICAgLy9cdFx0XHR9XG4gICAgICAgIC8vXHRcdF0pXG5cbiAgICAgICAgdGhpcy5tc2V0ID0gdGhpcy5tc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIGRlbFxuXG4gICAgICAgIC8vIHJlbW92ZSBrZXlzXG5cbiAgICAgICAgLy8gKipQYXJhbWV0ZXJzOioqXG5cbiAgICAgICAgLy8gKiBga2V5c2AgKCBTdHJpbmcgfMKgTnVtYmVyIHwgU3RyaW5nfE51bWJlcltdICk6IGNhY2hlIGtleSB0byBkZWxldGUgb3IgYSBhcnJheSBvZiBjYWNoZSBrZXlzXG5cbiAgICAgICAgLy8gKipSZXR1cm4qKlxuXG4gICAgICAgIC8vICggTnVtYmVyICk6IE51bWJlciBvZiBkZWxldGVkIGtleXNcblxuICAgICAgICAvLyAqKkV4YW1wbGU6KipcblxuICAgICAgICAvL1x0bXlDYWNoZS5kZWwoIFwibXlLZXlcIiApXG5cbiAgICAgICAgdGhpcy5kZWwgPSB0aGlzLmRlbC5iaW5kKHRoaXMpO1xuICAgICAgICAvLyAjIyB0YWtlXG5cbiAgICAgICAgLy8gZ2V0IHRoZSBjYWNoZWQgdmFsdWUgYW5kIHJlbW92ZSB0aGUga2V5IGZyb20gdGhlIGNhY2hlLlxuICAgICAgICAvLyBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGdldChrZXkpYCArIGBkZWwoa2V5KWAuXG4gICAgICAgIC8vIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGBzaW5nbGUgdXNlYCBtZWNoYW5pc20gc3VjaCBhcyBPVFAsIHdoZXJlIG9uY2UgYSB2YWx1ZSBpcyByZWFkIGl0IHdpbGwgYmVjb21lIG9ic29sZXRlLlxuXG4gICAgICAgIC8vICoqUGFyYW1ldGVyczoqKlxuXG4gICAgICAgIC8vICogYGtleWAgKCBTdHJpbmcgfCBOdW1iZXIgKTogY2FjaGUga2V5XG5cbiAgICAgICAgLy8gKipFeGFtcGxlOioqXG5cbiAgICAgICAgLy9cdG15Q2FjaGUudGFrZSBcIm15S2V5XCIsICggZXJyLCB2YWwgKVxuXG4gICAgICAgIHRoaXMudGFrZSA9IHRoaXMudGFrZS5iaW5kKHRoaXMpO1xuICAgICAgICAvLyAjIyB0dGxcblxuICAgICAgICAvLyByZXNldCBvciByZWRlZmluZSB0aGUgdHRsIG9mIGEga2V5LiBgdHRsYCA9IDAgbWVhbnMgaW5maW5pdGUgbGlmZXRpbWUuXG4gICAgICAgIC8vIElmIGB0dGxgIGlzIG5vdCBwYXNzZWQgdGhlIGRlZmF1bHQgdHRsIGlzIHVzZWQuXG4gICAgICAgIC8vIElmIGB0dGxgIDwgMCB0aGUga2V5IHdpbGwgYmUgZGVsZXRlZC5cblxuICAgICAgICAvLyAqKlBhcmFtZXRlcnM6KipcblxuICAgICAgICAvLyAqIGBrZXlgICggU3RyaW5nIHwgTnVtYmVyICk6IGNhY2hlIGtleSB0byByZXNldCB0aGUgdHRsIHZhbHVlXG4gICAgICAgIC8vICogYHR0bGAgKCBOdW1iZXIgKTogKCBvcHRpb25hbCAtPiBvcHRpb25zLnN0ZFRUTCB8fCAwICkgVGhlIHRpbWUgdG8gbGl2ZSBpbiBzZWNvbmRzXG5cbiAgICAgICAgLy8gKipSZXR1cm4qKlxuXG4gICAgICAgIC8vICggQm9vbGVuICk6IGtleSBmb3VuZCBhbmQgdHRsIHNldFxuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vXHRteUNhY2hlLnR0bCggXCJteUtleVwiICkgLy8gd2lsbCBzZXQgdHRsIHRvIGRlZmF1bHQgdHRsXG5cbiAgICAgICAgLy9cdG15Q2FjaGUudHRsKCBcIm15S2V5XCIsIDEwMDAgKVxuXG4gICAgICAgIHRoaXMudHRsID0gdGhpcy50dGwuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gIyMgZ2V0VHRsXG5cbiAgICAgICAgLy8gcmVjZWl2ZSB0aGUgdHRsIG9mIGEga2V5LlxuXG4gICAgICAgIC8vICoqUGFyYW1ldGVyczoqKlxuXG4gICAgICAgIC8vICogYGtleWAgKCBTdHJpbmcgfCBOdW1iZXIgKTogY2FjaGUga2V5IHRvIGNoZWNrIHRoZSB0dGwgdmFsdWVcblxuICAgICAgICAvLyAqKlJldHVybioqXG5cbiAgICAgICAgLy8gKCBOdW1iZXJ8dW5kZWZpbmVkICk6IFRoZSB0aW1lc3RhbXAgaW4gbXMgd2hlbiB0aGUga2V5IHdpbGwgZXhwaXJlLCAwIGlmIGl0IHdpbGwgbmV2ZXIgZXhwaXJlIG9yIHVuZGVmaW5lZCBpZiBpdCBub3QgZXhpc3RzXG5cbiAgICAgICAgLy8gKipFeGFtcGxlOioqXG5cbiAgICAgICAgLy9cdG15Q2FjaGUuZ2V0VHRsKCBcIm15S2V5XCIgKVxuXG4gICAgICAgIHRoaXMuZ2V0VHRsID0gdGhpcy5nZXRUdGwuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gIyMga2V5c1xuXG4gICAgICAgIC8vIGxpc3QgYWxsIGtleXMgd2l0aGluIHRoaXMgY2FjaGVcblxuICAgICAgICAvLyAqKlJldHVybioqXG5cbiAgICAgICAgLy8gKCBBcnJheSApOiBBbiBhcnJheSBvZiBhbGwga2V5c1xuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vICAgICBfa2V5cyA9IG15Q2FjaGUua2V5cygpXG5cbiAgICAgICAgLy8gICAgICMgWyBcImZvb1wiLCBcImJhclwiLCBcImZpenpcIiwgXCJidXp6XCIsIFwiYW5vdGhlcktleXNcIiBdXG5cbiAgICAgICAgdGhpcy5rZXlzID0gdGhpcy5rZXlzLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIGhhc1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEga2V5IGlzIGNhY2hlZFxuXG4gICAgICAgIC8vICoqUGFyYW1ldGVyczoqKlxuXG4gICAgICAgIC8vICogYGtleWAgKCBTdHJpbmcgfCBOdW1iZXIgKTogY2FjaGUga2V5IHRvIGNoZWNrIHRoZSB0dGwgdmFsdWVcblxuICAgICAgICAvLyAqKlJldHVybioqXG5cbiAgICAgICAgLy8gKCBCb29sZWFuICk6IEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUga2V5IGlzIGNhY2hlZFxuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vICAgICBfZXhpc3RzID0gbXlDYWNoZS5oYXMoJ215S2V5JylcblxuICAgICAgICAvLyAgICAgIyB0cnVlXG5cbiAgICAgICAgdGhpcy5oYXMgPSB0aGlzLmhhcy5iaW5kKHRoaXMpO1xuICAgICAgICAvLyAjIyBnZXRTdGF0c1xuXG4gICAgICAgIC8vIGdldCB0aGUgc3RhdHNcblxuICAgICAgICAvLyAqKlBhcmFtZXRlcnM6KipcblxuICAgICAgICAvLyAtXG5cbiAgICAgICAgLy8gKipSZXR1cm4qKlxuXG4gICAgICAgIC8vICggT2JqZWN0ICk6IFN0YXRzIGRhdGFcblxuICAgICAgICAvLyAqKkV4YW1wbGU6KipcblxuICAgICAgICAvLyAgICAgbXlDYWNoZS5nZXRTdGF0cygpXG4gICAgICAgIC8vICAgICAjIHtcbiAgICAgICAgLy8gICAgICMgaGl0czogMCxcbiAgICAgICAgLy8gICAgICMgbWlzc2VzOiAwLFxuICAgICAgICAvLyAgICAgIyBrZXlzOiAwLFxuICAgICAgICAvLyAgICAgIyBrc2l6ZTogMCxcbiAgICAgICAgLy8gICAgICMgdnNpemU6IDBcbiAgICAgICAgLy8gICAgICMgfVxuXG4gICAgICAgIHRoaXMuZ2V0U3RhdHMgPSB0aGlzLmdldFN0YXRzLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIGZsdXNoQWxsXG5cbiAgICAgICAgLy8gZmx1c2ggdGhlIHdob2xlIGRhdGEgYW5kIHJlc2V0IHRoZSBzdGF0c1xuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vICAgICBteUNhY2hlLmZsdXNoQWxsKClcblxuICAgICAgICAvLyAgICAgbXlDYWNoZS5nZXRTdGF0cygpXG4gICAgICAgIC8vICAgICAjIHtcbiAgICAgICAgLy8gICAgICMgaGl0czogMCxcbiAgICAgICAgLy8gICAgICMgbWlzc2VzOiAwLFxuICAgICAgICAvLyAgICAgIyBrZXlzOiAwLFxuICAgICAgICAvLyAgICAgIyBrc2l6ZTogMCxcbiAgICAgICAgLy8gICAgICMgdnNpemU6IDBcbiAgICAgICAgLy8gICAgICMgfVxuXG4gICAgICAgIHRoaXMuZmx1c2hBbGwgPSB0aGlzLmZsdXNoQWxsLmJpbmQodGhpcyk7XG4gICAgICAgIFxuICAgICAgICAvLyAjIyBmbHVzaFN0YXRzXG5cbiAgICAgICAgLy8gZmx1c2ggdGhlIHN0YXRzIGFuZCByZXNldCBhbGwgY291bnRlcnMgdG8gMFxuXG4gICAgICAgIC8vICoqRXhhbXBsZToqKlxuXG4gICAgICAgIC8vICAgICBteUNhY2hlLmZsdXNoU3RhdHMoKVxuXG4gICAgICAgIC8vICAgICBteUNhY2hlLmdldFN0YXRzKClcbiAgICAgICAgLy8gICAgICMge1xuICAgICAgICAvLyAgICAgIyBoaXRzOiAwLFxuICAgICAgICAvLyAgICAgIyBtaXNzZXM6IDAsXG4gICAgICAgIC8vICAgICAjIGtleXM6IDAsXG4gICAgICAgIC8vICAgICAjIGtzaXplOiAwLFxuICAgICAgICAvLyAgICAgIyB2c2l6ZTogMFxuICAgICAgICAvLyAgICAgIyB9XG5cbiAgICAgICAgdGhpcy5mbHVzaFN0YXRzID0gdGhpcy5mbHVzaFN0YXRzLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIGNsb3NlXG5cbiAgICAgICAgLy8gVGhpcyB3aWxsIGNsZWFyIHRoZSBpbnRlcnZhbCB0aW1lb3V0IHdoaWNoIGlzIHNldCBvbiBjaGVja3BlcmlvZCBvcHRpb24uXG5cbiAgICAgICAgLy8gKipFeGFtcGxlOioqXG5cbiAgICAgICAgLy8gICAgIG15Q2FjaGUuY2xvc2UoKVxuXG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIF9jaGVja0RhdGFcblxuICAgICAgICAvLyBpbnRlcm5hbCBob3VzZWtlZXBpbmcgbWV0aG9kLlxuICAgICAgICAvLyBDaGVjayBhbGwgdGhlIGNhY2hlZCBkYXRhIGFuZCBkZWxldGUgdGhlIGludmFsaWQgdmFsdWVzXG4gICAgICAgIHRoaXMuX2NoZWNrRGF0YSA9IHRoaXMuX2NoZWNrRGF0YS5iaW5kKHRoaXMpO1xuICAgICAgICAvLyAjIyBfY2hlY2tcblxuICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdGhlIGNoZWNrIHRoZSB2YWx1ZS4gSWYgaXQncyBub3QgdmFsaWQgYW55IG1vcmUgZGVsZXRlIGl0XG4gICAgICAgIHRoaXMuX2NoZWNrID0gdGhpcy5fY2hlY2suYmluZCh0aGlzKTtcbiAgICAgICAgLy8gIyMgX2lzSW52YWxpZEtleVxuXG4gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdHlwZSBvZiBhIGtleSBpcyBlaXRoZXIgYG51bWJlcmAgb3IgYHN0cmluZ2BcbiAgICAgICAgdGhpcy5faXNJbnZhbGlkS2V5ID0gdGhpcy5faXNJbnZhbGlkS2V5LmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIF93cmFwXG5cbiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHdyYXAgYSB2YWx1ZSBpbiBhbiBvYmplY3Qgd2l0aCBzb21lIG1ldGFkYXRhXG4gICAgICAgIHRoaXMuX3dyYXAgPSB0aGlzLl93cmFwLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIF9nZXRWYWxMZW5ndGhcblxuICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBsZW5ndGhcbiAgICAgICAgdGhpcy5fZ2V0VmFsTGVuZ3RoID0gdGhpcy5fZ2V0VmFsTGVuZ3RoLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIF9lcnJvclxuXG4gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLl9lcnJvciA9IHRoaXMuX2Vycm9yLmJpbmQodGhpcyk7XG4gICAgICAgIC8vICMjIF9pbml0RXJyb3JzXG5cbiAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIGdlbmVyYXRlIGVycm9yIG1lc3NhZ2UgdGVtcGxhdGVzXG4gICAgICAgIHRoaXMuX2luaXRFcnJvcnMgPSB0aGlzLl9pbml0RXJyb3JzLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuX2luaXRFcnJvcnMoKTtcbiAgICAgICAgLy8gY29udGFpbmVyIGZvciBjYWNoZWQgZGF0YVxuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgLy8gbW9kdWxlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgLy8gY29udmVydCBhbGwgZWxlbWVudHMgdG8gc3RyaW5nXG4gICAgICAgICAgZm9yY2VTdHJpbmc6IGZhbHNlLFxuICAgICAgICAgIC8vIHVzZWQgc3RhbmRhcmQgc2l6ZSBmb3IgY2FsY3VsYXRpbmcgdmFsdWUgc2l6ZVxuICAgICAgICAgIG9iamVjdFZhbHVlU2l6ZTogODAsXG4gICAgICAgICAgcHJvbWlzZVZhbHVlU2l6ZTogODAsXG4gICAgICAgICAgYXJyYXlWYWx1ZVNpemU6IDQwLFxuICAgICAgICAgIC8vIHN0YW5kYXJkIHRpbWUgdG8gbGl2ZSBpbiBzZWNvbmRzLiAwID0gaW5maW5pdHk7XG4gICAgICAgICAgc3RkVFRMOiAwLFxuICAgICAgICAgIC8vIHRpbWUgaW4gc2Vjb25kcyB0byBjaGVjayBhbGwgZGF0YSBhbmQgZGVsZXRlIGV4cGlyZWQga2V5c1xuICAgICAgICAgIGNoZWNrcGVyaW9kOiA2MDAsXG4gICAgICAgICAgLy8gZW4vZGlzYWJsZSBjbG9uaW5nIG9mIHZhcmlhYmxlcy4gSWYgYHRydWVgIHlvdSdsbCBnZXQgYSBjb3B5IG9mIHRoZSBjYWNoZWQgdmFyaWFibGUuIElmIGBmYWxzZWAgeW91J2xsIHNhdmUgYW5kIGdldCBqdXN0IHRoZSByZWZlcmVuY2VcbiAgICAgICAgICB1c2VDbG9uZXM6IHRydWUsXG4gICAgICAgICAgLy8gd2hldGhlciB2YWx1ZXMgc2hvdWxkIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSBhdCBleHBpcmF0aW9uXG4gICAgICAgICAgZGVsZXRlT25FeHBpcmU6IHRydWUsXG4gICAgICAgICAgLy8gZW5hYmxlIGxlZ2FjeSBjYWxsYmFja3NcbiAgICAgICAgICBlbmFibGVMZWdhY3lDYWxsYmFja3M6IGZhbHNlLFxuICAgICAgICAgIC8vIG1heCBhbW91bnQgb2Yga2V5cyB0aGF0IGFyZSBiZWluZyBzdG9yZWRcbiAgICAgICAgICBtYXhLZXlzOiAtMVxuICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAvLyBnZW5lcmF0ZSBmdW5jdGlvbnMgd2l0aCBjYWxsYmFja3MgKGxlZ2FjeSlcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMZWdhY3lDYWxsYmFja3MpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HISBub2RlLWNhY2hlIGxlZ2FjeSBjYWxsYmFjayBzdXBwb3J0IHdpbGwgZHJvcCBpbiB2Ni54XCIpO1xuICAgICAgICAgIFtcImdldFwiLCBcIm1nZXRcIiwgXCJzZXRcIiwgXCJkZWxcIiwgXCJ0dGxcIiwgXCJnZXRUdGxcIiwgXCJrZXlzXCIsIFwiaGFzXCJdLmZvckVhY2goKG1ldGhvZEtleSkgPT4ge1xuICAgICAgICAgICAgdmFyIG9sZE1ldGhvZDtcbiAgICAgICAgICAgIC8vIHJlZmVyZW5jZSByZWFsIGZ1bmN0aW9uXG4gICAgICAgICAgICBvbGRNZXRob2QgPSB0aGlzW21ldGhvZEtleV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZEtleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgICAgICAgIHZhciBjYiwgZXJyLCByZWYsIHJlcztcbiAgICAgICAgICAgICAgcmVmID0gYXJncywgWy4uLmFyZ3NdID0gcmVmLCBbY2JdID0gc3BsaWNlLmNhbGwoYXJncywgLTEpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gYSBjYWxsYmFjayBpZiBjYiBpcyBkZWZpbmVkIGFuZCBhIGZ1bmN0aW9uXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXMgPSBvbGRNZXRob2QoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICBjYihudWxsLCByZXMpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgICAgICAgZXJyID0gZXJyb3IxO1xuICAgICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZE1ldGhvZCguLi5hcmdzLCBjYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RhdGlzdGljcyBjb250YWluZXJcbiAgICAgICAgdGhpcy5zdGF0cyA9IHtcbiAgICAgICAgICBoaXRzOiAwLFxuICAgICAgICAgIG1pc3NlczogMCxcbiAgICAgICAgICBrZXlzOiAwLFxuICAgICAgICAgIGtzaXplOiAwLFxuICAgICAgICAgIHZzaXplOiAwXG4gICAgICAgIH07XG4gICAgICAgIC8vIHByZSBhbGxvY2F0ZSB2YWxpZCBrZXl0eXBlcyBhcnJheVxuICAgICAgICB0aGlzLnZhbGlkS2V5VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIl07XG4gICAgICAgIC8vIGluaXRhbGl6ZSBjaGVja2luZyBwZXJpb2RcbiAgICAgICAgdGhpcy5fY2hlY2tEYXRhKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0KGtleSkge1xuICAgICAgICB2YXIgX3JldCwgZXJyO1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIC8vIGhhbmRsZSBpbnZhbGlkIGtleSB0eXBlc1xuICAgICAgICBpZiAoKGVyciA9IHRoaXMuX2lzSW52YWxpZEtleShrZXkpKSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBkYXRhIGFuZCBpbmNyZW1ldCBzdGF0c1xuICAgICAgICBpZiAoKHRoaXMuZGF0YVtrZXldICE9IG51bGwpICYmIHRoaXMuX2NoZWNrKGtleSwgdGhpcy5kYXRhW2tleV0pKSB7XG4gICAgICAgICAgdGhpcy5zdGF0cy5oaXRzKys7XG4gICAgICAgICAgX3JldCA9IHRoaXMuX3Vud3JhcCh0aGlzLmRhdGFba2V5XSk7XG4gICAgICAgICAgLy8gcmV0dXJuIGRhdGFcbiAgICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBub3QgZm91bmQgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIHRoaXMuc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZ2V0KGtleXMpIHtcbiAgICAgICAgdmFyIF9lcnIsIGVyciwgaSwga2V5LCBsZW4sIG9SZXQ7XG4gICAgICAgIGJvdW5kTWV0aG9kQ2hlY2sodGhpcywgTm9kZUNhY2hlKTtcbiAgICAgICAgLy8gY29udmVydCBhIHN0cmluZyB0byBhbiBhcnJheSBvZiBvbmUga2V5XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgIF9lcnIgPSB0aGlzLl9lcnJvcihcIkVLRVlTVFlQRVwiKTtcbiAgICAgICAgICB0aHJvdyBfZXJyO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlZmluZSByZXR1cm5cbiAgICAgICAgb1JldCA9IHt9O1xuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCBrZXkgdHlwZXNcbiAgICAgICAgICBpZiAoKGVyciA9IHRoaXMuX2lzSW52YWxpZEtleShrZXkpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGdldCBkYXRhIGFuZCBpbmNyZW1lbnQgc3RhdHNcbiAgICAgICAgICBpZiAoKHRoaXMuZGF0YVtrZXldICE9IG51bGwpICYmIHRoaXMuX2NoZWNrKGtleSwgdGhpcy5kYXRhW2tleV0pKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRzLmhpdHMrKztcbiAgICAgICAgICAgIG9SZXRba2V5XSA9IHRoaXMuX3Vud3JhcCh0aGlzLmRhdGFba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIG5vdCBmb3VuZCByZXR1cm4gYSBlcnJvclxuICAgICAgICAgICAgdGhpcy5zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIGFsbCBmb3VuZCBrZXlzXG4gICAgICAgIHJldHVybiBvUmV0O1xuICAgICAgfVxuXG4gICAgICBzZXQoa2V5LCB2YWx1ZSwgdHRsKSB7XG4gICAgICAgIHZhciBfZXJyLCBlcnIsIGV4aXN0ZW50O1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIC8vIGNoZWNrIGlmIGNhY2hlIGlzIG92ZXJmbG93aW5nXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4S2V5cyA+IC0xICYmIHRoaXMuc3RhdHMua2V5cyA+PSB0aGlzLm9wdGlvbnMubWF4S2V5cykge1xuICAgICAgICAgIF9lcnIgPSB0aGlzLl9lcnJvcihcIkVDQUNIRUZVTExcIik7XG4gICAgICAgICAgdGhyb3cgX2VycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBmb3JjZSB0aGUgZGF0YSB0byBzdHJpbmdcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JjZVN0cmluZyAmJiAhdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgdHRsIGlmIG5vdCBwYXNzZWRcbiAgICAgICAgaWYgKHR0bCA9PSBudWxsKSB7XG4gICAgICAgICAgdHRsID0gdGhpcy5vcHRpb25zLnN0ZFRUTDtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCBrZXkgdHlwZXNcbiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9pc0ludmFsaWRLZXkoa2V5KSkgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlcm5hbCBoZWxwZXIgdmFyaWFibGVzXG4gICAgICAgIGV4aXN0ZW50ID0gZmFsc2U7XG4gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBkYXRhIGZyb20gc3RhdHNcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldKSB7XG4gICAgICAgICAgZXhpc3RlbnQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RhdHMudnNpemUgLT0gdGhpcy5fZ2V0VmFsTGVuZ3RoKHRoaXMuX3Vud3JhcCh0aGlzLmRhdGFba2V5XSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICAgIHRoaXMuZGF0YVtrZXldID0gdGhpcy5fd3JhcCh2YWx1ZSwgdHRsKTtcbiAgICAgICAgdGhpcy5zdGF0cy52c2l6ZSArPSB0aGlzLl9nZXRWYWxMZW5ndGgodmFsdWUpO1xuICAgICAgICAvLyBvbmx5IGFkZCB0aGUga2V5cyBhbmQga2V5LXNpemUgaWYgdGhlIGtleSBpcyBuZXdcbiAgICAgICAgaWYgKCFleGlzdGVudCkge1xuICAgICAgICAgIHRoaXMuc3RhdHMua3NpemUgKz0gdGhpcy5fZ2V0S2V5TGVuZ3RoKGtleSk7XG4gICAgICAgICAgdGhpcy5zdGF0cy5rZXlzKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KFwic2V0XCIsIGtleSwgdmFsdWUpO1xuICAgICAgICAvLyByZXR1cm4gdHJ1ZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbXNldChrZXlWYWx1ZVNldCkge1xuICAgICAgICB2YXIgX2VyciwgZXJyLCBpLCBqLCBrZXksIGtleVZhbHVlUGFpciwgbGVuLCBsZW4xLCB0dGwsIHZhbDtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICAvLyBjaGVjayBpZiBjYWNoZSBpcyBvdmVyZmxvd2luZ1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heEtleXMgPiAtMSAmJiB0aGlzLnN0YXRzLmtleXMgKyBrZXlWYWx1ZVNldC5sZW5ndGggPj0gdGhpcy5vcHRpb25zLm1heEtleXMpIHtcbiAgICAgICAgICBfZXJyID0gdGhpcy5fZXJyb3IoXCJFQ0FDSEVGVUxMXCIpO1xuICAgICAgICAgIHRocm93IF9lcnI7XG4gICAgICAgIH1cblxuLy8gbG9vcCBvdmVyIGtleVZhbHVlU2V0IHRvIHZhbGlkYXRlIGtleSBhbmQgdHRsXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGtleVZhbHVlU2V0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5VmFsdWVQYWlyID0ga2V5VmFsdWVTZXRbaV07XG4gICAgICAgICAgKHtrZXksIHZhbCwgdHRsfSA9IGtleVZhbHVlUGFpcik7XG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgdHRsIGFuZCBpdCdzIGEgbnVtYmVyXG4gICAgICAgICAgaWYgKHR0bCAmJiB0eXBlb2YgdHRsICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBfZXJyID0gdGhpcy5fZXJyb3IoXCJFVFRMVFlQRVwiKTtcbiAgICAgICAgICAgIHRocm93IF9lcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGhhbmRsZSBpbnZhbGlkIGtleSB0eXBlc1xuICAgICAgICAgIGlmICgoZXJyID0gdGhpcy5faXNJbnZhbGlkS2V5KGtleSkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMSA9IGtleVZhbHVlU2V0Lmxlbmd0aDsgaiA8IGxlbjE7IGorKykge1xuICAgICAgICAgIGtleVZhbHVlUGFpciA9IGtleVZhbHVlU2V0W2pdO1xuICAgICAgICAgICh7a2V5LCB2YWwsIHR0bH0gPSBrZXlWYWx1ZVBhaXIpO1xuICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsLCB0dGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWwoa2V5cykge1xuICAgICAgICB2YXIgZGVsQ291bnQsIGVyciwgaSwga2V5LCBsZW4sIG9sZFZhbDtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICAvLyBjb252ZXJ0IGtleXMgdG8gYW4gYXJyYXkgb2YgaXRzZWxmXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgIGtleXMgPSBba2V5c107XG4gICAgICAgIH1cbiAgICAgICAgZGVsQ291bnQgPSAwO1xuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCBrZXkgdHlwZXNcbiAgICAgICAgICBpZiAoKGVyciA9IHRoaXMuX2lzSW52YWxpZEtleShrZXkpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG9ubHkgZGVsZXRlIGlmIGV4aXN0ZW50XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGNhbGMgdGhlIHN0YXRzXG4gICAgICAgICAgICB0aGlzLnN0YXRzLnZzaXplIC09IHRoaXMuX2dldFZhbExlbmd0aCh0aGlzLl91bndyYXAodGhpcy5kYXRhW2tleV0sIGZhbHNlKSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRzLmtzaXplIC09IHRoaXMuX2dldEtleUxlbmd0aChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zdGF0cy5rZXlzLS07XG4gICAgICAgICAgICBkZWxDb3VudCsrO1xuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB2YWx1ZVxuICAgICAgICAgICAgb2xkVmFsID0gdGhpcy5kYXRhW2tleV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVsXCIsIGtleSwgb2xkVmFsLnYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsQ291bnQ7XG4gICAgICB9XG5cbiAgICAgIHRha2Uoa2V5KSB7XG4gICAgICAgIHZhciBfcmV0O1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIF9yZXQgPSB0aGlzLmdldChrZXkpO1xuICAgICAgICBpZiAoKF9yZXQgIT0gbnVsbCkpIHtcbiAgICAgICAgICB0aGlzLmRlbChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmV0O1xuICAgICAgfVxuXG4gICAgICB0dGwoa2V5LCB0dGwpIHtcbiAgICAgICAgdmFyIGVycjtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICB0dGwgfHwgKHR0bCA9IHRoaXMub3B0aW9ucy5zdGRUVEwpO1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCBrZXkgdHlwZXNcbiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9pc0ludmFsaWRLZXkoa2V5KSkgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgZXhpc3RlbnQgZGF0YSBhbmQgdXBkYXRlIHRoZSB0dGwgdmFsdWVcbiAgICAgICAgaWYgKCh0aGlzLmRhdGFba2V5XSAhPSBudWxsKSAmJiB0aGlzLl9jaGVjayhrZXksIHRoaXMuZGF0YVtrZXldKSkge1xuICAgICAgICAgIC8vIGlmIHR0bCA8IDAgZGVsZXRlIHRoZSBrZXkuIG90aGVyd2lzZSByZXNldCB0aGUgdmFsdWVcbiAgICAgICAgICBpZiAodHRsID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdGhpcy5fd3JhcCh0aGlzLmRhdGFba2V5XS52LCB0dGwsIGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWwoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIGtleSBoYXMgbm90IGJlZW4gZm91bmRcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2V0VHRsKGtleSkge1xuICAgICAgICB2YXIgX3R0bCwgZXJyO1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCBrZXkgdHlwZXNcbiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9pc0ludmFsaWRLZXkoa2V5KSkgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgZXhpc3RhbnQgZGF0YSBhbmQgdXBkYXRlIHRoZSB0dGwgdmFsdWVcbiAgICAgICAgaWYgKCh0aGlzLmRhdGFba2V5XSAhPSBudWxsKSAmJiB0aGlzLl9jaGVjayhrZXksIHRoaXMuZGF0YVtrZXldKSkge1xuICAgICAgICAgIF90dGwgPSB0aGlzLmRhdGFba2V5XS50O1xuICAgICAgICAgIHJldHVybiBfdHRsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYga2V5IGhhcyBub3QgYmVlbiBmb3VuZFxuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAga2V5cygpIHtcbiAgICAgICAgdmFyIF9rZXlzO1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIF9rZXlzID0gT2JqZWN0LmtleXModGhpcy5kYXRhKTtcbiAgICAgICAgcmV0dXJuIF9rZXlzO1xuICAgICAgfVxuXG4gICAgICBoYXMoa2V5KSB7XG4gICAgICAgIHZhciBfZXhpc3RzO1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIF9leGlzdHMgPSAodGhpcy5kYXRhW2tleV0gIT0gbnVsbCkgJiYgdGhpcy5fY2hlY2soa2V5LCB0aGlzLmRhdGFba2V5XSk7XG4gICAgICAgIHJldHVybiBfZXhpc3RzO1xuICAgICAgfVxuXG4gICAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0cztcbiAgICAgIH1cblxuICAgICAgZmx1c2hBbGwoX3N0YXJ0UGVyaW9kID0gdHJ1ZSkge1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIC8vIHBhcmFtZXRlciBqdXN0IGZvciB0ZXN0aW5nXG5cbiAgICAgICAgLy8gc2V0IGRhdGEgZW1wdHlcbiAgICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgICAgIC8vIHJlc2V0IHN0YXRzXG4gICAgICAgIHRoaXMuc3RhdHMgPSB7XG4gICAgICAgICAgaGl0czogMCxcbiAgICAgICAgICBtaXNzZXM6IDAsXG4gICAgICAgICAga2V5czogMCxcbiAgICAgICAgICBrc2l6ZTogMCxcbiAgICAgICAgICB2c2l6ZTogMFxuICAgICAgICB9O1xuICAgICAgICAvLyByZXNldCBjaGVjayBwZXJpb2RcbiAgICAgICAgdGhpcy5fa2lsbENoZWNrUGVyaW9kKCk7XG4gICAgICAgIHRoaXMuX2NoZWNrRGF0YShfc3RhcnRQZXJpb2QpO1xuICAgICAgICB0aGlzLmVtaXQoXCJmbHVzaFwiKTtcbiAgICAgIH1cblxuICAgICAgZmx1c2hTdGF0cygpIHtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICAvLyByZXNldCBzdGF0c1xuICAgICAgICB0aGlzLnN0YXRzID0ge1xuICAgICAgICAgIGhpdHM6IDAsXG4gICAgICAgICAgbWlzc2VzOiAwLFxuICAgICAgICAgIGtleXM6IDAsXG4gICAgICAgICAga3NpemU6IDAsXG4gICAgICAgICAgdnNpemU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZmx1c2hfc3RhdHNcIik7XG4gICAgICB9XG5cbiAgICAgIGNsb3NlKCkge1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIHRoaXMuX2tpbGxDaGVja1BlcmlvZCgpO1xuICAgICAgfVxuXG4gICAgICBfY2hlY2tEYXRhKHN0YXJ0UGVyaW9kID0gdHJ1ZSkge1xuICAgICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgICBib3VuZE1ldGhvZENoZWNrKHRoaXMsIE5vZGVDYWNoZSk7XG4gICAgICAgIHJlZiA9IHRoaXMuZGF0YTtcbiAgICAgICAgLy8gcnVuIHRoZSBob3VzZWtlZXBpbmcgbWV0aG9kXG4gICAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICAgIHZhbHVlID0gcmVmW2tleV07XG4gICAgICAgICAgdGhpcy5fY2hlY2soa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0UGVyaW9kICYmIHRoaXMub3B0aW9ucy5jaGVja3BlcmlvZCA+IDApIHtcbiAgICAgICAgICB0aGlzLmNoZWNrVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5fY2hlY2tEYXRhLCB0aGlzLm9wdGlvbnMuY2hlY2twZXJpb2QgKiAxMDAwLCBzdGFydFBlcmlvZCk7XG4gICAgICAgICAgaWYgKCh0aGlzLmNoZWNrVGltZW91dCAhPSBudWxsKSAmJiAodGhpcy5jaGVja1RpbWVvdXQudW5yZWYgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUaW1lb3V0LnVucmVmKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vICMjIF9raWxsQ2hlY2tQZXJpb2RcblxuICAgICAgLy8gc3RvcCB0aGUgY2hlY2tkYXRhIHBlcmlvZC4gT25seSBuZWVkZWQgdG8gYWJvcnQgdGhlIHNjcmlwdCBpbiB0ZXN0aW5nIG1vZGUuXG4gICAgICBfa2lsbENoZWNrUGVyaW9kKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja1RpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQodGhpcy5jaGVja1RpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9jaGVjayhrZXksIGRhdGEpIHtcbiAgICAgICAgdmFyIF9yZXR2YWw7XG4gICAgICAgIGJvdW5kTWV0aG9kQ2hlY2sodGhpcywgTm9kZUNhY2hlKTtcbiAgICAgICAgX3JldHZhbCA9IHRydWU7XG4gICAgICAgIC8vIGRhdGEgaXMgaW52YWxpZCBpZiB0aGUgdHRsIGlzIHRvbyBvbGQgYW5kIGlzIG5vdCAwXG4gICAgICAgIC8vIGNvbnNvbGUubG9nIGRhdGEudCA8IERhdGUubm93KCksIGRhdGEudCwgRGF0ZS5ub3coKVxuICAgICAgICBpZiAoZGF0YS50ICE9PSAwICYmIGRhdGEudCA8IERhdGUubm93KCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlbGV0ZU9uRXhwaXJlKSB7XG4gICAgICAgICAgICBfcmV0dmFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRlbChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoXCJleHBpcmVkXCIsIGtleSwgdGhpcy5fdW53cmFwKGRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHZhbDtcbiAgICAgIH1cblxuICAgICAgX2lzSW52YWxpZEtleShrZXkpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICBpZiAocmVmID0gdHlwZW9mIGtleSwgaW5kZXhPZi5jYWxsKHRoaXMudmFsaWRLZXlUeXBlcywgcmVmKSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoXCJFS0VZVFlQRVwiLCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlb2Yga2V5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3dyYXAodmFsdWUsIHR0bCwgYXNDbG9uZSA9IHRydWUpIHtcbiAgICAgICAgdmFyIGxpdmV0aW1lLCBub3csIG9SZXR1cm4sIHR0bE11bHRpcGxpY2F0b3I7XG4gICAgICAgIGJvdW5kTWV0aG9kQ2hlY2sodGhpcywgTm9kZUNhY2hlKTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlQ2xvbmVzKSB7XG4gICAgICAgICAgYXNDbG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlZmluZSB0aGUgdGltZSB0byBsaXZlXG4gICAgICAgIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGxpdmV0aW1lID0gMDtcbiAgICAgICAgdHRsTXVsdGlwbGljYXRvciA9IDEwMDA7XG4gICAgICAgIC8vIHVzZSBnaXZlbiB0dGxcbiAgICAgICAgaWYgKHR0bCA9PT0gMCkge1xuICAgICAgICAgIGxpdmV0aW1lID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0dGwpIHtcbiAgICAgICAgICBsaXZldGltZSA9IG5vdyArICh0dGwgKiB0dGxNdWx0aXBsaWNhdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1c2Ugc3RhbmRhcmQgdHRsXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdGRUVEwgPT09IDApIHtcbiAgICAgICAgICAgIGxpdmV0aW1lID0gdGhpcy5vcHRpb25zLnN0ZFRUTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGl2ZXRpbWUgPSBub3cgKyAodGhpcy5vcHRpb25zLnN0ZFRUTCAqIHR0bE11bHRpcGxpY2F0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWVcbiAgICAgICAgcmV0dXJuIG9SZXR1cm4gPSB7XG4gICAgICAgICAgdDogbGl2ZXRpbWUsXG4gICAgICAgICAgdjogYXNDbG9uZSA/IGNsb25lKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vICMjIF91bndyYXBcblxuICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIGV4dHJhY3QgZ2V0IHRoZSB2YWx1ZSBvdXQgb2YgdGhlIHdyYXBwZWQgdmFsdWVcbiAgICAgIF91bndyYXAodmFsdWUsIGFzQ2xvbmUgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZUNsb25lcykge1xuICAgICAgICAgIGFzQ2xvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUudiAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGFzQ2xvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZSh2YWx1ZS52KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyAjIyBfZ2V0S2V5TGVuZ3RoXG5cbiAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0aGUgY2FsY3VsYXRlIHRoZSBrZXkgbGVuZ3RoXG4gICAgICBfZ2V0S2V5TGVuZ3RoKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5LnRvU3RyaW5nKCkubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBfZ2V0VmFsTGVuZ3RoKHZhbHVlKSB7XG4gICAgICAgIGJvdW5kTWV0aG9kQ2hlY2sodGhpcywgTm9kZUNhY2hlKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIFN0cmluZyBnZXQgdGhlIHJlYWwgbGVuZ3RoXG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZm9yY2VTdHJpbmcpIHtcbiAgICAgICAgICAvLyBmb3JjZSBzdHJpbmcgaWYgaXQncyBkZWZpbmVkIGFuZCBub3QgcGFzc2VkXG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBpZiB0aGUgZGF0YSBpcyBhbiBBcnJheSBtdWx0aXBseSBlYWNoIGVsZW1lbnQgd2l0aCBhIGRlZmluZWQgZGVmYXVsdCBsZW5ndGhcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFycmF5VmFsdWVTaXplICogdmFsdWUubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiA4O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRoZW4gOiB2b2lkIDApID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBpZiB0aGUgZGF0YSBpcyBhIFByb21pc2UsIHVzZSBkZWZpbmVkIGRlZmF1bHRcbiAgICAgICAgICAvLyAoY2FuJ3QgY2FsY3VsYXRlIGFjdHVhbC9yZXNvbHZlZCB2YWx1ZSBzaXplIHN5bmNocm9ub3VzbHkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wcm9taXNlVmFsdWVTaXplO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyICE9PSBudWxsID8gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA6IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICE9IG51bGwpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGlzIGFuIE9iamVjdCBtdWx0aXBseSBlYWNoIGVsZW1lbnQgd2l0aCBhIGRlZmluZWQgZGVmYXVsdCBsZW5ndGhcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9iamVjdFZhbHVlU2l6ZSAqIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIHJldHVybiA4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRlZmF1bHQgZmFsbGJhY2tcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZXJyb3IodHlwZSwgZGF0YSA9IHt9KSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgZXJyb3Igb2JqZWN0XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGVycm9yLm5hbWUgPSB0eXBlO1xuICAgICAgICBlcnJvci5lcnJvcmNvZGUgPSB0eXBlO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gdGhpcy5FUlJPUlNbdHlwZV0gIT0gbnVsbCA/IHRoaXMuRVJST1JTW3R5cGVdKGRhdGEpIDogXCItXCI7XG4gICAgICAgIGVycm9yLmRhdGEgPSBkYXRhO1xuICAgICAgICAvLyByZXR1cm4gdGhlIGVycm9yIG9iamVjdFxuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIF9pbml0RXJyb3JzKCkge1xuICAgICAgICB2YXIgX2Vyck1zZywgX2VyclQsIHJlZjtcbiAgICAgICAgYm91bmRNZXRob2RDaGVjayh0aGlzLCBOb2RlQ2FjaGUpO1xuICAgICAgICB0aGlzLkVSUk9SUyA9IHt9O1xuICAgICAgICByZWYgPSB0aGlzLl9FUlJPUlM7XG4gICAgICAgIGZvciAoX2VyclQgaW4gcmVmKSB7XG4gICAgICAgICAgX2Vyck1zZyA9IHJlZltfZXJyVF07XG4gICAgICAgICAgdGhpcy5FUlJPUlNbX2VyclRdID0gdGhpcy5jcmVhdGVFcnJvck1lc3NhZ2UoX2Vyck1zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3JlYXRlRXJyb3JNZXNzYWdlKGVyck1zZykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgIHJldHVybiBlcnJNc2cucmVwbGFjZShcIl9fa2V5XCIsIGFyZ3MudHlwZSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICB9O1xuXG4gICAgTm9kZUNhY2hlLnByb3RvdHlwZS5fRVJST1JTID0ge1xuICAgICAgXCJFTk9URk9VTkRcIjogXCJLZXkgYF9fa2V5YCBub3QgZm91bmRcIixcbiAgICAgIFwiRUNBQ0hFRlVMTFwiOiBcIkNhY2hlIG1heCBrZXlzIGFtb3VudCBleGNlZWRlZFwiLFxuICAgICAgXCJFS0VZVFlQRVwiOiBcIlRoZSBrZXkgYXJndW1lbnQgaGFzIHRvIGJlIG9mIHR5cGUgYHN0cmluZ2Agb3IgYG51bWJlcmAuIEZvdW5kOiBgX19rZXlgXCIsXG4gICAgICBcIkVLRVlTVFlQRVwiOiBcIlRoZSBrZXlzIGFyZ3VtZW50IGhhcyB0byBiZSBhbiBhcnJheS5cIixcbiAgICAgIFwiRVRUTFRZUEVcIjogXCJUaGUgdHRsIGFyZ3VtZW50IGhhcyB0byBiZSBhIG51bWJlci5cIlxuICAgIH07XG5cbiAgICByZXR1cm4gTm9kZUNhY2hlO1xuXG4gIH0pLmNhbGwodGhpcyk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLAogICAgIi8qXG4gKiBub2RlLWNhY2hlIDUuMS4yICggMjAyMC0wNy0wMSApXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1jYWNoZS9ub2RlLWNhY2hlXG4gKlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1jYWNoZS9ub2RlLWNhY2hlL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqXG4gKiBNYWludGFpbmVkIGJ5ICAoICApXG4qL1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgZXhwb3J0cztcblxuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9ub2RlX2NhY2hlJyk7XG5cbiAgZXhwb3J0cy52ZXJzaW9uID0gJzUuMS4yJztcblxufSkuY2FsbCh0aGlzKTtcbiIsCiAgICAiLy8jcmVnaW9uIHJvbGxkb3duOnJ1bnRpbWVcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcblx0Zm9yICh2YXIgbmFtZSBpbiBhbGwpIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHtcblx0XHRnZXQ6IGFsbFtuYW1lXSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBfX2V4cG9ydCB9OyIsCiAgICAiY29uc3QgZW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmVudGl0eUtpbmRcIik7XG5jb25zdCBoYXNPd25FbnRpdHlLaW5kID0gU3ltYm9sLmZvcihcImRyaXp6bGU6aGFzT3duRW50aXR5S2luZFwiKTtcbmZ1bmN0aW9uIGlzKHZhbHVlLCB0eXBlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHR5cGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLCBlbnRpdHlLaW5kKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDbGFzcyBcIiR7dHlwZS5uYW1lID8/IFwiPHVua25vd24+XCJ9XCIgZG9lc24ndCBsb29rIGxpa2UgYSBEcml6emxlIGVudGl0eS4gSWYgdGhpcyBpcyBpbmNvcnJlY3QgYW5kIHRoZSBjbGFzcyBpcyBwcm92aWRlZCBieSBEcml6emxlLCBwbGVhc2UgcmVwb3J0IHRoaXMgYXMgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkuY29uc3RydWN0b3I7XG4gIGlmIChjbHMpIHtcbiAgICB3aGlsZSAoY2xzKSB7XG4gICAgICBpZiAoZW50aXR5S2luZCBpbiBjbHMgJiYgY2xzW2VudGl0eUtpbmRdID09PSB0eXBlW2VudGl0eUtpbmRdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2xzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCB7XG4gIGVudGl0eUtpbmQsXG4gIGhhc093bkVudGl0eUtpbmQsXG4gIGlzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW50aXR5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmtleUFzTmFtZSA9IGNvbmZpZy5rZXlBc05hbWU7XG4gICAgdGhpcy5ub3ROdWxsID0gY29uZmlnLm5vdE51bGw7XG4gICAgdGhpcy5kZWZhdWx0ID0gY29uZmlnLmRlZmF1bHQ7XG4gICAgdGhpcy5kZWZhdWx0Rm4gPSBjb25maWcuZGVmYXVsdEZuO1xuICAgIHRoaXMub25VcGRhdGVGbiA9IGNvbmZpZy5vblVwZGF0ZUZuO1xuICAgIHRoaXMuaGFzRGVmYXVsdCA9IGNvbmZpZy5oYXNEZWZhdWx0O1xuICAgIHRoaXMucHJpbWFyeSA9IGNvbmZpZy5wcmltYXJ5S2V5O1xuICAgIHRoaXMuaXNVbmlxdWUgPSBjb25maWcuaXNVbmlxdWU7XG4gICAgdGhpcy51bmlxdWVOYW1lID0gY29uZmlnLnVuaXF1ZU5hbWU7XG4gICAgdGhpcy51bmlxdWVUeXBlID0gY29uZmlnLnVuaXF1ZVR5cGU7XG4gICAgdGhpcy5kYXRhVHlwZSA9IGNvbmZpZy5kYXRhVHlwZTtcbiAgICB0aGlzLmNvbHVtblR5cGUgPSBjb25maWcuY29sdW1uVHlwZTtcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGNvbmZpZy5nZW5lcmF0ZWQ7XG4gICAgdGhpcy5nZW5lcmF0ZWRJZGVudGl0eSA9IGNvbmZpZy5nZW5lcmF0ZWRJZGVudGl0eTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5cIjtcbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICBwcmltYXJ5O1xuICBub3ROdWxsO1xuICBkZWZhdWx0O1xuICBkZWZhdWx0Rm47XG4gIG9uVXBkYXRlRm47XG4gIGhhc0RlZmF1bHQ7XG4gIGlzVW5pcXVlO1xuICB1bmlxdWVOYW1lO1xuICB1bmlxdWVUeXBlO1xuICBkYXRhVHlwZTtcbiAgY29sdW1uVHlwZTtcbiAgZW51bVZhbHVlcyA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkID0gdm9pZCAwO1xuICBnZW5lcmF0ZWRJZGVudGl0eSA9IHZvaWQgMDtcbiAgY29uZmlnO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvLyAqKiBAaW50ZXJuYWwgKi9cbiAgc2hvdWxkRGlzYWJsZUluc2VydCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkICE9PSB2b2lkIDAgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnR5cGUgIT09IFwiYnlEZWZhdWx0XCI7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5CdWlsZGVyXCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBrZXlBc05hbWU6IG5hbWUgPT09IFwiXCIsXG4gICAgICBub3ROdWxsOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IHZvaWQgMCxcbiAgICAgIGhhc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcHJpbWFyeUtleTogZmFsc2UsXG4gICAgICBpc1VuaXF1ZTogZmFsc2UsXG4gICAgICB1bmlxdWVOYW1lOiB2b2lkIDAsXG4gICAgICB1bmlxdWVUeXBlOiB2b2lkIDAsXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGNvbHVtblR5cGUsXG4gICAgICBnZW5lcmF0ZWQ6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLiBDb21tb25seSB1c2VkIHdpdGggYGpzb25gIGNvbHVtbnMuIEFsc28sIHVzZWZ1bCBmb3IgYnJhbmRlZCB0eXBlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogY29uc3QgdXNlcnMgPSBwZ1RhYmxlKCd1c2VycycsIHtcbiAgICogXHRpZDogaW50ZWdlcignaWQnKS4kdHlwZTxVc2VySWQ+KCkucHJpbWFyeUtleSgpLFxuICAgKiBcdGRldGFpbHM6IGpzb24oJ2RldGFpbHMnKS4kdHlwZTxVc2VyRGV0YWlscz4oKS5ub3ROdWxsKCksXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICR0eXBlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYG5vdCBudWxsYCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgc2VsZWN0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRob3V0KiBgbm90IG51bGxgIHdpbGwgYmUgbnVsbGFibGUgb24gc2VsZWN0LlxuICAgKi9cbiAgbm90TnVsbCgpIHtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBkZWZhdWx0IDx2YWx1ZT5gIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFmZmVjdHMgdGhlIGBpbnNlcnRgIG1vZGVsIG9mIHRoZSB0YWJsZSAtIGNvbHVtbnMgKndpdGgqIGBkZWZhdWx0YCBhcmUgb3B0aW9uYWwgb24gaW5zZXJ0LlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzZXQgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUsIHVzZSB7QGxpbmsgJGRlZmF1bHRGbn0gaW5zdGVhZC5cbiAgICovXG4gIGRlZmF1bHQodmFsdWUpIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0ID0gdmFsdWU7XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJGRlZmF1bHRGbihmbikge1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRGbiA9IGZuO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBbGlhcyBmb3Ige0BsaW5rICRkZWZhdWx0Rm59LlxuICAgKi9cbiAgJGRlZmF1bHQgPSB0aGlzLiRkZWZhdWx0Rm47XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyB1cGRhdGUgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyB1cGRhdGVkLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlIGlmIG5vbmUgaXMgcHJvdmlkZWQuXG4gICAqIElmIG5vIGBkZWZhdWx0YCAob3IgYCRkZWZhdWx0Rm5gKSB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCBhcyB3ZWxsLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGBkcml6emxlLWtpdGAgYmVoYXZpb3IsIGl0IGlzIG9ubHkgdXNlZCBhdCBydW50aW1lIGluIGBkcml6emxlLW9ybWAuXG4gICAqL1xuICAkb25VcGRhdGVGbihmbikge1xuICAgIHRoaXMuY29uZmlnLm9uVXBkYXRlRm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkb25VcGRhdGVGbn0uXG4gICAqL1xuICAkb25VcGRhdGUgPSB0aGlzLiRvblVwZGF0ZUZuO1xuICAvKipcbiAgICogQWRkcyBhIGBwcmltYXJ5IGtleWAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi4gVGhpcyBpbXBsaWNpdGx5IG1ha2VzIHRoZSBjb2x1bW4gYG5vdCBudWxsYC5cbiAgICpcbiAgICogSW4gU1FMaXRlLCBgaW50ZWdlciBwcmltYXJ5IGtleWAgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGF1dG8taW5jcmVtZW50aW5nLlxuICAgKi9cbiAgcHJpbWFyeUtleSgpIHtcbiAgICB0aGlzLmNvbmZpZy5wcmltYXJ5S2V5ID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB0aGUga2V5IHdpdGhpbiB0aGUgdGFibGUgZGVmaW5pdGlvbiBpZiBhIG5hbWUgd2FzIG5vdCBnaXZlbi4gKi9cbiAgc2V0TmFtZShuYW1lKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm5hbWUgIT09IFwiXCIpIHJldHVybjtcbiAgICB0aGlzLmNvbmZpZy5uYW1lID0gbmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi1idWlsZGVyLmpzLm1hcCIsCiAgICAiY29uc3QgVGFibGVOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6TmFtZVwiKTtcbmV4cG9ydCB7XG4gIFRhYmxlTmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLnV0aWxzLmpzLm1hcCIsCiAgICAiZnVuY3Rpb24gaWlmZShmbiwgLi4uYXJncykge1xuICByZXR1cm4gZm4oLi4uYXJncyk7XG59XG5leHBvcnQge1xuICBpaWZlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmZ1bmN0aW9uIHVuaXF1ZShuYW1lKSB7XG4gIHJldHVybiBuZXcgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcihuYW1lKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUtleU5hbWUodGFibGUsIGNvbHVtbnMpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1RhYmxlTmFtZV19XyR7Y29sdW1ucy5qb2luKFwiX1wiKX1fdW5pcXVlYDtcbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBudWxsc05vdERpc3RpbmN0Q29uZmlnID0gZmFsc2U7XG4gIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0Q29uZmlnID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbnVsbHNOb3REaXN0aW5jdCwgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0ID0gbnVsbHNOb3REaXN0aW5jdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgbnVsbHNOb3REaXN0aW5jdCA9IGZhbHNlO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyBpaWZlIH0gZnJvbSBcIi4uLy4uL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IG1ha2VQZ0FycmF5LCBwYXJzZVBnQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHMvYXJyYXkuanNcIjtcbmNsYXNzIFBnQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtbkJ1aWxkZXJcIjtcbiAgYXJyYXkoc2l6ZSkge1xuICAgIHJldHVybiBuZXcgUGdBcnJheUJ1aWxkZXIodGhpcy5jb25maWcubmFtZSwgdGhpcywgc2l6ZSk7XG4gIH1cbiAgcmVmZXJlbmNlcyhyZWYsIGFjdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MucHVzaCh7IHJlZiwgYWN0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB1bmlxdWUobmFtZSwgY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZVR5cGUgPSBjb25maWc/Lm51bGxzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzKSB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkID0ge1xuICAgICAgYXMsXG4gICAgICB0eXBlOiBcImFsd2F5c1wiLFxuICAgICAgbW9kZTogXCJzdG9yZWRcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiBpaWZlKFxuICAgICAgICAocmVmMiwgYWN0aW9uczIpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBbY29sdW1uXSwgZm9yZWlnbkNvbHVtbnM6IFtmb3JlaWduQ29sdW1uXSB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vblVwZGF0ZShhY3Rpb25zMi5vblVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vbkRlbGV0ZShhY3Rpb25zMi5vbkRlbGV0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmLFxuICAgICAgICBhY3Rpb25zXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbih0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRXh0cmFDb25maWdDb2x1bW4odGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgUGdDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQ29sdW1uXCI7XG59XG5jbGFzcyBFeHRyYUNvbmZpZ0NvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXh0cmFDb25maWdDb2x1bW5cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTUUxUeXBlKCk7XG4gIH1cbiAgaW5kZXhDb25maWcgPSB7XG4gICAgb3JkZXI6IHRoaXMuY29uZmlnLm9yZGVyID8/IFwiYXNjXCIsXG4gICAgbnVsbHM6IHRoaXMuY29uZmlnLm51bGxzID8/IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHRoaXMuY29uZmlnLm9wQ2xhc3NcbiAgfTtcbiAgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBvcmRlcjogXCJhc2NcIixcbiAgICBudWxsczogXCJsYXN0XCIsXG4gICAgb3BDbGFzczogdm9pZCAwXG4gIH07XG4gIGFzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJhc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkZXNjKCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3JkZXIgPSBcImRlc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBudWxsc0ZpcnN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImZpcnN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNMYXN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImxhc3RcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogIyMjIFBvc3RncmVTUUwgZG9jdW1lbnRhdGlvbiBxdW90ZVxuICAgKlxuICAgKiA+IEFuIG9wZXJhdG9yIGNsYXNzIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGNvbHVtbiBvZiBhbiBpbmRleC5cbiAgICogVGhlIG9wZXJhdG9yIGNsYXNzIGlkZW50aWZpZXMgdGhlIG9wZXJhdG9ycyB0byBiZSB1c2VkIGJ5IHRoZSBpbmRleCBmb3IgdGhhdCBjb2x1bW4uXG4gICAqIEZvciBleGFtcGxlLCBhIEItdHJlZSBpbmRleCBvbiBmb3VyLWJ5dGUgaW50ZWdlcnMgd291bGQgdXNlIHRoZSBpbnQ0X29wcyBjbGFzcztcbiAgICogdGhpcyBvcGVyYXRvciBjbGFzcyBpbmNsdWRlcyBjb21wYXJpc29uIGZ1bmN0aW9ucyBmb3IgZm91ci1ieXRlIGludGVnZXJzLlxuICAgKiBJbiBwcmFjdGljZSB0aGUgZGVmYXVsdCBvcGVyYXRvciBjbGFzcyBmb3IgdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuXG4gICAqIFRoZSBtYWluIHBvaW50IG9mIGhhdmluZyBvcGVyYXRvciBjbGFzc2VzIGlzIHRoYXQgZm9yIHNvbWUgZGF0YSB0eXBlcywgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBtZWFuaW5nZnVsIG9yZGVyaW5nLlxuICAgKiBGb3IgZXhhbXBsZSwgd2UgbWlnaHQgd2FudCB0byBzb3J0IGEgY29tcGxleC1udW1iZXIgZGF0YSB0eXBlIGVpdGhlciBieSBhYnNvbHV0ZSB2YWx1ZSBvciBieSByZWFsIHBhcnQuXG4gICAqIFdlIGNvdWxkIGRvIHRoaXMgYnkgZGVmaW5pbmcgdHdvIG9wZXJhdG9yIGNsYXNzZXMgZm9yIHRoZSBkYXRhIHR5cGUgYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9wZXIgY2xhc3Mgd2hlbiBjcmVhdGluZyBhbiBpbmRleC5cbiAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVyYXRvciBjbGFzc2VzIGNoZWNrOlxuICAgKlxuICAgKiAjIyMgVXNlZnVsIGxpbmtzXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9zcWwtY3JlYXRlaW5kZXguaHRtbFxuICAgKlxuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvaW5kZXhlcy1vcGNsYXNzLmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L3hpbmRleC5odG1sXG4gICAqXG4gICAqICMjIyBBZGRpdGlvbmFsIHR5cGVzXG4gICAqIElmIHlvdSBoYXZlIHRoZSBgcGdfdmVjdG9yYCBleHRlbnNpb24gaW5zdGFsbGVkIGluIHlvdXIgZGF0YWJhc2UsIHlvdSBjYW4gdXNlIHRoZVxuICAgKiBgdmVjdG9yX2wyX29wc2AsIGB2ZWN0b3JfaXBfb3BzYCwgYHZlY3Rvcl9jb3NpbmVfb3BzYCwgYHZlY3Rvcl9sMV9vcHNgLCBgYml0X2hhbW1pbmdfb3BzYCwgYGJpdF9qYWNjYXJkX29wc2AsIGBoYWxmdmVjX2wyX29wc2AsIGBzcGFyc2V2ZWNfbDJfb3BzYCBvcHRpb25zLCB3aGljaCBhcmUgcHJlZGVmaW5lZCB0eXBlcy5cbiAgICpcbiAgICogKipZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IGFueSBzdHJpbmcgeW91IHdhbnQgaW4gdGhlIG9wZXJhdG9yIGNsYXNzLCBpbiBjYXNlIERyaXp6bGUgZG9lc24ndCBoYXZlIGl0IG5hdGl2ZWx5IGluIGl0cyB0eXBlcyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcENsYXNzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBvcChvcENsYXNzKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcENsYXNzID0gb3BDbGFzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgSW5kZXhlZENvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkluZGV4ZWRDb2x1bW5cIjtcbiAgY29uc3RydWN0b3IobmFtZSwga2V5QXNOYW1lLCB0eXBlLCBpbmRleENvbmZpZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBrZXlBc05hbWU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmluZGV4Q29uZmlnID0gaW5kZXhDb25maWc7XG4gIH1cbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICB0eXBlO1xuICBpbmRleENvbmZpZztcbn1cbmNsYXNzIFBnQXJyYXlCdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheUJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgYmFzZUJ1aWxkZXIsIHNpemUpIHtcbiAgICBzdXBlcihuYW1lLCBcImFycmF5XCIsIFwiUGdBcnJheVwiKTtcbiAgICB0aGlzLmNvbmZpZy5iYXNlQnVpbGRlciA9IGJhc2VCdWlsZGVyO1xuICAgIHRoaXMuY29uZmlnLnNpemUgPSBzaXplO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICBjb25zdCBiYXNlQ29sdW1uID0gdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgIHJldHVybiBuZXcgUGdBcnJheShcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBiYXNlQ29sdW1uXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdBcnJheSBleHRlbmRzIFBnQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZywgYmFzZUNvbHVtbiwgcmFuZ2UpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uO1xuICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgICB0aGlzLnNpemUgPSBjb25maWcuc2l6ZTtcbiAgfVxuICBzaXplO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0FycmF5XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuYmFzZUNvbHVtbi5nZXRTUUxUeXBlKCl9WyR7dHlwZW9mIHRoaXMuc2l6ZSA9PT0gXCJudW1iZXJcIiA/IHRoaXMuc2l6ZSA6IFwiXCJ9XWA7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsdWUgPSBwYXJzZVBnQXJyYXkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PiB0aGlzLmJhc2VDb2x1bW4ubWFwRnJvbURyaXZlclZhbHVlKHYpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlLCBpc05lc3RlZEFycmF5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBhID0gdmFsdWUubWFwKFxuICAgICAgKHYpID0+IHYgPT09IG51bGwgPyBudWxsIDogaXModGhpcy5iYXNlQ29sdW1uLCBQZ0FycmF5KSA/IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYsIHRydWUpIDogdGhpcy5iYXNlQ29sdW1uLm1hcFRvRHJpdmVyVmFsdWUodilcbiAgICApO1xuICAgIGlmIChpc05lc3RlZEFycmF5KSByZXR1cm4gYTtcbiAgICByZXR1cm4gbWFrZVBnQXJyYXkoYSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV4dHJhQ29uZmlnQ29sdW1uLFxuICBJbmRleGVkQ29sdW1uLFxuICBQZ0FycmF5LFxuICBQZ0FycmF5QnVpbGRlcixcbiAgUGdDb2x1bW4sXG4gIFBnQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQZ0NvbHVtbiwgUGdDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bU9iamVjdENvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bU9iamVjdENvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtblwiO1xuICBlbnVtO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bS5lbnVtVmFsdWVzO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5lbnVtID0gY29uZmlnLmVudW07XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnVtLmVudW1OYW1lO1xuICB9XG59XG5jb25zdCBpc1BnRW51bVN5bSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmlzUGdFbnVtXCIpO1xuZnVuY3Rpb24gaXNQZ0VudW0ob2JqKSB7XG4gIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgaXNQZ0VudW1TeW0gaW4gb2JqICYmIG9ialtpc1BnRW51bVN5bV0gPT09IHRydWU7XG59XG5jbGFzcyBQZ0VudW1Db2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bUNvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bUNvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1Db2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtblwiO1xuICBlbnVtID0gdGhpcy5jb25maWcuZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcGdFbnVtKGVudW1OYW1lLCBpbnB1dCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCBbLi4uaW5wdXRdLCB2b2lkIDApIDogcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgaW5wdXQsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCB2YWx1ZXMsIHNjaGVtYSkge1xuICBjb25zdCBlbnVtSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKFxuICAgIChuYW1lKSA9PiBuZXcgUGdFbnVtQ29sdW1uQnVpbGRlcihuYW1lID8/IFwiXCIsIGVudW1JbnN0YW5jZSksXG4gICAge1xuICAgICAgZW51bU5hbWUsXG4gICAgICBlbnVtVmFsdWVzOiB2YWx1ZXMsXG4gICAgICBzY2hlbWEsXG4gICAgICBbaXNQZ0VudW1TeW1dOiB0cnVlXG4gICAgfVxuICApO1xuICByZXR1cm4gZW51bUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogT2JqZWN0LnZhbHVlcyh2YWx1ZXMpLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmV4cG9ydCB7XG4gIFBnRW51bUNvbHVtbixcbiAgUGdFbnVtQ29sdW1uQnVpbGRlcixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uLFxuICBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyLFxuICBpc1BnRW51bSxcbiAgcGdFbnVtLFxuICBwZ0VudW1PYmplY3RXaXRoU2NoZW1hLFxuICBwZ0VudW1XaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW51bS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU3VicXVlcnlcIjtcbiAgY29uc3RydWN0b3Ioc3FsLCBmaWVsZHMsIGFsaWFzLCBpc1dpdGggPSBmYWxzZSwgdXNlZFRhYmxlcyA9IFtdKSB7XG4gICAgdGhpcy5fID0ge1xuICAgICAgYnJhbmQ6IFwiU3VicXVlcnlcIixcbiAgICAgIHNxbCxcbiAgICAgIHNlbGVjdGVkRmllbGRzOiBmaWVsZHMsXG4gICAgICBhbGlhcyxcbiAgICAgIGlzV2l0aCxcbiAgICAgIHVzZWRUYWJsZXNcbiAgICB9O1xuICB9XG4gIC8vIGdldFNRTCgpOiBTUUw8dW5rbm93bj4ge1xuICAvLyBcdHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIC8vIH1cbn1cbmNsYXNzIFdpdGhTdWJxdWVyeSBleHRlbmRzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiV2l0aFN1YnF1ZXJ5XCI7XG59XG5leHBvcnQge1xuICBTdWJxdWVyeSxcbiAgV2l0aFN1YnF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3VicXVlcnkuanMubWFwIiwKICAgICIvLyBwYWNrYWdlLmpzb25cbnZhciB2ZXJzaW9uID0gXCIwLjQ0LjVcIjtcblxuLy8gc3JjL3ZlcnNpb24udHNcbnZhciBjb21wYXRpYmlsaXR5VmVyc2lvbiA9IDEwO1xuZXhwb3J0IHtcbiAgY29tcGF0aWJpbGl0eVZlcnNpb24sXG4gIHZlcnNpb24gYXMgbnBtVmVyc2lvblxufTtcbiIsCiAgICAiaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IG5wbVZlcnNpb24gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5sZXQgb3RlbDtcbmxldCByYXdUcmFjZXI7XG5jb25zdCB0cmFjZXIgPSB7XG4gIHN0YXJ0QWN0aXZlU3BhbihuYW1lLCBmbikge1xuICAgIGlmICghb3RlbCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIGlmICghcmF3VHJhY2VyKSB7XG4gICAgICByYXdUcmFjZXIgPSBvdGVsLnRyYWNlLmdldFRyYWNlcihcImRyaXp6bGUtb3JtXCIsIG5wbVZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gaWlmZShcbiAgICAgIChvdGVsMiwgcmF3VHJhY2VyMikgPT4gcmF3VHJhY2VyMi5zdGFydEFjdGl2ZVNwYW4oXG4gICAgICAgIG5hbWUsXG4gICAgICAgIChzcGFuKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmbihzcGFuKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgIGNvZGU6IG90ZWwyLlNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIlxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWluc3RhbmNlb2Yvbm8taW5zdGFuY2VvZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIG90ZWwsXG4gICAgICByYXdUcmFjZXJcbiAgICApO1xuICB9XG59O1xuZXhwb3J0IHtcbiAgdHJhY2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy5qcy5tYXAiLAogICAgImNvbnN0IFZpZXdCYXNlQ29uZmlnID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Vmlld0Jhc2VDb25maWdcIik7XG5leHBvcnQge1xuICBWaWV3QmFzZUNvbmZpZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpZXctY29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4vdGFibGUudXRpbHMuanNcIjtcbmNvbnN0IFNjaGVtYSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNjaGVtYVwiKTtcbmNvbnN0IENvbHVtbnMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpDb2x1bW5zXCIpO1xuY29uc3QgRXh0cmFDb25maWdDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdDb2x1bW5zXCIpO1xuY29uc3QgT3JpZ2luYWxOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6T3JpZ2luYWxOYW1lXCIpO1xuY29uc3QgQmFzZU5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpCYXNlTmFtZVwiKTtcbmNvbnN0IElzQWxpYXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0FsaWFzXCIpO1xuY29uc3QgRXh0cmFDb25maWdCdWlsZGVyID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdCdWlsZGVyXCIpO1xuY29uc3QgSXNEcml6emxlVGFibGUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVUYWJsZVwiKTtcbmNsYXNzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0ge1xuICAgIE5hbWU6IFRhYmxlTmFtZSxcbiAgICBTY2hlbWEsXG4gICAgT3JpZ2luYWxOYW1lLFxuICAgIENvbHVtbnMsXG4gICAgRXh0cmFDb25maWdDb2x1bW5zLFxuICAgIEJhc2VOYW1lLFxuICAgIElzQWxpYXMsXG4gICAgRXh0cmFDb25maWdCdWlsZGVyXG4gIH07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ2FuIGJlIGNoYW5nZWQgaWYgdGhlIHRhYmxlIGlzIGFsaWFzZWQuXG4gICAqL1xuICBbVGFibGVOYW1lXTtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSB0YWJsZSwgYmVmb3JlIGFueSBhbGlhc2luZy5cbiAgICovXG4gIFtPcmlnaW5hbE5hbWVdO1xuICAvKiogQGludGVybmFsICovXG4gIFtTY2hlbWFdO1xuICAvKiogQGludGVybmFsICovXG4gIFtDb2x1bW5zXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdDb2x1bW5zXTtcbiAgLyoqXG4gICAqICBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgdGFibGUgbmFtZSBiZWZvcmUgdGhlIHRyYW5zZm9ybWF0aW9uIHZpYSB0aGUgYHRhYmxlQ3JlYXRvcmAgZnVuY3Rpb25zLlxuICAgKi9cbiAgW0Jhc2VOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNBbGlhc10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVGFibGVdID0gdHJ1ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbiAgY29uc3RydWN0b3IobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSkge1xuICAgIHRoaXNbVGFibGVOYW1lXSA9IHRoaXNbT3JpZ2luYWxOYW1lXSA9IG5hbWU7XG4gICAgdGhpc1tTY2hlbWFdID0gc2NoZW1hO1xuICAgIHRoaXNbQmFzZU5hbWVdID0gYmFzZU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVGFibGUodGFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0YWJsZSA9PT0gXCJvYmplY3RcIiAmJiB0YWJsZSAhPT0gbnVsbCAmJiBJc0RyaXp6bGVUYWJsZSBpbiB0YWJsZTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGVOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlVW5pcXVlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gYCR7dGFibGVbU2NoZW1hXSA/PyBcInB1YmxpY1wifS4ke3RhYmxlW1RhYmxlTmFtZV19YDtcbn1cbmV4cG9ydCB7XG4gIEJhc2VOYW1lLFxuICBDb2x1bW5zLFxuICBFeHRyYUNvbmZpZ0J1aWxkZXIsXG4gIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgSXNBbGlhcyxcbiAgT3JpZ2luYWxOYW1lLFxuICBTY2hlbWEsXG4gIFRhYmxlLFxuICBnZXRUYWJsZU5hbWUsXG4gIGdldFRhYmxlVW5pcXVlTmFtZSxcbiAgaXNUYWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBpc1BnRW51bSB9IGZyb20gXCIuLi9wZy1jb3JlL2NvbHVtbnMvZW51bS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IHRyYWNlciB9IGZyb20gXCIuLi90cmFjaW5nLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgSXNBbGlhcywgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmNsYXNzIEZha2VQcmltaXRpdmVQYXJhbSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkZha2VQcmltaXRpdmVQYXJhbVwiO1xufVxuZnVuY3Rpb24gaXNTUUxXcmFwcGVyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwICYmIHR5cGVvZiB2YWx1ZS5nZXRTUUwgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIG1lcmdlUXVlcmllcyhxdWVyaWVzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgIHJlc3VsdC5zcWwgKz0gcXVlcnkuc3FsO1xuICAgIHJlc3VsdC5wYXJhbXMucHVzaCguLi5xdWVyeS5wYXJhbXMpO1xuICAgIGlmIChxdWVyeS50eXBpbmdzPy5sZW5ndGgpIHtcbiAgICAgIGlmICghcmVzdWx0LnR5cGluZ3MpIHtcbiAgICAgICAgcmVzdWx0LnR5cGluZ3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC50eXBpbmdzLnB1c2goLi4ucXVlcnkudHlwaW5ncyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBTdHJpbmdDaHVuayB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN0cmluZ0NodW5rXCI7XG4gIHZhbHVlO1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuY2xhc3MgU1FMIHtcbiAgY29uc3RydWN0b3IocXVlcnlDaHVua3MpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzID0gcXVlcnlDaHVua3M7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBxdWVyeUNodW5rcykge1xuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICB0aGlzLnVzZWRUYWJsZXMucHVzaChcbiAgICAgICAgICBzY2hlbWFOYW1lID09PSB2b2lkIDAgPyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV0gOiBzY2hlbWFOYW1lICsgXCIuXCIgKyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZGVjb2RlciA9IG5vb3BEZWNvZGVyO1xuICBzaG91bGRJbmxpbmVQYXJhbXMgPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB1c2VkVGFibGVzID0gW107XG4gIGFwcGVuZChxdWVyeSkge1xuICAgIHRoaXMucXVlcnlDaHVua3MucHVzaCguLi5xdWVyeS5xdWVyeUNodW5rcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdG9RdWVyeShjb25maWcpIHtcbiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihcImRyaXp6bGUuYnVpbGRTUUxcIiwgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyh0aGlzLnF1ZXJ5Q2h1bmtzLCBjb25maWcpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS50ZXh0XCI6IHF1ZXJ5LnNxbCxcbiAgICAgICAgXCJkcml6emxlLnF1ZXJ5LnBhcmFtc1wiOiBKU09OLnN0cmluZ2lmeShxdWVyeS5wYXJhbXMpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9KTtcbiAgfVxuICBidWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVua3MsIF9jb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBfY29uZmlnLCB7XG4gICAgICBpbmxpbmVQYXJhbXM6IF9jb25maWcuaW5saW5lUGFyYW1zIHx8IHRoaXMuc2hvdWxkSW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4OiBfY29uZmlnLnBhcmFtU3RhcnRJbmRleCB8fCB7IHZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBjYXNpbmcsXG4gICAgICBlc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW0sXG4gICAgICBwcmVwYXJlVHlwaW5nLFxuICAgICAgaW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4XG4gICAgfSA9IGNvbmZpZztcbiAgICByZXR1cm4gbWVyZ2VRdWVyaWVzKGNodW5rcy5tYXAoKGNodW5rKSA9PiB7XG4gICAgICBpZiAoaXMoY2h1bmssIFN0cmluZ0NodW5rKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGNodW5rLnZhbHVlLmpvaW4oXCJcIiksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLnZhbHVlKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaHVuaykpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBTdHJpbmdDaHVuayhcIihcIildO1xuICAgICAgICBmb3IgKGNvbnN0IFtpLCBwXSBvZiBjaHVuay5lbnRyaWVzKCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChwKTtcbiAgICAgICAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIiwgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IFN0cmluZ0NodW5rKFwiKVwiKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKHJlc3VsdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVuay5xdWVyeUNodW5rcywge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBpbmxpbmVQYXJhbXM6IGlubGluZVBhcmFtcyB8fCBjaHVuay5zaG91bGRJbmxpbmVQYXJhbXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFRhYmxlKSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IHNjaGVtYU5hbWUgPT09IHZvaWQgMCB8fCBjaHVua1tJc0FsaWFzXSA/IGVzY2FwZU5hbWUodGFibGVOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodGFibGVOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspO1xuICAgICAgICBpZiAoX2NvbmZpZy5pbnZva2VTb3VyY2UgPT09IFwiaW5kZXhlc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogY2h1bmsudGFibGVbSXNBbGlhc10gfHwgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgVmlldykpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5zY2hlbWE7XG4gICAgICAgIGNvbnN0IHZpZXdOYW1lID0gY2h1bmtbVmlld0Jhc2VDb25maWddLm5hbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbVmlld0Jhc2VDb25maWddLmlzQWxpYXMgPyBlc2NhcGVOYW1lKHZpZXdOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodmlld05hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgUGFyYW0pKSB7XG4gICAgICAgIGlmIChpcyhjaHVuay52YWx1ZSwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IGNodW5rLnZhbHVlID09PSBudWxsID8gbnVsbCA6IGNodW5rLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZShjaHVuay52YWx1ZSk7XG4gICAgICAgIGlmIChpcyhtYXBwZWRWYWx1ZSwgU1FMKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFttYXBwZWRWYWx1ZV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogdGhpcy5tYXBJbmxpbmVQYXJhbShtYXBwZWRWYWx1ZSwgY29uZmlnKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBpbmdzID0gW1wibm9uZVwiXTtcbiAgICAgICAgaWYgKHByZXBhcmVUeXBpbmcpIHtcbiAgICAgICAgICB0eXBpbmdzID0gW3ByZXBhcmVUeXBpbmcoY2h1bmsuZW5jb2RlcildO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIG1hcHBlZFZhbHVlKSwgcGFyYW1zOiBbbWFwcGVkVmFsdWVdLCB0eXBpbmdzIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTUUwuQWxpYXNlZCkgJiYgY2h1bmsuZmllbGRBbGlhcyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5maWVsZEFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTdWJxdWVyeSkpIHtcbiAgICAgICAgaWYgKGNodW5rLl8uaXNXaXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLl8uYWxpYXMpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuXy5zcWwsXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKSBcIiksXG4gICAgICAgICAgbmV3IE5hbWUoY2h1bmsuXy5hbGlhcylcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BnRW51bShjaHVuaykpIHtcbiAgICAgICAgaWYgKGNodW5rLnNjaGVtYSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5zY2hlbWEpICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNodW5rLmVudW1OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NRTFdyYXBwZXIoY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zaG91bGRPbWl0U1FMUGFyZW5zPy4oKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtjaHVuay5nZXRTUUwoKV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuZ2V0U1FMKCksXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICAgICAgICBdLCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0oY2h1bmssIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgfSkpO1xuICB9XG4gIG1hcElubGluZVBhcmFtKGNodW5rLCB7IGVzY2FwZVN0cmluZyB9KSB7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNodW5rID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGNodW5rLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoY2h1bmspO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZUFzU3RyaW5nID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIGlmIChtYXBwZWRWYWx1ZUFzU3RyaW5nID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoY2h1bmspKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcobWFwcGVkVmFsdWVBc1N0cmluZyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcGFyYW0gdmFsdWU6IFwiICsgY2h1bmspO1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZCh0aGlzLCBhbGlhcyk7XG4gIH1cbiAgbWFwV2l0aChkZWNvZGVyKSB7XG4gICAgdGhpcy5kZWNvZGVyID0gdHlwZW9mIGRlY29kZXIgPT09IFwiZnVuY3Rpb25cIiA/IHsgbWFwRnJvbURyaXZlclZhbHVlOiBkZWNvZGVyIH0gOiBkZWNvZGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlubGluZVBhcmFtcygpIHtcbiAgICB0aGlzLnNob3VsZElubGluZVBhcmFtcyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29uZGl0aW9uYWxseSBpbmNsdWRlIGEgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb24gLSBDb25kaXRpb24gdG8gY2hlY2tcbiAgICogQHJldHVybnMgaXRzZWxmIGlmIHRoZSBjb25kaXRpb24gaXMgYHRydWVgLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAgICovXG4gIGlmKGNvbmRpdGlvbikge1xuICAgIHJldHVybiBjb25kaXRpb24gPyB0aGlzIDogdm9pZCAwO1xuICB9XG59XG5jbGFzcyBOYW1lIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTmFtZVwiO1xuICBicmFuZDtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5hbWUodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRHJpdmVyVmFsdWVFbmNvZGVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJtYXBUb0RyaXZlclZhbHVlXCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1hcFRvRHJpdmVyVmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IG5vb3BEZWNvZGVyID0ge1xuICBtYXBGcm9tRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wRW5jb2RlciA9IHtcbiAgbWFwVG9Ecml2ZXJWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZVxufTtcbmNvbnN0IG5vb3BNYXBwZXIgPSB7XG4gIC4uLm5vb3BEZWNvZGVyLFxuICAuLi5ub29wRW5jb2RlclxufTtcbmNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBhcmFtZXRlciB2YWx1ZVxuICAgKiBAcGFyYW0gZW5jb2RlciAtIEVuY29kZXIgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBkcml2ZXIgcGFyYW1ldGVyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgZW5jb2RlciA9IG5vb3BFbmNvZGVyKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGVuY29kZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGFyYW1cIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwYXJhbSh2YWx1ZSwgZW5jb2Rlcikge1xuICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbn1cbmZ1bmN0aW9uIHNxbChzdHJpbmdzLCAuLi5wYXJhbXMpIHtcbiAgY29uc3QgcXVlcnlDaHVua3MgPSBbXTtcbiAgaWYgKHBhcmFtcy5sZW5ndGggPiAwIHx8IHN0cmluZ3MubGVuZ3RoID4gMCAmJiBzdHJpbmdzWzBdICE9PSBcIlwiKSB7XG4gICAgcXVlcnlDaHVua3MucHVzaChuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1swXSkpO1xuICB9XG4gIGZvciAoY29uc3QgW3BhcmFtSW5kZXgsIHBhcmFtMl0gb2YgcGFyYW1zLmVudHJpZXMoKSkge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gocGFyYW0yLCBuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1twYXJhbUluZGV4ICsgMV0pKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChxdWVyeUNodW5rcyk7XG59XG4oKHNxbDIpID0+IHtcbiAgZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW10pO1xuICB9XG4gIHNxbDIuZW1wdHkgPSBlbXB0eTtcbiAgZnVuY3Rpb24gZnJvbUxpc3QobGlzdCkge1xuICAgIHJldHVybiBuZXcgU1FMKGxpc3QpO1xuICB9XG4gIHNxbDIuZnJvbUxpc3QgPSBmcm9tTGlzdDtcbiAgZnVuY3Rpb24gcmF3KHN0cikge1xuICAgIHJldHVybiBuZXcgU1FMKFtuZXcgU3RyaW5nQ2h1bmsoc3RyKV0pO1xuICB9XG4gIHNxbDIucmF3ID0gcmF3O1xuICBmdW5jdGlvbiBqb2luKGNodW5rcywgc2VwYXJhdG9yKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBbaSwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChpID4gMCAmJiBzZXBhcmF0b3IgIT09IHZvaWQgMCkge1xuICAgICAgICByZXN1bHQucHVzaChzZXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTChyZXN1bHQpO1xuICB9XG4gIHNxbDIuam9pbiA9IGpvaW47XG4gIGZ1bmN0aW9uIGlkZW50aWZpZXIodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IE5hbWUodmFsdWUpO1xuICB9XG4gIHNxbDIuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gIGZ1bmN0aW9uIHBsYWNlaG9sZGVyMihuYW1lMikge1xuICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXIobmFtZTIpO1xuICB9XG4gIHNxbDIucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjI7XG4gIGZ1bmN0aW9uIHBhcmFtMih2YWx1ZSwgZW5jb2Rlcikge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGVuY29kZXIpO1xuICB9XG4gIHNxbDIucGFyYW0gPSBwYXJhbTI7XG59KShzcWwgfHwgKHNxbCA9IHt9KSk7XG4oKFNRTDIpID0+IHtcbiAgY2xhc3MgQWxpYXNlZCB7XG4gICAgY29uc3RydWN0b3Ioc3FsMiwgZmllbGRBbGlhcykge1xuICAgICAgdGhpcy5zcWwgPSBzcWwyO1xuICAgICAgdGhpcy5maWVsZEFsaWFzID0gZmllbGRBbGlhcztcbiAgICB9XG4gICAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMLkFsaWFzZWRcIjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgaXNTZWxlY3Rpb25GaWVsZCA9IGZhbHNlO1xuICAgIGdldFNRTCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNxbDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkKHRoaXMuc3FsLCB0aGlzLmZpZWxkQWxpYXMpO1xuICAgIH1cbiAgfVxuICBTUUwyLkFsaWFzZWQgPSBBbGlhc2VkO1xufSkoU1FMIHx8IChTUUwgPSB7fSkpO1xuY2xhc3MgUGxhY2Vob2xkZXIge1xuICBjb25zdHJ1Y3RvcihuYW1lMikge1xuICAgIHRoaXMubmFtZSA9IG5hbWUyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBsYWNlaG9sZGVyXCI7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwbGFjZWhvbGRlcihuYW1lMikge1xuICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbn1cbmZ1bmN0aW9uIGZpbGxQbGFjZWhvbGRlcnMocGFyYW1zLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHApID0+IHtcbiAgICBpZiAoaXMocCwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoIShwLm5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbHVlIGZvciBwbGFjZWhvbGRlciBcIiR7cC5uYW1lfVwiIHdhcyBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlc1twLm5hbWVdO1xuICAgIH1cbiAgICBpZiAoaXMocCwgUGFyYW0pICYmIGlzKHAudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC52YWx1ZS5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AudmFsdWUubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZXNbcC52YWx1ZS5uYW1lXSk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KTtcbn1cbmNvbnN0IElzRHJpenpsZVZpZXcgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVWaWV3XCIpO1xuY2xhc3MgVmlldyB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlZpZXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVmlld0Jhc2VDb25maWddO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0RyaXp6bGVWaWV3XSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZTogbmFtZTIsIHNjaGVtYSwgc2VsZWN0ZWRGaWVsZHMsIHF1ZXJ5IH0pIHtcbiAgICB0aGlzW1ZpZXdCYXNlQ29uZmlnXSA9IHtcbiAgICAgIG5hbWU6IG5hbWUyLFxuICAgICAgb3JpZ2luYWxOYW1lOiBuYW1lMixcbiAgICAgIHNjaGVtYSxcbiAgICAgIHNlbGVjdGVkRmllbGRzLFxuICAgICAgcXVlcnksXG4gICAgICBpc0V4aXN0aW5nOiAhcXVlcnksXG4gICAgICBpc0FsaWFzOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVmlldyh2aWV3KSB7XG4gIHJldHVybiB0eXBlb2YgdmlldyA9PT0gXCJvYmplY3RcIiAmJiB2aWV3ICE9PSBudWxsICYmIElzRHJpenpsZVZpZXcgaW4gdmlldztcbn1cbmZ1bmN0aW9uIGdldFZpZXdOYW1lKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLm5hbWU7XG59XG5Db2x1bW4ucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcblRhYmxlLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5TdWJxdWVyeS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuZXhwb3J0IHtcbiAgRmFrZVByaW1pdGl2ZVBhcmFtLFxuICBOYW1lLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXcsXG4gIGZpbGxQbGFjZWhvbGRlcnMsXG4gIGdldFZpZXdOYW1lLFxuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBpc1ZpZXcsXG4gIG5hbWUsXG4gIG5vb3BEZWNvZGVyLFxuICBub29wRW5jb2RlcixcbiAgbm9vcE1hcHBlcixcbiAgcGFyYW0sXG4gIHBsYWNlaG9sZGVyLFxuICBzcWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KGNvbHVtbk9iaiwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcInRhYmxlXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uT2JqW3Byb3BdO1xuICB9XG59XG5jbGFzcyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMsIHJlcGxhY2VPcmlnaW5hbE5hbWUpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgdGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lID0gcmVwbGFjZU9yaWdpbmFsTmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLklzQWxpYXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lICYmIHByb3AgPT09IFRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVmlld0Jhc2VDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldFtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIG5hbWU6IHRoaXMuYWxpYXMsXG4gICAgICAgIGlzQWxpYXM6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuQ29sdW1ucykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRhcmdldFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBpZiAoIWNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm94aWVkQ29sdW1ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoY29sdW1ucykubWFwKChrZXkpID0+IHtcbiAgICAgICAgcHJveGllZENvbHVtbnNba2V5XSA9IG5ldyBQcm94eShcbiAgICAgICAgICBjb2x1bW5zW2tleV0sXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJveGllZENvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY2xhc3MgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJzb3VyY2VUYWJsZVwiKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlKHRhcmdldC5zb3VyY2VUYWJsZSwgdGhpcy5hbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gIH1cbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHRhYmxlLCBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzLCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFJlbGF0aW9uKHJlbGF0aW9uLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkocmVsYXRpb24sIG5ldyBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcykpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFRhYmxlQ29sdW1uKGNvbHVtbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIGNvbHVtbixcbiAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KGNvbHVtbi50YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKSlcbiAgKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHF1ZXJ5LCBhbGlhcykge1xuICByZXR1cm4gbmV3IFNRTC5BbGlhc2VkKG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnkuc3FsLCBhbGlhcyksIHF1ZXJ5LmZpZWxkQWxpYXMpO1xufVxuZnVuY3Rpb24gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIHNxbC5qb2luKHF1ZXJ5LnF1ZXJ5Q2h1bmtzLm1hcCgoYykgPT4ge1xuICAgIGlmIChpcyhjLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlQ29sdW1uKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgcmV0dXJuIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIGM7XG4gIH0pKTtcbn1cbmV4cG9ydCB7XG4gIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLFxuICBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIGFsaWFzZWRSZWxhdGlvbixcbiAgYWxpYXNlZFRhYmxlLFxuICBhbGlhc2VkVGFibGVDb2x1bW4sXG4gIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLFxuICBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpYXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBWaWV3IH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5mdW5jdGlvbiBtYXBSZXN1bHRSb3coY29sdW1ucywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKSB7XG4gIGNvbnN0IG51bGxpZnlNYXAgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gY29sdW1ucy5yZWR1Y2UoXG4gICAgKHJlc3VsdDIsIHsgcGF0aCwgZmllbGQgfSwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICBsZXQgbm9kZSA9IHJlc3VsdDI7XG4gICAgICBmb3IgKGNvbnN0IFtwYXRoQ2h1bmtJbmRleCwgcGF0aENodW5rXSBvZiBwYXRoLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAocGF0aENodW5rSW5kZXggPCBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIShwYXRoQ2h1bmsgaW4gbm9kZSkpIHtcbiAgICAgICAgICAgIG5vZGVbcGF0aENodW5rXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZVtwYXRoQ2h1bmtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93W2NvbHVtbkluZGV4XTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbcGF0aENodW5rXSA9IHJhd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBpcyhmaWVsZCwgQ29sdW1uKSAmJiBwYXRoLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IHBhdGhbMF07XG4gICAgICAgICAgICBpZiAoIShvYmplY3ROYW1lIGluIG51bGxpZnlNYXApKSB7XG4gICAgICAgICAgICAgIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPSB2YWx1ZSA9PT0gbnVsbCA/IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPT09IFwic3RyaW5nXCIgJiYgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSAhPT0gZ2V0VGFibGVOYW1lKGZpZWxkLnRhYmxlKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LFxuICAgIHt9XG4gICk7XG4gIGlmIChqb2luc05vdE51bGxhYmxlTWFwICYmIE9iamVjdC5rZXlzKG51bGxpZnlNYXApLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtvYmplY3ROYW1lLCB0YWJsZU5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG51bGxpZnlNYXApKSB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAham9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdKSB7XG4gICAgICAgIHJlc3VsdFtvYmplY3ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcywgcGF0aFByZWZpeCkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZmllbGRzKS5yZWR1Y2UoKHJlc3VsdCwgW25hbWUsIGZpZWxkXSkgPT4ge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgbmV3UGF0aCA9IHBhdGhQcmVmaXggPyBbLi4ucGF0aFByZWZpeCwgbmFtZV0gOiBbbmFtZV07XG4gICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pIHx8IGlzKGZpZWxkLCBTUUwpIHx8IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgcGF0aDogbmV3UGF0aCwgZmllbGQgfSk7XG4gICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgVGFibGUpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSwgbmV3UGF0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkLCBuZXdQYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtdKTtcbn1cbmZ1bmN0aW9uIGhhdmVTYW1lS2V5cyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0S2V5cyA9IE9iamVjdC5rZXlzKGxlZnQpO1xuICBjb25zdCByaWdodEtleXMgPSBPYmplY3Qua2V5cyhyaWdodCk7XG4gIGlmIChsZWZ0S2V5cy5sZW5ndGggIT09IHJpZ2h0S2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2YgbGVmdEtleXMuZW50cmllcygpKSB7XG4gICAgaWYgKGtleSAhPT0gcmlnaHRLZXlzW2luZGV4XSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG1hcFVwZGF0ZVNldCh0YWJsZSwgdmFsdWVzKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdm9pZCAwKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSB8fCBpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtrZXksIG5ldyBQYXJhbSh2YWx1ZSwgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdW2tleV0pXTtcbiAgICB9XG4gIH0pO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWx1ZXMgdG8gc2V0XCIpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5mdW5jdGlvbiBhcHBseU1peGlucyhiYXNlQ2xhc3MsIGV4dGVuZGVkQ2xhc3Nlcykge1xuICBmb3IgKGNvbnN0IGV4dGVuZGVkQ2xhc3Mgb2YgZXh0ZW5kZWRDbGFzc2VzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlKSkge1xuICAgICAgaWYgKG5hbWUgPT09IFwiY29uc3RydWN0b3JcIikgY29udGludWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGJhc2VDbGFzcy5wcm90b3R5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXh0ZW5kZWRDbGFzcy5wcm90b3R5cGUsIG5hbWUpIHx8IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKHRhYmxlKSB7XG4gIHJldHVybiB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG59XG5mdW5jdGlvbiBnZXRWaWV3U2VsZWN0ZWRGaWVsZHModmlldykge1xuICByZXR1cm4gdmlld1tWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG59XG5mdW5jdGlvbiBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKSB7XG4gIHJldHVybiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5uYW1lIDogaXModGFibGUsIFNRTCkgPyB2b2lkIDAgOiB0YWJsZVtUYWJsZS5TeW1ib2wuSXNBbGlhc10gPyB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0gOiB0YWJsZVtUYWJsZS5TeW1ib2wuQmFzZU5hbWVdO1xufVxuZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogdHlwZW9mIGEgPT09IFwic3RyaW5nXCIgJiYgYS5sZW5ndGggPiAwID8gYSA6IFwiXCIsXG4gICAgY29uZmlnOiB0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiA/IGEgOiBiXG4gIH07XG59XG5jb25zdCBfID0ge307XG5jb25zdCBfXyA9IHt9O1xuZnVuY3Rpb24gaXNDb25maWcoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIk9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcImxvZ2dlclwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJsb2dnZXJcIl07XG4gICAgaWYgKHR5cGUgIT09IFwiYm9vbGVhblwiICYmICh0eXBlICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdW1wibG9nUXVlcnlcIl0gIT09IFwiZnVuY3Rpb25cIikgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcInNjaGVtYVwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJzY2hlbWFcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNhc2luZ1wiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjYXNpbmdcIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcIm1vZGVcIiBpbiBkYXRhKSB7XG4gICAgaWYgKGRhdGFbXCJtb2RlXCJdICE9PSBcImRlZmF1bHRcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gXCJwbGFuZXRzY2FsZVwiIHx8IGRhdGFbXCJtb2RlXCJdICE9PSB2b2lkIDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjb25uZWN0aW9uXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNvbm5lY3Rpb25cIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY2xpZW50XCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNsaWVudFwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCB0ZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBuZXcgVGV4dERlY29kZXIoKTtcbmV4cG9ydCB7XG4gIGFwcGx5TWl4aW5zLFxuICBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnLFxuICBnZXRUYWJsZUNvbHVtbnMsXG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIGdldFZpZXdTZWxlY3RlZEZpZWxkcyxcbiAgaGF2ZVNhbWVLZXlzLFxuICBpc0NvbmZpZyxcbiAgbWFwUmVzdWx0Um93LFxuICBtYXBVcGRhdGVTZXQsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHMsXG4gIHRleHREZWNvZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5jbGFzcyBGb3JlaWduS2V5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcmVmZXJlbmNlO1xuICAvKiogQGludGVybmFsICovXG4gIF9vblVwZGF0ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25EZWxldGU7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZywgYWN0aW9ucykge1xuICAgIHRoaXMucmVmZXJlbmNlID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gY29uZmlnKCk7XG4gICAgICByZXR1cm4geyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduVGFibGU6IGZvcmVpZ25Db2x1bW5zWzBdLnRhYmxlLCBmb3JlaWduQ29sdW1ucyB9O1xuICAgIH07XG4gICAgaWYgKGFjdGlvbnMpIHtcbiAgICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9ucy5vblVwZGF0ZTtcbiAgICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9ucy5vbkRlbGV0ZTtcbiAgICB9XG4gIH1cbiAgb25VcGRhdGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25VcGRhdGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb25EZWxldGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25EZWxldGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRm9yZWlnbktleSh0YWJsZSwgdGhpcyk7XG4gIH1cbn1cbmNsYXNzIEZvcmVpZ25LZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgYnVpbGRlcikge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnJlZmVyZW5jZSA9IGJ1aWxkZXIucmVmZXJlbmNlO1xuICAgIHRoaXMub25VcGRhdGUgPSBidWlsZGVyLl9vblVwZGF0ZTtcbiAgICB0aGlzLm9uRGVsZXRlID0gYnVpbGRlci5fb25EZWxldGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRm9yZWlnbktleVwiO1xuICByZWZlcmVuY2U7XG4gIG9uVXBkYXRlO1xuICBvbkRlbGV0ZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSB0aGlzLnJlZmVyZW5jZSgpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGZvcmVpZ25Db2x1bW5OYW1lcyA9IGZvcmVpZ25Db2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgY29uc3QgY2h1bmtzID0gW1xuICAgICAgdGhpcy50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uY29sdW1uTmFtZXMsXG4gICAgICBmb3JlaWduQ29sdW1uc1swXS50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uZm9yZWlnbkNvbHVtbk5hbWVzXG4gICAgXTtcbiAgICByZXR1cm4gbmFtZSA/PyBgJHtjaHVua3Muam9pbihcIl9cIil9X2ZrYDtcbiAgfVxufVxuZnVuY3Rpb24gZm9yZWlnbktleShjb25maWcpIHtcbiAgZnVuY3Rpb24gbWFwcGVkQ29uZmlnKCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgZm9yZWlnbkNvbHVtbnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgcmV0dXJuIG5ldyBGb3JlaWduS2V5QnVpbGRlcihtYXBwZWRDb25maWcpO1xufVxuZXhwb3J0IHtcbiAgRm9yZWlnbktleSxcbiAgRm9yZWlnbktleUJ1aWxkZXIsXG4gIGZvcmVpZ25LZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JlaWduLWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIoY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyB1bmlxdWVLZXlOYW1lKHRoaXMudGFibGUsIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgVW5pcXVlQ29uc3RyYWludCxcbiAgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIsXG4gIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIsXG4gIHVuaXF1ZSxcbiAgdW5pcXVlS2V5TmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS1jb25zdHJhaW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuLi8uLi9jb2x1bW4tYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgdW5pcXVlS2V5TmFtZSB9IGZyb20gXCIuLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuY2xhc3MgU1FMaXRlQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb2x1bW5CdWlsZGVyXCI7XG4gIGZvcmVpZ25LZXlDb25maWdzID0gW107XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUpIHtcbiAgICB0aGlzLmNvbmZpZy5pc1VuaXF1ZSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlTmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2VuZXJhdGVkQWx3YXlzQXMoYXMsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IGNvbmZpZz8ubW9kZSA/PyBcInZpcnR1YWxcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiAoKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRm9yZWlnbktleUJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgIH0pKHJlZiwgYWN0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUNvbHVtbiBleHRlbmRzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy51bmlxdWVOYW1lKSB7XG4gICAgICBjb25maWcudW5pcXVlTmFtZSA9IHVuaXF1ZUtleU5hbWUodGFibGUsIFtjb25maWcubmFtZV0pO1xuICAgIH1cbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uXCI7XG59XG5leHBvcnQge1xuICBTUUxpdGVDb2x1bW4sXG4gIFNRTGl0ZUNvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZywgdGV4dERlY29kZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQmlnSW50QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZUJpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnQodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5mcm9tKSB7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWUuYnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICAgIHJldHVybiBCaWdJbnQoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZS50b1N0cmluZygpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb25CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JKc29uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJqc29uXCIsIFwiU1FMaXRlQmxvYkpzb25cIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb24oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb24gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShidWYudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJidWZmZXJcIiwgXCJTUUxpdGVCbG9iQnVmZmVyXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JCdWZmZXIodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JCdWZmZXJcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxufVxuZnVuY3Rpb24gYmxvYihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJpZ0ludEJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUJpZ0ludCxcbiAgU1FMaXRlQmlnSW50QnVpbGRlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JKc29uLFxuICBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIsXG4gIGJsb2Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9iLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkQ29uZmlnLCBjdXN0b21UeXBlUGFyYW1zKSB7XG4gICAgc3VwZXIobmFtZSwgXCJjdXN0b21cIiwgXCJTUUxpdGVDdXN0b21Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZmllbGRDb25maWcgPSBmaWVsZENvbmZpZztcbiAgICB0aGlzLmNvbmZpZy5jdXN0b21UeXBlUGFyYW1zID0gY3VzdG9tVHlwZVBhcmFtcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCI7XG4gIHNxbE5hbWU7XG4gIG1hcFRvO1xuICBtYXBGcm9tO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5zcWxOYW1lID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZGF0YVR5cGUoY29uZmlnLmZpZWxkQ29uZmlnKTtcbiAgICB0aGlzLm1hcFRvID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMudG9Ecml2ZXI7XG4gICAgdGhpcy5tYXBGcm9tID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZnJvbURyaXZlcjtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNxbE5hbWU7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcEZyb20gPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMubWFwRnJvbSh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcFRvID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcFRvKHZhbHVlKSA6IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjdXN0b21UeXBlKGN1c3RvbVR5cGVQYXJhbXMpIHtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyKFxuICAgICAgbmFtZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN1c3RvbVR5cGVQYXJhbXNcbiAgICApO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uLFxuICBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyLFxuICBjdXN0b21UeXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICBzdXBlcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSk7XG4gICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IGZhbHNlO1xuICB9XG4gIHByaW1hcnlLZXkoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZz8uYXV0b0luY3JlbWVudCkge1xuICAgICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiBzdXBlci5wcmltYXJ5S2V5KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJcIjtcbiAgYXV0b0luY3JlbWVudCA9IHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQ7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZUludGVnZXJcIik7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXIoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW50ZWdlclwiO1xufVxuY2xhc3MgU1FMaXRlVGltZXN0YW1wQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgbW9kZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiZGF0ZVwiLCBcIlNRTGl0ZVRpbWVzdGFtcFwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWZhdWx0KClgIHdpdGggeW91ciBvd24gZXhwcmVzc2lvbiBpbnN0ZWFkLlxuICAgKlxuICAgKiBBZGRzIGBERUZBVUxUIChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgIHRvIHRoZSBjb2x1bW4sIHdoaWNoIGlzIHRoZSBjdXJyZW50IGVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBkZWZhdWx0Tm93KCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHQoc3FsYChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgKTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcCBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGltZXN0YW1wXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlICogMWUzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgY29uc3QgdW5peCA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodW5peCAvIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiB1bml4O1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJvb2xlYW5cIiwgXCJTUUxpdGVCb29sZWFuXCIpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSBtb2RlO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJvb2xlYW4gZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5cIjtcbiAgbW9kZSA9IHRoaXMuY29uZmlnLm1vZGU7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpID09PSAxO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPyAxIDogMDtcbiAgfVxufVxuZnVuY3Rpb24gaW50ZWdlcihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcInRpbWVzdGFtcFwiIHx8IGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBfbXNcIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJvb2xlYW5CdWlsZGVyKG5hbWUsIGNvbmZpZy5tb2RlKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXJCdWlsZGVyKG5hbWUpO1xufVxuY29uc3QgaW50ID0gaW50ZWdlcjtcbmV4cG9ydCB7XG4gIFNRTGl0ZUJhc2VJbnRlZ2VyLFxuICBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZUJvb2xlYW4sXG4gIFNRTGl0ZUJvb2xlYW5CdWlsZGVyLFxuICBTUUxpdGVJbnRlZ2VyLFxuICBTUUxpdGVJbnRlZ2VyQnVpbGRlcixcbiAgU1FMaXRlVGltZXN0YW1wLFxuICBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyLFxuICBpbnQsXG4gIGludGVnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlTnVtZXJpY0J1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0J1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiU1FMaXRlTnVtZXJpY1wiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWMgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlTnVtZXJpY051bWJlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljTnVtYmVyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljTnVtYmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlID0gU3RyaW5nO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYmlnaW50XCIsIFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljQmlnSW50KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSA9IEJpZ0ludDtcbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIG51bWVyaWMoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZz8ubW9kZTtcbiAgcmV0dXJuIG1vZGUgPT09IFwibnVtYmVyXCIgPyBuZXcgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIobmFtZSkgOiBtb2RlID09PSBcImJpZ2ludFwiID8gbmV3IFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyKG5hbWUpIDogbmV3IFNRTGl0ZU51bWVyaWNCdWlsZGVyKG5hbWUpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlTnVtZXJpYyxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludCxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZU51bWVyaWNCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlcixcbiAgbnVtZXJpY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWVyaWMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVSZWFsQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVSZWFsXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVJlYWwodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVhbCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJlYWxcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJyZWFsXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWwobmFtZSkge1xuICByZXR1cm4gbmV3IFNRTGl0ZVJlYWxCdWlsZGVyKG5hbWUgPz8gXCJcIik7XG59XG5leHBvcnQge1xuICBTUUxpdGVSZWFsLFxuICBTUUxpdGVSZWFsQnVpbGRlcixcbiAgcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVUZXh0QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb25maWcpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZVRleHRcIik7XG4gICAgdGhpcy5jb25maWcuZW51bVZhbHVlcyA9IGNvbmZpZy5lbnVtO1xuICAgIHRoaXMuY29uZmlnLmxlbmd0aCA9IGNvbmZpZy5sZW5ndGg7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dFwiO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bVZhbHVlcztcbiAgbGVuZ3RoID0gdGhpcy5jb25maWcubGVuZ3RoO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gYHRleHQke3RoaXMuY29uZmlnLmxlbmd0aCA/IGAoJHt0aGlzLmNvbmZpZy5sZW5ndGh9KWAgOiBcIlwifWA7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0SnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZVRleHRKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiB0ZXh0KGEsIGIgPSB7fSkge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dEpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlVGV4dEJ1aWxkZXIobmFtZSwgY29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVRleHQsXG4gIFNRTGl0ZVRleHRCdWlsZGVyLFxuICBTUUxpdGVUZXh0SnNvbixcbiAgU1FMaXRlVGV4dEpzb25CdWlsZGVyLFxuICB0ZXh0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLCBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIFNlbGVjdGlvblByb3h5SGFuZGxlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNlbGVjdGlvblByb3h5SGFuZGxlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgfVxuICBnZXQoc3VicXVlcnksIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJfXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN1YnF1ZXJ5W1wiX1wiXSxcbiAgICAgICAgc2VsZWN0ZWRGaWVsZHM6IG5ldyBQcm94eShcbiAgICAgICAgICBzdWJxdWVyeS5fLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnlbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSB7XG4gICAgICByZXR1cm4gc3VicXVlcnlbcHJvcF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSBpcyhzdWJxdWVyeSwgU3VicXVlcnkpID8gc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHN1YnF1ZXJ5LCBWaWV3KSA/IHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHN1YnF1ZXJ5O1xuICAgIGNvbnN0IHZhbHVlID0gY29sdW1uc1twcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEFsaWFzZWRCZWhhdmlvciA9PT0gXCJzcWxcIiAmJiAhdmFsdWUuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3FsO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5jbG9uZSgpO1xuICAgICAgbmV3VmFsdWUuaXNTZWxlY3Rpb25GaWVsZCA9IHRydWU7XG4gICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEJlaGF2aW9yID09PSBcInNxbFwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSB0cmllZCB0byByZWZlcmVuY2UgXCIke3Byb3B9XCIgZmllbGQgZnJvbSBhIHN1YnF1ZXJ5LCB3aGljaCBpcyBhIHJhdyBTUUwgZmllbGQsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgYW4gYWxpYXMgZGVjbGFyZWQuIFBsZWFzZSBhZGQgYW4gYWxpYXMgdG8gdGhlIGZpZWxkIHVzaW5nIFwiLmFzKCdhbGlhcycpXCIgbWV0aG9kLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKFxuICAgICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgICB2YWx1ZS50YWJsZSxcbiAgICAgICAgICAgICAgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGhpcy5jb25maWcuYWxpYXMsIHRoaXMuY29uZmlnLnJlcGxhY2VPcmlnaW5hbE5hbWUgPz8gZmFsc2UpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIodGhpcy5jb25maWcpKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU2VsZWN0aW9uUHJveHlIYW5kbGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0aW9uLXByb3h5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgUXVlcnlQcm9taXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJRdWVyeVByb21pc2VcIjtcbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlQcm9taXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktcHJvbWlzZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGJsb2IgfSBmcm9tIFwiLi9ibG9iLmpzXCI7XG5pbXBvcnQgeyBjdXN0b21UeXBlIH0gZnJvbSBcIi4vY3VzdG9tLmpzXCI7XG5pbXBvcnQgeyBpbnRlZ2VyIH0gZnJvbSBcIi4vaW50ZWdlci5qc1wiO1xuaW1wb3J0IHsgbnVtZXJpYyB9IGZyb20gXCIuL251bWVyaWMuanNcIjtcbmltcG9ydCB7IHJlYWwgfSBmcm9tIFwiLi9yZWFsLmpzXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4vdGV4dC5qc1wiO1xuZnVuY3Rpb24gZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYmxvYixcbiAgICBjdXN0b21UeXBlLFxuICAgIGludGVnZXIsXG4gICAgbnVtZXJpYyxcbiAgICByZWFsLFxuICAgIHRleHRcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRTUUxpdGVDb2x1bW5CdWlsZGVycyB9IGZyb20gXCIuL2NvbHVtbnMvYWxsLmpzXCI7XG5jb25zdCBJbmxpbmVGb3JlaWduS2V5cyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNRTGl0ZUlubGluZUZvcmVpZ25LZXlzXCIpO1xuY2xhc3MgU1FMaXRlVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlLlN5bWJvbCwge1xuICAgIElubGluZUZvcmVpZ25LZXlzXG4gIH0pO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgU1FMaXRlVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRTUUxpdGVDb2x1bW5CdWlsZGVycygpKSA6IGNvbHVtbnM7XG4gIGNvbnN0IGJ1aWx0Q29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZChyYXdUYWJsZSk7XG4gICAgICByYXdUYWJsZVtJbmxpbmVGb3JlaWduS2V5c10ucHVzaCguLi5jb2xCdWlsZGVyLmJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCByYXdUYWJsZSkpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIGlmIChleHRyYUNvbmZpZykge1xuICAgIHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3Qgc3FsaXRlVGFibGUgPSAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZyk7XG59O1xuZnVuY3Rpb24gc3FsaXRlVGFibGVDcmVhdG9yKGN1c3RvbWl6ZVRhYmxlTmFtZSkge1xuICByZXR1cm4gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFNRTGl0ZVRhYmxlLFxuICBzcWxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGVDcmVhdG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuY2xhc3MgSW5kZXhCdWlsZGVyT24ge1xuICBjb25zdHJ1Y3RvcihuYW1lLCB1bmlxdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudW5pcXVlID0gdW5pcXVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlck9uXCI7XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4QnVpbGRlcih0aGlzLm5hbWUsIGNvbHVtbnMsIHRoaXMudW5pcXVlKTtcbiAgfVxufVxuY2xhc3MgSW5kZXhCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb2x1bW5zLCB1bmlxdWUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdW5pcXVlLFxuICAgICAgd2hlcmU6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENvbmRpdGlvbiBmb3IgcGFydGlhbCBpbmRleC5cbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbikge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4KHRoaXMuY29uZmlnLCB0YWJsZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIHRhYmxlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZywgdGFibGUgfTtcbiAgfVxufVxuZnVuY3Rpb24gaW5kZXgobmFtZSkge1xuICByZXR1cm4gbmV3IEluZGV4QnVpbGRlck9uKG5hbWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCB0cnVlKTtcbn1cbmV4cG9ydCB7XG4gIEluZGV4LFxuICBJbmRleEJ1aWxkZXIsXG4gIEluZGV4QnVpbGRlck9uLFxuICBpbmRleCxcbiAgdW5pcXVlSW5kZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleGVzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ2hlY2tCdWlsZGVyIH0gZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgSW5kZXhCdWlsZGVyIH0gZnJvbSBcIi4vaW5kZXhlcy5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wcmltYXJ5LWtleXMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSBcIi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmZ1bmN0aW9uIGdldFRhYmxlQ29uZmlnKHRhYmxlKSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBPYmplY3QudmFsdWVzKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gIGNvbnN0IGluZGV4ZXMgPSBbXTtcbiAgY29uc3QgY2hlY2tzID0gW107XG4gIGNvbnN0IHByaW1hcnlLZXlzID0gW107XG4gIGNvbnN0IHVuaXF1ZUNvbnN0cmFpbnRzID0gW107XG4gIGNvbnN0IGZvcmVpZ25LZXlzID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuSW5saW5lRm9yZWlnbktleXNdKTtcbiAgY29uc3QgbmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgY29uc3QgZXh0cmFDb25maWdCdWlsZGVyID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl07XG4gIGlmIChleHRyYUNvbmZpZ0J1aWxkZXIgIT09IHZvaWQgMCkge1xuICAgIGNvbnN0IGV4dHJhQ29uZmlnID0gZXh0cmFDb25maWdCdWlsZGVyKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gICAgY29uc3QgZXh0cmFWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGV4dHJhQ29uZmlnKSA/IGV4dHJhQ29uZmlnLmZsYXQoMSkgOiBPYmplY3QudmFsdWVzKGV4dHJhQ29uZmlnKTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgT2JqZWN0LnZhbHVlcyhleHRyYVZhbHVlcykpIHtcbiAgICAgIGlmIChpcyhidWlsZGVyLCBJbmRleEJ1aWxkZXIpKSB7XG4gICAgICAgIGluZGV4ZXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIENoZWNrQnVpbGRlcikpIHtcbiAgICAgICAgY2hlY2tzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBVbmlxdWVDb25zdHJhaW50QnVpbGRlcikpIHtcbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICBwcmltYXJ5S2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgRm9yZWlnbktleUJ1aWxkZXIpKSB7XG4gICAgICAgIGZvcmVpZ25LZXlzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbHVtbnMsXG4gICAgaW5kZXhlcyxcbiAgICBmb3JlaWduS2V5cyxcbiAgICBjaGVja3MsXG4gICAgcHJpbWFyeUtleXMsXG4gICAgdW5pcXVlQ29uc3RyYWludHMsXG4gICAgbmFtZVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkge1xuICBpZiAoaXModGFibGUsIFNRTGl0ZVRhYmxlKSkge1xuICAgIHJldHVybiBbYCR7dGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXX1gXTtcbiAgfVxuICBpZiAoaXModGFibGUsIFN1YnF1ZXJ5KSkge1xuICAgIHJldHVybiB0YWJsZS5fLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTUUwpKSB7XG4gICAgcmV0dXJuIHRhYmxlLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld0NvbmZpZyh2aWV3KSB7XG4gIHJldHVybiB7XG4gICAgLi4udmlld1tWaWV3QmFzZUNvbmZpZ11cbiAgICAvLyAuLi52aWV3W1NRTGl0ZVZpZXdDb25maWddLFxuICB9O1xufVxuZXhwb3J0IHtcbiAgZXh0cmFjdFVzZWRUYWJsZSxcbiAgZ2V0VGFibGVDb25maWcsXG4gIGdldFZpZXdDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5jbGFzcyBTUUxpdGVEZWxldGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgd2l0aExpc3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEZWxldGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZGVsZXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgZGVsZXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZERlbGV0ZVF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZURlbGV0ZUJhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxldGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiB0b1NuYWtlQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5tYXAoKHdvcmQpID0+IHdvcmQudG9Mb3dlckNhc2UoKSkuam9pbihcIl9cIik7XG59XG5mdW5jdGlvbiB0b0NhbWVsQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5yZWR1Y2UoKGFjYywgd29yZCwgaSkgPT4ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFdvcmQgPSBpID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogYCR7d29yZFswXS50b1VwcGVyQ2FzZSgpfSR7d29yZC5zbGljZSgxKX1gO1xuICAgIHJldHVybiBhY2MgKyBmb3JtYXR0ZWRXb3JkO1xuICB9LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIG5vb3BDYXNlKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dDtcbn1cbmNsYXNzIENhc2luZ0NhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FzaW5nQ2FjaGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjYWNoZSA9IHt9O1xuICBjYWNoZWRUYWJsZXMgPSB7fTtcbiAgY29udmVydDtcbiAgY29uc3RydWN0b3IoY2FzaW5nKSB7XG4gICAgdGhpcy5jb252ZXJ0ID0gY2FzaW5nID09PSBcInNuYWtlX2Nhc2VcIiA/IHRvU25ha2VDYXNlIDogY2FzaW5nID09PSBcImNhbWVsQ2FzZVwiID8gdG9DYW1lbENhc2UgOiBub29wQ2FzZTtcbiAgfVxuICBnZXRDb2x1bW5DYXNpbmcoY29sdW1uKSB7XG4gICAgaWYgKCFjb2x1bW4ua2V5QXNOYW1lKSByZXR1cm4gY29sdW1uLm5hbWU7XG4gICAgY29uc3Qgc2NoZW1hID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IGtleSA9IGAke3NjaGVtYX0uJHt0YWJsZU5hbWV9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgdGhpcy5jYWNoZVRhYmxlKGNvbHVtbi50YWJsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gIH1cbiAgY2FjaGVUYWJsZSh0YWJsZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgY29uc3QgdGFibGVLZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlZFRhYmxlc1t0YWJsZUtleV0pIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXModGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdKSkge1xuICAgICAgICBjb25zdCBjb2x1bW5LZXkgPSBgJHt0YWJsZUtleX0uJHtjb2x1bW4ubmFtZX1gO1xuICAgICAgICB0aGlzLmNhY2hlW2NvbHVtbktleV0gPSB0aGlzLmNvbnZlcnQoY29sdW1uLm5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5jYWNoZWRUYWJsZXMgPSB7fTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ2FzaW5nQ2FjaGUsXG4gIHRvQ2FtZWxDYXNlLFxuICB0b1NuYWtlQ2FzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc2luZy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIERyaXp6bGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRHJpenpsZUVycm9yXCI7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY2F1c2UgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiRHJpenpsZUVycm9yXCI7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5jbGFzcyBEcml6emxlUXVlcnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocXVlcnksIHBhcmFtcywgY2F1c2UpIHtcbiAgICBzdXBlcihgRmFpbGVkIHF1ZXJ5OiAke3F1ZXJ5fVxucGFyYW1zOiAke3BhcmFtc31gKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIERyaXp6bGVRdWVyeUVycm9yKTtcbiAgICBpZiAoY2F1c2UpIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIGV4dGVuZHMgRHJpenpsZUVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXCI7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgbWVzc2FnZTogXCJSb2xsYmFja1wiIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBEcml6emxlRXJyb3IsXG4gIERyaXp6bGVRdWVyeUVycm9yLFxuICBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGdldFBnQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpQZ0lubGluZUZvcmVpZ25LZXlzXCIpO1xuY29uc3QgRW5hYmxlUkxTID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RW5hYmxlUkxTXCIpO1xuY2xhc3MgUGdUYWJsZSBleHRlbmRzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgICBFbmFibGVSTFNcbiAgfSk7XG4gIC8qKkBpbnRlcm5hbCAqL1xuICBbSW5saW5lRm9yZWlnbktleXNdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0VuYWJsZVJMU10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0ge307XG59XG5mdW5jdGlvbiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgUGdUYWJsZShuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKTtcbiAgY29uc3QgcGFyc2VkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcImZ1bmN0aW9uXCIgPyBjb2x1bW5zKGdldFBnQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgYnVpbHRDb2x1bW5zRm9yRXh0cmFDb25maWcgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbihyYXdUYWJsZSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IHRhYmxlID0gT2JqZWN0LmFzc2lnbihyYXdUYWJsZSwgYnVpbHRDb2x1bW5zKTtcbiAgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFibGUsIHtcbiAgICBlbmFibGVSTFM6ICgpID0+IHtcbiAgICAgIHRhYmxlW1BnVGFibGUuU3ltYm9sLkVuYWJsZVJMU10gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBwZ1RhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwKTtcbn07XG5mdW5jdGlvbiBwZ1RhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgRW5hYmxlUkxTLFxuICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgUGdUYWJsZSxcbiAgcGdUYWJsZSxcbiAgcGdUYWJsZUNyZWF0b3IsXG4gIHBnVGFibGVXaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiBwcmltYXJ5S2V5KC4uLmNvbmZpZykge1xuICBpZiAoY29uZmlnWzBdLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlCdWlsZGVyKGNvbmZpZ1swXS5jb2x1bW5zLCBjb25maWdbMF0ubmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWcpO1xufVxuY2xhc3MgUHJpbWFyeUtleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXkodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgUHJpbWFyeUtleSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lID8/IGAke3RoaXMudGFibGVbUGdUYWJsZS5TeW1ib2wuTmFtZV19XyR7dGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkuam9pbihcIl9cIil9X3BrYDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUHJpbWFyeUtleSxcbiAgUHJpbWFyeUtleUJ1aWxkZXIsXG4gIHByaW1hcnlLZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmltYXJ5LWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgc3FsLFxuICBTdHJpbmdDaHVuayxcbiAgVmlld1xufSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBiaW5kSWZQYXJhbSh2YWx1ZSwgY29sdW1uKSB7XG4gIGlmIChpc0RyaXZlclZhbHVlRW5jb2Rlcihjb2x1bW4pICYmICFpc1NRTFdyYXBwZXIodmFsdWUpICYmICFpcyh2YWx1ZSwgUGFyYW0pICYmICFpcyh2YWx1ZSwgUGxhY2Vob2xkZXIpICYmICFpcyh2YWx1ZSwgQ29sdW1uKSAmJiAhaXModmFsdWUsIFRhYmxlKSAmJiAhaXModmFsdWUsIFZpZXcpKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgY29sdW1uKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBlcSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IG5lID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8PiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmZ1bmN0aW9uIGFuZCguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgYW5kIFwiKSksXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICBdKTtcbn1cbmZ1bmN0aW9uIG9yKC4uLnVuZmlsdGVyZWRDb25kaXRpb25zKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSB1bmZpbHRlcmVkQ29uZGl0aW9ucy5maWx0ZXIoXG4gICAgKGMpID0+IGMgIT09IHZvaWQgMFxuICApO1xuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgU1FMKGNvbmRpdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKFtcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgIHNxbC5qb2luKGNvbmRpdGlvbnMsIG5ldyBTdHJpbmdDaHVuayhcIiBvciBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBub3QoY29uZGl0aW9uKSB7XG4gIHJldHVybiBzcWxgbm90ICR7Y29uZGl0aW9ufWA7XG59XG5jb25zdCBndCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGd0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPj0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPCAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGx0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBpbkFycmF5KGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNxbGBmYWxzZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IGluICR7dmFsdWVzLm1hcCgodikgPT4gYmluZElmUGFyYW0odiwgY29sdW1uKSl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbm90SW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgdHJ1ZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGluICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBudWxsYDtcbn1cbmZ1bmN0aW9uIGlzTm90TnVsbCh2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7dmFsdWV9IGlzIG5vdCBudWxsYDtcbn1cbmZ1bmN0aW9uIGV4aXN0cyhzdWJxdWVyeSkge1xuICByZXR1cm4gc3FsYGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBub3RFeGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBub3QgZXhpc3RzICR7c3VicXVlcnl9YDtcbn1cbmZ1bmN0aW9uIGJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBiZXR3ZWVuICR7YmluZElmUGFyYW0obWluLCBjb2x1bW4pfSBhbmQgJHtiaW5kSWZQYXJhbShcbiAgICBtYXgsXG4gICAgY29sdW1uXG4gICl9YDtcbn1cbmZ1bmN0aW9uIG5vdEJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgYmV0d2VlbiAke2JpbmRJZlBhcmFtKFxuICAgIG1pbixcbiAgICBjb2x1bW5cbiAgKX0gYW5kICR7YmluZElmUGFyYW0obWF4LCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RMaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gaWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RJbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlDb250YWlucyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gQD4gJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5lZChjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbmVkIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSA8QCAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGFycmF5T3ZlcmxhcHMoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheU92ZXJsYXBzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSAmJiAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmV4cG9ydCB7XG4gIGFuZCxcbiAgYXJyYXlDb250YWluZWQsXG4gIGFycmF5Q29udGFpbnMsXG4gIGFycmF5T3ZlcmxhcHMsXG4gIGJldHdlZW4sXG4gIGJpbmRJZlBhcmFtLFxuICBlcSxcbiAgZXhpc3RzLFxuICBndCxcbiAgZ3RlLFxuICBpbGlrZSxcbiAgaW5BcnJheSxcbiAgaXNOb3ROdWxsLFxuICBpc051bGwsXG4gIGxpa2UsXG4gIGx0LFxuICBsdGUsXG4gIG5lLFxuICBub3QsXG4gIG5vdEJldHdlZW4sXG4gIG5vdEV4aXN0cyxcbiAgbm90SWxpa2UsXG4gIG5vdEluQXJyYXksXG4gIG5vdExpa2UsXG4gIG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZGl0aW9ucy5qcy5tYXAiLAogICAgImltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwuanNcIjtcbmZ1bmN0aW9uIGFzYyhjb2x1bW4pIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYXNjYDtcbn1cbmZ1bmN0aW9uIGRlc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGRlc2NgO1xufVxuZXhwb3J0IHtcbiAgYXNjLFxuICBkZXNjXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQcmltYXJ5S2V5QnVpbGRlciB9IGZyb20gXCIuL3BnLWNvcmUvcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQge1xuICBhbmQsXG4gIGFzYyxcbiAgYmV0d2VlbixcbiAgZGVzYyxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufSBmcm9tIFwiLi9zcWwvZXhwcmVzc2lvbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCByZWxhdGlvbk5hbWUpIHtcbiAgICB0aGlzLnNvdXJjZVRhYmxlID0gc291cmNlVGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGUgPSByZWZlcmVuY2VkVGFibGU7XG4gICAgdGhpcy5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvblwiO1xuICByZWZlcmVuY2VkVGFibGVOYW1lO1xuICBmaWVsZE5hbWU7XG59XG5jbGFzcyBSZWxhdGlvbnMge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uc1wiO1xufVxuY2xhc3MgT25lIGV4dGVuZHMgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcsIGlzTnVsbGFibGUpIHtcbiAgICBzdXBlcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWc/LnJlbGF0aW9uTmFtZSk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc051bGxhYmxlID0gaXNOdWxsYWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJPbmVcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBPbmUoXG4gICAgICB0aGlzLnNvdXJjZVRhYmxlLFxuICAgICAgdGhpcy5yZWZlcmVuY2VkVGFibGUsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIHRoaXMuaXNOdWxsYWJsZVxuICAgICk7XG4gICAgcmVsYXRpb24uZmllbGROYW1lID0gZmllbGROYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxufVxuY2xhc3MgTWFueSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk1hbnlcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBNYW55KFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBhbmQsXG4gICAgYmV0d2VlbixcbiAgICBlcSxcbiAgICBleGlzdHMsXG4gICAgZ3QsXG4gICAgZ3RlLFxuICAgIGlsaWtlLFxuICAgIGluQXJyYXksXG4gICAgaXNOdWxsLFxuICAgIGlzTm90TnVsbCxcbiAgICBsaWtlLFxuICAgIGx0LFxuICAgIGx0ZSxcbiAgICBuZSxcbiAgICBub3QsXG4gICAgbm90QmV0d2VlbixcbiAgICBub3RFeGlzdHMsXG4gICAgbm90TGlrZSxcbiAgICBub3RJbGlrZSxcbiAgICBub3RJbkFycmF5LFxuICAgIG9yLFxuICAgIHNxbFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0T3JkZXJCeU9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBzcWwsXG4gICAgYXNjLFxuICAgIGRlc2NcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnKHNjaGVtYSwgY29uZmlnSGVscGVycykge1xuICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDEgJiYgXCJkZWZhdWx0XCIgaW4gc2NoZW1hICYmICFpcyhzY2hlbWFbXCJkZWZhdWx0XCJdLCBUYWJsZSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWFbXCJkZWZhdWx0XCJdO1xuICB9XG4gIGNvbnN0IHRhYmxlTmFtZXNNYXAgPSB7fTtcbiAgY29uc3QgcmVsYXRpb25zQnVmZmVyID0ge307XG4gIGNvbnN0IHRhYmxlc0NvbmZpZyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgaWYgKGlzKHZhbHVlLCBUYWJsZSkpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZSk7XG4gICAgICBjb25zdCBidWZmZXJlZFJlbGF0aW9ucyA9IHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdO1xuICAgICAgdGFibGVOYW1lc01hcFtkYk5hbWVdID0ga2V5O1xuICAgICAgdGFibGVzQ29uZmlnW2tleV0gPSB7XG4gICAgICAgIHRzTmFtZToga2V5LFxuICAgICAgICBkYk5hbWU6IHZhbHVlW1RhYmxlLlN5bWJvbC5OYW1lXSxcbiAgICAgICAgc2NoZW1hOiB2YWx1ZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSxcbiAgICAgICAgY29sdW1uczogdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICByZWxhdGlvbnM6IGJ1ZmZlcmVkUmVsYXRpb25zPy5yZWxhdGlvbnMgPz8ge30sXG4gICAgICAgIHByaW1hcnlLZXk6IGJ1ZmZlcmVkUmVsYXRpb25zPy5wcmltYXJ5S2V5ID8/IFtdXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdXG4gICAgICApKSB7XG4gICAgICAgIGlmIChjb2x1bW4ucHJpbWFyeSkge1xuICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBleHRyYUNvbmZpZyA9IHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdPy4odmFsdWVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10pO1xuICAgICAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29uZmlnRW50cnkgb2YgT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZykpIHtcbiAgICAgICAgICBpZiAoaXMoY29uZmlnRW50cnksIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICAgICAgdGFibGVzQ29uZmlnW2tleV0ucHJpbWFyeUtleS5wdXNoKC4uLmNvbmZpZ0VudHJ5LmNvbHVtbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXModmFsdWUsIFJlbGF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZS50YWJsZSk7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVzTWFwW2RiTmFtZV07XG4gICAgICBjb25zdCByZWxhdGlvbnMyID0gdmFsdWUuY29uZmlnKFxuICAgICAgICBjb25maWdIZWxwZXJzKHZhbHVlLnRhYmxlKVxuICAgICAgKTtcbiAgICAgIGxldCBwcmltYXJ5S2V5O1xuICAgICAgZm9yIChjb25zdCBbcmVsYXRpb25OYW1lLCByZWxhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMikpIHtcbiAgICAgICAgaWYgKHRhYmxlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gdGFibGVzQ29uZmlnW3RhYmxlTmFtZV07XG4gICAgICAgICAgdGFibGVDb25maWcucmVsYXRpb25zW3JlbGF0aW9uTmFtZV0gPSByZWxhdGlvbjtcbiAgICAgICAgICBpZiAocHJpbWFyeUtleSkge1xuICAgICAgICAgICAgdGFibGVDb25maWcucHJpbWFyeUtleS5wdXNoKC4uLnByaW1hcnlLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShkYk5hbWUgaW4gcmVsYXRpb25zQnVmZmVyKSkge1xuICAgICAgICAgICAgcmVsYXRpb25zQnVmZmVyW2RiTmFtZV0gPSB7XG4gICAgICAgICAgICAgIHJlbGF0aW9uczoge30sXG4gICAgICAgICAgICAgIHByaW1hcnlLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgdGFibGVzOiB0YWJsZXNDb25maWcsIHRhYmxlTmFtZXNNYXAgfTtcbn1cbmZ1bmN0aW9uIHJlbGF0aW9ucyh0YWJsZSwgcmVsYXRpb25zMikge1xuICByZXR1cm4gbmV3IFJlbGF0aW9ucyhcbiAgICB0YWJsZSxcbiAgICAoaGVscGVycykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMihoZWxwZXJzKSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZS53aXRoRmllbGROYW1lKGtleSlcbiAgICAgIF0pXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlT25lKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvbmUodGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgT25lKFxuICAgICAgc291cmNlVGFibGUsXG4gICAgICB0YWJsZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZz8uZmllbGRzLnJlZHVjZSgocmVzLCBmKSA9PiByZXMgJiYgZi5ub3ROdWxsLCB0cnVlKSA/PyBmYWxzZVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtYW55KHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBNYW55KHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZyk7XG4gIH07XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKSB7XG4gIGlmIChpcyhyZWxhdGlvbiwgT25lKSAmJiByZWxhdGlvbi5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZWxhdGlvbi5jb25maWcuZmllbGRzLFxuICAgICAgcmVmZXJlbmNlczogcmVsYXRpb24uY29uZmlnLnJlZmVyZW5jZXNcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSldO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZVRzTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUYWJsZSBcIiR7cmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZFRhYmxlQ29uZmlnID0gc2NoZW1hW3JlZmVyZW5jZWRUYWJsZVRzTmFtZV07XG4gIGlmICghcmVmZXJlbmNlZFRhYmxlQ29uZmlnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgKTtcbiAgfVxuICBjb25zdCBzb3VyY2VUYWJsZSA9IHJlbGF0aW9uLnNvdXJjZVRhYmxlO1xuICBjb25zdCBzb3VyY2VUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHNvdXJjZVRhYmxlKV07XG4gIGlmICghc291cmNlVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3NvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmV2ZXJzZVJlbGF0aW9ucyA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgcmVmZXJlbmNlZFRhYmxlQ29uZmlnLnJlbGF0aW9uc1xuICApKSB7XG4gICAgaWYgKHJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWxhdGlvbiAhPT0gcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24gJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVsYXRpb25OYW1lID09PSByZWxhdGlvbi5yZWxhdGlvbk5hbWUgfHwgIXJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWZlcmVuY2VkVGFibGVSZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUgPT09IHJlbGF0aW9uLnNvdXJjZVRhYmxlKSB7XG4gICAgICByZXZlcnNlUmVsYXRpb25zLnB1c2gocmVmZXJlbmNlZFRhYmxlUmVsYXRpb24pO1xuICAgIH1cbiAgfVxuICBpZiAocmV2ZXJzZVJlbGF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgcmVsYXRpb24ucmVsYXRpb25OYW1lID8gbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgd2l0aCBuYW1lIFwiJHtyZWxhdGlvbi5yZWxhdGlvbk5hbWV9XCIgaW4gdGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cImBcbiAgICApIDogbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgYmV0d2VlbiBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIGFuZCBcIiR7cmVsYXRpb24uc291cmNlVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiLiBQbGVhc2Ugc3BlY2lmeSByZWxhdGlvbiBuYW1lYFxuICAgICk7XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnNbMF0gJiYgaXMocmV2ZXJzZVJlbGF0aW9uc1swXSwgT25lKSAmJiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnLnJlZmVyZW5jZXMsXG4gICAgICByZWZlcmVuY2VzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5maWVsZHNcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiB0byBpbmZlciByZWxhdGlvbiBcIiR7c291cmNlVGFibGVUc05hbWV9LiR7cmVsYXRpb24uZmllbGROYW1lfVwiYFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiB7XG4gICAgb25lOiBjcmVhdGVPbmUoc291cmNlVGFibGUpLFxuICAgIG1hbnk6IGNyZWF0ZU1hbnkoc291cmNlVGFibGUpXG4gIH07XG59XG5mdW5jdGlvbiBtYXBSZWxhdGlvbmFsUm93KHRhYmxlc0NvbmZpZywgdGFibGVDb25maWcsIHJvdywgYnVpbGRRdWVyeVJlc3VsdFNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUgPSAodmFsdWUpID0+IHZhbHVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtcbiAgICBzZWxlY3Rpb25JdGVtSW5kZXgsXG4gICAgc2VsZWN0aW9uSXRlbVxuICBdIG9mIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24uZW50cmllcygpKSB7XG4gICAgaWYgKHNlbGVjdGlvbkl0ZW0uaXNKc29uKSB7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tzZWxlY3Rpb25JdGVtLnRzS2V5XTtcbiAgICAgIGNvbnN0IHJhd1N1YlJvd3MgPSByb3dbc2VsZWN0aW9uSXRlbUluZGV4XTtcbiAgICAgIGNvbnN0IHN1YlJvd3MgPSB0eXBlb2YgcmF3U3ViUm93cyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UocmF3U3ViUm93cykgOiByYXdTdWJSb3dzO1xuICAgICAgcmVzdWx0W3NlbGVjdGlvbkl0ZW0udHNLZXldID0gaXMocmVsYXRpb24sIE9uZSkgPyBzdWJSb3dzICYmIG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgdGFibGVzQ29uZmlnW3NlbGVjdGlvbkl0ZW0ucmVsYXRpb25UYWJsZVRzS2V5XSxcbiAgICAgICAgc3ViUm93cyxcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5zZWxlY3Rpb24sXG4gICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICApIDogc3ViUm93cy5tYXAoXG4gICAgICAgIChzdWJSb3cpID0+IG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgICAgdGFibGVzQ29uZmlnLFxuICAgICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgICAgc3ViUm93LFxuICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbWFwQ29sdW1uVmFsdWUocm93W3NlbGVjdGlvbkl0ZW1JbmRleF0pO1xuICAgICAgY29uc3QgZmllbGQgPSBzZWxlY3Rpb25JdGVtLmZpZWxkO1xuICAgICAgbGV0IGRlY29kZXI7XG4gICAgICBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuZGVjb2RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5zcWwuZGVjb2RlcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIE1hbnksXG4gIE9uZSxcbiAgUmVsYXRpb24sXG4gIFJlbGF0aW9ucyxcbiAgY3JlYXRlTWFueSxcbiAgY3JlYXRlT25lLFxuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnLFxuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIG1hcFJlbGF0aW9uYWxSb3csXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICByZWxhdGlvbnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWxhdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVWaWV3QmFzZSBleHRlbmRzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVWaWV3QmFzZVwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlVmlld0Jhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWJhc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBhbGlhc2VkVGFibGUsIGFsaWFzZWRUYWJsZUNvbHVtbiwgbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMsIG1hcENvbHVtbnNJblNRTFRvQWxpYXMgfSBmcm9tIFwiLi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENhc2luZ0NhY2hlIH0gZnJvbSBcIi4uL2Nhc2luZy5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEcml6emxlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIE1hbnksXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICBPbmVcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCIuLi9zcWwvaW5kZXguanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW5zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBnZXRUYWJsZVVuaXF1ZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEaWFsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FzaW5nO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNhc2luZyA9IG5ldyBDYXNpbmdDYWNoZShjb25maWc/LmNhc2luZyk7XG4gIH1cbiAgZXNjYXBlTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGBcIiR7bmFtZX1cImA7XG4gIH1cbiAgZXNjYXBlUGFyYW0oX251bSkge1xuICAgIHJldHVybiBcIj9cIjtcbiAgfVxuICBlc2NhcGVTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIGAnJHtzdHIucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICB9XG4gIGJ1aWxkV2l0aENURShxdWVyaWVzKSB7XG4gICAgaWYgKCFxdWVyaWVzPy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG4gICAgY29uc3Qgd2l0aFNxbENodW5rcyA9IFtzcWxgd2l0aCBgXTtcbiAgICBmb3IgKGNvbnN0IFtpLCB3XSBvZiBxdWVyaWVzLmVudHJpZXMoKSkge1xuICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHcuXy5hbGlhcyl9IGFzICgke3cuXy5zcWx9KWApO1xuICAgICAgaWYgKGkgPCBxdWVyaWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAsIGApO1xuICAgICAgfVxuICAgIH1cbiAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCBgKTtcbiAgICByZXR1cm4gc3FsLmpvaW4od2l0aFNxbENodW5rcyk7XG4gIH1cbiAgYnVpbGREZWxldGVRdWVyeSh7IHRhYmxlLCB3aGVyZSwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9ZGVsZXRlIGZyb20gJHt0YWJsZX0ke3doZXJlU3FsfSR7cmV0dXJuaW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfWA7XG4gIH1cbiAgYnVpbGRVcGRhdGVTZXQodGFibGUsIHNldCkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlQ29sdW1ucykuZmlsdGVyKFxuICAgICAgKGNvbE5hbWUpID0+IHNldFtjb2xOYW1lXSAhPT0gdm9pZCAwIHx8IHRhYmxlQ29sdW1uc1tjb2xOYW1lXT8ub25VcGRhdGVGbiAhPT0gdm9pZCAwXG4gICAgKTtcbiAgICBjb25zdCBzZXRTaXplID0gY29sdW1uTmFtZXMubGVuZ3RoO1xuICAgIHJldHVybiBzcWwuam9pbihjb2x1bW5OYW1lcy5mbGF0TWFwKChjb2xOYW1lLCBpKSA9PiB7XG4gICAgICBjb25zdCBjb2wgPSB0YWJsZUNvbHVtbnNbY29sTmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9IHNldFtjb2xOYW1lXSA/PyBzcWwucGFyYW0oY29sLm9uVXBkYXRlRm4oKSwgY29sKTtcbiAgICAgIGNvbnN0IHJlcyA9IHNxbGAke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2wpKX0gPSAke3ZhbHVlfWA7XG4gICAgICBpZiAoaSA8IHNldFNpemUgLSAxKSB7XG4gICAgICAgIHJldHVybiBbcmVzLCBzcWwucmF3KFwiLCBcIildO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtyZXNdO1xuICAgIH0pKTtcbiAgfVxuICBidWlsZFVwZGF0ZVF1ZXJ5KHsgdGFibGUsIHNldCwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGpvaW5zLCBmcm9tLCBsaW1pdCwgb3JkZXJCeSB9KSB7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBzZXRTcWwgPSB0aGlzLmJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpO1xuICAgIGNvbnN0IGZyb21TcWwgPSBmcm9tICYmIHNxbC5qb2luKFtzcWwucmF3KFwiIGZyb20gXCIpLCB0aGlzLmJ1aWxkRnJvbVRhYmxlKGZyb20pXSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfXVwZGF0ZSAke3RhYmxlfSBzZXQgJHtzZXRTcWx9JHtmcm9tU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIC8qKlxuICAgKiBCdWlsZHMgc2VsZWN0aW9uIFNRTCB3aXRoIHByb3ZpZGVkIGZpZWxkcy9leHByZXNzaW9uc1xuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogYHNlbGVjdCA8c2VsZWN0aW9uPiBmcm9tYFxuICAgKlxuICAgKiBgaW5zZXJ0IC4uLiByZXR1cm5pbmcgPHNlbGVjdGlvbj5gXG4gICAqXG4gICAqIElmIGBpc1NpbmdsZVRhYmxlYCBpcyB0cnVlLCB0aGVuIGNvbHVtbnMgd29uJ3QgYmUgcHJlZml4ZWQgd2l0aCB0YWJsZSBuYW1lXG4gICAqL1xuICBidWlsZFNlbGVjdGlvbihmaWVsZHMsIHsgaXNTaW5nbGVUYWJsZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGNvbnN0IGNvbHVtbnNMZW4gPSBmaWVsZHMubGVuZ3RoO1xuICAgIGNvbnN0IGNodW5rcyA9IGZpZWxkcy5mbGF0TWFwKCh7IGZpZWxkIH0sIGkpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rID0gW107XG4gICAgICBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSAmJiBmaWVsZC5pc1NlbGVjdGlvbkZpZWxkKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcykpO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpIHx8IGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaXMoZmllbGQsIFNRTC5BbGlhc2VkKSA/IGZpZWxkLnNxbCA6IGZpZWxkO1xuICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICBuZXcgU1FMKFxuICAgICAgICAgICAgICBxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsucHVzaChxdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKHNxbGAgYXMgJHtzcWwuaWRlbnRpZmllcihmaWVsZC5maWVsZEFsaWFzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBmaWVsZC50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIGlmIChmaWVsZC5jb2x1bW5UeXBlID09PSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIikge1xuICAgICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX0gYXMgdGV4dClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgY29sdW1uc0xlbiAtIDEpIHtcbiAgICAgICAgY2h1bmsucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9KTtcbiAgICByZXR1cm4gc3FsLmpvaW4oY2h1bmtzKTtcbiAgfVxuICBidWlsZEpvaW5zKGpvaW5zKSB7XG4gICAgaWYgKCFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IGpvaW5zQXJyYXkgPSBbXTtcbiAgICBpZiAoam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBqb2luTWV0YV0gb2Ygam9pbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gam9pbk1ldGEudGFibGU7XG4gICAgICAgIGNvbnN0IG9uU3FsID0gam9pbk1ldGEub24gPyBzcWxgIG9uICR7am9pbk1ldGEub259YCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgICAgY29uc3QgdGFibGVTY2hlbWEgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgICBjb25zdCBvcmlnVGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSB0YWJsZU5hbWUgPT09IG9yaWdUYWJsZU5hbWUgPyB2b2lkIDAgOiBqb2luTWV0YS5hbGlhcztcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlU2NoZW1hID8gc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVTY2hlbWEpfS5gIDogdm9pZCAwfSR7c3FsLmlkZW50aWZpZXIob3JpZ1RhYmxlTmFtZSl9JHthbGlhcyAmJiBzcWxgICR7c3FsLmlkZW50aWZpZXIoYWxpYXMpfWB9JHtvblNxbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4IDwgam9pbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcWwuam9pbihqb2luc0FycmF5KTtcbiAgfVxuICBidWlsZExpbWl0KGxpbWl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkT3JkZXJCeShvcmRlckJ5KSB7XG4gICAgY29uc3Qgb3JkZXJCeUxpc3QgPSBbXTtcbiAgICBpZiAob3JkZXJCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9yZGVyQnlWYWx1ZV0gb2Ygb3JkZXJCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgb3JkZXJCeUxpc3QucHVzaChvcmRlckJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBvcmRlckJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvcmRlckJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlckJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBvcmRlciBieSAke3NxbC5qb2luKG9yZGVyQnlMaXN0KX1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkRnJvbVRhYmxlKHRhYmxlKSB7XG4gICAgaWYgKGlzKHRhYmxlLCBUYWJsZSkgJiYgdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdKSB7XG4gICAgICByZXR1cm4gc3FsYCR7c3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJcIil9LmAuaWYodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0pfSR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV0pfSAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG4gIGJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgIHdpdGhMaXN0LFxuICAgIGZpZWxkcyxcbiAgICBmaWVsZHNGbGF0LFxuICAgIHdoZXJlLFxuICAgIGhhdmluZyxcbiAgICB0YWJsZSxcbiAgICBqb2lucyxcbiAgICBvcmRlckJ5LFxuICAgIGdyb3VwQnksXG4gICAgbGltaXQsXG4gICAgb2Zmc2V0LFxuICAgIGRpc3RpbmN0LFxuICAgIHNldE9wZXJhdG9yc1xuICB9KSB7XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IGZpZWxkc0ZsYXQgPz8gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHNMaXN0KSB7XG4gICAgICBpZiAoaXMoZi5maWVsZCwgQ29sdW1uKSAmJiBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSkgIT09IChpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogZ2V0VGFibGVOYW1lKHRhYmxlKSkgJiYgISgodGFibGUyKSA9PiBqb2lucz8uc29tZShcbiAgICAgICAgKHsgYWxpYXMgfSkgPT4gYWxpYXMgPT09ICh0YWJsZTJbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gZ2V0VGFibGVOYW1lKHRhYmxlMikgOiB0YWJsZTJbVGFibGUuU3ltYm9sLkJhc2VOYW1lXSlcbiAgICAgICkpKGYuZmllbGQudGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTmFtZShmLmZpZWxkLnRhYmxlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3VyIFwiJHtmLnBhdGguam9pbihcIi0+XCIpfVwiIGZpZWxkIHJlZmVyZW5jZXMgYSBjb2x1bW4gXCIke3RhYmxlTmFtZX1cIi5cIiR7Zi5maWVsZC5uYW1lfVwiLCBidXQgdGhlIHRhYmxlIFwiJHt0YWJsZU5hbWV9XCIgaXMgbm90IHBhcnQgb2YgdGhlIHF1ZXJ5ISBEaWQgeW91IGZvcmdldCB0byBqb2luIGl0P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNTaW5nbGVUYWJsZSA9ICFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDA7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBkaXN0aW5jdFNxbCA9IGRpc3RpbmN0ID8gc3FsYCBkaXN0aW5jdGAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5idWlsZFNlbGVjdGlvbihmaWVsZHNMaXN0LCB7IGlzU2luZ2xlVGFibGUgfSk7XG4gICAgY29uc3QgdGFibGVTcWwgPSB0aGlzLmJ1aWxkRnJvbVRhYmxlKHRhYmxlKTtcbiAgICBjb25zdCBqb2luc1NxbCA9IHRoaXMuYnVpbGRKb2lucyhqb2lucyk7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IGhhdmluZ1NxbCA9IGhhdmluZyA/IHNxbGAgaGF2aW5nICR7aGF2aW5nfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZ3JvdXBCeUxpc3QgPSBbXTtcbiAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGdyb3VwQnlWYWx1ZV0gb2YgZ3JvdXBCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChncm91cEJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBncm91cEJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBncm91cEJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQnlTcWwgPSBncm91cEJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBncm91cCBieSAke3NxbC5qb2luKGdyb3VwQnlMaXN0KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBmaW5hbFF1ZXJ5ID0gc3FsYCR7d2l0aFNxbH1zZWxlY3Qke2Rpc3RpbmN0U3FsfSAke3NlbGVjdGlvbn0gZnJvbSAke3RhYmxlU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke2dyb3VwQnlTcWx9JHtoYXZpbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgICBpZiAoc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9ucyhmaW5hbFF1ZXJ5LCBzZXRPcGVyYXRvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gZmluYWxRdWVyeTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvbnMobGVmdFNlbGVjdCwgc2V0T3BlcmF0b3JzKSB7XG4gICAgY29uc3QgW3NldE9wZXJhdG9yLCAuLi5yZXN0XSA9IHNldE9wZXJhdG9ycztcbiAgICBpZiAoIXNldE9wZXJhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFzcyB1bmRlZmluZWQgdmFsdWVzIHRvIGFueSBzZXQgb3BlcmF0b3JcIik7XG4gICAgfVxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7IGxlZnRTZWxlY3QsIHNldE9wZXJhdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoXG4gICAgICB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KSxcbiAgICAgIHJlc3RcbiAgICApO1xuICB9XG4gIGJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoe1xuICAgIGxlZnRTZWxlY3QsXG4gICAgc2V0T3BlcmF0b3I6IHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0LCBsaW1pdCwgb3JkZXJCeSwgb2Zmc2V0IH1cbiAgfSkge1xuICAgIGNvbnN0IGxlZnRDaHVuayA9IHNxbGAke2xlZnRTZWxlY3QuZ2V0U1FMKCl9IGA7XG4gICAgY29uc3QgcmlnaHRDaHVuayA9IHNxbGAke3JpZ2h0U2VsZWN0LmdldFNRTCgpfWA7XG4gICAgbGV0IG9yZGVyQnlTcWw7XG4gICAgaWYgKG9yZGVyQnkgJiYgb3JkZXJCeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvcmRlckJ5VmFsdWVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHNpbmdsZU9yZGVyQnkgb2Ygb3JkZXJCeSkge1xuICAgICAgICBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMaXRlQ29sdW1uKSkge1xuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWwuaWRlbnRpZmllcihzaW5nbGVPcmRlckJ5Lm5hbWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpcyhzaW5nbGVPcmRlckJ5LCBTUUwpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV07XG4gICAgICAgICAgICBpZiAoaXMoY2h1bmssIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICAgICAgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rc1tpXSA9IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjaHVuaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3JkZXJCeVNxbCA9IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5VmFsdWVzLCBzcWxgLCBgKX1gO1xuICAgIH1cbiAgICBjb25zdCBsaW1pdFNxbCA9IHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9wZXJhdG9yQ2h1bmsgPSBzcWwucmF3KGAke3R5cGV9ICR7aXNBbGwgPyBcImFsbCBcIiA6IFwiXCJ9YCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7bGVmdENodW5rfSR7b3BlcmF0b3JDaHVua30ke3JpZ2h0Q2h1bmt9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgfVxuICBidWlsZEluc2VydFF1ZXJ5KHsgdGFibGUsIHZhbHVlczogdmFsdWVzT3JTZWxlY3QsIG9uQ29uZmxpY3QsIHJldHVybmluZywgd2l0aExpc3QsIHNlbGVjdCB9KSB7XG4gICAgY29uc3QgdmFsdWVzU3FsTGlzdCA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChbXywgY29sXSkgPT4gIWNvbC5zaG91bGREaXNhYmxlSW5zZXJ0KClcbiAgICApO1xuICAgIGNvbnN0IGluc2VydE9yZGVyID0gY29sRW50cmllcy5tYXAoKFssIGNvbHVtbl0pID0+IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2x1bW4pKSk7XG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgY29uc3Qgc2VsZWN0MiA9IHZhbHVlc09yU2VsZWN0O1xuICAgICAgaWYgKGlzKHNlbGVjdDIsIFNRTCkpIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIuZ2V0U1FMKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWwucmF3KFwidmFsdWVzIFwiKSk7XG4gICAgICBmb3IgKGNvbnN0IFt2YWx1ZUluZGV4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBjb2xdIG9mIGNvbEVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBjb2xWYWx1ZSA9IHZhbHVlW2ZpZWxkTmFtZV07XG4gICAgICAgICAgaWYgKGNvbFZhbHVlID09PSB2b2lkIDAgfHwgaXMoY29sVmFsdWUsIFBhcmFtKSAmJiBjb2xWYWx1ZS52YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgaWYgKGNvbC5kZWZhdWx0ICE9PSBudWxsICYmIGNvbC5kZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoY29sLmRlZmF1bHQsIFNRTCkgPyBjb2wuZGVmYXVsdCA6IHNxbC5wYXJhbShjb2wuZGVmYXVsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGblJlc3VsdCA9IGNvbC5kZWZhdWx0Rm4oKTtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoZGVmYXVsdEZuUmVzdWx0LCBTUUwpID8gZGVmYXVsdEZuUmVzdWx0IDogc3FsLnBhcmFtKGRlZmF1bHRGblJlc3VsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbC5kZWZhdWx0ICYmIGNvbC5vblVwZGF0ZUZuICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY29uc3Qgb25VcGRhdGVGblJlc3VsdCA9IGNvbC5vblVwZGF0ZUZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKG9uVXBkYXRlRm5SZXN1bHQsIFNRTCkgPyBvblVwZGF0ZUZuUmVzdWx0IDogc3FsLnBhcmFtKG9uVXBkYXRlRm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBzcWxgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChjb2xWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaCh2YWx1ZUxpc3QpO1xuICAgICAgICBpZiAodmFsdWVJbmRleCA8IHZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgdmFsdWVzU3FsID0gc3FsLmpvaW4odmFsdWVzU3FsTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb25Db25mbGljdFNxbCA9IG9uQ29uZmxpY3Q/Lmxlbmd0aCA/IHNxbC5qb2luKG9uQ29uZmxpY3QpIDogdm9pZCAwO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWluc2VydCBpbnRvICR7dGFibGV9ICR7aW5zZXJ0T3JkZXJ9ICR7dmFsdWVzU3FsfSR7b25Db25mbGljdFNxbH0ke3JldHVybmluZ1NxbH1gO1xuICB9XG4gIHNxbFRvUXVlcnkoc3FsMiwgaW52b2tlU291cmNlKSB7XG4gICAgcmV0dXJuIHNxbDIudG9RdWVyeSh7XG4gICAgICBjYXNpbmc6IHRoaXMuY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZTogdGhpcy5lc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW06IHRoaXMuZXNjYXBlUGFyYW0sXG4gICAgICBlc2NhcGVTdHJpbmc6IHRoaXMuZXNjYXBlU3RyaW5nLFxuICAgICAgaW52b2tlU291cmNlXG4gICAgfSk7XG4gIH1cbiAgYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgIGZ1bGxTY2hlbWEsXG4gICAgc2NoZW1hLFxuICAgIHRhYmxlTmFtZXNNYXAsXG4gICAgdGFibGUsXG4gICAgdGFibGVDb25maWcsXG4gICAgcXVlcnlDb25maWc6IGNvbmZpZyxcbiAgICB0YWJsZUFsaWFzLFxuICAgIG5lc3RlZFF1ZXJ5UmVsYXRpb24sXG4gICAgam9pbk9uXG4gIH0pIHtcbiAgICBsZXQgc2VsZWN0aW9uID0gW107XG4gICAgbGV0IGxpbWl0LCBvZmZzZXQsIG9yZGVyQnkgPSBbXSwgd2hlcmU7XG4gICAgY29uc3Qgam9pbnMgPSBbXTtcbiAgICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25FbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBkYktleTogdmFsdWUubmFtZSxcbiAgICAgICAgdHNLZXk6IGtleSxcbiAgICAgICAgZmllbGQ6IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyksXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdm9pZCAwLFxuICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFsaWFzZWRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKV0pXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZpZy53aGVyZSkge1xuICAgICAgICBjb25zdCB3aGVyZVNxbCA9IHR5cGVvZiBjb25maWcud2hlcmUgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy53aGVyZShhbGlhc2VkQ29sdW1ucywgZ2V0T3BlcmF0b3JzKCkpIDogY29uZmlnLndoZXJlO1xuICAgICAgICB3aGVyZSA9IHdoZXJlU3FsICYmIG1hcENvbHVtbnNJblNRTFRvQWxpYXMod2hlcmVTcWwsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzU2VsZWN0aW9uID0gW107XG4gICAgICBsZXQgc2VsZWN0ZWRDb2x1bW5zID0gW107XG4gICAgICBpZiAoY29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgbGV0IGlzSW5jbHVkZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuY29sdW1ucykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZCBpbiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoIWlzSW5jbHVkZU1vZGUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgaXNJbmNsdWRlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMucHVzaChmaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucyA9IGlzSW5jbHVkZU1vZGUgPyBzZWxlY3RlZENvbHVtbnMuZmlsdGVyKChjKSA9PiBjb25maWcuY29sdW1ucz8uW2NdID09PSB0cnVlKSA6IE9iamVjdC5rZXlzKHRhYmxlQ29uZmlnLmNvbHVtbnMpLmZpbHRlcigoa2V5KSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VsZWN0ZWRDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlQ29uZmlnLmNvbHVtbnNbZmllbGRdO1xuICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7IHRzS2V5OiBmaWVsZCwgdmFsdWU6IGNvbHVtbiB9KTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWxlY3RlZFJlbGF0aW9ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy53aXRoKSB7XG4gICAgICAgIHNlbGVjdGVkUmVsYXRpb25zID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLndpdGgpLmZpbHRlcigoZW50cnkpID0+ICEhZW50cnlbMV0pLm1hcCgoW3RzS2V5LCBxdWVyeUNvbmZpZ10pID0+ICh7IHRzS2V5LCBxdWVyeUNvbmZpZywgcmVsYXRpb246IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1t0c0tleV0gfSkpO1xuICAgICAgfVxuICAgICAgbGV0IGV4dHJhcztcbiAgICAgIGlmIChjb25maWcuZXh0cmFzKSB7XG4gICAgICAgIGV4dHJhcyA9IHR5cGVvZiBjb25maWcuZXh0cmFzID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcuZXh0cmFzKGFsaWFzZWRDb2x1bW5zLCB7IHNxbCB9KSA6IGNvbmZpZy5leHRyYXM7XG4gICAgICAgIGZvciAoY29uc3QgW3RzS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXh0cmFzKSkge1xuICAgICAgICAgIGZpZWxkc1NlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgICAgdmFsdWU6IG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHZhbHVlLCB0YWJsZUFsaWFzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHsgdHNLZXksIHZhbHVlIH0gb2YgZmllbGRzU2VsZWN0aW9uKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogaXModmFsdWUsIFNRTC5BbGlhc2VkKSA/IHZhbHVlLmZpZWxkQWxpYXMgOiB0YWJsZUNvbmZpZy5jb2x1bW5zW3RzS2V5XS5uYW1lLFxuICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgIGZpZWxkOiBpcyh2YWx1ZSwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcykgOiB2YWx1ZSxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGlvbjogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgb3JkZXJCeU9yaWcgPSB0eXBlb2YgY29uZmlnLm9yZGVyQnkgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy5vcmRlckJ5KGFsaWFzZWRDb2x1bW5zLCBnZXRPcmRlckJ5T3BlcmF0b3JzKCkpIDogY29uZmlnLm9yZGVyQnkgPz8gW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXJCeU9yaWcpKSB7XG4gICAgICAgIG9yZGVyQnlPcmlnID0gW29yZGVyQnlPcmlnXTtcbiAgICAgIH1cbiAgICAgIG9yZGVyQnkgPSBvcmRlckJ5T3JpZy5tYXAoKG9yZGVyQnlWYWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXMob3JkZXJCeVZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKG9yZGVyQnlWYWx1ZSwgdGFibGVBbGlhcyk7XG4gICAgICB9KTtcbiAgICAgIGxpbWl0ID0gY29uZmlnLmxpbWl0O1xuICAgICAgb2Zmc2V0ID0gY29uZmlnLm9mZnNldDtcbiAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICB0c0tleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICBxdWVyeUNvbmZpZzogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICByZWxhdGlvblxuICAgICAgfSBvZiBzZWxlY3RlZFJlbGF0aW9ucykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpb24gPSBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZU5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUocmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbcmVsYXRpb25UYWJsZU5hbWVdO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlQWxpYXMgPSBgJHt0YWJsZUFsaWFzfV8ke3NlbGVjdGVkUmVsYXRpb25Uc0tleX1gO1xuICAgICAgICBjb25zdCBqb2luT24yID0gYW5kKFxuICAgICAgICAgIC4uLm5vcm1hbGl6ZWRSZWxhdGlvbi5maWVsZHMubWFwKFxuICAgICAgICAgICAgKGZpZWxkMiwgaSkgPT4gZXEoXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihub3JtYWxpemVkUmVsYXRpb24ucmVmZXJlbmNlc1tpXSwgcmVsYXRpb25UYWJsZUFsaWFzKSxcbiAgICAgICAgICAgICAgYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcylcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJ1aWx0UmVsYXRpb24gPSB0aGlzLmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgICAgICBmdWxsU2NoZW1hLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHRhYmxlOiBmdWxsU2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiBzY2hlbWFbcmVsYXRpb25UYWJsZVRzTmFtZV0sXG4gICAgICAgICAgcXVlcnlDb25maWc6IGlzKHJlbGF0aW9uLCBPbmUpID8gc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlID09PSB0cnVlID8geyBsaW1pdDogMSB9IDogeyAuLi5zZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsIGxpbWl0OiAxIH0gOiBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsXG4gICAgICAgICAgdGFibGVBbGlhczogcmVsYXRpb25UYWJsZUFsaWFzLFxuICAgICAgICAgIGpvaW5Pbjogam9pbk9uMixcbiAgICAgICAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uOiByZWxhdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzcWxgKCR7YnVpbHRSZWxhdGlvbi5zcWx9KWAuYXMoc2VsZWN0ZWRSZWxhdGlvblRzS2V5KTtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgIGRiS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHJlbGF0aW9uVGFibGVUc05hbWUsXG4gICAgICAgICAgaXNKc29uOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYnVpbHRSZWxhdGlvbi5zZWxlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZUVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogYE5vIGZpZWxkcyBzZWxlY3RlZCBmb3IgdGFibGUgXCIke3RhYmxlQ29uZmlnLnRzTmFtZX1cIiAoXCIke3RhYmxlQWxpYXN9XCIpLiBZb3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtIGluIFwiY29sdW1uc1wiLCBcIndpdGhcIiBvciBcImV4dHJhc1wiLiBJZiB5b3UgbmVlZCB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIG9taXQgdGhlIFwiY29sdW1uc1wiIGtleSBvciBzZXQgaXQgdG8gdW5kZWZpbmVkLmBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIHdoZXJlID0gYW5kKGpvaW5Pbiwgd2hlcmUpO1xuICAgIGlmIChuZXN0ZWRRdWVyeVJlbGF0aW9uKSB7XG4gICAgICBsZXQgZmllbGQgPSBzcWxganNvbl9hcnJheSgke3NxbC5qb2luKFxuICAgICAgICBzZWxlY3Rpb24ubWFwKFxuICAgICAgICAgICh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gaXMoZmllbGQyLCBTUUxpdGVDb2x1bW4pID8gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkMikpIDogaXMoZmllbGQyLCBTUUwuQWxpYXNlZCkgPyBmaWVsZDIuc3FsIDogZmllbGQyXG4gICAgICAgICksXG4gICAgICAgIHNxbGAsIGBcbiAgICAgICl9KWA7XG4gICAgICBpZiAoaXMobmVzdGVkUXVlcnlSZWxhdGlvbiwgTWFueSkpIHtcbiAgICAgICAgZmllbGQgPSBzcWxgY29hbGVzY2UoanNvbl9ncm91cF9hcnJheSgke2ZpZWxkfSksIGpzb25fYXJyYXkoKSlgO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkU2VsZWN0aW9uID0gW3tcbiAgICAgICAgZGJLZXk6IFwiZGF0YVwiLFxuICAgICAgICB0c0tleTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkOiBmaWVsZC5hcyhcImRhdGFcIiksXG4gICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICAgIHNlbGVjdGlvblxuICAgICAgfV07XG4gICAgICBjb25zdCBuZWVkc1N1YnF1ZXJ5ID0gbGltaXQgIT09IHZvaWQgMCB8fCBvZmZzZXQgIT09IHZvaWQgMCB8fCBvcmRlckJ5Lmxlbmd0aCA+IDA7XG4gICAgICBpZiAobmVlZHNTdWJxdWVyeSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICAgIGZpZWxkczoge30sXG4gICAgICAgICAgZmllbGRzRmxhdDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgICAgZmllbGQ6IHNxbC5yYXcoXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB3aGVyZSA9IHZvaWQgMDtcbiAgICAgICAgbGltaXQgPSB2b2lkIDA7XG4gICAgICAgIG9mZnNldCA9IHZvaWQgMDtcbiAgICAgICAgb3JkZXJCeSA9IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyk7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogaXMocmVzdWx0LCBTUUxpdGVUYWJsZSkgPyByZXN1bHQgOiBuZXcgU3VicXVlcnkocmVzdWx0LCB7fSwgdGFibGVBbGlhcyksXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGZpZWxkc0ZsYXQ6IG5lc3RlZFNlbGVjdGlvbi5tYXAoKHsgZmllbGQ6IGZpZWxkMiB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZDIsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQyLCB0YWJsZUFsaWFzKSA6IGZpZWxkMlxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBzZWxlY3Rpb24ubWFwKCh7IGZpZWxkIH0pID0+ICh7XG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgZmllbGQ6IGlzKGZpZWxkLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkLCB0YWJsZUFsaWFzKSA6IGZpZWxkXG4gICAgICAgIH0pKSxcbiAgICAgICAgam9pbnMsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlVHNLZXk6IHRhYmxlQ29uZmlnLnRzTmFtZSxcbiAgICAgIHNxbDogcmVzdWx0LFxuICAgICAgc2VsZWN0aW9uXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY0RpYWxlY3RcIjtcbiAgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgc2Vzc2lvbi5ydW4oc3FsYEJFR0lOYCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIHNlc3Npb24ucnVuKHNxbC5yYXcoc3RtdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXNzaW9uLnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Vzc2lvbi5ydW4oc3FsYENPTU1JVGApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNlc3Npb24ucnVuKHNxbGBST0xMQkFDS2ApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUFzeW5jRGlhbGVjdCBleHRlbmRzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY0RpYWxlY3RcIjtcbiAgYXN5bmMgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBhd2FpdCBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gYXdhaXQgc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgYXdhaXQgc2Vzc2lvbi50cmFuc2FjdGlvbihhc3luYyAodHgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4LnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdHgucnVuKFxuICAgICAgICAgICAgc3FsYElOU0VSVCBJTlRPICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFwiaGFzaFwiLCBcImNyZWF0ZWRfYXRcIikgVkFMVUVTKCR7bWlncmF0aW9uLmhhc2h9LCAke21pZ3JhdGlvbi5mb2xkZXJNaWxsaXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUFzeW5jRGlhbGVjdCxcbiAgU1FMaXRlRGlhbGVjdCxcbiAgU1FMaXRlU3luY0RpYWxlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIFR5cGVkUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHlwZWRRdWVyeUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTZWxlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fLnNlbGVjdGVkRmllbGRzO1xuICB9XG59XG5leHBvcnQge1xuICBUeXBlZFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFR5cGVkUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LWJ1aWxkZXJzL3F1ZXJ5LWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBoYXZlU2FtZUtleXMsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHNcbn0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVTZWxlY3RCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0QnVpbGRlclwiO1xuICBmaWVsZHM7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIHdpdGhMaXN0O1xuICBkaXN0aW5jdDtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5maWVsZHMgPSBjb25maWcuZmllbGRzO1xuICAgIHRoaXMuc2Vzc2lvbiA9IGNvbmZpZy5zZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGNvbmZpZy5kaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSBjb25maWcud2l0aExpc3Q7XG4gICAgdGhpcy5kaXN0aW5jdCA9IGNvbmZpZy5kaXN0aW5jdDtcbiAgfVxuICBmcm9tKHNvdXJjZSkge1xuICAgIGNvbnN0IGlzUGFydGlhbFNlbGVjdCA9ICEhdGhpcy5maWVsZHM7XG4gICAgbGV0IGZpZWxkcztcbiAgICBpZiAodGhpcy5maWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IHRoaXMuZmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTdWJxdWVyeSkpIHtcbiAgICAgIGZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmtleXMoc291cmNlLl8uc2VsZWN0ZWRGaWVsZHMpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2Vba2V5XV0pXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUxpdGVWaWV3QmFzZSkpIHtcbiAgICAgIGZpZWxkcyA9IHNvdXJjZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFNRTCkpIHtcbiAgICAgIGZpZWxkcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSBnZXRUYWJsZUNvbHVtbnMoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCYXNlKHtcbiAgICAgIHRhYmxlOiBzb3VyY2UsXG4gICAgICBmaWVsZHMsXG4gICAgICBpc1BhcnRpYWxTZWxlY3QsXG4gICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24sXG4gICAgICBkaWFsZWN0OiB0aGlzLmRpYWxlY3QsXG4gICAgICB3aXRoTGlzdDogdGhpcy53aXRoTGlzdCxcbiAgICAgIGRpc3RpbmN0OiB0aGlzLmRpc3RpbmN0XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UgZXh0ZW5kcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlclwiO1xuICBfO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgdGFibGVOYW1lO1xuICBpc1BhcnRpYWxTZWxlY3Q7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIGNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICB1c2VkVGFibGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3RydWN0b3IoeyB0YWJsZSwgZmllbGRzLCBpc1BhcnRpYWxTZWxlY3QsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0LCBkaXN0aW5jdCB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHdpdGhMaXN0LFxuICAgICAgdGFibGUsXG4gICAgICBmaWVsZHM6IHsgLi4uZmllbGRzIH0sXG4gICAgICBkaXN0aW5jdCxcbiAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICB9O1xuICAgIHRoaXMuaXNQYXJ0aWFsU2VsZWN0ID0gaXNQYXJ0aWFsU2VsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLl8gPSB7XG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1xuICAgIH07XG4gICAgdGhpcy50YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSB0eXBlb2YgdGhpcy50YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgPyB7IFt0aGlzLnRhYmxlTmFtZV06IHRydWUgfSA6IHt9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSkgdGhpcy51c2VkVGFibGVzLmFkZChpdGVtKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFVzZWRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnVzZWRUYWJsZXNdO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgYmFzZVRhYmxlTmFtZSA9IHRoaXMudGFibGVOYW1lO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucz8uc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc1BhcnRpYWxTZWxlY3QpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubGVuZ3RoID09PSAxICYmIHR5cGVvZiBiYXNlVGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzID0ge1xuICAgICAgICAgICAgW2Jhc2VUYWJsZU5hbWVdOiB0aGlzLmNvbmZpZy5maWVsZHNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmICFpcyh0YWJsZSwgU1FMKSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFZpZXcpID8gdGFibGVbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkc1t0YWJsZU5hbWVdID0gc2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuam9pbnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmpvaW5zLnB1c2goeyBvbiwgdGFibGUsIGpvaW5UeXBlLCBhbGlhczogdGFibGVOYW1lIH0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc3dpdGNoIChqb2luVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInJpZ2h0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxuICAgICAgICAgIGNhc2UgXCJpbm5lclwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImZ1bGxcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLm1hcCgoW2tleV0pID0+IFtrZXksIGZhbHNlXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBsZWZ0IGpvaW5gIG9wZXJhdGlvbiBieSBhZGRpbmcgYW5vdGhlciB0YWJsZSB0byB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIGVhY2ggcm93IG9mIHRoZSB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBqb2luZWQgdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIGpvaW5lZCB0YWJsZSB0byBudWxsLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2xlZnQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0IHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5sZWZ0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBsZWZ0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImxlZnRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGByaWdodCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgam9pbmVkIHRhYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZyb20gdGhlIG1haW4gdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIG1haW4gdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNyaWdodC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyIHwgbnVsbDsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyIHwgbnVsbDsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBgaW5uZXIgam9pbmAgb3BlcmF0aW9uLCBjcmVhdGluZyBhIG5ldyB0YWJsZSBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgdGhhdCBoYXZlIG1hdGNoaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgcm93cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGJvdGggam9pbmVkIHRhYmxlcy4gUm93cyB3aXRob3V0IG1hdGNoaW5nIGVudHJpZXMgaW4gZWl0aGVyIHRhYmxlIGFyZSBleGNsdWRlZCwgcmVzdWx0aW5nIGluIGEgdGFibGUgdGhhdCBpbmNsdWRlcyBvbmx5IG1hdGNoaW5nIHBhaXJzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2lubmVyLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5pbm5lckpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBmdWxsIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgcm93cyB3aXRoIG1hdGNoaW5nIHZhbHVlcyBhbmQgZmlsbGluZyBpbiBgbnVsbGAgZm9yIG5vbi1tYXRjaGluZyBjb2x1bW5zLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Z1bGwtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXIgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGNyb3NzIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgYWxsIHJvd3MgZnJvbSBlYWNoIHRhYmxlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Nyb3NzLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycywgZWFjaCB1c2VyIHdpdGggZXZlcnkgcGV0XG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5jcm9zc0pvaW4ocGV0cylcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqIGBgYFxuICAgKi9cbiAgY3Jvc3NKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiY3Jvc3NcIik7XG4gIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gICAgcmV0dXJuIChyaWdodFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmlnaHRTZWxlY3QgPSB0eXBlb2YgcmlnaHRTZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHJpZ2h0U2VsZWN0aW9uKGdldFNRTGl0ZVNldE9wZXJhdG9ycygpKSA6IHJpZ2h0U2VsZWN0aW9uO1xuICAgICAgaWYgKCFoYXZlU2FtZUtleXModGhpcy5nZXRTZWxlY3RlZEZpZWxkcygpLCByaWdodFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJTZXQgb3BlcmF0b3IgZXJyb3IgKHVuaW9uIC8gaW50ZXJzZWN0IC8gZXhjZXB0KTogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0IH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBgdW5pb25gIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQgc2V0cyBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbn1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1bmlxdWUgbmFtZXMgZnJvbSBjdXN0b21lcnMgYW5kIHVzZXJzIHRhYmxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBuYW1lOiB1c2Vycy5uYW1lIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnVuaW9uKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgdW5pb24gfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgdW5pb24oXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KS5mcm9tKHVzZXJzKSxcbiAgICogICBkYi5zZWxlY3QoeyBuYW1lOiBjdXN0b21lcnMubmFtZSB9KS5mcm9tKGN1c3RvbWVycylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbiA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCBmYWxzZSk7XG4gIC8qKlxuICAgKiBBZGRzIGB1bmlvbiBhbGxgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQtc2V0IG9mIHRoZSBgc2VsZWN0YCBzdGF0ZW1lbnRzIGFuZCBrZWVwIGFsbCBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbi1hbGx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdHJhbnNhY3Rpb24gaWRzIGZyb20gYm90aCBvbmxpbmUgYW5kIGluLXN0b3JlIHNhbGVzXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pXG4gICAqICAgLmZyb20ob25saW5lU2FsZXMpXG4gICAqICAgLnVuaW9uQWxsKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IGluU3RvcmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20oaW5TdG9yZVNhbGVzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uQWxsIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uQWxsKFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20ob25saW5lU2FsZXMpLFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbkFsbCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGludGVyc2VjdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldGFpbiBvbmx5IHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCByZXN1bHQgc2V0cyBhbmQgZWxpbWluYXRlIGR1cGxpY2F0ZXMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjaW50ZXJzZWN0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgY291cnNlIG5hbWVzIHRoYXQgYXJlIG9mZmVyZWQgaW4gYm90aCBkZXBhcnRtZW50cyBBIGFuZCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmludGVyc2VjdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgaW50ZXJzZWN0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGludGVyc2VjdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGludGVyc2VjdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgZXhjZXB0YCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYWxsIHVuaXF1ZSByb3dzIGZyb20gdGhlIGxlZnQgcXVlcnksIGV4Y2VwdCBmb3IgdGhlIHJvd3MgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcmVzdWx0IHNldCBvZiB0aGUgcmlnaHQgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjZXhjZXB0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNvdXJzZXMgb2ZmZXJlZCBpbiBkZXBhcnRtZW50IEEgYnV0IG5vdCBpbiBkZXBhcnRtZW50IEJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pXG4gICAqICAgLmZyb20oZGVwQSlcbiAgICogICAuZXhjZXB0KFxuICAgKiAgICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyBleGNlcHQgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgZXhjZXB0KFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KS5mcm9tKGRlcEEpLFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhjZXB0ID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcImV4Y2VwdFwiLCBmYWxzZSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYWRkU2V0T3BlcmF0b3JzKHNldE9wZXJhdG9ycykge1xuICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKC4uLnNldE9wZXJhdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgd2hlcmVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZWxlY3Qgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2ZpbHRlcmluZ31cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgc2VsZWN0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gU2VsZWN0IGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgaWYgKHR5cGVvZiB3aGVyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB3aGVyZSA9IHdoZXJlKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgaGF2aW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLiBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgdG8gZmlsdGVyIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYmFzZWQgb24gYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNhZ2dyZWdhdGlvbnN9XG4gICAqXG4gICAqIEBwYXJhbSBoYXZpbmcgdGhlIGBoYXZpbmdgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBicmFuZHMgd2l0aCBtb3JlIHRoYW4gb25lIGNhclxuICAgKiBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiBcdGJyYW5kOiBjYXJzLmJyYW5kLFxuICAgKiBcdGNvdW50OiBzcWw8bnVtYmVyPmBjYXN0KGNvdW50KCR7Y2Fycy5pZH0pIGFzIGludClgLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKGNhcnMpXG4gICAqICAgLmdyb3VwQnkoY2Fycy5icmFuZClcbiAgICogICAuaGF2aW5nKCh7IGNvdW50IH0pID0+IGd0KGNvdW50LCAxKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGF2aW5nKGhhdmluZykge1xuICAgIGlmICh0eXBlb2YgaGF2aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGhhdmluZyA9IGhhdmluZyhcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXZpbmcgPSBoYXZpbmc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ3JvdXBCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBBcnJheS5pc0FycmF5KGdyb3VwQnkpID8gZ3JvdXBCeSA6IFtncm91cEJ5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ3JvdXBCeSA9IGNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGxpbWl0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNsaW1pdC0tb2Zmc2V0fVxuICAgKlxuICAgKiBAcGFyYW0gbGltaXQgdGhlIGBsaW1pdGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIGZpcnN0IDEwIHBlb3BsZSBmcm9tIHRoaXMgcXVlcnkuXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20ocGVvcGxlKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgbGltaXQobGltaXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkubGltaXQgPSBsaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9mZnNldGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNraXAgYSBudW1iZXIgb2Ygcm93cyB3aGVuIHJldHVybmluZyByZXN1bHRzIGZyb20gdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIG9mZnNldCB0aGUgYG9mZnNldGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIDEwdGgtMjB0aCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkub2Zmc2V0KDEwKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgb2Zmc2V0KG9mZnNldCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLm9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFNlbGVjdFF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGNvbnN0IHVzZWRUYWJsZXMgPSBbXTtcbiAgICB1c2VkVGFibGVzLnB1c2goLi4uZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSkpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5qb2lucykge1xuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmNvbmZpZy5qb2lucykgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUoaXQudGFibGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIG5ldyBTdWJxdWVyeSh0aGlzLmdldFNRTCgpLCB0aGlzLmNvbmZpZy5maWVsZHMsIGFsaWFzLCBmYWxzZSwgWy4uLm5ldyBTZXQodXNlZFRhYmxlcyldKSxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICApO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhczogdGhpcy50YWJsZU5hbWUsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgU1FMaXRlU2VsZWN0QmFzZSBleHRlbmRzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuc2Vzc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGV4ZWN1dGUgYSBxdWVyeSBvbiBhIHF1ZXJ5IGJ1aWxkZXIuIFBsZWFzZSB1c2UgYSBkYXRhYmFzZSBpbnN0YW5jZSBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IG9yZGVyU2VsZWN0ZWRGaWVsZHModGhpcy5jb25maWcuZmllbGRzKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIGZpZWxkc0xpc3QsXG4gICAgICBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgdGFibGVzOiBbLi4udGhpcy51c2VkVGFibGVzXVxuICAgICAgfSxcbiAgICAgIHRoaXMuY2FjaGVDb25maWdcbiAgICApO1xuICAgIHF1ZXJ5LmpvaW5zTm90TnVsbGFibGVNYXAgPSB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXA7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG4gICR3aXRoQ2FjaGUoY29uZmlnKSB7XG4gICAgdGhpcy5jYWNoZUNvbmZpZyA9IGNvbmZpZyA9PT0gdm9pZCAwID8geyBjb25maWc6IHt9LCBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH0gOiBjb25maWcgPT09IGZhbHNlID8geyBlbmFibGU6IGZhbHNlIH0gOiB7IGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUsIC4uLmNvbmZpZyB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoKTtcbiAgfVxufVxuYXBwbHlNaXhpbnMoU1FMaXRlU2VsZWN0QmFzZSwgW1F1ZXJ5UHJvbWlzZV0pO1xuZnVuY3Rpb24gY3JlYXRlU2V0T3BlcmF0b3IodHlwZSwgaXNBbGwpIHtcbiAgcmV0dXJuIChsZWZ0U2VsZWN0LCByaWdodFNlbGVjdCwgLi4ucmVzdFNlbGVjdHMpID0+IHtcbiAgICBjb25zdCBzZXRPcGVyYXRvcnMgPSBbcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzXS5tYXAoKHNlbGVjdCkgPT4gKHtcbiAgICAgIHR5cGUsXG4gICAgICBpc0FsbCxcbiAgICAgIHJpZ2h0U2VsZWN0OiBzZWxlY3RcbiAgICB9KSk7XG4gICAgZm9yIChjb25zdCBzZXRPcGVyYXRvciBvZiBzZXRPcGVyYXRvcnMpIHtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKGxlZnRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgc2V0T3BlcmF0b3IucmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZWZ0U2VsZWN0LmFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpO1xuICB9O1xufVxuY29uc3QgZ2V0U1FMaXRlU2V0T3BlcmF0b3JzID0gKCkgPT4gKHtcbiAgdW5pb24sXG4gIHVuaW9uQWxsLFxuICBpbnRlcnNlY3QsXG4gIGV4Y2VwdFxufSk7XG5jb25zdCB1bmlvbiA9IGNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuY29uc3QgdW5pb25BbGwgPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIHRydWUpO1xuY29uc3QgaW50ZXJzZWN0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuY29uc3QgZXhjZXB0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuZXhwb3J0IHtcbiAgU1FMaXRlU2VsZWN0QmFzZSxcbiAgU1FMaXRlU2VsZWN0QnVpbGRlcixcbiAgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSxcbiAgZXhjZXB0LFxuICBpbnRlcnNlY3QsXG4gIHVuaW9uLFxuICB1bmlvbkFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlRGlhbGVjdCwgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgV2l0aFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTZWxlY3RCdWlsZGVyIH0gZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5jbGFzcyBRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVRdWVyeUJ1aWxkZXJcIjtcbiAgZGlhbGVjdDtcbiAgZGlhbGVjdENvbmZpZztcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGlzKGRpYWxlY3QsIFNRTGl0ZURpYWxlY3QpID8gZGlhbGVjdCA6IHZvaWQgMDtcbiAgICB0aGlzLmRpYWxlY3RDb25maWcgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IHZvaWQgMCA6IGRpYWxlY3Q7XG4gIH1cbiAgJHdpdGggPSAoYWxpYXMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKHF1ZXJ5QnVpbGRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICB3aXRoKC4uLnF1ZXJpZXMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBzZWxlY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QgfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB2b2lkIDAsIGRpYWxlY3Q6IHRoaXMuZ2V0RGlhbGVjdCgpIH0pO1xuICB9XG4gIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLy8gTGF6eSBsb2FkIGRpYWxlY3QgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBnZXREaWFsZWN0KCkge1xuICAgIGlmICghdGhpcy5kaWFsZWN0KSB7XG4gICAgICB0aGlzLmRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QodGhpcy5kaWFsZWN0Q29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktYnVpbGRlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1ucywgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGhhdmVTYW1lS2V5cywgbWFwVXBkYXRlU2V0LCBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyLmpzXCI7XG5jbGFzcyBTUUxpdGVJbnNlcnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gd2l0aExpc3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0QnVpbGRlclwiO1xuICB2YWx1ZXModmFsdWVzKSB7XG4gICAgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW3ZhbHVlc107XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbHVlcygpIG11c3QgYmUgY2FsbGVkIHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBjb25zdCBjb2xzID0gdGhpcy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBmb3IgKGNvbnN0IGNvbEtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgY29uc3QgY29sVmFsdWUgPSBlbnRyeVtjb2xLZXldO1xuICAgICAgICByZXN1bHRbY29sS2V5XSA9IGlzKGNvbFZhbHVlLCBTUUwpID8gY29sVmFsdWUgOiBuZXcgUGFyYW0oY29sVmFsdWUsIGNvbHNbY29sS2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QmFzZSh0aGlzLnRhYmxlLCBtYXBwZWRWYWx1ZXMsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0LCB0aGlzLndpdGhMaXN0KTtcbiAgfVxuICBzZWxlY3Qoc2VsZWN0UXVlcnkpIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0eXBlb2Ygc2VsZWN0UXVlcnkgPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdFF1ZXJ5KG5ldyBRdWVyeUJ1aWxkZXIoKSkgOiBzZWxlY3RRdWVyeTtcbiAgICBpZiAoIWlzKHNlbGVjdCwgU1FMKSAmJiAhaGF2ZVNhbWVLZXlzKHRoaXMudGFibGVbQ29sdW1uc10sIHNlbGVjdC5fLnNlbGVjdGVkRmllbGRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluc2VydCBzZWxlY3QgZXJyb3I6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciBjb21wYXJlZCB0byB0aGUgdGFibGUgZGVmaW5pdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgc2VsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCwgdHJ1ZSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUluc2VydEJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgdmFsdWVzLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgc2VsZWN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHRhYmxlLCB2YWx1ZXMsIHdpdGhMaXN0LCBzZWxlY3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnNlcnRcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLmNvbmZpZy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgc2ltcGx5IGF2b2lkcyBpbnNlcnRpbmcgYSByb3cgYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjb24tY29uZmxpY3QtZG8tbm90aGluZ31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gSW5zZXJ0IG9uZSByb3cgYW5kIGNhbmNlbCB0aGUgaW5zZXJ0IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKCk7XG4gICAqXG4gICAqIC8vIEV4cGxpY2l0bHkgc3BlY2lmeSBjb25mbGljdCB0YXJnZXRcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogY2Fycy5pZCB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9Ob3RoaW5nKGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgaWYgKGNvbmZpZy50YXJnZXQgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgZG8gbm90aGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHNxbGBgO1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgJHt0YXJnZXRTcWx9IGRvIG5vdGhpbmcke3doZXJlU3FsfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb24gY29uZmxpY3QgZG8gdXBkYXRlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSBleGlzdGluZyByb3cgdGhhdCBjb25mbGljdHMgd2l0aCB0aGUgcm93IHByb3Bvc2VkIGZvciBpbnNlcnRpb24gYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjdXBzZXJ0cy1hbmQtY29uZmxpY3RzfVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBgdGFyZ2V0YCwgYHNldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIHRoZSByb3cgaWYgdGhlcmUncyBhIGNvbmZsaWN0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICdQb3JzY2hlJyB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIC8vIFVwc2VydCB3aXRoICd3aGVyZScgY2xhdXNlXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICduZXdCTVcnIH0sXG4gICAqICAgICB3aGVyZTogc3FsYCR7Y2Fycy5jcmVhdGVkQXR9ID4gJzIwMjMtMDEtMDEnOjpkYXRlYCxcbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9VcGRhdGUoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy53aGVyZSAmJiAoY29uZmlnLnRhcmdldFdoZXJlIHx8IGNvbmZpZy5zZXRXaGVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1lvdSBjYW5ub3QgdXNlIGJvdGggXCJ3aGVyZVwiIGFuZCBcInRhcmdldFdoZXJlXCIvXCJzZXRXaGVyZVwiIGF0IHRoZSBzYW1lIHRpbWUgLSBcIndoZXJlXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwidGFyZ2V0V2hlcmVcIiBvciBcInNldFdoZXJlXCIgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uQ29uZmxpY3QpIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QgPSBbXTtcbiAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRXaGVyZVNxbCA9IGNvbmZpZy50YXJnZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcudGFyZ2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBzZXRXaGVyZVNxbCA9IGNvbmZpZy5zZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcuc2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBtYXBVcGRhdGVTZXQodGhpcy5jb25maWcudGFibGUsIGNvbmZpZy5zZXQpKTtcbiAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goXG4gICAgICBzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSR7dGFyZ2V0V2hlcmVTcWx9IGRvIHVwZGF0ZSBzZXQgJHtzZXRTcWx9JHt3aGVyZVNxbH0ke3NldFdoZXJlU3FsfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRJbnNlcnRRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVJbnNlcnRCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5zZXJ0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlVXBkYXRlQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZUJ1aWxkZXJcIjtcbiAgc2V0KHZhbHVlcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQmFzZShcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICBtYXBVcGRhdGVTZXQodGhpcy50YWJsZSwgdmFsdWVzKSxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMud2l0aExpc3RcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVVcGRhdGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNldCwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgc2V0LCB0YWJsZSwgd2l0aExpc3QsIGpvaW5zOiBbXSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgZnJvbShzb3VyY2UpIHtcbiAgICB0aGlzLmNvbmZpZy5mcm9tID0gc291cmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucy5zb21lKChqb2luKSA9PiBqb2luLmFsaWFzID09PSB0YWJsZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxpYXMgXCIke3RhYmxlTmFtZX1cIiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBxdWVyeWApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmNvbmZpZy5mcm9tID8gaXModGFibGUsIFNRTGl0ZVRhYmxlKSA/IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA6IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFNRTGl0ZVZpZXdCYXNlKSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgZnJvbSAmJiBuZXcgUHJveHkoXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICByaWdodEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJyaWdodFwiKTtcbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEFkZHMgYSAnd2hlcmUnIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvdXBkYXRlfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlICd3aGVyZScgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRVcGRhdGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVVcGRhdGVCYXNlLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXBkYXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmNsYXNzIFNRTGl0ZUNvdW50QnVpbGRlciBleHRlbmRzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZEVtYmVkZGVkQ291bnQocGFyYW1zLnNvdXJjZSwgcGFyYW1zLmZpbHRlcnMpLnF1ZXJ5Q2h1bmtzKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnNlc3Npb24gPSBwYXJhbXMuc2Vzc2lvbjtcbiAgICB0aGlzLnNxbCA9IFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZENvdW50KFxuICAgICAgcGFyYW1zLnNvdXJjZSxcbiAgICAgIHBhcmFtcy5maWx0ZXJzXG4gICAgKTtcbiAgfVxuICBzcWw7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvdW50QnVpbGRlckFzeW5jXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBzZXNzaW9uO1xuICBzdGF0aWMgYnVpbGRFbWJlZGRlZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgKHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfSlgO1xuICB9XG4gIHN0YXRpYyBidWlsZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgc2VsZWN0IGNvdW50KCopIGZyb20gJHtzb3VyY2V9JHtzcWwucmF3KFwiIHdoZXJlIFwiKS5pZihmaWx0ZXJzKX0ke2ZpbHRlcnN9YDtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNlc3Npb24uY291bnQodGhpcy5zcWwpKS50aGVuKFxuICAgICAgb25mdWxmaWxsZWQsXG4gICAgICBvbnJlamVjdGVkXG4gICAgKTtcbiAgfVxuICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIG9uUmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25GaW5hbGx5KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ291bnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y291bnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7XG4gIG1hcFJlbGF0aW9uYWxSb3dcbn0gZnJvbSBcIi4uLy4uL3JlbGF0aW9ucy5qc1wiO1xuY2xhc3MgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGZ1bGxTY2hlbWEsIHNjaGVtYSwgdGFibGVOYW1lc01hcCwgdGFibGUsIHRhYmxlQ29uZmlnLCBkaWFsZWN0LCBzZXNzaW9uKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlCdWlsZGVyXCI7XG4gIGZpbmRNYW55KGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFwic3luY1wiID8gbmV3IFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8gY29uZmlnIDoge30sXG4gICAgICBcIm1hbnlcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApO1xuICB9XG4gIGZpbmRGaXJzdChjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKSA6IG5ldyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8geyAuLi5jb25maWcsIGxpbWl0OiAxIH0gOiB7IGxpbWl0OiAxIH0sXG4gICAgICBcImZpcnN0XCJcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbiwgY29uZmlnLCBtb2RlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIG1vZGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgZnVsbFNjaGVtYTogdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGFibGVDb25maWc6IHRoaXMudGFibGVDb25maWcsXG4gICAgICBxdWVyeUNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB0YWJsZUFsaWFzOiB0aGlzLnRhYmxlQ29uZmlnLnRzTmFtZVxuICAgIH0pLnNxbDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHF1ZXJ5LCBidWlsdFF1ZXJ5IH0gPSB0aGlzLl90b1NRTCgpO1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgYnVpbHRRdWVyeSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiID8gXCJnZXRcIiA6IFwiYWxsXCIsXG4gICAgICB0cnVlLFxuICAgICAgKHJhd1Jvd3MsIG1hcENvbHVtblZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSByYXdSb3dzLm1hcChcbiAgICAgICAgICAocm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KHRoaXMuc2NoZW1hLCB0aGlzLnRhYmxlQ29uZmlnLCByb3csIHF1ZXJ5LnNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgICAgIHJldHVybiByb3dzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgX3RvU1FMKCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KTtcbiAgICBjb25zdCBidWlsdFF1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkuc3FsKTtcbiAgICByZXR1cm4geyBxdWVyeSwgYnVpbHRRdWVyeSB9O1xuICB9XG4gIHRvU1FMKCkge1xuICAgIHJldHVybiB0aGlzLl90b1NRTCgpLmJ1aWx0UXVlcnk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleGVjdXRlUmF3KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSkuYWxsKCk7XG4gIH1cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmF3KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XCI7XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5leHBvcnQge1xuICBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVSZWxhdGlvbmFsUXVlcnksXG4gIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuY2xhc3MgU1FMaXRlUmF3IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0ZSwgZ2V0U1FMLCBhY3Rpb24sIGRpYWxlY3QsIG1hcEJhdGNoUmVzdWx0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICAgIHRoaXMuZ2V0U1FMID0gZ2V0U1FMO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5tYXBCYXRjaFJlc3VsdCA9IG1hcEJhdGNoUmVzdWx0O1xuICAgIHRoaXMuY29uZmlnID0geyBhY3Rpb24gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSYXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLCBtZXRob2Q6IHRoaXMuY29uZmlnLmFjdGlvbiB9O1xuICB9XG4gIG1hcFJlc3VsdChyZXN1bHQsIGlzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIGlzRnJvbUJhdGNoID8gdGhpcy5tYXBCYXRjaFJlc3VsdChyZXN1bHQpIDogcmVzdWx0O1xuICB9XG4gIF9wcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmF3XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmF3LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQge1xuICBRdWVyeUJ1aWxkZXIsXG4gIFNRTGl0ZURlbGV0ZUJhc2UsXG4gIFNRTGl0ZUluc2VydEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVVwZGF0ZUJ1aWxkZXJcbn0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ291bnRCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvY291bnQuanNcIjtcbmltcG9ydCB7IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUmF3IH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcmF3LmpzXCI7XG5jbGFzcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRLaW5kLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpIHtcbiAgICB0aGlzLnJlc3VsdEtpbmQgPSByZXN1bHRLaW5kO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLl8gPSBzY2hlbWEgPyB7XG4gICAgICBzY2hlbWE6IHNjaGVtYS5zY2hlbWEsXG4gICAgICBmdWxsU2NoZW1hOiBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHNjaGVtYS50YWJsZU5hbWVzTWFwXG4gICAgfSA6IHtcbiAgICAgIHNjaGVtYTogdm9pZCAwLFxuICAgICAgZnVsbFNjaGVtYToge30sXG4gICAgICB0YWJsZU5hbWVzTWFwOiB7fVxuICAgIH07XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICBpZiAodGhpcy5fLnNjaGVtYSkge1xuICAgICAgZm9yIChjb25zdCBbdGFibGVOYW1lLCBjb2x1bW5zXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl8uc2NoZW1hKSkge1xuICAgICAgICBxdWVyeVt0YWJsZU5hbWVdID0gbmV3IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIoXG4gICAgICAgICAgcmVzdWx0S2luZCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8uc2NoZW1hLFxuICAgICAgICAgIHRoaXMuXy50YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHNjaGVtYS5mdWxsU2NoZW1hW3RhYmxlTmFtZV0sXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBkaWFsZWN0LFxuICAgICAgICAgIHNlc3Npb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kY2FjaGUgPSB7IGludmFsaWRhdGU6IGFzeW5jIChfcGFyYW1zKSA9PiB7XG4gICAgfSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJhc2VTUUxpdGVEYXRhYmFzZVwiO1xuICBxdWVyeTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdWJxdWVyeSB0aGF0IGRlZmluZXMgYSB0ZW1wb3JhcnkgbmFtZWQgcmVzdWx0IHNldCBhcyBhIENURS5cbiAgICpcbiAgICogSXQgaXMgdXNlZnVsIGZvciBicmVha2luZyBkb3duIGNvbXBsZXggcXVlcmllcyBpbnRvIHNpbXBsZXIgcGFydHMgYW5kIGZvciByZXVzaW5nIHRoZSByZXN1bHQgc2V0IGluIHN1YnNlcXVlbnQgcGFydHMgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIGFsaWFzIFRoZSBhbGlhcyBmb3IgdGhlIHN1YnF1ZXJ5LlxuICAgKlxuICAgKiBGYWlsdXJlIHRvIHByb3ZpZGUgYW4gYWxpYXMgd2lsbCByZXN1bHQgaW4gYSBEcml6emxlVHlwZUVycm9yLCBwcmV2ZW50aW5nIHRoZSBzdWJxdWVyeSBmcm9tIGJlaW5nIHJlZmVyZW5jZWQgaW4gb3RoZXIgcXVlcmllcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gQ3JlYXRlIGEgc3VicXVlcnkgd2l0aCBhbGlhcyAnc3EnIGFuZCB1c2UgaXQgaW4gdGhlIHNlbGVjdCBxdWVyeVxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUbyBzZWxlY3QgYXJiaXRyYXJ5IFNRTCB2YWx1ZXMgYXMgZmllbGRzIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgdGhlbSBpbiBvdGhlciBDVEVzIG9yIGluIHRoZSBtYWluIHF1ZXJ5LCB5b3UgbmVlZCB0byBhZGQgYWxpYXNlcyB0byB0aGVtOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYW4gYXJiaXRyYXJ5IFNRTCB2YWx1ZSBhcyBhIGZpZWxkIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgaXQgaW4gdGhlIG1haW4gcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3Qoe1xuICAgKiAgIG5hbWU6IHNxbDxzdHJpbmc+YHVwcGVyKCR7dXNlcnMubmFtZX0pYC5hcygnbmFtZScpLFxuICAgKiB9KVxuICAgKiAuZnJvbSh1c2VycykpO1xuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoeyBuYW1lOiBzcS5uYW1lIH0pLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBhcyA9IChxYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBxYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHFiID0gcWIobmV3IFF1ZXJ5QnVpbGRlcihzZWxmLmRpYWxlY3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBXaXRoU3VicXVlcnkoXG4gICAgICAgICAgcWIuZ2V0U1FMKCksXG4gICAgICAgICAgc2VsZWN0aW9uID8/IChcImdldFNlbGVjdGVkRmllbGRzXCIgaW4gcWIgPyBxYi5nZXRTZWxlY3RlZEZpZWxkcygpID8/IHt9IDoge30pLFxuICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGFzIH07XG4gIH07XG4gICRjb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUNvdW50QnVpbGRlcih7IHNvdXJjZSwgZmlsdGVycywgc2Vzc2lvbjogdGhpcy5zZXNzaW9uIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbmNvcnBvcmF0ZXMgYSBwcmV2aW91c2x5IGRlZmluZWQgQ1RFICh1c2luZyBgJHdpdGhgKSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIG1haW4gcXVlcnkgdG8gcmVmZXJlbmNlIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I3dpdGgtY2xhdXNlfVxuICAgKlxuICAgKiBAcGFyYW0gcXVlcmllcyBUaGUgQ1RFcyB0byBpbmNvcnBvcmF0ZSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWZpbmUgYSBzdWJxdWVyeSAnc3EnIGFzIGEgQ1RFIHVzaW5nICR3aXRoXG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KCkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIDQyKSkpO1xuICAgKlxuICAgKiAvLyBJbmNvcnBvcmF0ZSB0aGUgQ1RFICdzcScgaW50byB0aGUgbWFpbiBxdWVyeSBhbmQgc2VsZWN0IGZyb20gaXRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiBzZWxmLnNlc3Npb24sXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZGlhbGVjdCxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0YWJsZSkge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydChpbnRvKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWxldGVfKGZyb20pIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QsIHVwZGF0ZSwgaW5zZXJ0LCBkZWxldGU6IGRlbGV0ZV8gfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB0aGlzLnNlc3Npb24sIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiB1cGRhdGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIHVwZGF0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAqXG4gICAqIFVzZSBgLnNldCgpYCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byB1cGRhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgcm93cyBpbiB0aGUgJ2NhcnMnIHRhYmxlXG4gICAqIGF3YWl0IGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pLndoZXJlKGVxKGNhcnMuYnJhbmQsICdCTVcnKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgdXBkYXRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi51cGRhdGUoY2FycylcbiAgICogICAuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICB1cGRhdGUodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJ1aWxkZXIodGFibGUsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICAkY2FjaGU7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc2VydCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBuZXcgcm93cyBpbiBhIHRhYmxlLiBVc2UgYC52YWx1ZXMoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIGluc2VydC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnR9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gaW5zZXJ0IGludG8uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSk7XG4gICAqXG4gICAqIC8vIEluc2VydCBtdWx0aXBsZSByb3dzXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoW3sgYnJhbmQ6ICdCTVcnIH0sIHsgYnJhbmQ6ICdQb3JzY2hlJyB9XSk7XG4gICAqXG4gICAqIC8vIEluc2VydCB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgaW5zZXJ0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnNlcnQoaW50bykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QnVpbGRlcihpbnRvLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkZWxldGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIGRlbGV0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvZGVsZXRlfVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycyk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGRlbGV0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuZGVsZXRlKGNhcnMpXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBkZWxldGUoZnJvbSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJydW5cIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5ydW4oc2VxdWVsKTtcbiAgfVxuICBhbGwocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImFsbFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3QWxsVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmFsbChzZXF1ZWwpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwiZ2V0XCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0KHNlcXVlbCk7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJ2YWx1ZXNcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1ZhbHVlc1ZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi52YWx1ZXMoc2VxdWVsKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKTtcbiAgfVxufVxuY29uc3Qgd2l0aFJlcGxpY2FzID0gKHByaW1hcnksIHJlcGxpY2FzLCBnZXRSZXBsaWNhID0gKCkgPT4gcmVwbGljYXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmVwbGljYXMubGVuZ3RoKV0pID0+IHtcbiAgY29uc3Qgc2VsZWN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdCguLi5hcmdzKTtcbiAgY29uc3Qgc2VsZWN0RGlzdGluY3QgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuc2VsZWN0RGlzdGluY3QoLi4uYXJncyk7XG4gIGNvbnN0ICRjb3VudCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS4kY291bnQoLi4uYXJncyk7XG4gIGNvbnN0ICR3aXRoID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLndpdGgoLi4uYXJncyk7XG4gIGNvbnN0IHVwZGF0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnVwZGF0ZSguLi5hcmdzKTtcbiAgY29uc3QgaW5zZXJ0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuaW5zZXJ0KC4uLmFyZ3MpO1xuICBjb25zdCAkZGVsZXRlID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZGVsZXRlKC4uLmFyZ3MpO1xuICBjb25zdCBydW4gPSAoLi4uYXJncykgPT4gcHJpbWFyeS5ydW4oLi4uYXJncyk7XG4gIGNvbnN0IGFsbCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmFsbCguLi5hcmdzKTtcbiAgY29uc3QgZ2V0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZ2V0KC4uLmFyZ3MpO1xuICBjb25zdCB2YWx1ZXMgPSAoLi4uYXJncykgPT4gcHJpbWFyeS52YWx1ZXMoLi4uYXJncyk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudHJhbnNhY3Rpb24oLi4uYXJncyk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJpbWFyeSxcbiAgICB1cGRhdGUsXG4gICAgaW5zZXJ0LFxuICAgIGRlbGV0ZTogJGRlbGV0ZSxcbiAgICBydW4sXG4gICAgYWxsLFxuICAgIGdldCxcbiAgICB2YWx1ZXMsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgJHByaW1hcnk6IHByaW1hcnksXG4gICAgc2VsZWN0LFxuICAgIHNlbGVjdERpc3RpbmN0LFxuICAgICRjb3VudCxcbiAgICB3aXRoOiAkd2l0aCxcbiAgICBnZXQgcXVlcnkoKSB7XG4gICAgICByZXR1cm4gZ2V0UmVwbGljYShyZXBsaWNhcykucXVlcnk7XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB7XG4gIEJhc2VTUUxpdGVEYXRhYmFzZSxcbiAgd2l0aFJlcGxpY2FzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuY2xhc3MgQ2FjaGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDYWNoZVwiO1xufVxuY2xhc3MgTm9vcENhY2hlIGV4dGVuZHMgQ2FjaGUge1xuICBzdHJhdGVneSgpIHtcbiAgICByZXR1cm4gXCJhbGxcIjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wQ2FjaGVcIjtcbiAgYXN5bmMgZ2V0KF9rZXkpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGFzeW5jIHB1dChfaGFzaGVkUXVlcnksIF9yZXNwb25zZSwgX3RhYmxlcywgX2NvbmZpZykge1xuICB9XG4gIGFzeW5jIG9uTXV0YXRlKF9wYXJhbXMpIHtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gaGFzaFF1ZXJ5KHNxbCwgcGFyYW1zKSB7XG4gIGNvbnN0IGRhdGFUb0hhc2ggPSBgJHtzcWx9LSR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShkYXRhVG9IYXNoKTtcbiAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgY29uc3QgaGFzaEFycmF5ID0gWy4uLm5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpXTtcbiAgY29uc3QgaGFzaEhleCA9IGhhc2hBcnJheS5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGhhc2hIZXg7XG59XG5leHBvcnQge1xuICBDYWNoZSxcbiAgTm9vcENhY2hlLFxuICBoYXNoUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNoZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGhhc2hRdWVyeSwgTm9vcENhY2hlIH0gZnJvbSBcIi4uL2NhY2hlL2NvcmUvY2FjaGUuanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yLCBEcml6emxlUXVlcnlFcnJvciwgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuL2RiLmpzXCI7XG5jbGFzcyBFeGVjdXRlUmVzdWx0U3luYyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdENiKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdENiID0gcmVzdWx0Q2I7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXhlY3V0ZVJlc3VsdFN5bmNcIjtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDYigpO1xuICB9XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUHJlcGFyZWRRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5LCBjYWNoZSwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZXhlY3V0ZU1ldGhvZCA9IGV4ZWN1dGVNZXRob2Q7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEgPSBxdWVyeU1ldGFkYXRhO1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjYWNoZUNvbmZpZztcbiAgICBpZiAoY2FjaGUgJiYgY2FjaGUuc3RyYXRlZ3koKSA9PT0gXCJhbGxcIiAmJiBjYWNoZUNvbmZpZyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0geyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5jYWNoZUNvbmZpZz8uZW5hYmxlKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQcmVwYXJlZFF1ZXJ5XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBxdWVyeVdpdGhDYWNoZShxdWVyeVN0cmluZywgcGFyYW1zLCBxdWVyeSkge1xuICAgIGlmICh0aGlzLmNhY2hlID09PSB2b2lkIDAgfHwgaXModGhpcy5jYWNoZSwgTm9vcENhY2hlKSB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVDb25maWcgJiYgIXRoaXMuY2FjaGVDb25maWcuZW5hYmxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImluc2VydFwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcInVwZGF0ZVwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImRlbGV0ZVwiKSAmJiB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHF1ZXJ5KCksXG4gICAgICAgICAgdGhpcy5jYWNoZS5vbk11dGF0ZSh7IHRhYmxlczogdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyB9KVxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgY29uc3QgZnJvbUNhY2hlID0gYXdhaXQgdGhpcy5jYWNoZS5nZXQoXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnID8/IChhd2FpdCBoYXNoUXVlcnkocXVlcnlTdHJpbmcsIHBhcmFtcykpLFxuICAgICAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyAhPT0gdm9pZCAwLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlXG4gICAgICApO1xuICAgICAgaWYgKGZyb21DYWNoZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcXVlcnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNhY2hlLnB1dChcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNlbmQgdGFibGVzIHRoYXQgd2VyZSB1c2VkIGluIGEgcXVlcnkgb25seSBpZiB1c2VyIHdhbnRzIHRvIGludmFsaWRhdGUgaXQgb24gZWFjaCB3cml0ZVxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcuYXV0b0ludmFsaWRhdGUgPyB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzIDogW10sXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmNvbmZpZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21DYWNoZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICB9XG4gIH1cbiAgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnk7XG4gIH1cbiAgbWFwUnVuUmVzdWx0KHJlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtYXBBbGxSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIG1hcEdldFJlc3VsdChfcmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXhlY3V0ZVJlc3VsdFN5bmMoKCkgPT4gdGhpc1t0aGlzLmV4ZWN1dGVNZXRob2RdKHBsYWNlaG9sZGVyVmFsdWVzKSk7XG4gIH1cbiAgbWFwUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCkge1xuICAgIHN3aXRjaCAodGhpcy5leGVjdXRlTWV0aG9kKSB7XG4gICAgICBjYXNlIFwicnVuXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwUnVuUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYWxsXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwQWxsUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZ2V0XCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwR2V0UmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2Vzc2lvblwiO1xuICBwcmVwYXJlT25lVGltZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyLCBxdWVyeU1ldGFkYXRhLCBjYWNoZUNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVRdWVyeShcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmllbGRzLFxuICAgICAgZXhlY3V0ZU1ldGhvZCxcbiAgICAgIGlzUmVzcG9uc2VJbkFycmF5TW9kZSxcbiAgICAgIGN1c3RvbVJlc3VsdE1hcHBlcixcbiAgICAgIHF1ZXJ5TWV0YWRhdGEsXG4gICAgICBjYWNoZUNvbmZpZ1xuICAgICk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc3RhdGljUXVlcnkgPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkoc3RhdGljUXVlcnksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnJ1bigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7IGNhdXNlOiBlcnIsIG1lc3NhZ2U6IGBGYWlsZWQgdG8gcnVuIHRoZSBxdWVyeSAnJHtzdGF0aWNRdWVyeS5zcWx9J2AgfSk7XG4gICAgfVxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0KHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmFsbCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZ2V0KHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmdldCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0dldFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnZhbHVlcygpO1xuICB9XG4gIGFzeW5jIGNvdW50KHNxbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsdWVzKHNxbCk7XG4gICAgcmV0dXJuIHJlc3VsdFswXVswXTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSwgbmVzdGVkSW5kZXggPSAwKSB7XG4gICAgc3VwZXIocmVzdWx0VHlwZSwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm5lc3RlZEluZGV4ID0gbmVzdGVkSW5kZXg7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVHJhbnNhY3Rpb25cIjtcbiAgcm9sbGJhY2soKSB7XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvcigpO1xuICB9XG59XG5leHBvcnQge1xuICBFeGVjdXRlUmVzdWx0U3luYyxcbiAgU1FMaXRlUHJlcGFyZWRRdWVyeSxcbiAgU1FMaXRlU2Vzc2lvbixcbiAgU1FMaXRlVHJhbnNhY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXNzaW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29uc29sZUxvZ1dyaXRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbnNvbGVMb2dXcml0ZXJcIjtcbiAgd3JpdGUobWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICB9XG59XG5jbGFzcyBEZWZhdWx0TG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRGVmYXVsdExvZ2dlclwiO1xuICB3cml0ZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMud3JpdGVyID0gY29uZmlnPy53cml0ZXIgPz8gbmV3IENvbnNvbGVMb2dXcml0ZXIoKTtcbiAgfVxuICBsb2dRdWVyeShxdWVyeSwgcGFyYW1zKSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWRQYXJhbXMgPSBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwYXJhbXNTdHIgPSBzdHJpbmdpZmllZFBhcmFtcy5sZW5ndGggPyBgIC0tIHBhcmFtczogWyR7c3RyaW5naWZpZWRQYXJhbXMuam9pbihcIiwgXCIpfV1gIDogXCJcIjtcbiAgICB0aGlzLndyaXRlci53cml0ZShgUXVlcnk6ICR7cXVlcnl9JHtwYXJhbXNTdHJ9YCk7XG4gIH1cbn1cbmNsYXNzIE5vb3BMb2dnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wTG9nZ2VyXCI7XG4gIGxvZ1F1ZXJ5KCkge1xuICB9XG59XG5leHBvcnQge1xuICBDb25zb2xlTG9nV3JpdGVyLFxuICBEZWZhdWx0TG9nZ2VyLFxuICBOb29wTG9nZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgaW5kZXgsIGludGVnZXIsIHJlYWwsIHNxbGl0ZVRhYmxlLCB0ZXh0IH0gZnJvbSBcImRyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlXCI7XG5pbXBvcnQgeyByZWxhdGlvbnMgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9zY2hlbWEudHNcbnZhciBzY2hlbWFfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoc2NoZW1hX2V4cG9ydHMsIHtcblx0Y2hhcmFjdGVyczogKCkgPT4gY2hhcmFjdGVycyxcblx0Y2hhcmFjdGVyc1JlbGF0aW9uczogKCkgPT4gY2hhcmFjdGVyc1JlbGF0aW9ucyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9uczogKCkgPT4gbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0czogKCkgPT4gbWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0c1JlbGF0aW9ucyxcblx0cmVzdW1lQ29tbWFuZHM6ICgpID0+IHJlc3VtZUNvbW1hbmRzLFxuXHRzaGFyZWQ6ICgpID0+IHNoYXJlZCxcblx0dXNlcnM6ICgpID0+IHVzZXJzLFxuXHR1c2Vyc1JlbGF0aW9uczogKCkgPT4gdXNlcnNSZWxhdGlvbnNcbn0pO1xuY29uc3Qgc2hhcmVkID0ge1xuXHRjcmVhdGVkQXQ6IGludGVnZXIoXCJjcmVhdGVkX2F0XCIpLm5vdE51bGwoKSxcblx0dXBkYXRlZEF0OiBpbnRlZ2VyKFwidXBkYXRlZF9hdFwiKVxufTtcbmNvbnN0IHVzZXJzID0gc3FsaXRlVGFibGUoXCJ1c2Vyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKCkucHJpbWFyeUtleSgpLnVuaXF1ZSgpLm5vdE51bGwoKSxcblx0ZGlzY29yZElEOiB0ZXh0KFwiZGlzY29yZF9pZFwiKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdG1haW5DaGFyYWN0ZXI6IGludGVnZXIoXCJtYWluX2NoYXJhY3RlclwiKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtpbmRleChcImlkeF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJRCksIGluZGV4KFwiaWR4X21haW5fY2hhcmFjdGVyXCIpLm9uKHRhYmxlLm1haW5DaGFyYWN0ZXIpXSk7XG5jb25zdCB1c2Vyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyh1c2VycywgKHsgb25lLCBtYW55IH0pID0+ICh7XG5cdGNoYXJhY3RlcnM6IG1hbnkoY2hhcmFjdGVycyksXG5cdG1haW46IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbdXNlcnMubWFpbkNoYXJhY3Rlcl0sXG5cdFx0cmVmZXJlbmNlczogW2NoYXJhY3RlcnMuaWRdXG5cdH0pXG59KSk7XG5jb25zdCBjaGFyYWN0ZXJzID0gc3FsaXRlVGFibGUoXCJjaGFyYWN0ZXJzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZXZlSUQ6IGludGVnZXIoXCJldmVfaWRcIikubm90TnVsbCgpLFxuXHR1c2VySUQ6IGludGVnZXIoXCJ1c2VyX2lkXCIpLm5vdE51bGwoKSxcblx0bmFtZTogdGV4dCgpLm5vdE51bGwoKSxcblx0YWNjZXNzVG9rZW46IHRleHQoXCJhY2Nlc3NfdG9rZW5cIikubm90TnVsbCgpLFxuXHRleHBpcmVzQXQ6IGludGVnZXIoXCJleHBpcmVzX2F0XCIpLm5vdE51bGwoKSxcblx0cmVmcmVzaFRva2VuOiB0ZXh0KFwicmVmcmVzaF90b2tlblwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfdXNlcl9pZFwiKS5vbih0YWJsZS51c2VySUQpLCBpbmRleChcImlkeF9ldmVfaWRcIikub24odGFibGUuZXZlSUQpXSk7XG5jb25zdCBjaGFyYWN0ZXJzUmVsYXRpb25zID0gcmVsYXRpb25zKGNoYXJhY3RlcnMsICh7IG9uZSB9KSA9PiAoeyB1c2VyOiBvbmUodXNlcnMsIHtcblx0ZmllbGRzOiBbY2hhcmFjdGVycy51c2VySURdLFxuXHRyZWZlcmVuY2VzOiBbdXNlcnMuaWRdXG59KSB9KSk7XG5jb25zdCByZXN1bWVDb21tYW5kcyA9IHNxbGl0ZVRhYmxlKFwicmVzdW1lY29tbWFuZHNcIiwge1xuXHRpZDogdGV4dCgpLnByaW1hcnlLZXkoKSxcblx0Y29tbWFuZDogdGV4dCgpLm5vdE51bGwoKSxcblx0cGFyYW1zOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRjb250ZXh0OiB0ZXh0KCkubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0pO1xuY29uc3QgbWluaW5nRmxlZXRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0bmFtZTogdGV4dChcIm5hbWVcIikubm90TnVsbCgpLFxuXHRkZXNjcmlwdGlvbjogdGV4dChcImRlc2NyaXB0aW9uXCIpLFxuXHRjcmVhdG9yRGlzY29yZElkOiB0ZXh0KFwiY3JlYXRvcl9kaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0c3RhcnRUaW1lOiBpbnRlZ2VyKFwic3RhcnRfdGltZVwiKS5ub3ROdWxsKCksXG5cdGVuZFRpbWU6IGludGVnZXIoXCJlbmRfdGltZVwiKSxcblx0c3RhdHVzOiB0ZXh0KFwic3RhdHVzXCIsIHsgZW51bTogW1xuXHRcdFwiY29uZmlndXJpbmdcIixcblx0XHRcImFjdGl2ZVwiLFxuXHRcdFwiZW5kZWRcIixcblx0XHRcImdlbmVyYXRpbmdfcmVwb3J0XCIsXG5cdFx0XCJjb21wbGV0ZWRcIixcblx0XHRcImZhaWxlZFwiXG5cdF0gfSkubm90TnVsbCgpLmRlZmF1bHQoXCJjb25maWd1cmluZ1wiKSxcblx0dGF4UmF0ZTogcmVhbChcInRheF9yYXRlXCIpLm5vdE51bGwoKS5kZWZhdWx0KDApLFxuXHRwdWJsaWNNZXNzYWdlSWQ6IHRleHQoXCJwdWJsaWNfbWVzc2FnZV9pZFwiKS51bmlxdWUoKSxcblx0cHVibGljQ2hhbm5lbElkOiB0ZXh0KFwicHVibGljX2NoYW5uZWxfaWRcIiksXG5cdHJlcG9ydERhdGE6IHRleHQoXCJyZXBvcnRfZGF0YVwiKSxcblx0Y3JlYXRvckVwaGVtZXJhbE1lc3NhZ2VJZDogdGV4dChcImNyZWF0b3JfZXBoZW1lcmFsX21lc3NhZ2VfaWRcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X2ZsZWV0X2NyZWF0b3JfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5jcmVhdG9yRGlzY29yZElkKSxcblx0aW5kZXgoXCJpZHhfZmxlZXRfc3RhdHVzXCIpLm9uKHRhYmxlLnN0YXR1cyksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3B1YmxpY19tZXNzYWdlX2lkXCIpLm9uKHRhYmxlLnB1YmxpY01lc3NhZ2VJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMgPSBzcWxpdGVUYWJsZShcIm1pbmluZ19mbGVldF9wYXJ0aWNpcGFudHNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRmbGVldElkOiBpbnRlZ2VyKFwiZmxlZXRfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gbWluaW5nRmxlZXRzLmlkLCB7IG9uRGVsZXRlOiBcImNhc2NhZGVcIiB9KSxcblx0Y2hhcmFjdGVySWQ6IGludGVnZXIoXCJjaGFyYWN0ZXJfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY2hhcmFjdGVycy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGRpc2NvcmRJZDogdGV4dChcImRpc2NvcmRfaWRcIikubm90TnVsbCgpLFxuXHRyb2xlOiB0ZXh0KFwicm9sZVwiLCB7IGVudW06IFtcblx0XHRcIm1pbmVyXCIsXG5cdFx0XCJzZWN1cml0eVwiLFxuXHRcdFwiaGF1bGVyXCJcblx0XSB9KS5ub3ROdWxsKCksXG5cdGpvaW5UaW1lOiBpbnRlZ2VyKFwiam9pbl90aW1lXCIpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfZmxlZXRfaWRcIikub24odGFibGUuZmxlZXRJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2NoYXJhY3Rlcl9pZFwiKS5vbih0YWJsZS5jaGFyYWN0ZXJJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2Rpc2NvcmRfaWRcIikub24odGFibGUuZGlzY29yZElkKVxuXSk7XG5jb25zdCBtaW5pbmdGbGVldHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRzLCAoeyBtYW55IH0pID0+ICh7IHBhcnRpY2lwYW50czogbWFueShtaW5pbmdGbGVldFBhcnRpY2lwYW50cykgfSkpO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsICh7IG9uZSB9KSA9PiAoe1xuXHRmbGVldDogb25lKG1pbmluZ0ZsZWV0cywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmZsZWV0SWRdLFxuXHRcdHJlZmVyZW5jZXM6IFttaW5pbmdGbGVldHMuaWRdXG5cdH0pLFxuXHRjaGFyYWN0ZXI6IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMuY2hhcmFjdGVySWRdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfTsiLAogICAgIi8vI3JlZ2lvbiBzcmMvZXNpL29wdGlvbnMudHNcbmNvbnN0IENMSUVOVF9JRCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfSUQgfHwgXCJcIjtcbmNvbnN0IENMSUVOVF9TRUNSRVQgPSBwcm9jZXNzLmVudi5FVkVfQ0xJRU5UX1NFQ1JFVCB8fCBcIlwiO1xuY29uc3QgQ0FMTEJBQ0tfVVJMID0gcHJvY2Vzcy5lbnYuRVZFX0NBTExCQUNLX1VSTCB8fCBcIlwiO1xuY29uc3QgVVNFUl9BR0VOVCA9IHByb2Nlc3MuZW52LkVTSV9VU0VSX0FHRU5UIHx8IFwiXCI7XG5jb25zdCBvcHRpb25zID0ge1xuXHRjbGllbnRfaWQ6IENMSUVOVF9JRCxcblx0Y2xpZW50X3NlY3JldDogQ0xJRU5UX1NFQ1JFVCxcblx0Y2FsbGJhY2tfdXJsOiBDQUxMQkFDS19VUkwsXG5cdHVzZXJfYWdlbnQ6IFVTRVJfQUdFTlRcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgb3B0aW9ucyB9OyIsCiAgICAiZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuSW52YWxpZFRva2VuRXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIkludmFsaWRUb2tlbkVycm9yXCI7XG5mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKHN0cikge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihzdHIpLnJlcGxhY2UoLyguKS9nLCAobSwgcCkgPT4ge1xuICAgICAgICBsZXQgY29kZSA9IHAuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgY29kZSA9IFwiMFwiICsgY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIlXCIgKyBjb2RlO1xuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZShzdHIpIHtcbiAgICBsZXQgb3V0cHV0ID0gc3RyLnJlcGxhY2UoLy0vZywgXCIrXCIpLnJlcGxhY2UoL18vZywgXCIvXCIpO1xuICAgIHN3aXRjaCAob3V0cHV0Lmxlbmd0aCAlIDQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBiNjREZWNvZGVVbmljb2RlKG91dHB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICB9XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBjb25zdCBwb3MgPSBvcHRpb25zLmhlYWRlciA9PT0gdHJ1ZSA/IDAgOiAxO1xuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbWlzc2luZyBwYXJ0ICMke3BvcyArIDF9YCk7XG4gICAgfVxuICAgIGxldCBkZWNvZGVkO1xuICAgIHRyeSB7XG4gICAgICAgIGRlY29kZWQgPSBiYXNlNjRVcmxEZWNvZGUocGFydCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQgYmFzZTY0IGZvciBwYXJ0ICMke3BvcyArIDF9ICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGpzb24gZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTG93ZXJDYXNlKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2VOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzIoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlKGJ5dGVzKTtcbn1cbi8qKiBSZXBsYWNlZDogVXNlIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZygpIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZyhieXRlcyk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDUpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDBuO1xuICAgICAgICBsZXQgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNSAmJiBpICsgaiA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA4bikgfCBCaWdJbnQoYnl0ZXNbaSArIGpdKTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSAlIDUgIT09IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCBCaWdJbnQoNSAtIChidWZmZXJCaXRTaXplICUgNSkpO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgPj0gNSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA+PiBCaWdJbnQoYnVmZmVyQml0U2l6ZSAtIDUpKSAmIDB4MWZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSAtPSA1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmZmVyQml0U2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbTnVtYmVyKChidWZmZXIgPDwgQmlnSW50KDYgLSBidWZmZXJCaXRTaXplKSkgJiAweDNmbildO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFkZGluZyA9PT0gRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlMzIoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTMyRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMklnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTMyRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmZ1bmN0aW9uIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBkZWNvZGVNYXAsIHBhZGRpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwoZW5jb2RlZC5sZW5ndGggLyA4KSAqIDUpO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpICs9IDgpIHtcbiAgICAgICAgbGV0IGNodW5rID0gMG47XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLklnbm9yZSkge1xuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCB8fCBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBCaWdJbnQoZGVjb2RlTWFwW2VuY29kZWRbaSArIGpdXSkgPDwgQmlnSW50KCg3IC0gaikgKiA1KTtcbiAgICAgICAgICAgIGJpdHNSZWFkICs9IDU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpdHNSZWFkIDwgNDApIHtcbiAgICAgICAgICAgIGxldCB1bnVzZWQ7XG4gICAgICAgICAgICBpZiAoYml0c1JlYWQgPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAyMCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDI1KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDM1KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnVzZWQgIT09IDBuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBNYXRoLmZsb29yKGJpdHNSZWFkIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbdG90YWxCeXRlc10gPSBOdW1iZXIoKGNodW5rID4+IEJpZ0ludCgzMiAtIGkgKiA4KSkgJiAweGZmbik7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0b3RhbEJ5dGVzKTtcbn1cbmNvbnN0IGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2N1wiO1xuY29uc3QgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MjM0NTY3XCI7XG5jb25zdCBiYXNlMzJEZWNvZGVNYXAgPSB7XG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAwLFxuICAgIGI6IDEsXG4gICAgYzogMixcbiAgICBkOiAzLFxuICAgIGU6IDQsXG4gICAgZjogNSxcbiAgICBnOiA2LFxuICAgIGg6IDcsXG4gICAgaTogOCxcbiAgICBqOiA5LFxuICAgIGs6IDEwLFxuICAgIGw6IDExLFxuICAgIG06IDEyLFxuICAgIG46IDEzLFxuICAgIG86IDE0LFxuICAgIHA6IDE1LFxuICAgIHE6IDE2LFxuICAgIHI6IDE3LFxuICAgIHM6IDE4LFxuICAgIHQ6IDE5LFxuICAgIHU6IDIwLFxuICAgIHY6IDIxLFxuICAgIHc6IDIyLFxuICAgIHg6IDIzLFxuICAgIHk6IDI0LFxuICAgIHo6IDI1LFxuICAgIFwiMlwiOiAyNixcbiAgICBcIjNcIjogMjcsXG4gICAgXCI0XCI6IDI4LFxuICAgIFwiNVwiOiAyOSxcbiAgICBcIjZcIjogMzAsXG4gICAgXCI3XCI6IDMxXG59O1xudmFyIEVuY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRW5jb2RpbmdQYWRkaW5nKSB7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIkluY2x1ZGVcIl0gPSAwXSA9IFwiSW5jbHVkZVwiO1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJOb25lXCJdID0gMV0gPSBcIk5vbmVcIjtcbn0pKEVuY29kaW5nUGFkZGluZyB8fCAoRW5jb2RpbmdQYWRkaW5nID0ge30pKTtcbnZhciBEZWNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKERlY29kaW5nUGFkZGluZykge1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJSZXF1aXJlZFwiXSA9IDBdID0gXCJSZXF1aXJlZFwiO1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJJZ25vcmVcIl0gPSAxXSA9IFwiSWdub3JlXCI7XG59KShEZWNvZGluZ1BhZGRpbmcgfHwgKERlY29kaW5nUGFkZGluZyA9IHt9KSk7XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjQoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjRBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0dXJsKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0dXJsQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZnVuY3Rpb24gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBhbHBoYWJldCwgcGFkZGluZykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGxldCBidWZmZXIgPSAwO1xuICAgICAgICBsZXQgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMyAmJiBpICsgaiA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA4KSB8IGJ5dGVzW2kgKyBqXTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgPj0gNikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyID4+IChidWZmZXJCaXRTaXplIC0gNikpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSAtPSA2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmZmVyQml0U2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbKGJ1ZmZlciA8PCAoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZdO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFkZGluZyA9PT0gRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGJhc2U2NEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBiYXNlNjR1cmxBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktX1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NChlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjREZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0SWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjREZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NHVybChlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjR1cmxEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsSWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjR1cmxEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDQpICogMyk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwO1xuICAgICAgICBsZXQgYml0c1JlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCAmJiBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlICYmXG4gICAgICAgICAgICAgICAgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCAmJiBlbmNvZGVkW2kgKyBqIC0gMV0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZW5jb2RlZFtpICsgal0gaW4gZGVjb2RlTWFwKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmsgfD0gZGVjb2RlTWFwW2VuY29kZWRbaSArIGpdXSA8PCAoKDMgLSBqKSAqIDYpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCAyNCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAxOCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnVzZWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IChjaHVuayA+PiAoMTYgLSBpICogOCkpICYgMHhmZjtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxudmFyIEVuY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRW5jb2RpbmdQYWRkaW5nKSB7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIkluY2x1ZGVcIl0gPSAwXSA9IFwiSW5jbHVkZVwiO1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJOb25lXCJdID0gMV0gPSBcIk5vbmVcIjtcbn0pKEVuY29kaW5nUGFkZGluZyB8fCAoRW5jb2RpbmdQYWRkaW5nID0ge30pKTtcbnZhciBEZWNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKERlY29kaW5nUGFkZGluZykge1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJSZXF1aXJlZFwiXSA9IDBdID0gXCJSZXF1aXJlZFwiO1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJJZ25vcmVcIl0gPSAxXSA9IFwiSWdub3JlXCI7XG59KShEZWNvZGluZ1BhZGRpbmcgfHwgKERlY29kaW5nUGFkZGluZyA9IHt9KSk7XG5jb25zdCBiYXNlNjREZWNvZGVNYXAgPSB7XG4gICAgXCIwXCI6IDUyLFxuICAgIFwiMVwiOiA1MyxcbiAgICBcIjJcIjogNTQsXG4gICAgXCIzXCI6IDU1LFxuICAgIFwiNFwiOiA1NixcbiAgICBcIjVcIjogNTcsXG4gICAgXCI2XCI6IDU4LFxuICAgIFwiN1wiOiA1OSxcbiAgICBcIjhcIjogNjAsXG4gICAgXCI5XCI6IDYxLFxuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMjYsXG4gICAgYjogMjcsXG4gICAgYzogMjgsXG4gICAgZDogMjksXG4gICAgZTogMzAsXG4gICAgZjogMzEsXG4gICAgZzogMzIsXG4gICAgaDogMzMsXG4gICAgaTogMzQsXG4gICAgajogMzUsXG4gICAgazogMzYsXG4gICAgbDogMzcsXG4gICAgbTogMzgsXG4gICAgbjogMzksXG4gICAgbzogNDAsXG4gICAgcDogNDEsXG4gICAgcTogNDIsXG4gICAgcjogNDMsXG4gICAgczogNDQsXG4gICAgdDogNDUsXG4gICAgdTogNDYsXG4gICAgdjogNDcsXG4gICAgdzogNDgsXG4gICAgeDogNDksXG4gICAgeTogNTAsXG4gICAgejogNTEsXG4gICAgXCIrXCI6IDYyLFxuICAgIFwiL1wiOiA2M1xufTtcbmNvbnN0IGJhc2U2NHVybERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIi1cIjogNjIsXG4gICAgXzogNjNcbn07XG4iLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tIFwiLi9vcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuaW1wb3J0IHsgZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nIH0gZnJvbSBcIkBvc2xvanMvZW5jb2RpbmdcIjtcbmltcG9ydCBqd3QgZnJvbSBcImpzb253ZWJ0b2tlblwiO1xuaW1wb3J0IGp3a1RvUGVtIGZyb20gXCJqd2stdG8tcGVtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2F1dGgudHNcbnZhciBhdXRoX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGF1dGhfZXhwb3J0cywge1xuXHRjaGFyYWN0ZXJJZEZyb21Ub2tlbjogKCkgPT4gY2hhcmFjdGVySWRGcm9tVG9rZW4sXG5cdGNyZWF0ZUF1dGhvcml6YXRpb25VUkw6ICgpID0+IGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsXG5cdHJlZnJlc2g6ICgpID0+IHJlZnJlc2gsXG5cdHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGU6ICgpID0+IHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsXG5cdHZhbGlkYXRlVG9rZW46ICgpID0+IHZhbGlkYXRlVG9rZW5cbn0pO1xuZnVuY3Rpb24gZ2VuZXJhdGVTdGF0ZSgpIHtcblx0Y29uc3QgcmFuZG9tVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuXHRjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbVZhbHVlcyk7XG5cdHJldHVybiBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcocmFuZG9tVmFsdWVzKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwoc2NvcGVzID0gXCJwdWJsaWNEYXRhXCIpIHtcblx0Y29uc3Qgc3RhdGUgPSBnZW5lcmF0ZVN0YXRlKCk7XG5cdGNvbnN0IHVybCA9IG5ldyBVUkwoXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvYXV0aG9yaXplL1wiKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJyZXNwb25zZV90eXBlXCIsIFwiY29kZVwiKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJyZWRpcmVjdF91cmlcIiwgb3B0aW9ucy5jYWxsYmFja191cmwpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudF9pZFwiLCBvcHRpb25zLmNsaWVudF9pZCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic3RhdGVcIiwgc3RhdGUpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInNjb3BlXCIsIEFycmF5LmlzQXJyYXkoc2NvcGVzKSA/IHNjb3Blcy5qb2luKFwiIFwiKSA6IHNjb3Blcyk7XG5cdHJldHVybiB7XG5cdFx0dXJsLFxuXHRcdHN0YXRlXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlKGNvZGUpIHtcblx0dHJ5IHtcblx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRcdEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke29wdGlvbnMuY2xpZW50X2lkfToke29wdGlvbnMuY2xpZW50X3NlY3JldH1gKS50b1N0cmluZyhcImJhc2U2NFwiKX1gXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0XHRcdGdyYW50X3R5cGU6IFwiYXV0aG9yaXphdGlvbl9jb2RlXCIsXG5cdFx0XHRcdGNvZGVcblx0XHRcdH0pXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIGF1dGhvcml6YXRpb24gY29kZWAsIGVycm9yKTtcblx0XHR0aHJvdyBgJHtlcnJvcn1gO1xuXHR9XG59XG5sZXQgZXZlQXV0aFB1YmxpY0tleTtcbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlVG9rZW4odG9rZW4pIHtcblx0aWYgKCFldmVBdXRoUHVibGljS2V5KSB0cnkge1xuXHRcdGNvbnN0IGV2ZUpXS1MgPSBhd2FpdCAoYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vb2F1dGgvandrc1wiKSkuanNvbigpO1xuXHRcdGV2ZUF1dGhQdWJsaWNLZXkgPSBqd2tUb1BlbShldmVKV0tTLmtleXNbMF0pO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gZ2V0IEVWRSBBdXRoIHB1YmxpYyBrZXlzYCwgZXJyKTtcblx0fVxuXHR0cnkge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3QudmVyaWZ5KHRva2VuLCBldmVBdXRoUHVibGljS2V5KTtcblx0XHRyZXR1cm4gZGVjb2RlZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIHZhbGlkYXRlIEVWRSB0b2tlbmAsIGVycik7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goeyByZWZyZXNoX3Rva2VuIH0sIHNjb3Blcykge1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0Z3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG5cdFx0cmVmcmVzaF90b2tlbixcblx0XHRzY29wZTogXCJcIlxuXHR9O1xuXHRpZiAoc2NvcGVzKSBwYXJhbXNbXCJzY29wZVwiXSA9IEFycmF5LmlzQXJyYXkoc2NvcGVzKSA/IHNjb3Blcy5qb2luKFwiIFwiKSA6IHNjb3Blcztcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC90b2tlblwiLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHR9LFxuXHRcdGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKVxuXHR9KTtcblx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbn1cbmZ1bmN0aW9uIGNoYXJhY3RlcklkRnJvbVRva2VuKHRva2VuKSB7XG5cdGNvbnN0IHBheWxvYWQgPSBqd3REZWNvZGUodG9rZW4pO1xuXHRyZXR1cm4gcGFyc2VJbnQocGF5bG9hZC5zdWIuc3BsaXQoXCI6XCIpWzJdKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhdXRoX2V4cG9ydHMsIGNoYXJhY3RlcklkRnJvbVRva2VuLCBjcmVhdGVBdXRob3JpemF0aW9uVVJMLCByZWZyZXNoLCB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlLCB2YWxpZGF0ZVRva2VuIH07IiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgcmVmcmVzaCwgdmFsaWRhdGVUb2tlbiB9IGZyb20gXCIuLi8uLi9lc2kvYXV0aC5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGFuZCwgZXEgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC50c1xudmFyIENoYXJhY3RlckhlbHBlciA9IGNsYXNzIENoYXJhY3RlckhlbHBlciB7XG5cdHN0YXRpYyBoYXNWYWxpZFRva2VuKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSA8IGNoYXJhY3Rlci5leHBpcmVzQXQ7XG5cdH1cblx0c3RhdGljIGdldFNjb3BlcyhjaGFyYWN0ZXIpIHtcblx0XHRjb25zdCBkZWNvZGVkID0gand0RGVjb2RlKGNoYXJhY3Rlci5hY2Nlc3NUb2tlbik7XG5cdFx0cmV0dXJuIHR5cGVvZiBkZWNvZGVkLnNjcCA9PT0gXCJzdHJpbmdcIiA/IFtkZWNvZGVkLnNjcF0gOiBkZWNvZGVkLnNjcDtcblx0fVxuXHRzdGF0aWMgaGFzT25seVB1YmxpY1Njb3BlKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJwdWJsaWNEYXRhXCIpO1xuXHR9XG5cdHN0YXRpYyBnZXRUb2tlbnMoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFjY2Vzc190b2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0cmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdGV4cGlyZXNfaW46IChjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMWUzXG5cdFx0fTtcblx0fVxuXHRzdGF0aWMgaGFzU2NvcGUoY2hhcmFjdGVyLCBzY29wZSkge1xuXHRcdHJldHVybiB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpLmluY2x1ZGVzKHNjb3BlKTtcblx0fVxuXHRzdGF0aWMgaGFzQWxsU2NvcGVzKGNoYXJhY3Rlciwgc2NvcGVzKSB7XG5cdFx0Y29uc3QgaGFzID0gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gc2NvcGVzLmV2ZXJ5KChzY29wZSkgPT4gaGFzLmluY2x1ZGVzKHNjb3BlKSk7XG5cdH1cblx0c3RhdGljIGZpbmQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGlkKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEJ5VXNlcih1c2VyKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlci5pZCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5VXNlckFuZEV2ZUlEKHVzZXJJRCwgZXZlSUQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGFuZChlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlcklEKSwgZXEoY2hhcmFjdGVycy5ldmVJRCwgZXZlSUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEJ5TmFtZSh1c2VySUQsIG5hbWUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGFuZChlcShjaGFyYWN0ZXJzLm5hbWUsIG5hbWUpLCBlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlcklEKSkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRBbGwoKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZShldmVJRCwgbmFtZSwgdXNlciwgdG9rZW5zKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2F2ZSh7XG5cdFx0XHRldmVJRCxcblx0XHRcdHVzZXJJRDogdXNlci5pZCxcblx0XHRcdGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzX3Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUodG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaF90b2tlbixcblx0XHRcdG5hbWUsXG5cdFx0XHRjcmVhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpXG5cdFx0fSk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUNoYXJhY3RlcnMocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocXVlcnkpKSByZXR1cm4gcXVlcnkubWFwKChjaGFyYWN0ZXIpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiBjaGFyYWN0ZXIuaWQsXG5cdFx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdFx0ZXhwaXJlc0F0OiBuZXcgRGF0ZShjaGFyYWN0ZXIuZXhwaXJlc0F0KSxcblx0XHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShjaGFyYWN0ZXIuY3JlYXRlZEF0KSxcblx0XHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShjaGFyYWN0ZXIudXBkYXRlZEF0KVxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRlbHNlIHJldHVybiBbe1xuXHRcdFx0aWQ6IHF1ZXJ5LmlkLFxuXHRcdFx0ZXZlSUQ6IHF1ZXJ5LmV2ZUlELFxuXHRcdFx0dXNlcklEOiBxdWVyeS51c2VySUQsXG5cdFx0XHRhY2Nlc3NUb2tlbjogcXVlcnkuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKHF1ZXJ5LmV4cGlyZXNBdCksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHF1ZXJ5LnJlZnJlc2hUb2tlbixcblx0XHRcdG5hbWU6IHF1ZXJ5Lm5hbWUsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LmNyZWF0ZWRBdCksXG5cdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LnVwZGF0ZWRBdClcblx0XHR9XTtcblx0fVxuXHRzdGF0aWMgc2F2ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5pbnNlcnQoY2hhcmFjdGVycykudmFsdWVzKHtcblx0XHRcdGlkOiBjaGFyYWN0ZXIuaWQsXG5cdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiBjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSxcblx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IGNoYXJhY3RlcnMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdFx0ZXhwaXJlc0F0OiBjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSxcblx0XHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IERhdGUubm93KClcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gQ2hhcmFjdGVySGVscGVyLmZpbmRCeVVzZXJBbmRFdmVJRChjaGFyYWN0ZXIudXNlcklELCBjaGFyYWN0ZXIuZXZlSUQpO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUoY2hhcmFjdGVyKSB7XG5cdFx0ZGIuZGVsZXRlKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGNoYXJhY3Rlci5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBhc3luYyByZWZyZXNoVG9rZW5zKGNoYXJhY3Rlciwgc2NvcGVzKSB7XG5cdFx0Y29uc3QgdG9rZW5zID0gYXdhaXQgcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gfSwgc2NvcGVzKTtcblx0XHRjb25zdCBkZWNvZGVkID0gYXdhaXQgdmFsaWRhdGVUb2tlbih0b2tlbnMuYWNjZXNzX3Rva2VuKTtcblx0XHRpZiAoIWRlY29kZWQpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSB0b2tlbiBmb3IgY2hhcmFjdGVyICR7Y2hhcmFjdGVyLmV2ZUlEfWApO1xuXHRcdFx0cmV0dXJuIGNoYXJhY3Rlcjtcblx0XHR9XG5cdFx0Y2hhcmFjdGVyLmFjY2Vzc1Rva2VuID0gdG9rZW5zLmFjY2Vzc190b2tlbjtcblx0XHRjaGFyYWN0ZXIuZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRva2Vucy5leHBpcmVzX2luICogMWUzKTtcblx0XHRjaGFyYWN0ZXIucmVmcmVzaFRva2VuID0gdG9rZW5zLnJlZnJlc2hfdG9rZW47XG5cdFx0dGhpcy5zYXZlKGNoYXJhY3Rlcik7XG5cdFx0cmV0dXJuIGNoYXJhY3Rlcjtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIHVzZXJzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEsIHNxbCB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy91c2VyLm1vZGVsLnRzXG52YXIgVXNlckhlbHBlciA9IGNsYXNzIHtcblx0c3RhdGljIGZpbmQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5RGlzY29yZElkKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuZGlzY29yZElELCBpZCkpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQWxsKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeUNoYXJhY3Rlck5hbWUobmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVGcm9tUXVlcnkocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocXVlcnkpKSByZXR1cm4gcXVlcnkubWFwKCh1c2VyKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogdXNlci5pZCxcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZSh1c2VyLmNyZWF0ZWRBdCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUodXNlci51cGRhdGVkQXQpLFxuXHRcdFx0XHRjaGFyYWN0ZXJJRHM6IHVzZXIuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZSh1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/PyBcIltdXCIpLm1hcCgocykgPT4gTnVtYmVyKHMpKS5zb3J0KCkgOiBbXSxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2VyLm1haW5DaGFyYWN0ZXJJRFxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRlbHNlIHJldHVybiB7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHF1ZXJ5LmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KSxcblx0XHRcdGNoYXJhY3RlcklEczogcXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZShxdWVyeS5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHF1ZXJ5Lm1haW5DaGFyYWN0ZXJJRFxuXHRcdH07XG5cdH1cblx0c3RhdGljIGNyZWF0ZShkaXNjb3JkSUQpIHtcblx0XHR0aGlzLnNhdmUoe1xuXHRcdFx0ZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcblx0XHRcdHVwZGF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0XHRyZXR1cm4gdGhpcy5maW5kQnlEaXNjb3JkSWQoZGlzY29yZElEKTtcblx0fVxuXHRzdGF0aWMgc2F2ZSh1c2VyKSB7XG5cdFx0ZGIuaW5zZXJ0KHVzZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXIuY3JlYXRlZEF0LmdldFRpbWUoKSxcblx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogdXNlcnMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIHVzZXI7XG5cdH1cblx0c3RhdGljIGRlbGV0ZSh1c2VyKSB7XG5cdFx0ZGIuZGVsZXRlKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgdXNlci5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBnZXRDaGFyYWN0ZXIodXNlciwgaW5kZXgpIHtcblx0XHRpZiAoIXVzZXIuY2hhcmFjdGVySURzKSByZXR1cm4gdm9pZCAwO1xuXHRcdGlmIChpbmRleCA+PSB1c2VyLmNoYXJhY3RlcklEcy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG5cdFx0cmV0dXJuIENoYXJhY3RlckhlbHBlci5maW5kKHVzZXIuY2hhcmFjdGVySURzW2luZGV4XSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgVXNlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgcmVzdW1lQ29tbWFuZHMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwudHNcbnZhciBSZXN1bWVDb21tYW5kID0gY2xhc3MgUmVzdW1lQ29tbWFuZCB7XG5cdGlkO1xuXHRjb21tYW5kO1xuXHRwYXJhbXM7XG5cdGNvbnRleHQ7XG5cdGNyZWF0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5jcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdH1cblx0c3RhdGljIGZpbmQobWVzc2FnZUlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIG1lc3NhZ2VJZCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUobWVzc2FnZUlkLCBjb21tYW5kLCBwYXJhbXMgPSB7fSwgY29udGV4dCA9IHt9KSB7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBtZXNzYWdlSWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBjb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xuXHRcdHJlc3VtZS5jb250ZXh0ID0gSlNPTi5zdHJpbmdpZnkoY29udGV4dCk7XG5cdFx0cmV0dXJuIHJlc3VtZTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBxdWVyeS5pZDtcblx0XHRyZXN1bWUuY29tbWFuZCA9IHF1ZXJ5LmNvbW1hbmQ7XG5cdFx0cmVzdW1lLnBhcmFtcyA9IHF1ZXJ5LnBhcmFtcztcblx0XHRyZXN1bWUuY29udGV4dCA9IHF1ZXJ5LmNvbnRleHQ7XG5cdFx0cmVzdW1lLmNyZWF0ZWQgPSBxdWVyeS5jcmVhdGVkO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c2F2ZSgpIHtcblx0XHRkYi5pbnNlcnQocmVzdW1lQ29tbWFuZHMpLnZhbHVlcyh7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGNvbW1hbmQ6IHRoaXMuY29tbWFuZCxcblx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHQsXG5cdFx0XHRjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZC5nZXRUaW1lKClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiByZXN1bWVDb21tYW5kcy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRcdGNvbnRleHQ6IHRoaXMuY29udGV4dFxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdGRlbGV0ZSgpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCB0aGlzLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShtZXNzYWdlSWQpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5ydW4oKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBSZXN1bWVDb21tYW5kIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi8uLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZXN1bWVDb21tYW5kIH0gZnJvbSBcIi4vcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvaW5kZXgudHNcbnZhciBtb2RlbHNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQobW9kZWxzX2V4cG9ydHMsIHtcblx0Q2hhcmFjdGVySGVscGVyOiAoKSA9PiBDaGFyYWN0ZXJIZWxwZXIsXG5cdFJlc3VtZUNvbW1hbmQ6ICgpID0+IFJlc3VtZUNvbW1hbmQsXG5cdFVzZXJIZWxwZXI6ICgpID0+IFVzZXJIZWxwZXJcbn0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IG1vZGVsc19leHBvcnRzIH07IiwKICAgICJpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRGVmYXVsdExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyxcbiAgZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWdcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgQmFzZVNRTGl0ZURhdGFiYXNlIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2RiLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTeW5jRGlhbGVjdCB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kaWFsZWN0LmpzXCI7XG5pbXBvcnQgeyBpc0NvbmZpZyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQnVuU2Vzc2lvbiB9IGZyb20gXCIuL3Nlc3Npb24uanNcIjtcbmNsYXNzIEJ1blNRTGl0ZURhdGFiYXNlIGV4dGVuZHMgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQnVuU1FMaXRlRGF0YWJhc2VcIjtcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdChjbGllbnQsIGNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IGRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QoeyBjYXNpbmc6IGNvbmZpZy5jYXNpbmcgfSk7XG4gIGxldCBsb2dnZXI7XG4gIGlmIChjb25maWcubG9nZ2VyID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcbiAgfSBlbHNlIGlmIChjb25maWcubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgIGxvZ2dlciA9IGNvbmZpZy5sb2dnZXI7XG4gIH1cbiAgbGV0IHNjaGVtYTtcbiAgaWYgKGNvbmZpZy5zY2hlbWEpIHtcbiAgICBjb25zdCB0YWJsZXNDb25maWcgPSBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhcbiAgICAgIGNvbmZpZy5zY2hlbWEsXG4gICAgICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnNcbiAgICApO1xuICAgIHNjaGVtYSA9IHtcbiAgICAgIGZ1bGxTY2hlbWE6IGNvbmZpZy5zY2hlbWEsXG4gICAgICBzY2hlbWE6IHRhYmxlc0NvbmZpZy50YWJsZXMsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0YWJsZXNDb25maWcudGFibGVOYW1lc01hcFxuICAgIH07XG4gIH1cbiAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBTUUxpdGVCdW5TZXNzaW9uKGNsaWVudCwgZGlhbGVjdCwgc2NoZW1hLCB7IGxvZ2dlciB9KTtcbiAgY29uc3QgZGIgPSBuZXcgQnVuU1FMaXRlRGF0YWJhc2UoXCJzeW5jXCIsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gIGRiLiRjbGllbnQgPSBjbGllbnQ7XG4gIHJldHVybiBkYjtcbn1cbmZ1bmN0aW9uIGRyaXp6bGUoLi4ucGFyYW1zKSB7XG4gIGlmIChwYXJhbXNbMF0gPT09IHZvaWQgMCB8fCB0eXBlb2YgcGFyYW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBwYXJhbXNbMF0gPT09IHZvaWQgMCA/IG5ldyBEYXRhYmFzZSgpIDogbmV3IERhdGFiYXNlKHBhcmFtc1swXSk7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgcGFyYW1zWzFdKTtcbiAgfVxuICBpZiAoaXNDb25maWcocGFyYW1zWzBdKSkge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvbiwgY2xpZW50LCAuLi5kcml6emxlQ29uZmlnIH0gPSBwYXJhbXNbMF07XG4gICAgaWYgKGNsaWVudCkgcmV0dXJuIGNvbnN0cnVjdChjbGllbnQsIGRyaXp6bGVDb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIC4uLm9wdHMgfSA9IGNvbm5lY3Rpb247XG4gICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LnZhbHVlcyhvcHRzKS5maWx0ZXIoKHYpID0+IHYgIT09IHZvaWQgMCkubGVuZ3RoID8gb3B0cyA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IG5ldyBEYXRhYmFzZShzb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZTIsIGRyaXp6bGVDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEYXRhYmFzZShjb25uZWN0aW9uKTtcbiAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlLCBkcml6emxlQ29uZmlnKTtcbiAgfVxuICByZXR1cm4gY29uc3RydWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdKTtcbn1cbigoZHJpenpsZTIpID0+IHtcbiAgZnVuY3Rpb24gbW9jayhjb25maWcpIHtcbiAgICByZXR1cm4gY29uc3RydWN0KHt9LCBjb25maWcpO1xuICB9XG4gIGRyaXp6bGUyLm1vY2sgPSBtb2NrO1xufSkoZHJpenpsZSB8fCAoZHJpenpsZSA9IHt9KSk7XG5leHBvcnQge1xuICBCdW5TUUxpdGVEYXRhYmFzZSxcbiAgZHJpenpsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyaXZlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBOb29wTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgZmlsbFBsYWNlaG9sZGVycywgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRyYW5zYWN0aW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVQcmVwYXJlZFF1ZXJ5IGFzIFByZXBhcmVkUXVlcnlCYXNlLCBTUUxpdGVTZXNzaW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL3Nlc3Npb24uanNcIjtcbmltcG9ydCB7IG1hcFJlc3VsdFJvdyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlQnVuU2Vzc2lvbiBleHRlbmRzIFNRTGl0ZVNlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoZGlhbGVjdCk7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTm9vcExvZ2dlcigpO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blNlc3Npb25cIjtcbiAgbG9nZ2VyO1xuICBleGVjKHF1ZXJ5KSB7XG4gICAgdGhpcy5jbGllbnQuZXhlYyhxdWVyeSk7XG4gIH1cbiAgcHJlcGFyZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuY2xpZW50LnByZXBhcmUocXVlcnkuc3FsKTtcbiAgICByZXR1cm4gbmV3IFByZXBhcmVkUXVlcnkoXG4gICAgICBzdG10LFxuICAgICAgcXVlcnksXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXJcbiAgICApO1xuICB9XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMsIHRoaXMuc2NoZW1hKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG5hdGl2ZVR4ID0gdGhpcy5jbGllbnQudHJhbnNhY3Rpb24oKCkgPT4ge1xuICAgICAgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuICAgIG5hdGl2ZVR4W2NvbmZpZy5iZWhhdmlvciA/PyBcImRlZmVycmVkXCJdKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQnVuVHJhbnNhY3Rpb24gZXh0ZW5kcyBTUUxpdGVUcmFuc2FjdGlvbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blRyYW5zYWN0aW9uXCI7XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3Qgc2F2ZXBvaW50TmFtZSA9IGBzcCR7dGhpcy5uZXN0ZWRJbmRleH1gO1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMuc2Vzc2lvbiwgdGhpcy5zY2hlbWEsIHRoaXMubmVzdGVkSW5kZXggKyAxKTtcbiAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc2FjdGlvbih0eCk7XG4gICAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHJlbGVhc2Ugc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByb2xsYmFjayB0byBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFByZXBhcmVkUXVlcnkgZXh0ZW5kcyBQcmVwYXJlZFF1ZXJ5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHN0bXQsIHF1ZXJ5LCBsb2dnZXIsIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgX2lzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgc3VwZXIoXCJzeW5jXCIsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5KTtcbiAgICB0aGlzLnN0bXQgPSBzdG10O1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuX2lzUmVzcG9uc2VJbkFycmF5TW9kZSA9IF9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gICAgdGhpcy5jdXN0b21SZXN1bHRNYXBwZXIgPSBjdXN0b21SZXN1bHRNYXBwZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuUHJlcGFyZWRRdWVyeVwiO1xuICBydW4ocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC5ydW4oLi4ucGFyYW1zKTtcbiAgfVxuICBhbGwocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCB7IGZpZWxkcywgcXVlcnksIGxvZ2dlciwgam9pbnNOb3ROdWxsYWJsZU1hcCwgc3RtdCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnMocXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgICBsb2dnZXIubG9nUXVlcnkocXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHN0bXQuYWxsKC4uLnBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihyb3dzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IG1hcFJlc3VsdFJvdyhmaWVsZHMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkpO1xuICB9XG4gIGdldChwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLnN0bXQudmFsdWVzKC4uLnBhcmFtcylbMF07XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRzLCBqb2luc05vdE51bGxhYmxlTWFwLCBjdXN0b21SZXN1bHRNYXBwZXIgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMgJiYgIWN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihbcm93XSk7XG4gICAgfVxuICAgIHJldHVybiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApO1xuICB9XG4gIHZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZUJ1blNlc3Npb24sXG4gIFNRTGl0ZUJ1blRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfSBmcm9tIFwiLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL21vZGVscy9yZXN1bWUtY29tbWFuZC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgbW9kZWxzX2V4cG9ydHMgfSBmcm9tIFwiLi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tIFwiZHJpenpsZS1vcm0vYnVuLXNxbGl0ZVwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9pbmRleC50c1xuY29uc3QgREJfUEFUSCA9IHByb2Nlc3MuZW52LkFVVEhfREJfUEFUSCB8fCBqb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vZGIva2l0dGVuLmRiXCIpO1xuY29uc29sZS5sb2coXCJVc2luZyBEQl9QQVRIOlwiLCBEQl9QQVRIKTtcbmNvbnN0IHNxbGl0ZSA9IG5ldyBEYXRhYmFzZShEQl9QQVRIKTtcbmNvbnN0IGRiID0gZHJpenpsZShzcWxpdGUsIHsgc2NoZW1hOiB7XG5cdHVzZXJzLFxuXHRjaGFyYWN0ZXJzLFxuXHRyZXN1bWVDb21tYW5kcyxcblx0bWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1xufSB9KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIERCX1BBVEgsIFJlc3VtZUNvbW1hbmQsIFVzZXJIZWxwZXIsIGRiLCBtb2RlbHNfZXhwb3J0cyBhcyBtb2RlbHMsIHNjaGVtYV9leHBvcnRzIGFzIHNjaGVtYSB9OyIsCiAgICAiaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2NvcGVzLnRzXG5jb25zdCBFVkVfSldLU19VUkwgPSBcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCI7XG5jb25zdCBFVkVfSVNTVUVSID0gXCJsb2dpbi5ldmVvbmxpbmUuY29tXCI7XG5jb25zdCBFVkVfQVVESUVOQ0UgPSBcImV2ZW9ubGluZVwiO1xuY29uc3QgRVNJX0xBVEVTVF9VUkwgPSBcImh0dHBzOi8vZXNpLmV2ZXRlY2gubmV0L2xhdGVzdFwiO1xuY29uc3QgREFUQV9TT1VSQ0UgPSBcInRyYW5xdWlsaXR5XCI7XG5mdW5jdGlvbiBqb2luU2NvcGVzKC4uLnNjb3Blcykge1xuXHRyZXR1cm4gc2NvcGVzLmpvaW4oXCIgXCIpO1xufVxubGV0IFNDT1BFUyA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihTQ09QRVMkMSkge1xuXHRTQ09QRVMkMVtcIlBVQkxJQ19EQVRBXCJdID0gXCJwdWJsaWNEYXRhXCI7XG5cdFNDT1BFUyQxW1wiQ0FMRU5EQVJfUkVTUE9ORF9DQUxFTkRBUl9FVkVOVFNcIl0gPSBcImVzaS1jYWxlbmRhci5yZXNwb25kX2NhbGVuZGFyX2V2ZW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFQURfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVhZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX0xPQ0FUSU9OXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9sb2NhdGlvbi52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfU0hJUF9UWVBFXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9zaGlwX3R5cGUudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX09SR0FOSVpFX01BSUxcIl0gPSBcImVzaS1tYWlsLm9yZ2FuaXplX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX1JFQURfTUFJTFwiXSA9IFwiZXNpLW1haWwucmVhZF9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9TRU5EX01BSUxcIl0gPSBcImVzaS1tYWlsLnNlbmRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMU1wiXSA9IFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMUVVFVUVcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ0hBUkFDVEVSX1dBTExFVFwiXSA9IFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJTRUFSQ0hfU0VBUkNIX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1zZWFyY2guc2VhcmNoX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9DTE9ORVNcIl0gPSBcImVzaS1jbG9uZXMucmVhZF9jbG9uZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJVTklWRVJTRV9SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS11bml2ZXJzZS5yZWFkX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJLSUxMTUFJTFNfUkVBRF9LSUxMTUFJTFNcIl0gPSBcImVzaS1raWxsbWFpbHMucmVhZF9raWxsbWFpbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT1JQT1JBVElPTl9NRU1CRVJTSElQXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29ycG9yYXRpb25fbWVtYmVyc2hpcC52MVwiO1xuXHRTQ09QRVMkMVtcIkFTU0VUU19SRUFEX0FTU0VUU1wiXSA9IFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIlBMQU5FVFNfTUFOQUdFX1BMQU5FVFNcIl0gPSBcImVzaS1wbGFuZXRzLm1hbmFnZV9wbGFuZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRkxFRVRTX1JFQURfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMucmVhZF9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19XUklURV9GTEVFVFwiXSA9IFwiZXNpLWZsZWV0cy53cml0ZV9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIlVJX09QRU5fV0lORE9XXCJdID0gXCJlc2ktdWkub3Blbl93aW5kb3cudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9XUklURV9XQVlQT0lOVFwiXSA9IFwiZXNpLXVpLndyaXRlX3dheXBvaW50LnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19XUklURV9DT05UQUNUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMud3JpdGVfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19SRUFEX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3MucmVhZF9maXR0aW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkZJVFRJTkdTX1dSSVRFX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3Mud3JpdGVfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1NUUlVDVFVSRV9NQVJLRVRTXCJdID0gXCJlc2ktbWFya2V0cy5zdHJ1Y3R1cmVfbWFya2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0xPWUFMVFlcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbG95YWx0eS52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9PUFBPUlRVTklUSUVTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX29wcG9ydHVuaXRpZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ0hBVF9DSEFOTkVMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jaGF0X2NoYW5uZWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfU1RBTkRJTkdTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9BR0VOVFNfUkVTRUFSQ0hcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYWdlbnRzX3Jlc2VhcmNoLnYxXCI7XG5cdFNDT1BFUyQxW1wiSU5EVVNUUllfUkVBRF9DSEFSQUNURVJfSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ0hBUkFDVEVSX09SREVSU1wiXSA9IFwiZXNpLW1hcmtldHMucmVhZF9jaGFyYWN0ZXJfb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0JMVUVQUklOVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9DT1JQT1JBVElPTl9ST0xFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfT05MSU5FXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9vbmxpbmUudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DSEFSQUNURVJfQ09OVFJBQ1RTXCJdID0gXCJlc2ktY29udHJhY3RzLnJlYWRfY2hhcmFjdGVyX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNMT05FU19SRUFEX0lNUExBTlRTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfRkFUSUdVRVwiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfQ09SUE9SQVRJT05fS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfY29ycG9yYXRpb25fa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1RSQUNLX01FTUJFUlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMudHJhY2tfbWVtYmVycy52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NPUlBPUkFUSU9OX1dBTExFVFNcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX05PVElGSUNBVElPTlNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0RJVklTSU9OU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2RpdmlzaW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9DT1JQT1JBVElPTl9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPTlRSQUNUU19SRUFEX0NPUlBPUkFUSU9OX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NvcnBvcmF0aW9uX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQVJCQVNFU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YXJiYXNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fam9icy52MVwiO1xuXHRTQ09QRVMkMVtcIk1BUktFVFNfUkVBRF9DT1JQT1JBVElPTl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY29ycG9yYXRpb25fb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09OVEFJTkVSX0xPR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9jb250YWluZXJfbG9ncy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX21pbmluZy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fTUlOSU5HXCJdID0gXCJlc2ktaW5kdXN0cnkucmVhZF9jb3Jwb3JhdGlvbl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX1JFQURfQ1VTVE9NU19PRkZJQ0VTXCJdID0gXCJlc2ktcGxhbmV0cy5yZWFkX2N1c3RvbXNfb2ZmaWNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZBQ0lMSVRJRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9mYWNpbGl0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfTUVEQUxTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1RJVExFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJBTExJQU5DRVNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWFsbGlhbmNlcy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2Z3X3N0YXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfRldfU1RBVFNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRyZXR1cm4gU0NPUEVTJDE7XG59KHt9KTtcbmZ1bmN0aW9uIHRva2VuSGFzU2NvcGVzKGFjY2Vzc190b2tlbiwgLi4uc2NvcGVzKSB7XG5cdGxldCB0b2tlblNjb3BlcyA9IGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gc2NvcGVzLmV2ZXJ5KChzY29wZSkgPT4gdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpKTtcbn1cbmZ1bmN0aW9uIGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pIHtcblx0Y29uc3QgZGVjb2RlZCA9IGp3dERlY29kZShhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IERBVEFfU09VUkNFLCBFU0lfTEFURVNUX1VSTCwgRVZFX0FVRElFTkNFLCBFVkVfSVNTVUVSLCBFVkVfSldLU19VUkwsIFNDT1BFUywgZ2V0U2NvcGVzRnJvbVRva2VuLCBqb2luU2NvcGVzLCB0b2tlbkhhc1Njb3BlcyB9OyIsCiAgICAiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVTSV9MQVRFU1RfVVJMIH0gZnJvbSBcIi4vc2NvcGVzLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2ZldGNoLnRzXG5jb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuXHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYWNoZSkgaWYgKHZhbHVlLmV4cGlyZXMgPCBub3cpIGNhY2hlLmRlbGV0ZShrZXkpO1xufVxuc2V0SW50ZXJ2YWwoY2xlYW5DYWNoZSwgMWUzICogNjAgKiAxNSk7XG5jb25zdCBkZWZhdWx0Q2FjaGVEdXJhdGlvbiA9IDFlMyAqIDYwICogMzA7XG5hc3luYyBmdW5jdGlvbiBlc2lGZXRjaChwYXRoLCBjaGFyYWN0ZXIsIHsgbWV0aG9kID0gXCJHRVRcIiwgYm9keSwgbm9DYWNoZSA9IGZhbHNlLCBjYWNoZUR1cmF0aW9uID0gZGVmYXVsdENhY2hlRHVyYXRpb24gfSA9IHt9KSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgaGVhZGVycyA9IHtcblx0XHRcdFwiVXNlci1BZ2VudFwiOiBvcHRpb25zLnVzZXJfYWdlbnQsXG5cdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdH07XG5cdFx0aWYgKGNoYXJhY3Rlcikge1xuXHRcdFx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRcdGF3YWl0IENoYXJhY3RlckhlbHBlci5yZWZyZXNoVG9rZW5zKGNoYXJhY3Rlcik7XG5cdFx0XHRcdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbiBmb3IgY2hhcmFjdGVyOiAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdH1cblx0XHRcdGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2NoYXJhY3Rlci5hY2Nlc3NUb2tlbn1gO1xuXHRcdH1cblx0XHRjb25zdCBpbml0ID0ge1xuXHRcdFx0aGVhZGVycyxcblx0XHRcdG1ldGhvZDogbWV0aG9kIHx8IFwiR0VUXCIsXG5cdFx0XHRib2R5OiBib2R5IHx8IHZvaWQgMFxuXHRcdH07XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChgJHtFU0lfTEFURVNUX1VSTH0ke3BhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRofWApO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZGF0YXNvdXJjZVwiLCBcInRyYW5xdWlsaXR5XCIpO1xuXHRcdGlmICghbm9DYWNoZSAmJiBpbml0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuXHRcdFx0Y29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KHVybC5ocmVmKTtcblx0XHRcdGlmIChjYWNoZWQgJiYgY2FjaGVkPy5leHBpcmVzID4gRGF0ZS5ub3coKSkgcmV0dXJuIGNhY2hlZC5kYXRhO1xuXHRcdH1cblx0XHRjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGluaXQpO1xuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXHRcdGlmICghcmVzLm9rKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBFU0kgcmVxdWVzdCBmYWlsdXJlIGF0ICR7cGF0aH0gfCAke3Jlcy5zdGF0dXN9OiR7cmVzLnN0YXR1c1RleHR9ID0+ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKGluaXQubWV0aG9kID09PSBcIkdFVFwiKSBjYWNoZS5zZXQodXJsLmhyZWYsIHtcblx0XHRcdGV4cGlyZXM6IE1hdGgubWF4KHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgJiYgbmV3IERhdGUoTnVtYmVyKHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgfHwgXCJcIikpLmdldFRpbWUoKSB8fCAwLCBEYXRlLm5vdygpICsgY2FjaGVEdXJhdGlvbiksXG5cdFx0XHRkYXRhXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVTSSByZXF1ZXN0IGZhaWx1cmUgYXQgJHtwYXRofSB8ICR7SlNPTi5zdHJpbmdpZnkoZXJyKX1gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgZXNpRmV0Y2ggfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9zY29wZXMuanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvY2hhcmFjdGVyLnRzXG52YXIgY2hhcmFjdGVyX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoYXJhY3Rlcl9leHBvcnRzLCB7XG5cdGdldENoYXJhY3RlckFmZmlsaWF0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoOiAoKSA9PiBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLFxuXHRnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMsXG5cdGdldENoYXJhY3RlckFzc2V0TmFtZXM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0TmFtZXMsXG5cdGdldENoYXJhY3RlckFzc2V0czogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRzLFxuXHRnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLFxuXHRnZXRDaGFyYWN0ZXJDbG9uZXM6ICgpID0+IGdldENoYXJhY3RlckNsb25lcyxcblx0Z2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3Rvcnk6ICgpID0+IGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeSxcblx0Z2V0Q2hhcmFjdGVyQ3VycmVudFNoaXA6ICgpID0+IGdldENoYXJhY3RlckN1cnJlbnRTaGlwLFxuXHRnZXRDaGFyYWN0ZXJJbXBsYW50czogKCkgPT4gZ2V0Q2hhcmFjdGVySW1wbGFudHMsXG5cdGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlOiAoKSA9PiBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZSxcblx0Z2V0Q2hhcmFjdGVyTG9jYXRpb246ICgpID0+IGdldENoYXJhY3RlckxvY2F0aW9uLFxuXHRnZXRDaGFyYWN0ZXJNZWRhbHM6ICgpID0+IGdldENoYXJhY3Rlck1lZGFscyxcblx0Z2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyT25saW5lOiAoKSA9PiBnZXRDaGFyYWN0ZXJPbmxpbmUsXG5cdGdldENoYXJhY3RlclBvcnRyYWl0czogKCkgPT4gZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLFxuXHRnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhOiAoKSA9PiBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLFxuXHRnZXRDaGFyYWN0ZXJSb2xlczogKCkgPT4gZ2V0Q2hhcmFjdGVyUm9sZXMsXG5cdGdldENoYXJhY3RlclN0YW5kaW5nczogKCkgPT4gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLFxuXHRnZXRDaGFyYWN0ZXJUaXRsZXM6ICgpID0+IGdldENoYXJhY3RlclRpdGxlcyxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0OiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXQsXG5cdGdldENoYXJhY3RlcldhbGxldEpvdXJuYWw6ICgpID0+IGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwsXG5cdGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLFxuXHRnZXRQb3J0cmFpdFVSTDogKCkgPT4gZ2V0UG9ydHJhaXRVUkxcbn0pO1xuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUHVibGljRGF0YShpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zKGlkcykge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzL2FmZmlsaWF0aW9uL2AsIHZvaWQgMCwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KVswXTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclBvcnRyYWl0cyhpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5KGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vY29ycG9yYXRpb25oaXN0b3J5L2ApO1xufVxuZnVuY3Rpb24gZ2V0UG9ydHJhaXRVUkwoaWQpIHtcblx0cmV0dXJuIGBodHRwczovL2ltYWdlcy5ldmV0ZWNoLm5ldC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0YDtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclJvbGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3JvbGVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJUaXRsZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX3RpdGxlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3RpdGxlcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9zdGFuZGluZ3MvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ub3RpZmljYXRpb25zL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L25vdGlmaWNhdGlvbnMvY29udGFjdHNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTWVkYWxzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9tZWRhbHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vZmF0aWd1ZS9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2JsdWVwcmludHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFnZW50UmVzZWFyY2goY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2FnZW50c19yZXNlYXJjaC9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xvbmVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNsb25lcy5yZWFkX2Nsb25lcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Nsb25lcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVySW1wbGFudHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9pbXBsYW50cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbG9jYXRpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0TmFtZXMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbmFtZXMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0KGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucyhjaGFyYWN0ZXIsIGZyb21JZCkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvdHJhbnNhY3Rpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoZnJvbUlkKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwoY2hhcmFjdGVyLCBwYWdlID0gMSkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvam91cm5hbC8/cGFnZT0ke3BhZ2V9YCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckxvY2F0aW9uKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9sb2NhdGlvbi9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyT25saW5lKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vb25saW5lL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX3NoaXBfdHlwZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NoaXAvYCwgY2hhcmFjdGVyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJfZXhwb3J0cywgZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLCBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLCBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucywgZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcywgZ2V0Q2hhcmFjdGVyQXNzZXRzLCBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLCBnZXRDaGFyYWN0ZXJDbG9uZXMsIGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLCBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnksIGdldENoYXJhY3RlckN1cnJlbnRTaGlwLCBnZXRDaGFyYWN0ZXJJbXBsYW50cywgZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUsIGdldENoYXJhY3RlckxvY2F0aW9uLCBnZXRDaGFyYWN0ZXJNZWRhbHMsIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMsIGdldENoYXJhY3Rlck9ubGluZSwgZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLCBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLCBnZXRDaGFyYWN0ZXJSb2xlcywgZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLCBnZXRDaGFyYWN0ZXJUaXRsZXMsIGdldENoYXJhY3RlcldhbGxldCwgZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbCwgZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLCBnZXRQb3J0cmFpdFVSTCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2NvcnBvcmF0aW9uLnRzXG52YXIgY29ycG9yYXRpb25fZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoY29ycG9yYXRpb25fZXhwb3J0cywge1xuXHRnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeTogKCkgPT4gZ2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3RvcnksXG5cdGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnMsXG5cdGdldENvcnBvcmF0aW9uQXNzZXROYW1lczogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzLFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0czogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldHMsXG5cdGdldENvcnBvcmF0aW9uRGF0YTogKCkgPT4gZ2V0Q29ycG9yYXRpb25EYXRhLFxuXHRnZXRDb3Jwb3JhdGlvbkljb25zOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkljb25zXG59KTtcbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uRGF0YShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYWxsaWFuY2VoaXN0b3J5L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25JY29ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vaWNvbnMvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0cyhpZCwgY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9ucyhpZCwgY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL2xvY2F0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXMoaWQsIGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9uYW1lcy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY29ycG9yYXRpb25fZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hbGxpYW5jZS50c1xudmFyIGFsbGlhbmNlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGFsbGlhbmNlX2V4cG9ydHMsIHtcblx0Z2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnM6ICgpID0+IGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLFxuXHRnZXRBbGxpYW5jZURhdGE6ICgpID0+IGdldEFsbGlhbmNlRGF0YSxcblx0Z2V0QWxsaWFuY2VJY29uczogKCkgPT4gZ2V0QWxsaWFuY2VJY29uc1xufSk7XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZURhdGEoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2NvcnBvcmF0aW9ucy9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlSWNvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ljb25zL2ApO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGFsbGlhbmNlX2V4cG9ydHMsIGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLCBnZXRBbGxpYW5jZURhdGEsIGdldEFsbGlhbmNlSWNvbnMgfTsiLAogICAgImltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2tpbGxzLnRzXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2F0dHJpYnV0ZXNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2tpbGxRdWV1ZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxxdWV1ZWAsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTa2lsbHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRyYWluaW5nUGVyY2VudGFnZShxdWV1ZWRTa2lsbCkge1xuXHRjb25zdCB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gPSAocXVldWVkU2tpbGwudHJhaW5pbmdfc3RhcnRfc3AgLSBxdWV1ZWRTa2lsbC5sZXZlbF9zdGFydF9zcCkgLyBxdWV1ZWRTa2lsbC5sZXZlbF9lbmRfc3A7XG5cdGNvbnN0IHRpbWVQb3NpdGlvbiA9ICgoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSkgLyAobmV3IERhdGUocXVldWVkU2tpbGwuZmluaXNoX2RhdGUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSk7XG5cdHJldHVybiB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gKyAoMSAtIHRyYWluaW5nU3RhcnRQb3NpdGlvbikgKiB0aW1lUG9zaXRpb247XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlLCBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzLCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlLCBnZXRDaGFyYWN0ZXJTa2lsbHMgfTsiLAogICAgImltcG9ydCAqIGFzIGZzJDEgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjaGFpbiB9IGZyb20gXCJzdHJlYW0tY2hhaW5cIjtcbmltcG9ydCB7IHBhcnNlciB9IGZyb20gXCJzdHJlYW0tanNvblwiO1xuaW1wb3J0IHsgc3RyZWFtQXJyYXkgfSBmcm9tIFwic3RyZWFtLWpzb24vc3RyZWFtZXJzL1N0cmVhbUFycmF5XCI7XG5pbXBvcnQgeyBzdHJlYW1PYmplY3QgfSBmcm9tIFwic3RyZWFtLWpzb24vc3RyZWFtZXJzL1N0cmVhbU9iamVjdFwiO1xuaW1wb3J0IE5vZGVDYWNoZSBmcm9tIFwibm9kZS1jYWNoZVwiO1xuXG4vLyNyZWdpb24gc3JjL2pzb25RdWVyeS50c1xuY29uc3QgY2FjaGUgPSBuZXcgTm9kZUNhY2hlKHsgc3RkVFRMOiAzNjAwIH0pO1xuLyoqXG4qIFF1ZXJpZXMgYSBsYXJnZSBKU09OIGFycmF5IGZpbGUgZm9yIGFuIGl0ZW0gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IGZ1bmN0aW9uLlxuKiBUaGlzIGZ1bmN0aW9uIHN0cmVhbXMgdGhlIGZpbGUgdG8gYXZvaWQgbG9hZGluZyB0aGUgZW50aXJlIGNvbnRlbnQgaW50byBtZW1vcnkuXG4qXG4qIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyBhbiBhcnJheSBvZiBpdGVtcy5cbiogQHBhcmFtIHF1ZXJ5IC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGl0ZW0gYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBjcml0ZXJpYS5cbiogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gb3IgbnVsbCBpZiBubyBtYXRjaCBpcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBxdWVyeUpzb25BcnJheShmaWxlUGF0aCwgcXVlcnksIGNhY2hlS2V5LCBjYWNoZUV4cGlyeSkge1xuXHRpZiAoY2FjaGVLZXkpIHtcblx0XHRjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuXHRcdGlmIChjYWNoZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkKTtcblx0fVxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHBpcGVsaW5lID0gY2hhaW4oW1xuXHRcdFx0ZnMkMS5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKSxcblx0XHRcdHBhcnNlcigpLFxuXHRcdFx0c3RyZWFtQXJyYXkoKSxcblx0XHRcdChkYXRhKSA9PiBxdWVyeShkYXRhLnZhbHVlKSA/IGRhdGEudmFsdWUgOiBudWxsXG5cdFx0XSk7XG5cdFx0cGlwZWxpbmUub24oXCJkYXRhXCIsICh2YWx1ZSkgPT4ge1xuXHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdGlmIChjYWNoZUtleSkgY2FjaGUuc2V0KGNhY2hlS2V5LCB2YWx1ZSwgY2FjaGVFeHBpcnkgfHwgMzYwMCk7XG5cdFx0XHRcdHJlc29sdmUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHBpcGVsaW5lLm9uKFwiZW5kXCIsICgpID0+IHtcblx0XHRcdHJlc29sdmUobnVsbCk7XG5cdFx0fSk7XG5cdFx0cGlwZWxpbmUub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG5cdFx0XHRyZWplY3QoZXJyKTtcblx0XHR9KTtcblx0fSk7XG59XG4vKipcbiogUXVlcmllcyBhIGxhcmdlIEpTT04gb2JqZWN0IGZpbGUgZm9yIGEgdmFsdWUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IGZ1bmN0aW9uLlxuKiBUaGlzIGZ1bmN0aW9uIHN0cmVhbXMgdGhlIGZpbGUgdG8gYXZvaWQgbG9hZGluZyB0aGUgZW50aXJlIGNvbnRlbnQgaW50byBtZW1vcnkuXG4qXG4qIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBKU09OIGZpbGUgY29udGFpbmluZyBhbiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzLlxuKiBAcGFyYW0gcXVlcnkgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBrZXktdmFsdWUgcGFpciBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IG1hdGNoZXMgdGhlIGNyaXRlcmlhLlxuKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgdmFsdWUgb3IgbnVsbCBpZiBubyBtYXRjaCBpcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBxdWVyeUpzb25PYmplY3QoZmlsZVBhdGgsIHF1ZXJ5LCBjYWNoZUtleSwgY2FjaGVFeHBpcnkpIHtcblx0aWYgKGNhY2hlS2V5KSB7XG5cdFx0Y29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcblx0XHRpZiAoY2FjaGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNhY2hlZCk7XG5cdH1cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBwaXBlbGluZSA9IGNoYWluKFtcblx0XHRcdGZzJDEuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCksXG5cdFx0XHRwYXJzZXIoKSxcblx0XHRcdHN0cmVhbU9iamVjdCgpLFxuXHRcdFx0KGRhdGEpID0+IHF1ZXJ5KGRhdGEpID8gZGF0YS52YWx1ZSA6IG51bGxcblx0XHRdKTtcblx0XHRwaXBlbGluZS5vbihcImRhdGFcIiwgKHZhbHVlKSA9PiB7XG5cdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0aWYgKGNhY2hlS2V5KSBjYWNoZS5zZXQoY2FjaGVLZXksIHZhbHVlLCBjYWNoZUV4cGlyeSB8fCAzNjAwKTtcblx0XHRcdFx0cmVzb2x2ZSh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cGlwZWxpbmUub24oXCJlbmRcIiwgKCkgPT4ge1xuXHRcdFx0cmVzb2x2ZShudWxsKTtcblx0XHR9KTtcblx0XHRwaXBlbGluZS5vbihcImVycm9yXCIsIChlcnIpID0+IHtcblx0XHRcdHJlamVjdChlcnIpO1xuXHRcdH0pO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBxdWVyeUpzb25BcnJheSwgcXVlcnlKc29uT2JqZWN0IH07IiwKICAgICJpbXBvcnQgeyBnZXRBdHRyaWJ1dGUgfSBmcm9tIFwiLi9hdHRyaWJ1dGUuanNcIjtcbmltcG9ydCB7IEljb25TaXplIH0gZnJvbSBcIi4vaWNvbi5qc1wiO1xuaW1wb3J0IHsgZ2V0R3JvdXAgfSBmcm9tIFwiLi9ncm91cC5qc1wiO1xuaW1wb3J0IHsgZ2V0VW5pdCB9IGZyb20gXCIuL3VuaXQuanNcIjtcbmltcG9ydCB7IGdldE1ldGFHcm91cCB9IGZyb20gXCIuL21ldGEtZ3JvdXAuanNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBxdWVyeUpzb25PYmplY3QgfSBmcm9tIFwiQHN0YXIta2l0dGVuL3V0aWwvanNvblF1ZXJ5LmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvbW9kZWxzL3R5cGUudHNcbmFzeW5jIGZ1bmN0aW9uIGdldFR5cGUodHlwZV9pZCkge1xuXHRjb25zdCBkYXRhID0gYXdhaXQgcXVlcnlKc29uT2JqZWN0KGpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuLi8uLi9kYXRhL3JlZmVyZW5jZS1kYXRhL3R5cGVzLmpzb25cIiksIChkYXRhJDEpID0+IGRhdGEkMS5rZXkgPT09IFN0cmluZyh0eXBlX2lkKSk7XG5cdGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBUeXBlIElEICR7dHlwZV9pZH0gbm90IGZvdW5kIGluIHJlZmVyZW5jZSBkYXRhYCk7XG5cdHJldHVybiBkYXRhO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUljb25VcmwodHlwZSwgc2l6ZSA9IEljb25TaXplLlNJWkVfNjQpIHtcblx0cmV0dXJuIGBodHRwczovL2ltYWdlcy5ldmV0ZWNoLm5ldC90eXBlcy8ke3R5cGUudHlwZV9pZH0vaWNvbiR7dHlwZS5pc19ibHVlcHJpbnQgPyBcIi9icFwiIDogXCJcIn0/c2l6ZT0ke3NpemV9YDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFNraWxsQm9udXNlcyh0eXBlKSB7XG5cdGlmICghdHlwZS50cmFpdHMpIHJldHVybiBbXTtcblx0Y29uc3Qgc2tpbGxCb251c2VzID0gW107XG5cdGZvciAoY29uc3Qgc2tpbGxfdHlwZV9pZCBpbiB0eXBlLnRyYWl0cy50eXBlcykgc2tpbGxCb251c2VzLnB1c2goe1xuXHRcdHNraWxsOiBhd2FpdCBnZXRUeXBlKE51bWJlcihza2lsbF90eXBlX2lkKSksXG5cdFx0Ym9udXNlczogYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmtleXModHlwZS50cmFpdHMudHlwZXNbc2tpbGxfdHlwZV9pZF0pLm1hcChhc3luYyAob3JkZXIpID0+IHtcblx0XHRcdGNvbnN0IGJvbnVzID0gdHlwZS50cmFpdHMudHlwZXNbc2tpbGxfdHlwZV9pZF1bb3JkZXJdO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Ym9udXM6IGJvbnVzLmJvbnVzLFxuXHRcdFx0XHRib251c190ZXh0OiBib251cy5ib251c190ZXh0LFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBib251cy5pbXBvcnRhbmNlLFxuXHRcdFx0XHR1bml0OiBhd2FpdCBnZXRVbml0KGJvbnVzLnVuaXRfaWQpXG5cdFx0XHR9O1xuXHRcdH0pKVxuXHR9KTtcblx0cmV0dXJuIHNraWxsQm9udXNlcztcbn1cbmZ1bmN0aW9uIGdldFJvbGVCb251c2VzKHR5cGUpIHtcblx0aWYgKCF0eXBlLnRyYWl0cyB8fCAhdHlwZS50cmFpdHMucm9sZV9ib251c2VzKSByZXR1cm4gW107XG5cdHJldHVybiBPYmplY3QudmFsdWVzKHR5cGUudHJhaXRzLnJvbGVfYm9udXNlcykubWFwKChib251cykgPT4gKHtcblx0XHRib251czogYm9udXMuYm9udXMsXG5cdFx0Ym9udXNfdGV4dDogYm9udXMuYm9udXNfdGV4dCxcblx0XHRpbXBvcnRhbmNlOiBib251cy5pbXBvcnRhbmNlLFxuXHRcdHVuaXQ6IGJvbnVzLnVuaXRfaWQgJiYgZ2V0VW5pdChib251cy51bml0X2lkKVxuXHR9KSk7XG59XG5mdW5jdGlvbiBldmVSZWZMaW5rKHR5cGVfaWQpIHtcblx0cmV0dXJuIGBodHRwczovL2V2ZXJlZi5uZXQvdHlwZXMvJHt0eXBlX2lkfWA7XG59XG5mdW5jdGlvbiByZW5kZXJUeXBlRXZlUmVmTGluayh0eXBlLCBsb2NhbGUgPSBcImVuXCIpIHtcblx0cmV0dXJuIGBbJHt0eXBlLm5hbWVbbG9jYWxlXSA/PyB0eXBlLm5hbWUuZW59XSgke2V2ZVJlZkxpbmsodHlwZS50eXBlX2lkKX0pYDtcbn1cbmZ1bmN0aW9uIGV2ZVR5Y29vbkxpbmsodHlwZV9pZCkge1xuXHRyZXR1cm4gYGh0dHBzOi8vZXZldHljb29uLmNvbS9tYXJrZXQvJHt0eXBlX2lkfWA7XG59XG5mdW5jdGlvbiBnZXRUeXBlQXR0cmlidXRlcyh0eXBlKSB7XG5cdGlmICghdHlwZS5kb2dtYV9hdHRyaWJ1dGVzKSByZXR1cm4gW107XG5cdE9iamVjdC5rZXlzKHR5cGUuZG9nbWFfYXR0cmlidXRlcykubWFwKChhdHRyaWJ1dGVfaWQpID0+ICh7XG5cdFx0YXR0cmlidXRlOiBnZXRBdHRyaWJ1dGUoTnVtYmVyKGF0dHJpYnV0ZV9pZCkpLFxuXHRcdHZhbHVlOiB0eXBlLmRvZ21hX2F0dHJpYnV0ZXNbYXR0cmlidXRlX2lkXS52YWx1ZVxuXHR9KSk7XG59XG5mdW5jdGlvbiB0eXBlSGFzQW55QXR0cmlidXRlKHR5cGUsIGF0dHJpYnV0ZV9pZHMpIHtcblx0aWYgKCF0eXBlLmRvZ21hX2F0dHJpYnV0ZXMpIHJldHVybiBmYWxzZTtcblx0Zm9yIChjb25zdCBhdHRyaWJ1dGVfaWQgb2YgYXR0cmlidXRlX2lkcykgaWYgKHR5cGUuZG9nbWFfYXR0cmlidXRlc1thdHRyaWJ1dGVfaWRdKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIGZhbHNlO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0VHlwZVNraWxscyh0eXBlKSB7XG5cdGlmICghdHlwZS5yZXF1aXJlZF9za2lsbHMpIHJldHVybiBbXTtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHR5cGUucmVxdWlyZWRfc2tpbGxzKS5tYXAoYXN5bmMgKHNraWxsX3R5cGVfaWQpID0+ICh7XG5cdFx0c2tpbGw6IGF3YWl0IGdldFR5cGUoTnVtYmVyKHNraWxsX3R5cGVfaWQpKSxcblx0XHRsZXZlbDogdHlwZS5yZXF1aXJlZF9za2lsbHNbc2tpbGxfdHlwZV9pZF1cblx0fSkpKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHR5cGVHZXRBdHRyaWJ1dGUodHlwZSwgYXR0cmlidXRlX2lkKSB7XG5cdGlmICghdHlwZS5kb2dtYV9hdHRyaWJ1dGVzIHx8ICF0eXBlLmRvZ21hX2F0dHJpYnV0ZXNbYXR0cmlidXRlX2lkXSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiB7XG5cdFx0YXR0cmlidXRlOiBhd2FpdCBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlX2lkKSxcblx0XHR2YWx1ZTogdHlwZS5kb2dtYV9hdHRyaWJ1dGVzW2F0dHJpYnV0ZV9pZF0udmFsdWVcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFR5cGVCbHVlcHJpbnRzKHR5cGUpIHtcblx0aWYgKCF0eXBlLnByb2R1Y2VkX2J5X2JsdWVwcmludHMpIHJldHVybiBbXTtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXModHlwZS5wcm9kdWNlZF9ieV9ibHVlcHJpbnRzKS5tYXAoYXN5bmMgKGJsdWVwcmludCkgPT4gKHtcblx0XHRibHVlcHJpbnQ6IGF3YWl0IGdldFR5cGUoYmx1ZXByaW50LmJsdWVwcmludF90eXBlX2lkKSxcblx0XHRhY3Rpdml0eTogYmx1ZXByaW50LmJsdWVwcmludF9hY3Rpdml0eVxuXHR9KSkpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0VHlwZVNjaGVtYXRpY3ModHlwZSkge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwodHlwZS5wcm9kdWNlZF9ieV9zY2hlbWF0aWNfaWRzPy5tYXAoKHNjaGVtYXRpY19pZCkgPT4gZ2V0VHlwZShzY2hlbWF0aWNfaWQpKSA/PyBbXSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUeXBlR3JvdXAodHlwZSkge1xuXHRpZiAoIXR5cGUuZ3JvdXBfaWQpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZ2V0R3JvdXAodHlwZS5ncm91cF9pZCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUeXBlVmFyaWFudHModHlwZSkge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModHlwZS50eXBlX3ZhcmlhdGlvbnMgfHwge30pLm1hcChhc3luYyAoW21ldGFfZ3JvdXBfaWQsIHZhcmlhbnRfaWRzXSkgPT4gKHtcblx0XHRtZXRhR3JvdXA6IGF3YWl0IGdldE1ldGFHcm91cChOdW1iZXIobWV0YV9ncm91cF9pZCkpLFxuXHRcdHR5cGVzOiBhd2FpdCBQcm9taXNlLmFsbCh2YXJpYW50X2lkcy5tYXAoKHR5cGVfaWQpID0+IGdldFR5cGUodHlwZV9pZCkpKVxuXHR9KSkpO1xufVxuZnVuY3Rpb24gdHlwZUhhc0F0dHJpYnV0ZXModHlwZSkge1xuXHRyZXR1cm4gdHlwZS5kb2dtYV9hdHRyaWJ1dGVzICYmIE9iamVjdC5rZXlzKHR5cGUuZG9nbWFfYXR0cmlidXRlcykubGVuZ3RoID4gMDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBldmVSZWZMaW5rLCBldmVUeWNvb25MaW5rLCBnZXRSb2xlQm9udXNlcywgZ2V0U2tpbGxCb251c2VzLCBnZXRUeXBlLCBnZXRUeXBlQXR0cmlidXRlcywgZ2V0VHlwZUJsdWVwcmludHMsIGdldFR5cGVHcm91cCwgZ2V0VHlwZUljb25VcmwsIGdldFR5cGVTY2hlbWF0aWNzLCBnZXRUeXBlU2tpbGxzLCBnZXRUeXBlVmFyaWFudHMsIHJlbmRlclR5cGVFdmVSZWZMaW5rLCB0eXBlR2V0QXR0cmlidXRlLCB0eXBlSGFzQW55QXR0cmlidXRlLCB0eXBlSGFzQXR0cmlidXRlcyB9OyIsCiAgICAiLy8jcmVnaW9uIHNyYy90ZXh0LnRzXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQoaW5wdXQsIGxlbmd0aCA9IDFlMykge1xuXHRyZXR1cm4gaW5wdXQubGVuZ3RoID4gbGVuZ3RoID8gaW5wdXQuc3Vic3RyaW5nKDAsIGxlbmd0aCkgKyBcIi4uLlwiIDogaW5wdXQ7XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXJUb1Nob3J0Rm9ybShudW1iZXIsIGxvY2FsZSA9IFwiZW4tdVNcIikge1xuXHRsZXQgc3VmZml4ID0gXCJcIjtcblx0bGV0IHZhbHVlID0gbnVtYmVyO1xuXHRpZiAoTWF0aC5hYnMobnVtYmVyKSA+PSAxZTkpIHtcblx0XHR2YWx1ZSA9IG51bWJlciAvIDFlOTtcblx0XHRzdWZmaXggPSBcImJcIjtcblx0fSBlbHNlIGlmIChNYXRoLmFicyhudW1iZXIpID49IDFlNikge1xuXHRcdHZhbHVlID0gbnVtYmVyIC8gMWU2O1xuXHRcdHN1ZmZpeCA9IFwiTVwiO1xuXHR9IGVsc2UgaWYgKE1hdGguYWJzKG51bWJlcikgPj0gMWUzKSB7XG5cdFx0dmFsdWUgPSBudW1iZXIgLyAxZTM7XG5cdFx0c3VmZml4ID0gXCJrXCI7XG5cdH1cblx0Y29uc3QgZm9ybWF0dGVkVmFsdWUgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCB7IG1heGltdW1TaWduaWZpY2FudERpZ2l0czogNCB9KS5mb3JtYXQodmFsdWUpO1xuXHRyZXR1cm4gYCR7Zm9ybWF0dGVkVmFsdWV9JHtzdWZmaXh9YDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBmb3JtYXROdW1iZXJUb1Nob3J0Rm9ybSwgdHJ1bmNhdGVUZXh0IH07IiwKICAgICJpbXBvcnQgeyBnZXRBdHRyaWJ1dGUgfSBmcm9tIFwiLi9hdHRyaWJ1dGUuanNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBxdWVyeUpzb25PYmplY3QgfSBmcm9tIFwiQHN0YXIta2l0dGVuL3V0aWwvanNvblF1ZXJ5LmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvbW9kZWxzL3NraWxsLnRzXG5hc3luYyBmdW5jdGlvbiBnZXRTa2lsbCh0eXBlX2lkKSB7XG5cdGNvbnN0IGRhdGEgPSBhd2FpdCBxdWVyeUpzb25PYmplY3Qoam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL2RhdGEvcmVmZXJlbmNlLWRhdGEvc2tpbGxzLmpzb25cIiksIChkYXRhJDEpID0+IGRhdGEkMS5rZXkgPT09IFN0cmluZyh0eXBlX2lkKSk7XG5cdGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBTa2lsbCBJRCAke3R5cGVfaWR9IG5vdCBmb3VuZCBpbiByZWZlcmVuY2UgZGF0YWApO1xuXHRyZXR1cm4gZGF0YTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFByaW1hcnlEb2dtYUF0dHJpYnV0ZShza2lsbCkge1xuXHRyZXR1cm4gZ2V0QXR0cmlidXRlKHNraWxsLnByaW1hcnlfZG9nbWFfYXR0cmlidXRlX2lkKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY29uZGFyeURvZ21hQXR0cmlidXRlKHNraWxsKSB7XG5cdHJldHVybiBnZXRBdHRyaWJ1dGUoc2tpbGwuc2Vjb25kYXJ5X2RvZ21hX2F0dHJpYnV0ZV9pZCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRQcmltYXJ5Q2hhcmFjdGVyQXR0cmlidXRlKHNraWxsKSB7XG5cdHJldHVybiBnZXRBdHRyaWJ1dGUoc2tpbGwucHJpbWFyeV9jaGFyYWN0ZXJfYXR0cmlidXRlX2lkKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY29uZGFyeUNoYXJhY3RlckF0dHJpYnV0ZShza2lsbCkge1xuXHRyZXR1cm4gZ2V0QXR0cmlidXRlKHNraWxsLnNlY29uZGFyeV9jaGFyYWN0ZXJfYXR0cmlidXRlX2lkKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXJlcXVpc2l0ZXMoc2tpbGwpIHtcblx0aWYgKCFza2lsbC5yZXF1aXJlZF9za2lsbHMpIHJldHVybiBbXTtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKHNraWxsLnJlcXVpcmVkX3NraWxscykubWFwKGFzeW5jIChbc2tpbGxfdHlwZV9pZCwgbGV2ZWxdKSA9PiAoe1xuXHRcdHNraWxsOiBhd2FpdCBnZXRTa2lsbChwYXJzZUludChza2lsbF90eXBlX2lkKSksXG5cdFx0bGV2ZWxcblx0fSkpKTtcbn1cbmZ1bmN0aW9uIHNraWxscG9pbnRzQXRMZXZlbChza2lsbCwgbGV2ZWwpIHtcblx0cmV0dXJuIE1hdGgucG93KDIsIDIuNSAqIChsZXZlbCAtIDEpKSAqIDI1MCAqIHNraWxsLnRyYWluaW5nX3RpbWVfbXVsdGlwbGllcjtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBnZXRQcmVyZXF1aXNpdGVzLCBnZXRQcmltYXJ5Q2hhcmFjdGVyQXR0cmlidXRlLCBnZXRQcmltYXJ5RG9nbWFBdHRyaWJ1dGUsIGdldFNlY29uZGFyeUNoYXJhY3RlckF0dHJpYnV0ZSwgZ2V0U2Vjb25kYXJ5RG9nbWFBdHRyaWJ1dGUsIGdldFNraWxsLCBza2lsbHBvaW50c0F0TGV2ZWwgfTsiLAogICAgIi8vIEBidW5cbnZhciBuPVN5bWJvbC5mb3IoXCJpc0pTWFwiKTtmdW5jdGlvbiBTKHIpe3JldHVybiBpKG51bGwscil9ZnVuY3Rpb24gaShyLHtjaGlsZHJlbjplLC4uLm99LHMpe2xldCBhPWU7aWYoQXJyYXkuaXNBcnJheShlKSYmIWwoZSkpYT1lLm1hcCgodCk9PnQ/LltuXT90OlMoe2NoaWxkcmVuOnR9KSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oW3Isey4uLm8sa2V5OnN9LGFdLHtbbl06ITB9KX1mdW5jdGlvbiBsKHIpe3JldHVybiBBcnJheS5pc0FycmF5KHIpJiYoKG4gaW4gcil8fG0ocikpfWZ1bmN0aW9uIG0ocil7cmV0dXJuIHI/LlswXT09PVwiSFRNTFwiJiZ0eXBlb2YgclsxXT8uaHRtbD09PVwic3RyaW5nXCJ9ZXhwb3J0e2kgYXMganN4cyxpIGFzIGpzeERFVixpIGFzIGpzeCxtIGFzIGlzRGFuZ2VySFRNTCxsIGFzIGlzQXJyYXdPZkpTWENvbnRlbnQsUyBhcyBGcmFnbWVudH07XG4iLAogICAgImltcG9ydCB7Y2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlLCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlfSBmcm9tIFwiQHN0YXIta2l0dGVuL2V2ZS9lc2lcIjtcbmltcG9ydCB7Z2V0U2tpbGwsIGdldFR5cGV9IGZyb20gXCJAc3Rhci1raXR0ZW4vZXZlL21vZGVsc1wiO1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gU2tpbGxRdWV1ZVN0YXQoe2NoYXJhY3Rlcn0pIHtcbiAgY29uc3QgcXVldWUgPSBhd2FpdCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlKGNoYXJhY3Rlcik7XG4gIGNvbnN0IGN1cnJlbnQgPSBxdWV1ZT8uZmluZChza2lsbCA9PiBza2lsbC5xdWV1ZV9wb3NpdGlvbiA9PT0gMCk7XG4gIGlmICghY3VycmVudCB8fCAhY3VycmVudC5zdGFydF9kYXRlKSB7XG4gICAgcmV0dXJuIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICBjbGFzczogXCJzdGF0XCIsXG4gICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzOiBcInN0YXQtZmlndXJlIHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzOiBcInN0YXQtdGl0bGVcIixcbiAgICAgICAgY2hpbGRyZW46IFwiTm8gU2tpbGxzIFRyYWluaW5nXCJcbiAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyldXG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpO1xuICB9XG4gIGNvbnN0IHNraWxsID0gYXdhaXQgZ2V0U2tpbGwoY3VycmVudC5za2lsbF9pZCk7XG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSBjYWxjdWxhdGVUcmFpbmluZ1BlcmNlbnRhZ2UoY3VycmVudCkgKiAxMDA7XG4gIHJldHVybiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgIGNsYXNzOiBcInN0YXRcIixcbiAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICBjbGFzczogXCJzdGF0LWZpZ3VyZSB0ZXh0LXNlY29uZGFyeVwiXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInN0YXQtdGl0bGVcIixcbiAgICAgIGNoaWxkcmVuOiBcIkN1cnJlbnRseSBUcmFpbmluZ1wiXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInN0YXQtdmFsdWVcIixcbiAgICAgIGNoaWxkcmVuOiBbKGF3YWl0IGdldFR5cGUoc2tpbGwudHlwZV9pZCkpLm5hbWUuZW4sIFwiIFwiLCBjdXJyZW50LmZpbmlzaGVkX2xldmVsXVxuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInN0YXQtZGVzY1wiLFxuICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcInByb2dyZXNzXCIsIHtcbiAgICAgICAgY2xhc3M6IFwicHJvZ3Jlc3MgcHJvZ3Jlc3MtcHJpbWFyeSB3LWZ1bGxcIixcbiAgICAgICAgdmFsdWU6IHBlcmNlbnRhZ2UsXG4gICAgICAgIG1heDogXCIxMDBcIlxuICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyldXG4gIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCB0aGlzKTtcbn1cblNraWxsUXVldWVTdGF0LnN1c3BlbnNlID0gKCkgPT4ganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgY2xhc3M6IFwic3RhdFwiLFxuICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgY2xhc3M6IFwic3RhdC1maWd1cmUgdGV4dC1zZWNvbmRhcnlcIlxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgIGNsYXNzOiBcInN0YXQtdGl0bGVcIixcbiAgICBjaGlsZHJlbjogXCJDdXJyZW50bHkgVHJhaW5pbmdcIlxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgIGNsYXNzOiBcImZsZXggdy01MiBmbGV4LWNvbCBnYXAtNFwiLFxuICAgIGNoaWxkcmVuOiBbanN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInNrZWxldG9uIGgtMTYgdy1mdWxsXCJcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwic2tlbGV0b24gaC00IHctZnVsbFwiXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKV1cbiAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpXVxufSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpO1xuaW1wb3J0IHsganN4IGFzIGpzeF93Nzd5YWZzNCwganN4cyBhcyBqc3hzX2VoNmM3OG5qLCBqc3hERVYgYXMganN4REVWXzd4ODFoMGtuLCBGcmFnbWVudCBhcyBGcmFnbWVudF84dmc5eDNzcSB9IGZyb20gJ2JyaXNhL2pzeC1ydW50aW1lJztcbiIsCiAgICAiaW1wb3J0IHtyZW5kZXJDb21wb25lbnR9IGZyb20gXCJicmlzYS9zZXJ2ZXJcIjtcbmltcG9ydCB7Q2hhcmFjdGVyQVBJfSBmcm9tIFwiQHN0YXIta2l0dGVuL2V2ZS9lc2lcIjtcbmltcG9ydCB7Zm9ybWF0TnVtYmVyVG9TaG9ydEZvcm19IGZyb20gXCJAc3Rhci1raXR0ZW4vdXRpbC90ZXh0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBXYWxsZXRTdGF0KHtjaGFyYWN0ZXJ9KSB7XG4gIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBDaGFyYWN0ZXJBUEkuZ2V0Q2hhcmFjdGVyV2FsbGV0KGNoYXJhY3RlcikgfHwgMDtcbiAgY29uc3Qgam91cm5hbCA9IGF3YWl0IENoYXJhY3RlckFQSS5nZXRDaGFyYWN0ZXJXYWxsZXRKb3VybmFsKGNoYXJhY3RlciwgMSk7XG4gIGNvbnN0IGVhcmxpZXN0VHJhbnNhY3Rpb24gPSBqb3VybmFsPy5maWx0ZXIodHJhbnNhY3Rpb24gPT4ge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cmFuc2FjdGlvbi5kYXRlKTtcbiAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgPT09IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpO1xuICB9KS5zb3J0KChhLCBiKSA9PiBuZXcgRGF0ZShhLmRhdGUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuZGF0ZSkuZ2V0VGltZSgpKVswXTtcbiAgY29uc3QgYmFsYW5jZUNoYW5nZSA9IGJhbGFuY2UgLSAoZWFybGllc3RUcmFuc2FjdGlvbj8uYmFsYW5jZSB8fCBiYWxhbmNlKTtcbiAgY29uc3QgYmFsYW5jZUNoYW5nZVBlcmNlbnRhZ2UgPSBiYWxhbmNlQ2hhbmdlIC8gKGVhcmxpZXN0VHJhbnNhY3Rpb24/LmJhbGFuY2UgfHwgYmFsYW5jZSkgKiAxMDA7XG4gIGNvbnN0IGJhbGFuY2VDaGFuZ2VEaXJlY3Rpb24gPSBiYWxhbmNlQ2hhbmdlID4gMCA/IFwi4oaX77iOXCIgOiBcIuKGmO+4jlwiO1xuICBjb25zdCBiYWxhbmNlQ2hhbmdlVGV4dCA9IGAke2JhbGFuY2VDaGFuZ2VEaXJlY3Rpb259ICR7Zm9ybWF0TnVtYmVyVG9TaG9ydEZvcm0oTWF0aC5hYnMoYmFsYW5jZUNoYW5nZSkpfSAoJHtNYXRoLmFicyhOdW1iZXIoYmFsYW5jZUNoYW5nZVBlcmNlbnRhZ2UudG9GaXhlZCgyKSkpfSUpYDtcbiAgcmV0dXJuIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgY2xhc3M6IFwic3RhdFwiLFxuICAgIGNoaWxkcmVuOiBbanN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInN0YXQtZmlndXJlIHRleHQtc2Vjb25kYXJ5XCJcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwic3RhdC10aXRsZVwiLFxuICAgICAgY2hpbGRyZW46IFwiV2FsbGV0XCJcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwic3RhdC12YWx1ZVwiLFxuICAgICAgY2hpbGRyZW46IFtmb3JtYXROdW1iZXJUb1Nob3J0Rm9ybShiYWxhbmNlKSwgXCIgSVNLXCJdXG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwic3RhdC1kZXNjXCIsXG4gICAgICBjaGlsZHJlbjogYmFsYW5jZUNoYW5nZVRleHRcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXVxuICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcyk7XG59XG5XYWxsZXRTdGF0LnN1c3BlbnNlID0gKCkgPT4ganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgY2xhc3M6IFwic3RhdFwiLFxuICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgY2xhc3M6IFwic3RhdC1maWd1cmUgdGV4dC1zZWNvbmRhcnlcIlxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgIGNsYXNzOiBcInN0YXQtdGl0bGVcIixcbiAgICBjaGlsZHJlbjogXCJXYWxsZXRcIlxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgIGNsYXNzOiBcImZsZXggdy01MiBmbGV4LWNvbCBnYXAtNFwiLFxuICAgIGNoaWxkcmVuOiBbanN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzOiBcInNrZWxldG9uIGgtMTYgdy1mdWxsXCJcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwic2tlbGV0b24gaC00IHctZnVsbFwiXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKV1cbiAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpXVxufSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpO1xuaW1wb3J0IHsganN4IGFzIGpzeF93Nzd5YWZzNCwganN4cyBhcyBqc3hzX2VoNmM3OG5qLCBqc3hERVYgYXMganN4REVWXzd4ODFoMGtuLCBGcmFnbWVudCBhcyBGcmFnbWVudF84dmc5eDNzcSB9IGZyb20gJ2JyaXNhL2pzeC1ydW50aW1lJztcbiIsCiAgICAiaW1wb3J0IHtnZXRDb29raWVzfSBmcm9tIFwiQC91dGlsc1wiO1xuaW1wb3J0IHtDaGFyYWN0ZXJIZWxwZXIsIFVzZXJIZWxwZXJ9IGZyb20gXCJAc3Rhci1raXR0ZW4vZXZlL2RiXCI7XG5pbXBvcnQgU2tpbGxRdWV1ZVN0YXQgZnJvbSBcIkAvY29tcG9uZW50cy9zdGF0cy9za2lsbC1xdWV1ZVwiO1xuaW1wb3J0IFdhbGxldFN0YXQgZnJvbSBcIkAvY29tcG9uZW50cy9zdGF0cy93YWxsZXRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEhvbWVwYWdlKHByb3BzLCByZXF1ZXN0KSB7XG4gIGNvbnN0IHVzZXIgPSBVc2VySGVscGVyLmZpbmQoMSk7XG4gIGNvbnN0IGNoYXJhY3RlciA9IHVzZXIubWFpbkNoYXJhY3RlcklEICYmIENoYXJhY3RlckhlbHBlci5maW5kKHVzZXIubWFpbkNoYXJhY3RlcklEKTtcbiAgcmV0dXJuIGpzeERFVl83eDgxaDBrbihGcmFnbWVudF84dmc5eDNzcSwge1xuICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwiYmctZ3JheS05MDAgcHktMjQgc206cHktMzJcIixcbiAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICBjbGFzczogXCJteC1hdXRvIG1heC13LTd4bCBweC02IGxnOnB4LThcIixcbiAgICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3M6IFwibXgtYXV0byBtYXgtdy0yeGwgbGc6bWF4LXctbm9uZVwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwic3RhdHMgc2hhZG93XCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzOiBcInN0YXRcIixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcInN0YXQtZmlndXJlIHRleHQtc2Vjb25kYXJ5XCIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgICAgICAgICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6IFwiaW5saW5lLWJsb2NrIGgtOCB3LTggc3Ryb2tlLWN1cnJlbnRcIixcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJwYXRoXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJva2UtbGluZWNhcFwiOiBcInJvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3Ryb2tlLWxpbmVqb2luXCI6IFwicm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogXCIyXCIsXG4gICAgICAgICAgICAgICAgICAgIGQ6IFwiTTEzIDE2aC0xdi00aC0xbTEtNGguMDFNMjEgMTJhOSA5IDAgMTEtMTggMCA5IDkgMCAwMTE4IDB6XCJcbiAgICAgICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcylcbiAgICAgICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwic3RhdC10aXRsZVwiLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBcIkNoYXJhY3RlcnNcIlxuICAgICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcInN0YXQtdmFsdWVcIixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogdXNlci5jaGFyYWN0ZXJJRHMubGVuZ3RoXG4gICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwic3RhdC1kZXNjXCIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFwiSmFuIDFzdCAtIEZlYiAxc3RcIlxuICAgICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXVxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpLCBjaGFyYWN0ZXIgJiYganN4REVWXzd4ODFoMGtuKFNraWxsUXVldWVTdGF0LCB7XG4gICAgICAgICAgICAgIGNoYXJhY3RlclxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwgY2hhcmFjdGVyICYmIGpzeERFVl83eDgxaDBrbihXYWxsZXRTdGF0LCB7XG4gICAgICAgICAgICAgIGNoYXJhY3RlclxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgY2xhc3M6IFwic3RhdFwiLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwic3RhdC1maWd1cmUgdGV4dC1zZWNvbmRhcnlcIixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjoganN4REVWXzd4ODFoMGtuKFwic3ZnXCIsIHtcbiAgICAgICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgICAgICAgICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgICAgICAgICAgICAgICBjbGFzczogXCJpbmxpbmUtYmxvY2sgaC04IHctOCBzdHJva2UtY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS1saW5lY2FwXCI6IFwicm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJva2UtbGluZWpvaW5cIjogXCJyb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0cm9rZS13aWR0aFwiOiBcIjJcIixcbiAgICAgICAgICAgICAgICAgICAgZDogXCJNNSA4aDE0TTUgOGEyIDIgMCAxMTAtNGgxNGEyIDIgMCAxMTAgNE01IDh2MTBhMiAyIDAgMDAyIDJoMTBhMiAyIDAgMDAyLTJWOG0tOSA0aDRcIlxuICAgICAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcylcbiAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJzdGF0LXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFwiTmV3IFJlZ2lzdGVyc1wiXG4gICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZCwgdGhpcyksIGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwic3RhdC12YWx1ZVwiLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBcIjEsMjAwXCJcbiAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKSwganN4REVWXzd4ODFoMGtuKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJzdGF0LWRlc2NcIixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogXCLihpjvuI4gOTAgKDE0JSlcIlxuICAgICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXVxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB1bmRlZmluZWQsIHRoaXMpXVxuICAgICAgICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdW5kZWZpbmVkLCB0aGlzKVxuICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpO1xufVxuaW1wb3J0IHsganN4IGFzIGpzeF93Nzd5YWZzNCwganN4cyBhcyBqc3hzX2VoNmM3OG5qLCBqc3hERVYgYXMganN4REVWXzd4ODFoMGtuLCBGcmFnbWVudCBhcyBGcmFnbWVudF84dmc5eDNzcSB9IGZyb20gJ2JyaXNhL2pzeC1ydW50aW1lJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSTtBQUFBLEVBQ0osSUFBSSxVQUFTLE9BQU87QUFBQSxFQUdwQixTQUFTLFNBQVUsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUM1QixTQUFTLE9BQU8sS0FBSztBQUFBLE1BQ25CLElBQUksT0FBTyxJQUFJO0FBQUEsSUFDakI7QUFBQTtBQUFBLEVBRUYsSUFBSSxRQUFPLFFBQVEsUUFBTyxTQUFTLFFBQU8sZUFBZSxRQUFPLGlCQUFpQjtBQUFBLElBQy9FLE9BQU8sVUFBVTtBQUFBLEVBQ25CLEVBQU87QUFBQSxJQUVMLFVBQVUsUUFBUSxPQUFPO0FBQUEsSUFDekIsUUFBUSxTQUFTO0FBQUE7QUFBQSxFQUduQixTQUFTLFVBQVcsQ0FBQyxLQUFLLGtCQUFrQixRQUFRO0FBQUEsSUFDbEQsT0FBTyxRQUFPLEtBQUssa0JBQWtCLE1BQU07QUFBQTtBQUFBLEVBRzdDLFdBQVcsWUFBWSxPQUFPLE9BQU8sUUFBTyxTQUFTO0FBQUEsRUFHckQsVUFBVSxTQUFRLFVBQVU7QUFBQSxFQUU1QixXQUFXLE9BQU8sUUFBUyxDQUFDLEtBQUssa0JBQWtCLFFBQVE7QUFBQSxJQUN6RCxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsTUFBTSxJQUFJLFVBQVUsK0JBQStCO0FBQUEsSUFDckQ7QUFBQSxJQUNBLE9BQU8sUUFBTyxLQUFLLGtCQUFrQixNQUFNO0FBQUE7QUFBQSxFQUc3QyxXQUFXLFFBQVEsUUFBUyxDQUFDLE1BQU0sTUFBTSxVQUFVO0FB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SUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sT0FBTyxVQUFVO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7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Q2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEs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LEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFH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LE1BQU07QUFBQSxFQUN0QixJQUFJLFdBQVcsTUFBTTtBQUFBLEVBQ3JCLElBQUksV0FBVyxNQUFNO0FBQUEsRUFDckIsSUFBSSxRQUFRLE1BQU07QUFBQSxFQUNsQixJQUFJLFdBQVcsTUFBTTtBQUFBLEVBQ3JCLElBQUksV0FBVyxNQUFNO0FBQUEsRUFDckIsSUFBSSxhQUFhLE1BQU07QUFBQSxFQUN2QixJQUFJLGFBQWEsTUFBTTtBQUFBLEVBQ3ZCLElBQUksYUFBYSxNQUFNO0FBQUEsRUFDdkIsSUFBSSxhQUFhLE1BQU07QUFBQSxFQUV2QixJQUFJLFlBQVksT0FBTztBQUFBLEVBRXZCLElBQUksV0FBVztBQUFBLElBQ2I7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElB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QUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDbEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxJQUFJO0FBQUEsSUFDTjtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLEVBQ3REO0FBQUE7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QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSztBQUFBLE1BQ0gsS0FBSztBQUFBLE1BQ0wsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEs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QVcsSUFBSSxHQUFHLEVBQWdCLE9BQU87QUFBQSxnQkFDNUQsT0FBTztBQUFBLGdCQUNQLFVBQVUsS0FBSyxhQUFhO0FBQUEsY0FDOUIsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsT0FBTztBQUFBLGdCQUM1RCxPQUFPO0FBQUEsZ0JBQ1AsVUFBVTtBQUFBLGNBQ1osR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFBQSxZQUN2QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUksR0FBRyxhQUFhLEVBQWdCLGdCQUFnQjtBQUFBLGNBQ2pGO0FBQUEsWUFDRixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxhQUFhLEVBQWdCLFlBQVk7QUFBQSxjQUM5RTtBQUFBLFlBQ0YsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLEdBQUcsRUFBZ0IsT0FBTztBQUFBLGNBQzVELE9BQU87QUFBQSxjQUNQLFVBQVUsQ0FBQyxFQUFnQixPQUFPO0FBQUEsZ0JBQ2hDLE9BQU87QUFBQSxnQkFDUCxVQUFVLEVBQWdCLE9BQU87QUFBQSxrQkFDL0IsT0FBTztBQUFBLGtCQUNQLE1BQU07QUFBQSxrQkFDTixTQUFTO0FBQUEsa0JBQ1QsT0FBTztBQUFBLGtCQUNQLFVBQVUsRUFBZ0IsUUFBUTtBQUFBLG9CQUNoQyxrQkFBa0I7QUFBQSxvQkFDbEIsbUJBQW1CO0FBQUEsb0JBQ25CLGdCQUFnQjtBQUFBLG9CQUNoQixHQUFHO0FBQUEsa0JBQ0wsR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJO0FBQUEsZ0JBQ3RDLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSTtBQUFBLGNBQ3RDLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLE9BQU87QUFBQSxnQkFDNUQsT0FBTztBQUFBLGdCQUNQLFVBQVU7QUFBQSxjQUNaLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLE9BQU87QUFBQSxnQkFDNUQsT0FBTztBQUFBLGdCQUNQLFVBQVU7QUFBQSxjQUNaLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQWdCLE9BQU87QUFBQSxnQkFDNUQsT0FBTztBQUFBLGdCQUNQLFVBQVU7QUFBQSxjQUNaLEdBQUcsV0FBVyxPQUFPLFdBQVcsSUFBSSxDQUFDO0FBQUEsWUFDdkMsR0FBRyxXQUFXLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFBQSxVQUN0QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUk7QUFBQSxRQUNyQyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxNQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxJQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxFQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkFBMzQyQzFEOUQ1M0I2MkI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|