// @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 */ 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 index = R++; debug(name, index, value); t[name] = index; src[index] = value; safeSrc[index] = safe; re[index] = new RegExp(value, isGlobal ? "g" : undefined); safeRe[index] = 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 numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { const anum = numeric.test(a); const bnum = numeric.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(version, options2) { options2 = parseOptions(options2); if (version instanceof SemVer) { if (version.loose === !!options2.loose && version.includePrerelease === !!options2.includePrerelease) { return version; } else { version = version.version; } } else if (typeof version !== "string") { throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`); } if (version.length > MAX_LENGTH) { throw new TypeError(`version is longer than ${MAX_LENGTH} characters`); } debug("SemVer", version, options2); this.options = options2; this.loose = !!options2.loose; this.includePrerelease = !!options2.includePrerelease; const m = version.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { throw new TypeError(`Invalid Version: ${version}`); } this.raw = version; 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 = (version, options2, throwErrors = false) => { if (version instanceof SemVer) { return version; } try { return new SemVer(version, 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 = (version, options2) => { const v = parse(version, 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 = (version, options2) => { const s = parse(version.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 = (version, release, options2, identifier, identifierBase) => { if (typeof options2 === "string") { identifierBase = identifier; identifier = options2; options2 = undefined; } try { return new SemVer(version instanceof SemVer ? version.version : version, 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 = (version, options2) => { const parsed = parse(version, 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 gt = (a, b, loose) => compare(a, b, loose) > 0; module.exports = gt; }); // ../eve/node_modules/semver/functions/lt.js var require_lt = __commonJS((exports, module) => { var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module.exports = lt; }); // ../eve/node_modules/semver/functions/eq.js var require_eq = __commonJS((exports, module) => { var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module.exports = eq; }); // ../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 gte = (a, b, loose) => compare(a, b, loose) >= 0; module.exports = gte; }); // ../eve/node_modules/semver/functions/lte.js var require_lte = __commonJS((exports, module) => { var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module.exports = lte; }); // ../eve/node_modules/semver/functions/cmp.js var require_cmp = __commonJS((exports, module) => { var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); var gte = require_gte(); var lt = require_lt(); var lte = 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 eq(a, b, loose); case "!=": return neq(a, b, loose); case ">": return gt(a, b, loose); case ">=": return gte(a, b, loose); case "<": return lt(a, b, loose); case "<=": return lte(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 = (version, options2) => { if (version instanceof SemVer) { return version; } if (typeof version === "number") { version = String(version); } if (typeof version !== "string") { return null; } options2 = options2 || {}; let match = null; if (!options2.rtl) { match = version.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(version)) && (!match || match.index + match[0].length !== version.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(version) { if (!version) { return false; } if (typeof version === "string") { try { version = new SemVer(version, this.options); } catch (er) { return false; } } for (let i = 0;i < this.set.length; i++) { if (testSet(this.set[i], version, 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, version, options2) => { for (let i = 0;i < set.length; i++) { if (!set[i].test(version)) { return false; } } if (version.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 === version.major && allowed.minor === version.minor && allowed.patch === version.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(version) { debug("Comparator.test", version, this.options.loose); if (this.semver === ANY || version === ANY) { return true; } if (typeof version === "string") { try { version = new SemVer(version, this.options); } catch (er) { return false; } } return cmp(version, 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 = (version, range, options2) => { try { range = new Range(range, options2); } catch (er) { return false; } return range.test(version); }; 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 gt = 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 || gt(compver, setMin)) { setMin = compver; } break; case "<": case "<=": break; default: throw new Error(`Unexpected operation: ${comparator.operator}`); } }); if (setMin && (!minver || gt(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 gt = require_gt(); var lt = require_lt(); var lte = require_lte(); var gte = require_gte(); var outside = (version, range, hilo, options2) => { version = new SemVer(version, options2); range = new Range(range, options2); let gtfn, ltefn, ltfn, comp, ecomp; switch (hilo) { case ">": gtfn = gt; ltefn = lte; ltfn = lt; comp = ">"; ecomp = ">="; break; case "<": gtfn = lt; ltefn = gte; ltfn = gt; comp = "<"; ecomp = "<="; break; default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } if (satisfies(version, 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(version, low.semver)) { return false; } else if (low.operator === ecomp && ltfn(version, 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 = (version, range, options2) => outside(version, range, ">", options2); module.exports = gtr; }); // ../eve/node_modules/semver/ranges/ltr.js var require_ltr = __commonJS((exports, module) => { var outside = require_outside(); var ltr = (version, range, options2) => outside(version, 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 version of v) { const included = satisfies(version, range, options2); if (included) { prev = version; if (!first) { first = version; } } 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 gt, lt; for (const c of sub) { if (c.operator === ">" || c.operator === ">=") { gt = higherGT(gt, c, options2); } else if (c.operator === "<" || c.operator === "<=") { lt = lowerLT(lt, c, options2); } else { eqSet.add(c.semver); } } if (eqSet.size > 1) { return null; } let gtltComp; if (gt && lt) { gtltComp = compare(gt.semver, lt.semver, options2); if (gtltComp > 0) { return null; } else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<=")) { return null; } } for (const eq of eqSet) { if (gt && !satisfies(eq, String(gt), options2)) { return null; } if (lt && !satisfies(eq, String(lt), options2)) { return null; } for (const c of dom) { if (!satisfies(eq, String(c), options2)) { return false; } } return true; } let higher, lower; let hasDomLT, hasDomGT; let needDomLTPre = lt && !options2.includePrerelease && lt.semver.prerelease.length ? lt.semver : false; let needDomGTPre = gt && !options2.includePrerelease && gt.semver.prerelease.length ? gt.semver : false; if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.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 (gt) { 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(gt, c, options2); if (higher === c && higher !== gt) { return false; } } else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options2)) { return false; } } if (lt) { 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(lt, c, options2); if (lower === c && lower !== lt) { return false; } } else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options2)) { return false; } } if (!c.operator && (lt || gt) && gtltComp !== 0) { return false; } } if (gt && hasDomLT && !lt && gtltComp !== 0) { return false; } if (lt && hasDomGT && !gt && 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 gt = require_gt(); var lt = require_lt(); var eq = require_eq(); var neq = require_neq(); var gte = require_gte(); var lte = 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, lt, eq, neq, gte, lte, 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 index = -1, length = array ? array.length : 0, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while (fromRight ? index-- : ++index < length) { if (predicate(array[index], index, array)) { return index; } } return -1; } function baseIndexOf(array, value, fromIndex) { if (value !== value) { return baseFindIndex(array, baseIsNaN, fromIndex); } var index = fromIndex - 1, length = array.length; while (++index < length) { if (array[index] === value) { return index; } } return -1; } function baseIsNaN(value) { return value !== value; } function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } 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, index) { var c = string.charCodeAt(index); 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, index) { var r = parseHex4Bits(string, index); if (index - 1 >= lowerBound) { r |= parseHex4Bits(string, index - 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 ? ""; }; 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(index) { const state = this._reporterState; state.path = state.path.slice(0, index - 1); }; Reporter.prototype.leaveKey = function leaveKey(index, key, value) { const state = this._reporterState; this.exitKey(index); 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 ", 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 index = [ -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] = index[(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 ""; return ""; }; 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 ""; return ""; }; 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 ""; return ""; }; 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 ""; return ""; }; 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 ""; }; }); // ../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; }); // ../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/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/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/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/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 ?? ""}" 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/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/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/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; } // src/utils/cookies.ts function getCookies(headers) { if (!headers) return {}; const cookieHeader = headers.get("Cookie"); const cookies = {}; if (cookieHeader === null) return {}; for (const kv of cookieHeader.split(";")) { const [cookieKey, ...cookieVal] = kv.split("="); const key = cookieKey.trim(); cookies[key] = cookieVal.join("="); } return cookies; } function setCookie(response, key, value, maxAge) { response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`); } function removeCookie(response, key) { response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`); } // node_modules/oslo/dist/encoding/hex.js var hexDecodeMap = new Map([ ["0", 0], ["1", 1], ["2", 2], ["3", 3], ["4", 4], ["5", 5], ["6", 6], ["7", 7], ["8", 8], ["9", 9], ["A", 10], ["B", 11], ["C", 12], ["D", 13], ["E", 14], ["F", 15], ["a", 10], ["b", 11], ["c", 12], ["d", 13], ["e", 14], ["f", 15] ]); // node_modules/oslo/dist/encoding/base32.js class Base32Encoding { alphabet; padding; decodeMap = new Map; constructor(alphabet2, options2) { if (alphabet2.length !== 32) { throw new Error("Invalid alphabet"); } this.alphabet = alphabet2; this.padding = options2?.padding ?? "="; if (this.alphabet.includes(this.padding) || this.padding.length !== 1) { throw new Error("Invalid padding"); } for (let i = 0;i < alphabet2.length; i++) { this.decodeMap.set(alphabet2[i], i); } } encode(data, options2) { let result = ""; let buffer = 0; let shift = 0; for (let i = 0;i < data.length; i++) { buffer = buffer << 8 | data[i]; shift += 8; while (shift >= 5) { shift -= 5; result += this.alphabet[buffer >> shift & 31]; } } if (shift > 0) { result += this.alphabet[buffer << 5 - shift & 31]; } const includePadding = options2?.includePadding ?? true; if (includePadding) { const padCount = (8 - result.length % 8) % 8; for (let i = 0;i < padCount; i++) { result += "="; } } return result; } decode(data, options2) { const strict = options2?.strict ?? true; const chunkCount = Math.ceil(data.length / 8); const result = []; for (let i = 0;i < chunkCount; i++) { let padCount = 0; const chunks = []; for (let j = 0;j < 8; j++) { const encoded = data[i * 8 + j]; if (encoded === "=") { if (i + 1 !== chunkCount) { throw new Error(`Invalid character: ${encoded}`); } padCount += 1; continue; } if (encoded === undefined) { if (strict) { throw new Error("Invalid data"); } padCount += 1; continue; } const value = this.decodeMap.get(encoded) ?? null; if (value === null) { throw new Error(`Invalid character: ${encoded}`); } chunks.push(value); } if (padCount === 8 || padCount === 7 || padCount === 5 || padCount === 2) { throw new Error("Invalid padding"); } const byte1 = (chunks[0] << 3) + (chunks[1] >> 2); result.push(byte1); if (padCount < 6) { const byte2 = ((chunks[1] & 3) << 6) + (chunks[2] << 1) + (chunks[3] >> 4); result.push(byte2); } if (padCount < 4) { const byte3 = ((chunks[3] & 255) << 4) + (chunks[4] >> 1); result.push(byte3); } if (padCount < 3) { const byte4 = ((chunks[4] & 1) << 7) + (chunks[5] << 2) + (chunks[6] >> 3); result.push(byte4); } if (padCount < 1) { const byte5 = ((chunks[6] & 7) << 5) + chunks[7]; result.push(byte5); } } return Uint8Array.from(result); } } var base32 = new Base32Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"); var base32hex = new Base32Encoding("0123456789ABCDEFGHIJKLMNOPQRSTUV"); // node_modules/oslo/dist/encoding/base64.js class Base64Encoding { alphabet; padding; decodeMap = new Map; constructor(alphabet2, options2) { if (alphabet2.length !== 64) { throw new Error("Invalid alphabet"); } this.alphabet = alphabet2; this.padding = options2?.padding ?? "="; if (this.alphabet.includes(this.padding) || this.padding.length !== 1) { throw new Error("Invalid padding"); } for (let i = 0;i < alphabet2.length; i++) { this.decodeMap.set(alphabet2[i], i); } } encode(data, options2) { let result = ""; let buffer = 0; let shift = 0; for (let i = 0;i < data.length; i++) { buffer = buffer << 8 | data[i]; shift += 8; while (shift >= 6) { shift += -6; result += this.alphabet[buffer >> shift & 63]; } } if (shift > 0) { result += this.alphabet[buffer << 6 - shift & 63]; } const includePadding = options2?.includePadding ?? true; if (includePadding) { const padCount = (4 - result.length % 4) % 4; for (let i = 0;i < padCount; i++) { result += "="; } } return result; } decode(data, options2) { const strict = options2?.strict ?? true; const chunkCount = Math.ceil(data.length / 4); const result = []; for (let i = 0;i < chunkCount; i++) { let padCount = 0; let buffer = 0; for (let j = 0;j < 4; j++) { const encoded = data[i * 4 + j]; if (encoded === "=") { if (i + 1 !== chunkCount) { throw new Error(`Invalid character: ${encoded}`); } padCount += 1; continue; } if (encoded === undefined) { if (strict) { throw new Error("Invalid data"); } padCount += 1; continue; } const value = this.decodeMap.get(encoded) ?? null; if (value === null) { throw new Error(`Invalid character: ${encoded}`); } buffer += value << 6 * (3 - j); } result.push(buffer >> 16 & 255); if (padCount < 2) { result.push(buffer >> 8 & 255); } if (padCount < 1) { result.push(buffer & 255); } } return Uint8Array.from(result); } } var base64 = new Base64Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); var base64url = new Base64Encoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"); // node_modules/oslo/dist/oauth2/index.js class OAuth2RequestError extends Error { request; description; constructor(request, body) { super(body.error ?? ""); this.request = request; this.description = body.error_description ?? null; } } // src/middleware.ts async function middleware(req) { req.store.set("options", options); const redirect = async (scopes) => { const { url, state } = await createAuthorizationURL(scopes); const response = new Response("", { status: 302 }); setCookie(response, "state", state, 60 * 10); response.headers.set("location", url.href); return response; }; const eveauth = { validateAuthorizationCode: (code) => { try { return validateAuthorizationCode(code); } catch (error) { throw new OAuth2RequestError(req, { error: `Failed to authenticate with EVE Online ${error}` }); } }, validateToken, validate: async (response) => { const query = new URL(req.url).searchParams; const code = query.get("code"); if (!code) { throw Error(`code missing from query parameters, there may be an error with the OAuth provider`); } const cookies = getCookies(req.headers); if (cookies["state"] !== query.get("state")) throw Error("invalid state"); removeCookie(response, "state"); try { const tokens = await validateAuthorizationCode(code); const decoded = await validateToken(tokens.access_token); if (!decoded) throw "Invalid Token"; return tokens; } catch (error) { throw new OAuth2RequestError(req, { error: `Failed to authenticate with EVE Online ${error}` }); } }, redirect }; req.store.set("eveauth", eveauth); } export { middleware as default }; //# debugId=F43A0BF57718A84E64756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxfdmlydHVhbFxccm9sbGRvd25fcnVudGltZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3QtZGVjb2RlXFxidWlsZFxcZXNtXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxAb3Nsb2pzXFxlbmNvZGluZ1xcZGlzdFxcYmFzZTMyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlNjQuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcYXV0aC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxzY29wZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcdXNlci5tb2RlbC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xccmVzdW1lLWNvbW1hbmQubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxkcml2ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGJ1bi1zcWxpdGVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcY2hhcmFjdGVyLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXHNyY1xcdXRpbHNcXGNvb2tpZXMudHMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcb3Nsb1xcZGlzdFxcZW5jb2RpbmdcXGhleC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxvc2xvXFxkaXN0XFxlbmNvZGluZ1xcYmFzZTMyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXG9zbG9cXGRpc3RcXGVuY29kaW5nXFxiYXNlNjQuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcb3Nsb1xcZGlzdFxcb2F1dGgyXFxpbmRleC5qcyIsICIuLlxcc3JjXFxtaWRkbGV3YXJlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gRGF0YVN0cmVhbShkYXRhKSB7XG4gIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIE5vIGlucHV0XG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gU3RyZWFtXG4gIGlmICh0eXBlb2YgZGF0YS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZGF0YS5waXBlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQnVmZmVyIG9yIFN0cmluZ1xuICAvLyBvciBPYmplY3QgKGFzc3VtZWRseSBhIHBhc3N3b3JkZWQga2V5KVxuICBpZiAoZGF0YS5sZW5ndGggfHwgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgdGhpcy5idWZmZXIgPSBkYXRhO1xuICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gICAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfS5iaW5kKHRoaXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQgZGF0YSB0eXBlICgnKyB0eXBlb2YgZGF0YSArICcpJyk7XG59XG51dGlsLmluaGVyaXRzKERhdGFTdHJlYW0sIFN0cmVhbSk7XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBCdWZmZXIuZnJvbShkYXRhKV0pO1xuICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbn07XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZChkYXRhKSB7XG4gIGlmIChkYXRhKVxuICAgIHRoaXMud3JpdGUoZGF0YSk7XG4gIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFTdHJlYW07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZ2V0UGFyYW1TaXplKGtleVNpemUpIHtcblx0dmFyIHJlc3VsdCA9ICgoa2V5U2l6ZSAvIDgpIHwgMCkgKyAoa2V5U2l6ZSAlIDggPT09IDAgPyAwIDogMSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBwYXJhbUJ5dGVzRm9yQWxnID0ge1xuXHRFUzI1NjogZ2V0UGFyYW1TaXplKDI1NiksXG5cdEVTMzg0OiBnZXRQYXJhbVNpemUoMzg0KSxcblx0RVM1MTI6IGdldFBhcmFtU2l6ZSg1MjEpXG59O1xuXG5mdW5jdGlvbiBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZykge1xuXHR2YXIgcGFyYW1CeXRlcyA9IHBhcmFtQnl0ZXNGb3JBbGdbYWxnXTtcblx0aWYgKHBhcmFtQnl0ZXMpIHtcblx0XHRyZXR1cm4gcGFyYW1CeXRlcztcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0gXCInICsgYWxnICsgJ1wiJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBnZXRQYXJhbUJ5dGVzRm9yQWxnID0gcmVxdWlyZSgnLi9wYXJhbS1ieXRlcy1mb3ItYWxnJyk7XG5cbnZhciBNQVhfT0NURVQgPSAweDgwLFxuXHRDTEFTU19VTklWRVJTQUwgPSAwLFxuXHRQUklNSVRJVkVfQklUID0gMHgyMCxcblx0VEFHX1NFUSA9IDB4MTAsXG5cdFRBR19JTlQgPSAweDAyLFxuXHRFTkNPREVEX1RBR19TRVEgPSAoVEFHX1NFUSB8IFBSSU1JVElWRV9CSVQpIHwgKENMQVNTX1VOSVZFUlNBTCA8PCA2KSxcblx0RU5DT0RFRF9UQUdfSU5UID0gVEFHX0lOVCB8IChDTEFTU19VTklWRVJTQUwgPDwgNik7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybChiYXNlNjQpIHtcblx0cmV0dXJuIGJhc2U2NFxuXHRcdC5yZXBsYWNlKC89L2csICcnKVxuXHRcdC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuXHRcdC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKSB7XG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoc2lnbmF0dXJlKSkge1xuXHRcdHJldHVybiBzaWduYXR1cmU7XG5cdH0gZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBzaWduYXR1cmUpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG5cdH1cblxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFQ0RTQSBzaWduYXR1cmUgbXVzdCBiZSBhIEJhc2U2NCBzdHJpbmcgb3IgYSBCdWZmZXInKTtcbn1cblxuZnVuY3Rpb24gZGVyVG9Kb3NlKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdC8vIHRoZSBERVIgZW5jb2RlZCBwYXJhbSBzaG91bGQgYXQgbW9zdCBiZSB0aGUgcGFyYW0gc2l6ZSwgcGx1cyBhIHBhZGRpbmdcblx0Ly8gemVybywgc2luY2UgZHVlIHRvIGJlaW5nIGEgc2lnbmVkIGludGVnZXJcblx0dmFyIG1heEVuY29kZWRQYXJhbUxlbmd0aCA9IHBhcmFtQnl0ZXMgKyAxO1xuXG5cdHZhciBpbnB1dExlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cblx0dmFyIG9mZnNldCA9IDA7XG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19TRVEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwic2VxXCInKTtcblx0fVxuXG5cdHZhciBzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHRpZiAoc2VxTGVuZ3RoID09PSAoTUFYX09DVEVUIHwgMSkpIHtcblx0XHRzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHR9XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IDwgc2VxTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNlcVwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc2VxTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgcmVtYWluaW5nJyk7XG5cdH1cblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInJcIicpO1xuXHR9XG5cblx0dmFyIHJMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIgPCByTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInJcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHJMZW5ndGggKyAnXCIsIG9ubHkgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IC0gMikgKyAnXCIgYXZhaWxhYmxlJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciByT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gckxlbmd0aDtcblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInNcIicpO1xuXHR9XG5cblx0dmFyIHNMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAhPT0gc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBleHBlY3RlZCBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciBzT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gc0xlbmd0aDtcblxuXHRpZiAob2Zmc2V0ICE9PSBpbnB1dExlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gY29uc3VtZSBlbnRpcmUgYnVmZmVyLCBidXQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIiBieXRlcyByZW1haW4nKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSByTGVuZ3RoLFxuXHRcdHNQYWRkaW5nID0gcGFyYW1CeXRlcyAtIHNMZW5ndGg7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShyUGFkZGluZyArIHJMZW5ndGggKyBzUGFkZGluZyArIHNMZW5ndGgpO1xuXG5cdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgclBhZGRpbmc7ICsrb2Zmc2V0KSB7XG5cdFx0ZHN0W29mZnNldF0gPSAwO1xuXHR9XG5cdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByT2Zmc2V0ICsgTWF0aC5tYXgoLXJQYWRkaW5nLCAwKSwgck9mZnNldCArIHJMZW5ndGgpO1xuXG5cdG9mZnNldCA9IHBhcmFtQnl0ZXM7XG5cblx0Zm9yICh2YXIgbyA9IG9mZnNldDsgb2Zmc2V0IDwgbyArIHNQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgc09mZnNldCArIE1hdGgubWF4KC1zUGFkZGluZywgMCksIHNPZmZzZXQgKyBzTGVuZ3RoKTtcblxuXHRkc3QgPSBkc3QudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHRkc3QgPSBiYXNlNjRVcmwoZHN0KTtcblxuXHRyZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBjb3VudFBhZGRpbmcoYnVmLCBzdGFydCwgc3RvcCkge1xuXHR2YXIgcGFkZGluZyA9IDA7XG5cdHdoaWxlIChzdGFydCArIHBhZGRpbmcgPCBzdG9wICYmIGJ1ZltzdGFydCArIHBhZGRpbmddID09PSAwKSB7XG5cdFx0KytwYWRkaW5nO1xuXHR9XG5cblx0dmFyIG5lZWRzU2lnbiA9IGJ1ZltzdGFydCArIHBhZGRpbmddID49IE1BWF9PQ1RFVDtcblx0aWYgKG5lZWRzU2lnbikge1xuXHRcdC0tcGFkZGluZztcblx0fVxuXG5cdHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBqb3NlVG9EZXIoc2lnbmF0dXJlLCBhbGcpIHtcblx0c2lnbmF0dXJlID0gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKTtcblx0dmFyIHBhcmFtQnl0ZXMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZyk7XG5cblx0dmFyIHNpZ25hdHVyZUJ5dGVzID0gc2lnbmF0dXJlLmxlbmd0aDtcblx0aWYgKHNpZ25hdHVyZUJ5dGVzICE9PSBwYXJhbUJ5dGVzICogMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiJyArIGFsZyArICdcIiBzaWduYXR1cmVzIG11c3QgYmUgXCInICsgcGFyYW1CeXRlcyAqIDIgKyAnXCIgYnl0ZXMsIHNhdyBcIicgKyBzaWduYXR1cmVCeXRlcyArICdcIicpO1xuXHR9XG5cblx0dmFyIHJQYWRkaW5nID0gY291bnRQYWRkaW5nKHNpZ25hdHVyZSwgMCwgcGFyYW1CeXRlcyk7XG5cdHZhciBzUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIHBhcmFtQnl0ZXMsIHNpZ25hdHVyZS5sZW5ndGgpO1xuXHR2YXIgckxlbmd0aCA9IHBhcmFtQnl0ZXMgLSByUGFkZGluZztcblx0dmFyIHNMZW5ndGggPSBwYXJhbUJ5dGVzIC0gc1BhZGRpbmc7XG5cblx0dmFyIHJzQnl0ZXMgPSAxICsgMSArIHJMZW5ndGggKyAxICsgMSArIHNMZW5ndGg7XG5cblx0dmFyIHNob3J0TGVuZ3RoID0gcnNCeXRlcyA8IE1BWF9PQ1RFVDtcblxuXHR2YXIgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKChzaG9ydExlbmd0aCA/IDIgOiAzKSArIHJzQnl0ZXMpO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfU0VRO1xuXHRpZiAoc2hvcnRMZW5ndGgpIHtcblx0XHQvLyBCaXQgOCBoYXMgdmFsdWUgXCIwXCJcblx0XHQvLyBiaXRzIDctMSBnaXZlIHRoZSBsZW5ndGguXG5cdFx0ZHN0W29mZnNldCsrXSA9IHJzQnl0ZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQml0IDggb2YgZmlyc3Qgb2N0ZXQgaGFzIHZhbHVlIFwiMVwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbGVuZ3RoIG9jdGV0cy5cblx0XHRkc3Rbb2Zmc2V0KytdID0gTUFYX09DVEVUXHR8IDE7XG5cdFx0Ly8gbGVuZ3RoLCBiYXNlIDI1NlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzICYgMHhmZjtcblx0fVxuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfSU5UO1xuXHRkc3Rbb2Zmc2V0KytdID0gckxlbmd0aDtcblx0aWYgKHJQYWRkaW5nIDwgMCkge1xuXHRcdGRzdFtvZmZzZXQrK10gPSAwO1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgMCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0b2Zmc2V0ICs9IHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByUGFkZGluZywgcGFyYW1CeXRlcyk7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHNMZW5ndGg7XG5cdGlmIChzUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMgKyBzUGFkZGluZyk7XG5cdH1cblxuXHRyZXR1cm4gZHN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZGVyVG9Kb3NlOiBkZXJUb0pvc2UsXG5cdGpvc2VUb0Rlcjogam9zZVRvRGVyXG59O1xuIiwKICAgICIvKmpzaGludCBub2RlOnRydWUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7IC8vIGJyb3dzZXJpZnlcbnZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBidWZmZXJFcTtcblxuZnVuY3Rpb24gYnVmZmVyRXEoYSwgYikge1xuXG4gIC8vIHNob3J0Y3V0dGluZyBvbiB0eXBlIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3NcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGJ1ZmZlciBzaXplcyBzaG91bGQgYmUgd2VsbC1rbm93biBpbmZvcm1hdGlvbiwgc28gZGVzcGl0ZSB0aGlzXG4gIC8vIHNob3J0Y3V0dGluZywgaXQgZG9lc24ndCBsZWFrIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgKmNvbnRlbnRzKiBvZiB0aGVcbiAgLy8gYnVmZmVycy5cbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLypqc2hpbnQgYml0d2lzZTpmYWxzZSAqL1xuICAgIGMgfD0gYVtpXSBeIGJbaV07IC8vIFhPUlxuICB9XG4gIHJldHVybiBjID09PSAwO1xufVxuXG5idWZmZXJFcS5pbnN0YWxsID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKHRoYXQpIHtcbiAgICByZXR1cm4gYnVmZmVyRXEodGhpcywgdGhhdCk7XG4gIH07XG59O1xuXG52YXIgb3JpZ0J1ZkVxdWFsID0gQnVmZmVyLnByb3RvdHlwZS5lcXVhbDtcbnZhciBvcmlnU2xvd0J1ZkVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG5idWZmZXJFcS5yZXN0b3JlID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBvcmlnQnVmRXF1YWw7XG4gIFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ1Nsb3dCdWZFcXVhbDtcbn07XG4iLAogICAgInZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBmb3JtYXRFY2RzYSA9IHJlcXVpcmUoJ2VjZHNhLXNpZy1mb3JtYXR0ZXInKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgTVNHX0lOVkFMSURfQUxHT1JJVEhNID0gJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCBhbGdvcml0aG0uXFxuICBTdXBwb3J0ZWQgYWxnb3JpdGhtcyBhcmU6XFxuICBcIkhTMjU2XCIsIFwiSFMzODRcIiwgXCJIUzUxMlwiLCBcIlJTMjU2XCIsIFwiUlMzODRcIiwgXCJSUzUxMlwiLCBcIlBTMjU2XCIsIFwiUFMzODRcIiwgXCJQUzUxMlwiLCBcIkVTMjU2XCIsIFwiRVMzODRcIiwgXCJFUzUxMlwiIGFuZCBcIm5vbmVcIi4nXG52YXIgTVNHX0lOVkFMSURfU0VDUkVUID0gJ3NlY3JldCBtdXN0IGJlIGEgc3RyaW5nIG9yIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgYnVmZmVyJztcbnZhciBNU0dfSU5WQUxJRF9TSUdORVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ1ZmZlciBvciBhbiBvYmplY3QnO1xuXG52YXIgc3VwcG9ydHNLZXlPYmplY3RzID0gdHlwZW9mIGNyeXB0by5jcmVhdGVQdWJsaWNLZXkgPT09ICdmdW5jdGlvbic7XG5pZiAoc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSArPSAnIG9yIGEgS2V5T2JqZWN0JztcbiAgTVNHX0lOVkFMSURfU0VDUkVUICs9ICdvciBhIEtleU9iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNQdWJsaWNLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5hc3ltbWV0cmljS2V5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja0lzUHJpdmF0ZUtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NJR05FUl9LRVkpO1xufTtcblxuZnVuY3Rpb24gY2hlY2tJc1NlY3JldEtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmIChrZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZyb21CYXNlNjQoYmFzZTY0KSB7XG4gIHJldHVybiBiYXNlNjRcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJhc2U2NHVybCkge1xuICBiYXNlNjR1cmwgPSBiYXNlNjR1cmwudG9TdHJpbmcoKTtcblxuICB2YXIgcGFkZGluZyA9IDQgLSBiYXNlNjR1cmwubGVuZ3RoICUgNDtcbiAgaWYgKHBhZGRpbmcgIT09IDQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkge1xuICAgICAgYmFzZTY0dXJsICs9ICc9JztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZTY0dXJsXG4gICAgLnJlcGxhY2UoL1xcLS9nLCAnKycpXG4gICAgLnJlcGxhY2UoL18vZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gdHlwZUVycm9yKHRlbXBsYXRlKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgZXJyTXNnID0gdXRpbC5mb3JtYXQuYmluZCh1dGlsLCB0ZW1wbGF0ZSkuYXBwbHkobnVsbCwgYXJncyk7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKGVyck1zZyk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlck9yU3RyaW5nKG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0KHRoaW5nKSB7XG4gIGlmICghYnVmZmVyT3JTdHJpbmcodGhpbmcpKVxuICAgIHRoaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpbmcpO1xuICByZXR1cm4gdGhpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNTaWduZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgc2VjcmV0KSB7XG4gICAgY2hlY2tJc1NlY3JldEtleShzZWNyZXQpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYScgKyBiaXRzLCBzZWNyZXQpO1xuICAgIHZhciBzaWcgPSAoaG1hYy51cGRhdGUodGhpbmcpLCBobWFjLmRpZ2VzdCgnYmFzZTY0JykpXG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG52YXIgYnVmZmVyRXF1YWw7XG52YXIgdGltaW5nU2FmZUVxdWFsID0gJ3RpbWluZ1NhZmVFcXVhbCcgaW4gY3J5cHRvID8gZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuYnl0ZUxlbmd0aCAhPT0gYi5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNyeXB0by50aW1pbmdTYWZlRXF1YWwoYSwgYilcbn0gOiBmdW5jdGlvbiB0aW1pbmdTYWZlRXF1YWwoYSwgYikge1xuICBpZiAoIWJ1ZmZlckVxdWFsKSB7XG4gICAgYnVmZmVyRXF1YWwgPSByZXF1aXJlKCdidWZmZXItZXF1YWwtY29uc3RhbnQtdGltZScpO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlckVxdWFsKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgc2VjcmV0KSB7XG4gICAgdmFyIGNvbXB1dGVkU2lnID0gY3JlYXRlSG1hY1NpZ25lcihiaXRzKSh0aGluZywgc2VjcmV0KTtcbiAgICByZXR1cm4gdGltaW5nU2FmZUVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSksIEJ1ZmZlci5mcm9tKGNvbXB1dGVkU2lnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5U2lnbmVyKGJpdHMpIHtcbiByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgcHJpdmF0ZUtleSkge1xuICAgIGNoZWNrSXNQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFyZSBzcGVjaWZ5aW5nIFwiUlNBXCIgaGVyZSwgdGhpcyB3b3JrcyB3aXRoIEVDRFNBXG4gICAgLy8ga2V5cyBhcyB3ZWxsLlxuICAgIHZhciBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2YXIgc2lnID0gKHNpZ25lci51cGRhdGUodGhpbmcpLCBzaWduZXIuc2lnbihwcml2YXRlS2V5LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5U2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24oe1xuICAgICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHtcbiAgICAgIGtleTogcHVibGljS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCBzaWduYXR1cmUsICdiYXNlNjQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVNpZ25lcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVNpZ25lcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGlubmVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgc2lnbmF0dXJlID0gZm9ybWF0RWNkc2EuZGVyVG9Kb3NlKHNpZ25hdHVyZSwgJ0VTJyArIGJpdHMpO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVDRFNBVmVyaWZlcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmpvc2VUb0RlcihzaWduYXR1cmUsICdFUycgKyBiaXRzKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IGlubmVyKHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9uZVNpZ25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVWZXJpZmllcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHNpZ25hdHVyZSA9PT0gJyc7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBqd2EoYWxnb3JpdGhtKSB7XG4gIHZhciBzaWduZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNTaWduZXIsXG4gICAgcnM6IGNyZWF0ZUtleVNpZ25lcixcbiAgICBwczogY3JlYXRlUFNTS2V5U2lnbmVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVNpZ25lcixcbiAgICBub25lOiBjcmVhdGVOb25lU2lnbmVyLFxuICB9XG4gIHZhciB2ZXJpZmllckZhY3RvcmllcyA9IHtcbiAgICBoczogY3JlYXRlSG1hY1ZlcmlmaWVyLFxuICAgIHJzOiBjcmVhdGVLZXlWZXJpZmllcixcbiAgICBwczogY3JlYXRlUFNTS2V5VmVyaWZpZXIsXG4gICAgZXM6IGNyZWF0ZUVDRFNBVmVyaWZlcixcbiAgICBub25lOiBjcmVhdGVOb25lVmVyaWZpZXIsXG4gIH1cbiAgdmFyIG1hdGNoID0gYWxnb3JpdGhtLm1hdGNoKC9eKFJTfFBTfEVTfEhTKSgyNTZ8Mzg0fDUxMikkfF4obm9uZSkkL2kpO1xuICBpZiAoIW1hdGNoKVxuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9BTEdPUklUSE0sIGFsZ29yaXRobSk7XG4gIHZhciBhbGdvID0gKG1hdGNoWzFdIHx8IG1hdGNoWzNdKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYml0cyA9IG1hdGNoWzJdO1xuXG4gIHJldHVybiB7XG4gICAgc2lnbjogc2lnbmVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICAgIHZlcmlmeTogdmVyaWZpZXJGYWN0b3JpZXNbYWxnb10oYml0cyksXG4gIH1cbn07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IEJ1ZmZlci5pc0J1ZmZlcihvYmopKVxuICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gYmFzZTY0dXJsKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlclxuICAgIC5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG4gIHZhciBlbmNvZGVkSGVhZGVyID0gYmFzZTY0dXJsKHRvU3RyaW5nKGhlYWRlciksICdiaW5hcnknKTtcbiAgdmFyIGVuY29kZWRQYXlsb2FkID0gYmFzZTY0dXJsKHRvU3RyaW5nKHBheWxvYWQpLCBlbmNvZGluZyk7XG4gIHJldHVybiB1dGlsLmZvcm1hdCgnJXMuJXMnLCBlbmNvZGVkSGVhZGVyLCBlbmNvZGVkUGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGp3c1NpZ24ob3B0cykge1xuICB2YXIgaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHZhciBwYXlsb2FkID0gb3B0cy5wYXlsb2FkO1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldCB8fCBvcHRzLnByaXZhdGVLZXk7XG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHZhciBhbGdvID0gandhKGhlYWRlci5hbGcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpO1xuICB2YXIgc2lnbmF0dXJlID0gYWxnby5zaWduKHNlY3VyZWRJbnB1dCwgc2VjcmV0T3JLZXkpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgc2VjdXJlZElucHV0LCBzaWduYXR1cmUpO1xufVxuXG5mdW5jdGlvbiBTaWduU3RyZWFtKG9wdHMpIHtcbiAgdmFyIHNlY3JldCA9IG9wdHMuc2VjcmV0fHxvcHRzLnByaXZhdGVLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0KTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHRoaXMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB0aGlzLnNlY3JldCA9IHRoaXMucHJpdmF0ZUtleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnBheWxvYWQgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnBheWxvYWQpO1xuICB0aGlzLnNlY3JldC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy5zaWduKCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5wYXlsb2FkLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zZWNyZXQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhTaWduU3RyZWFtLCBTdHJlYW0pO1xuXG5TaWduU3RyZWFtLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc2lnbmF0dXJlID0gandzU2lnbih7XG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLmJ1ZmZlcixcbiAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQuYnVmZmVyLFxuICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoJ2RvbmUnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHNpZ25hdHVyZSk7XG4gICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5TaWduU3RyZWFtLnNpZ24gPSBqd3NTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25TdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgRGF0YVN0cmVhbSA9IHJlcXVpcmUoJy4vZGF0YS1zdHJlYW0nKTtcbnZhciBqd2EgPSByZXF1aXJlKCdqd2EnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9zdHJpbmcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIEpXU19SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9dKz9cXC5bYS16QS1aMC05XFwtX10rP1xcLihbYS16QS1aMC05XFwtX10rKT8kLztcblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlKHRoaW5nKSB7XG4gIGlmIChpc09iamVjdCh0aGluZykpXG4gICAgcmV0dXJuIHRoaW5nO1xuICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZSh0aGluZyk7IH1cbiAgY2F0Y2ggKGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxufVxuXG5mdW5jdGlvbiBoZWFkZXJGcm9tSldTKGp3c1NpZykge1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGp3c1NpZy5zcGxpdCgnLicsIDEpWzBdO1xuICByZXR1cm4gc2FmZUpzb25QYXJzZShCdWZmZXIuZnJvbShlbmNvZGVkSGVhZGVyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpKTtcbn1cblxuZnVuY3Rpb24gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicsIDIpLmpvaW4oJy4nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicpWzJdO1xufVxuXG5mdW5jdGlvbiBwYXlsb2FkRnJvbUpXUyhqd3NTaWcsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgcGF5bG9hZCA9IGp3c1NpZy5zcGxpdCgnLicpWzFdO1xuICByZXR1cm4gQnVmZmVyLmZyb20ocGF5bG9hZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKGVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEp3cyhzdHJpbmcpIHtcbiAgcmV0dXJuIEpXU19SRUdFWC50ZXN0KHN0cmluZykgJiYgISFoZWFkZXJGcm9tSldTKHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGp3c1ZlcmlmeShqd3NTaWcsIGFsZ29yaXRobSwgc2VjcmV0T3JLZXkpIHtcbiAgaWYgKCFhbGdvcml0aG0pIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiTWlzc2luZyBhbGdvcml0aG0gcGFyYW1ldGVyIGZvciBqd3MudmVyaWZ5XCIpO1xuICAgIGVyci5jb2RlID0gXCJNSVNTSU5HX0FMR09SSVRITVwiO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBqd3NTaWcgPSB0b1N0cmluZyhqd3NTaWcpO1xuICB2YXIgc2lnbmF0dXJlID0gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgYWxnbyA9IGp3YShhbGdvcml0aG0pO1xuICByZXR1cm4gYWxnby52ZXJpZnkoc2VjdXJlZElucHV0LCBzaWduYXR1cmUsIHNlY3JldE9yS2V5KTtcbn1cblxuZnVuY3Rpb24gandzRGVjb2RlKGp3c1NpZywgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcblxuICBpZiAoIWlzVmFsaWRKd3MoandzU2lnKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgaGVhZGVyID0gaGVhZGVyRnJvbUpXUyhqd3NTaWcpO1xuXG4gIGlmICghaGVhZGVyKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXlsb2FkID0gcGF5bG9hZEZyb21KV1MoandzU2lnKTtcbiAgaWYgKGhlYWRlci50eXAgPT09ICdKV1QnIHx8IG9wdHMuanNvbilcbiAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShwYXlsb2FkLCBvcHRzLmVuY29kaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGhlYWRlcjogaGVhZGVyLFxuICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmVGcm9tSldTKGp3c1NpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gVmVyaWZ5U3RyZWFtKG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBzZWNyZXRPcktleSA9IG9wdHMuc2VjcmV0fHxvcHRzLnB1YmxpY0tleXx8b3B0cy5rZXk7XG4gIHZhciBzZWNyZXRTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbShzZWNyZXRPcktleSk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmFsZ29yaXRobSA9IG9wdHMuYWxnb3JpdGhtO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnB1YmxpY0tleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnNpZ25hdHVyZSA9IG5ldyBEYXRhU3RyZWFtKG9wdHMuc2lnbmF0dXJlKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNpZ25hdHVyZS53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLnNpZ25hdHVyZS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnZlcmlmeSgpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZnlTdHJlYW0sIFN0cmVhbSk7XG5WZXJpZnlTdHJlYW0ucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmFsaWQgPSBqd3NWZXJpZnkodGhpcy5zaWduYXR1cmUuYnVmZmVyLCB0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXkuYnVmZmVyKTtcbiAgICB2YXIgb2JqID0gandzRGVjb2RlKHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgdmFsaWQsIG9iaik7XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgdmFsaWQpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5WZXJpZnlTdHJlYW0uZGVjb2RlID0gandzRGVjb2RlO1xuVmVyaWZ5U3RyZWFtLmlzVmFsaWQgPSBpc1ZhbGlkSndzO1xuVmVyaWZ5U3RyZWFtLnZlcmlmeSA9IGp3c1ZlcmlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZXJpZnlTdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIGV4cG9ydHMqL1xudmFyIFNpZ25TdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9zaWduLXN0cmVhbScpO1xudmFyIFZlcmlmeVN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3ZlcmlmeS1zdHJlYW0nKTtcblxudmFyIEFMR09SSVRITVMgPSBbXG4gICdIUzI1NicsICdIUzM4NCcsICdIUzUxMicsXG4gICdSUzI1NicsICdSUzM4NCcsICdSUzUxMicsXG4gICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicsXG4gICdFUzI1NicsICdFUzM4NCcsICdFUzUxMidcbl07XG5cbmV4cG9ydHMuQUxHT1JJVEhNUyA9IEFMR09SSVRITVM7XG5leHBvcnRzLnNpZ24gPSBTaWduU3RyZWFtLnNpZ247XG5leHBvcnRzLnZlcmlmeSA9IFZlcmlmeVN0cmVhbS52ZXJpZnk7XG5leHBvcnRzLmRlY29kZSA9IFZlcmlmeVN0cmVhbS5kZWNvZGU7XG5leHBvcnRzLmlzVmFsaWQgPSBWZXJpZnlTdHJlYW0uaXNWYWxpZDtcbmV4cG9ydHMuY3JlYXRlU2lnbiA9IGZ1bmN0aW9uIGNyZWF0ZVNpZ24ob3B0cykge1xuICByZXR1cm4gbmV3IFNpZ25TdHJlYW0ob3B0cyk7XG59O1xuZXhwb3J0cy5jcmVhdGVWZXJpZnkgPSBmdW5jdGlvbiBjcmVhdGVWZXJpZnkob3B0cykge1xuICByZXR1cm4gbmV3IFZlcmlmeVN0cmVhbShvcHRzKTtcbn07XG4iLAogICAgInZhciBqd3MgPSByZXF1aXJlKCdqd3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoand0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGVjb2RlZCA9IGp3cy5kZWNvZGUoand0LCBvcHRpb25zKTtcbiAgaWYgKCFkZWNvZGVkKSB7IHJldHVybiBudWxsOyB9XG4gIHZhciBwYXlsb2FkID0gZGVjb2RlZC5wYXlsb2FkO1xuXG4gIC8vdHJ5IHBhcnNlIHRoZSBwYXlsb2FkXG4gIGlmKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICAgIGlmKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXlsb2FkID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgLy9yZXR1cm4gaGVhZGVyIGlmIGBjb21wbGV0ZWAgb3B0aW9uIGlzIGVuYWJsZWQuICBoZWFkZXIgaW5jbHVkZXMgY2xhaW1zXG4gIC8vc3VjaCBhcyBga2lkYCBhbmQgYGFsZ2AgdXNlZCB0byBzZWxlY3QgdGhlIGtleSB3aXRoaW4gYSBKV0tTIG5lZWRlZCB0b1xuICAvL3ZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcjogZGVjb2RlZC5oZWFkZXIsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgc2lnbmF0dXJlOiBkZWNvZGVkLnNpZ25hdHVyZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXJyb3IpIHtcbiAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgaWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuICB0aGlzLm5hbWUgPSAnSnNvbldlYlRva2VuRXJyb3InO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICBpZiAoZXJyb3IpIHRoaXMuaW5uZXIgPSBlcnJvcjtcbn07XG5cbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEpzb25XZWJUb2tlbkVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpzb25XZWJUb2tlbkVycm9yO1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL0pzb25XZWJUb2tlbkVycm9yJyk7XG5cbnZhciBOb3RCZWZvcmVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBkYXRlKSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdOb3RCZWZvcmVFcnJvcic7XG4gIHRoaXMuZGF0ZSA9IGRhdGU7XG59O1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSk7XG5cbk5vdEJlZm9yZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vdEJlZm9yZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vdEJlZm9yZUVycm9yOyIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgVG9rZW5FeHBpcmVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXhwaXJlZEF0KSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdUb2tlbkV4cGlyZWRFcnJvcic7XG4gIHRoaXMuZXhwaXJlZEF0ID0gZXhwaXJlZEF0O1xufTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ub2tlbkV4cGlyZWRFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb2tlbkV4cGlyZWRFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBUb2tlbkV4cGlyZWRFcnJvcjsiLAogICAgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsCiAgICAidmFyIG1zID0gcmVxdWlyZSgnbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGltZSwgaWF0KSB7XG4gIHZhciB0aW1lc3RhbXAgPSBpYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtcyh0aW1lKTtcbiAgICBpZiAodHlwZW9mIG1pbGxpc2Vjb25kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGltZXN0YW1wICsgbWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcCArIHRpbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbn07IiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3Qgc2FmZVNyYyA9IGV4cG9ydHMuc2FmZVNyYyA9IFtdXG5jb25zdCB0ID0gZXhwb3J0cy50ID0ge31cbmxldCBSID0gMFxuXG5jb25zdCBMRVRURVJEQVNITlVNQkVSID0gJ1thLXpBLVowLTktXSdcblxuLy8gUmVwbGFjZSBzb21lIGdyZWVkeSByZWdleCB0b2tlbnMgdG8gcHJldmVudCByZWdleCBkb3MgaXNzdWVzLiBUaGVzZSByZWdleCBhcmVcbi8vIHVzZWQgaW50ZXJuYWxseSB2aWEgdGhlIHNhZmVSZSBvYmplY3Qgc2luY2UgYWxsIGlucHV0cyBpbiB0aGlzIGxpYnJhcnkgZ2V0XG4vLyBub3JtYWxpemVkIGZpcnN0IHRvIHRyaW0gYW5kIGNvbGxhcHNlIGFsbCBleHRyYSB3aGl0ZXNwYWNlLiBUaGUgb3JpZ2luYWxcbi8vIHJlZ2V4ZXMgYXJlIGV4cG9ydGVkIGZvciB1c2VybGFuZCBjb25zdW1wdGlvbiBhbmQgbG93ZXIgbGV2ZWwgdXNhZ2UuIEFcbi8vIGZ1dHVyZSBicmVha2luZyBjaGFuZ2UgY291bGQgZXhwb3J0IHRoZSBzYWZlciByZWdleCBvbmx5IHdpdGggYSBub3RlIHRoYXRcbi8vIGFsbCBpbnB1dCBzaG91bGQgaGF2ZSBleHRyYSB3aGl0ZXNwYWNlIHJlbW92ZWQuXG5jb25zdCBzYWZlUmVnZXhSZXBsYWNlbWVudHMgPSBbXG4gIFsnXFxcXHMnLCAxXSxcbiAgWydcXFxcZCcsIE1BWF9MRU5HVEhdLFxuICBbTEVUVEVSREFTSE5VTUJFUiwgTUFYX1NBRkVfQlVJTERfTEVOR1RIXSxcbl1cblxuY29uc3QgbWFrZVNhZmVSZWdleCA9ICh2YWx1ZSkgPT4ge1xuICBmb3IgKGNvbnN0IFt0b2tlbiwgbWF4XSBvZiBzYWZlUmVnZXhSZXBsYWNlbWVudHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAuc3BsaXQoYCR7dG9rZW59KmApLmpvaW4oYCR7dG9rZW59ezAsJHttYXh9fWApXG4gICAgICAuc3BsaXQoYCR7dG9rZW59K2ApLmpvaW4oYCR7dG9rZW59ezEsJHttYXh9fWApXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuID0gKG5hbWUsIHZhbHVlLCBpc0dsb2JhbCkgPT4ge1xuICBjb25zdCBzYWZlID0gbWFrZVNhZmVSZWdleCh2YWx1ZSlcbiAgY29uc3QgaW5kZXggPSBSKytcbiAgZGVidWcobmFtZSwgaW5kZXgsIHZhbHVlKVxuICB0W25hbWVdID0gaW5kZXhcbiAgc3JjW2luZGV4XSA9IHZhbHVlXG4gIHNhZmVTcmNbaW5kZXhdID0gc2FmZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cbi8vIE5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBpbmNsdWRlIG51bWJlcmljIGlkZW50aWZpZXJzIGJ1dCBjYW4gYmUgbG9uZ2VyLlxuLy8gVGhlcmVmb3JlIG5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBtdXN0IGdvIGZpcnN0LlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVInLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0UnLCBgKD86LSgke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl19KSopKWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFTE9PU0UnLCBgKD86LT8oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXX0pKikpYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxESURFTlRJRklFUicsIGAke0xFVFRFUkRBU0hOVU1CRVJ9K2ApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignQlVJTEQnLCBgKD86XFxcXCsoJHtzcmNbdC5CVUlMRElERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LkJVSUxESURFTlRJRklFUl19KSopKWApXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG5jcmVhdGVUb2tlbignRlVMTFBMQUlOJywgYHY/JHtzcmNbdC5NQUlOVkVSU0lPTl1cbn0ke3NyY1t0LlBSRVJFTEVBU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdGVUxMJywgYF4ke3NyY1t0LkZVTExQTEFJTl19JGApXG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbmNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgYFt2PVxcXFxzXSoke3NyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdXG59JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdMT09TRScsIGBeJHtzcmNbdC5MT09TRVBMQUlOXX0kYClcblxuY3JlYXRlVG9rZW4oJ0dUTFQnLCAnKCg/Ojx8Pik/PT8pJylcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVJMT09TRScsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfXx4fFh8XFxcXCpgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVInLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19fHh8WHxcXFxcKmApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTicsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTkxPT1NFJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDb2VyY2lvbi5cbi8vIEV4dHJhY3QgYW55dGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBiZSBhIHBhcnQgb2YgYSB2YWxpZCBzZW12ZXJcbmNyZWF0ZVRva2VuKCdDT0VSQ0VQTEFJTicsIGAkeycoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCd9JHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pYCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YClcbmNyZWF0ZVRva2VuKCdDT0VSQ0UnLCBgJHtzcmNbdC5DT0VSQ0VQTEFJTl19KD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRUZVTEwnLCBzcmNbdC5DT0VSQ0VQTEFJTl0gK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5CVUlMRF19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVEwnLCBzcmNbdC5DT0VSQ0VdLCB0cnVlKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTEZVTEwnLCBzcmNbdC5DT0VSQ0VGVUxMXSwgdHJ1ZSlcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbmNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpXG5cbmNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVUSUxERV19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMudGlsZGVUcmltUmVwbGFjZSA9ICckMX4nXG5cbmNyZWF0ZVRva2VuKCdUSUxERScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1RJTERFTE9PU0UnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKVxuXG5jcmVhdGVUb2tlbignQ0FSRVRUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FQ0FSRVRdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLmNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJ1xuXG5jcmVhdGVUb2tlbignQ0FSRVQnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdDQVJFVExPT1NFJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9STE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19KSR8XiRgKVxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuRlVMTFBMQUlOXX0pJHxeJGApXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUlRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkdUTFRdXG59XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19fCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgLCB0cnVlKVxuZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbmNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKVxuLy8gPj0wLjAuMCBpcyBsaWtlIGEgc3RhclxuY3JlYXRlVG9rZW4oJ0dURTAnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMFxcXFxzKiQnKVxuY3JlYXRlVG9rZW4oJ0dURTBQUkUnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMC0wXFxcXHMqJCcpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCB7IE1BWF9MRU5HVEgsIE1BWF9TQUZFX0lOVEVHRVIgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IGNvbXBhcmVJZGVudGlmaWVycyB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaWRlbnRpZmllcnMnKVxuY2xhc3MgU2VtVmVyIHtcbiAgY29uc3RydWN0b3IgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgICAgaWYgKHZlcnNpb24ubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ2J1aWxkIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgaWYgKHJlbGVhc2Uuc3RhcnRzV2l0aCgncHJlJykpIHtcbiAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBhbiBpbnZhbGlkIHNlbXZlciByZXN1bHRzXG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGAtJHtpZGVudGlmaWVyfWAubWF0Y2godGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5QUkVSRUxFQVNFTE9PU0VdIDogcmVbdC5QUkVSRUxFQVNFXSlcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpZGVudGlmaWVyOiAke2lkZW50aWZpZXJ9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyc2lvbiAke3RoaXMucmF3fSBpcyBub3QgYSBwcmVyZWxlYXNlYClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgdmFsaWQgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB2ID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5cbmNvbnN0IGRpZmYgPSAodmVyc2lvbjEsIHZlcnNpb24yKSA9PiB7XG4gIGNvbnN0IHYxID0gcGFyc2UodmVyc2lvbjEsIG51bGwsIHRydWUpXG4gIGNvbnN0IHYyID0gcGFyc2UodmVyc2lvbjIsIG51bGwsIHRydWUpXG4gIGNvbnN0IGNvbXBhcmlzb24gPSB2MS5jb21wYXJlKHYyKVxuXG4gIGlmIChjb21wYXJpc29uID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHYxSGlnaGVyID0gY29tcGFyaXNvbiA+IDBcbiAgY29uc3QgaGlnaFZlcnNpb24gPSB2MUhpZ2hlciA/IHYxIDogdjJcbiAgY29uc3QgbG93VmVyc2lvbiA9IHYxSGlnaGVyID8gdjIgOiB2MVxuICBjb25zdCBoaWdoSGFzUHJlID0gISFoaWdoVmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuICBjb25zdCBsb3dIYXNQcmUgPSAhIWxvd1ZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcblxuICBpZiAobG93SGFzUHJlICYmICFoaWdoSGFzUHJlKSB7XG4gICAgLy8gR29pbmcgZnJvbSBwcmVyZWxlYXNlIC0+IG5vIHByZXJlbGVhc2UgcmVxdWlyZXMgc29tZSBzcGVjaWFsIGNhc2luZ1xuXG4gICAgLy8gSWYgdGhlIGxvdyB2ZXJzaW9uIGhhcyBvbmx5IGEgbWFqb3IsIHRoZW4gaXQgd2lsbCBhbHdheXMgYmUgYSBtYWpvclxuICAgIC8vIFNvbWUgZXhhbXBsZXM6XG4gICAgLy8gMS4wLjAtMSAtPiAxLjAuMFxuICAgIC8vIDEuMC4wLTEgLT4gMS4xLjFcbiAgICAvLyAxLjAuMC0xIC0+IDIuMC4wXG4gICAgaWYgKCFsb3dWZXJzaW9uLnBhdGNoICYmICFsb3dWZXJzaW9uLm1pbm9yKSB7XG4gICAgICByZXR1cm4gJ21ham9yJ1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBtYWluIHBhcnQgaGFzIG5vIGRpZmZlcmVuY2VcbiAgICBpZiAobG93VmVyc2lvbi5jb21wYXJlTWFpbihoaWdoVmVyc2lvbikgPT09IDApIHtcbiAgICAgIGlmIChsb3dWZXJzaW9uLm1pbm9yICYmICFsb3dWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgIHJldHVybiAnbWlub3InXG4gICAgICB9XG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IHJjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGIsIGEsIGxvb3NlKVxubW9kdWxlLmV4cG9ydHMgPSByY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYSwgYiwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSBzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPD0gMFxubW9kdWxlLmV4cG9ydHMgPSBsdGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLm1heCA9IDEwMDBcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWFwLmdldChrZXkpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgbWFwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmRlbGV0ZShrZXkpXG5cbiAgICBpZiAoIWRlbGV0ZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgY2FjaGUgaXMgZnVsbCwgZGVsZXRlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1cbiAgICAgIGlmICh0aGlzLm1hcC5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tYXAua2V5cygpLm5leHQoKS52YWx1ZVxuICAgICAgICB0aGlzLmRlbGV0ZShmaXJzdEtleSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVUNhY2hlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBBTlkgPSBTeW1ib2woJ1NlbVZlciBBTlknKVxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIENvbXBhcmF0b3Ige1xuICBzdGF0aWMgZ2V0IEFOWSAoKSB7XG4gICAgcmV0dXJuIEFOWVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIGlmIChjb21wLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXAgPSBjb21wLnZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcCA9IGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykuam9pbignICcpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5wYXJzZShjb21wKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb25cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29tcCcsIHRoaXMpXG4gIH1cblxuICBwYXJzZSAoY29tcCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LkNPTVBBUkFUT1JMT09TRV0gOiByZVt0LkNPTVBBUkFUT1JdXG4gICAgY29uc3QgbSA9IGNvbXAubWF0Y2gocilcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb21wYXJhdG9yOiAke2NvbXB9YClcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdG9yID0gbVsxXSAhPT0gdW5kZWZpbmVkID8gbVsxXSA6ICcnXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9Jykge1xuICAgICAgdGhpcy5vcGVyYXRvciA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gICAgaWYgKCFtWzJdKSB7XG4gICAgICB0aGlzLnNlbXZlciA9IEFOWVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbXZlciA9IG5ldyBTZW1WZXIobVsyXSwgdGhpcy5vcHRpb25zLmxvb3NlKVxuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVxuICB9XG5cbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMubG9vc2UpXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSB8fCB2ZXJzaW9uID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgaW50ZXJzZWN0cyAoY29tcCwgb3B0aW9ucykge1xuICAgIGlmICghKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZShjb21wLnZhbHVlLCBvcHRpb25zKS50ZXN0KHRoaXMudmFsdWUpXG4gICAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKGNvbXAudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMudmFsdWUsIG9wdGlvbnMpLnRlc3QoY29tcC5zZW12ZXIpXG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBub3RoaW5nIGNhbiBwb3NzaWJseSBiZSBsb3dlclxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZSA9PT0gJzwwLjAuMC0wJyB8fCBjb21wLnZhbHVlID09PSAnPDAuMC4wLTAnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykgfHwgY29tcC52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGluY3JlYXNpbmcgKD4gb3IgPj0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBkZWNyZWFzaW5nICg8IG9yIDw9KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gc2FtZSBTZW1WZXIgYW5kIGJvdGggc2lkZXMgYXJlIGluY2x1c2l2ZSAoPD0gb3IgPj0pXG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2VtdmVyLnZlcnNpb24gPT09IGNvbXAuc2VtdmVyLnZlcnNpb24pICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykgJiYgY29tcC5vcGVyYXRvci5pbmNsdWRlcygnPScpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGxlc3MgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBncmVhdGVyIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGFyYXRvclxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgY21wID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZScpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbilcbn1cbm1vZHVsZS5leHBvcnRzID0gc2F0aXNmaWVzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbmNvbnN0IGd0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBndHJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNS43LjAnKTtcbiIsCiAgICAiY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICc+PTE2LjkuMCcpO1xuIiwKICAgICJjb25zdCBBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vYXN5bW1ldHJpY0tleURldGFpbHNTdXBwb3J0ZWQnKTtcbmNvbnN0IFJTQV9QU1NfS0VZX0RFVEFJTFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9yc2FQc3NLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5cbmNvbnN0IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5cyA9IHtcbiAgJ2VjJzogWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddLFxuICAncnNhJzogWydSUzI1NicsICdQUzI1NicsICdSUzM4NCcsICdQUzM4NCcsICdSUzUxMicsICdQUzUxMiddLFxuICAncnNhLXBzcyc6IFsnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInXVxufTtcblxuY29uc3QgYWxsb3dlZEN1cnZlcyA9IHtcbiAgRVMyNTY6ICdwcmltZTI1NnYxJyxcbiAgRVMzODQ6ICdzZWNwMzg0cjEnLFxuICBFUzUxMjogJ3NlY3A1MjFyMScsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwga2V5KSB7XG4gIGlmICghYWxnb3JpdGhtIHx8ICFrZXkpIHJldHVybjtcblxuICBjb25zdCBrZXlUeXBlID0ga2V5LmFzeW1tZXRyaWNLZXlUeXBlO1xuICBpZiAoIWtleVR5cGUpIHJldHVybjtcblxuICBjb25zdCBhbGxvd2VkQWxnb3JpdGhtcyA9IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5c1trZXlUeXBlXTtcblxuICBpZiAoIWFsbG93ZWRBbGdvcml0aG1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGtleSB0eXBlIFwiJHtrZXlUeXBlfVwiLmApO1xuICB9XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcImFsZ1wiIHBhcmFtZXRlciBmb3IgXCIke2tleVR5cGV9XCIga2V5IHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZEFsZ29yaXRobXMuam9pbignLCAnKX0uYClcbiAgfVxuXG4gIC8qXG4gICAqIElnbm9yZSB0aGUgbmV4dCBibG9jayBmcm9tIHRlc3QgY292ZXJhZ2UgYmVjYXVzZSBpdCBnZXRzIGV4ZWN1dGVkXG4gICAqIGNvbmRpdGlvbmFsbHkgZGVwZW5kaW5nIG9uIHRoZSBOb2RlIHZlcnNpb24uIE5vdCBpZ25vcmluZyBpdCB3b3VsZFxuICAgKiBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgdGhlIHRhcmdldCAlIG9mIGNvdmVyYWdlIGZvciB2ZXJzaW9ucyBvZlxuICAgKiBOb2RlIHVuZGVyIDE1LjcuMC5cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgIHN3aXRjaCAoa2V5VHlwZSkge1xuICAgIGNhc2UgJ2VjJzpcbiAgICAgIGNvbnN0IGtleUN1cnZlID0ga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm5hbWVkQ3VydmU7XG4gICAgICBjb25zdCBhbGxvd2VkQ3VydmUgPSBhbGxvd2VkQ3VydmVzW2FsZ29yaXRobV07XG5cbiAgICAgIGlmIChrZXlDdXJ2ZSAhPT0gYWxsb3dlZEN1cnZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgXCIke2FsZ29yaXRobX1cIiByZXF1aXJlcyBjdXJ2ZSBcIiR7YWxsb3dlZEN1cnZlfVwiLmApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyc2EtcHNzJzpcbiAgICAgIGlmIChSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChhbGdvcml0aG0uc2xpY2UoLTMpLCAxMCk7XG4gICAgICAgIGNvbnN0IHsgaGFzaEFsZ29yaXRobSwgbWdmMUhhc2hBbGdvcml0aG0sIHNhbHRMZW5ndGggfSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscztcblxuICAgICAgICBpZiAoaGFzaEFsZ29yaXRobSAhPT0gYHNoYSR7bGVuZ3RofWAgfHwgbWdmMUhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvcml0aG0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVycyBkbyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBzYWx0TGVuZ3RoID4gbGVuZ3RoID4+IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVyIHNhbHRMZW5ndGggZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJ2YXIgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICdeNi4xMi4wIHx8ID49OC4wLjAnKTtcbiIsCiAgICAiY29uc3QgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuY29uc3QgTm90QmVmb3JlRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpO1xuY29uc3QgVG9rZW5FeHBpcmVkRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpO1xuY29uc3QgZGVjb2RlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmNvbnN0IHRpbWVzcGFuID0gcmVxdWlyZSgnLi9saWIvdGltZXNwYW4nKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuY29uc3Qge0tleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQdWJsaWNLZXl9ID0gcmVxdWlyZShcImNyeXB0b1wiKTtcblxuY29uc3QgUFVCX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgRUNfS0VZX0FMR1MgPSBbJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5jb25zdCBSU0FfS0VZX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJ107XG5jb25zdCBIU19BTEdTID0gWydIUzI1NicsICdIUzM4NCcsICdIUzUxMiddO1xuXG5pZiAoUFNfU1VQUE9SVEVEKSB7XG4gIFBVQl9LRVlfQUxHUy5zcGxpY2UoUFVCX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG4gIFJTQV9LRVlfQUxHUy5zcGxpY2UoUlNBX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dFN0cmluZywgc2VjcmV0T3JQdWJsaWNLZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICgodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvL2Nsb25lIHRoaXMgb2JqZWN0IHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdXRhdGUgaXQuXG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcblxuICBsZXQgZG9uZTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBkb25lID0gY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSA9IGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmNsb2NrVGltZXN0YW1wICYmIHR5cGVvZiBvcHRpb25zLmNsb2NrVGltZXN0YW1wICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignY2xvY2tUaW1lc3RhbXAgbXVzdCBiZSBhIG51bWJlcicpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5vbmNlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLm5vbmNlICE9PSAnc3RyaW5nJyB8fCBvcHRpb25zLm5vbmNlLnRyaW0oKSA9PT0gJycpKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdub25jZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgbXVzdCBiZSBhIGJvb2xlYW4nKSk7XG4gIH1cblxuICBjb25zdCBjbG9ja1RpbWVzdGFtcCA9IG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKCFqd3RTdHJpbmcpe1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGp3dFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIGEgc3RyaW5nJykpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBqd3RTdHJpbmcuc3BsaXQoJy4nKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtYWxmb3JtZWQnKSk7XG4gIH1cblxuICBsZXQgZGVjb2RlZFRva2VuO1xuXG4gIHRyeSB7XG4gICAgZGVjb2RlZFRva2VuID0gZGVjb2RlKGp3dFN0cmluZywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaChlcnIpIHtcbiAgICByZXR1cm4gZG9uZShlcnIpO1xuICB9XG5cbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgdG9rZW4nKSk7XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVkVG9rZW4uaGVhZGVyO1xuICBsZXQgZ2V0U2VjcmV0O1xuXG4gIGlmKHR5cGVvZiBzZWNyZXRPclB1YmxpY0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCd2ZXJpZnkgbXVzdCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzIGlmIHNlY3JldCBvciBwdWJsaWMga2V5IGlzIHByb3ZpZGVkIGFzIGEgY2FsbGJhY2snKSk7XG4gICAgfVxuXG4gICAgZ2V0U2VjcmV0ID0gc2VjcmV0T3JQdWJsaWNLZXk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ2V0U2VjcmV0ID0gZnVuY3Rpb24oaGVhZGVyLCBzZWNyZXRDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHNlY3JldENhbGxiYWNrKG51bGwsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdldFNlY3JldChoZWFkZXIsIGZ1bmN0aW9uKGVyciwgc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignZXJyb3IgaW4gc2VjcmV0IG9yIHB1YmxpYyBrZXkgY2FsbGJhY2s6ICcgKyBlcnIubWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1NpZ25hdHVyZSA9IHBhcnRzWzJdLnRyaW0oKSAhPT0gJyc7XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiBzZWNyZXRPclB1YmxpY0tleSl7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NpZ25hdHVyZSAmJiAhc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0IG9yIHB1YmxpYyBrZXkgbXVzdCBiZSBwcm92aWRlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiAhb3B0aW9ucy5hbGdvcml0aG1zKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3BsZWFzZSBzcGVjaWZ5IFwibm9uZVwiIGluIFwiYWxnb3JpdGhtc1wiIHRvIHZlcmlmeSB1bnNpZ25lZCB0b2tlbnMnKSk7XG4gICAgfVxuXG4gICAgaWYgKHNlY3JldE9yUHVibGljS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclB1YmxpY0tleSBpbnN0YW5jZW9mIEtleU9iamVjdCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHVibGljS2V5ID0gY3JlYXRlUHVibGljS2V5KHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oc2VjcmV0T3JQdWJsaWNLZXkpIDogc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdzZWNyZXRPclB1YmxpY0tleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgaWYgKHNlY3JldE9yUHVibGljS2V5LnR5cGUgPT09ICdzZWNyZXQnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEhTX0FMR1M7XG4gICAgICB9IGVsc2UgaWYgKFsncnNhJywgJ3JzYS1wc3MnXS5pbmNsdWRlcyhzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSkpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUlNBX0tFWV9BTEdTXG4gICAgICB9IGVsc2UgaWYgKHNlY3JldE9yUHVibGljS2V5LmFzeW1tZXRyaWNLZXlUeXBlID09PSAnZWMnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEVDX0tFWV9BTEdTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBQVUJfS0VZX0FMR1NcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGdvcml0aG1zLmluZGV4T2YoZGVjb2RlZFRva2VuLmhlYWRlci5hbGcpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGFsZ29yaXRobScpKTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpICYmIHNlY3JldE9yUHVibGljS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoKGBzZWNyZXRPclB1YmxpY0tleSBtdXN0IGJlIGEgc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAncHVibGljJykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVBc3ltbWV0cmljS2V5KGhlYWRlci5hbGcsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkID0gandzLnZlcmlmeShqd3RTdHJpbmcsIGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgfVxuXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlZFRva2VuLnBheWxvYWQ7XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0aW9ucy5pZ25vcmVOb3RCZWZvcmUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBuYmYgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAocGF5bG9hZC5uYmYgPiBjbG9ja1RpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBOb3RCZWZvcmVFcnJvcignand0IG5vdCBhY3RpdmUnLCBuZXcgRGF0ZShwYXlsb2FkLm5iZiAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlRXhwaXJhdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGV4cCB2YWx1ZScpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9ja1RpbWVzdGFtcCA+PSBwYXlsb2FkLmV4cCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignand0IGV4cGlyZWQnLCBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXVkaWVuY2UpIHtcbiAgICAgIGNvbnN0IGF1ZGllbmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hdWRpZW5jZSkgPyBvcHRpb25zLmF1ZGllbmNlIDogW29wdGlvbnMuYXVkaWVuY2VdO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgPyBwYXlsb2FkLmF1ZCA6IFtwYXlsb2FkLmF1ZF07XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gdGFyZ2V0LnNvbWUoZnVuY3Rpb24gKHRhcmdldEF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBhdWRpZW5jZXMuc29tZShmdW5jdGlvbiAoYXVkaWVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gYXVkaWVuY2UgaW5zdGFuY2VvZiBSZWdFeHAgPyBhdWRpZW5jZS50ZXN0KHRhcmdldEF1ZGllbmNlKSA6IGF1ZGllbmNlID09PSB0YXJnZXRBdWRpZW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBhdWRpZW5jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIGF1ZGllbmNlcy5qb2luKCcgb3IgJykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pc3N1ZXIpIHtcbiAgICAgIGNvbnN0IGludmFsaWRfaXNzdWVyID1cbiAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmlzc3VlciA9PT0gJ3N0cmluZycgJiYgcGF5bG9hZC5pc3MgIT09IG9wdGlvbnMuaXNzdWVyKSB8fFxuICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmlzc3VlcikgJiYgb3B0aW9ucy5pc3N1ZXIuaW5kZXhPZihwYXlsb2FkLmlzcykgPT09IC0xKTtcblxuICAgICAgaWYgKGludmFsaWRfaXNzdWVyKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGlzc3VlciBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuaXNzdWVyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuc3ViICE9PSBvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc3ViamVjdCBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuc3ViamVjdCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmp3dGlkKSB7XG4gICAgICBpZiAocGF5bG9hZC5qdGkgIT09IG9wdGlvbnMuand0aWQpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgand0aWQgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmp3dGlkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9uY2UpIHtcbiAgICAgIGlmIChwYXlsb2FkLm5vbmNlICE9PSBvcHRpb25zLm5vbmNlKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG5vbmNlIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5ub25jZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heEFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmlhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpYXQgcmVxdWlyZWQgd2hlbiBtYXhBZ2UgaXMgc3BlY2lmaWVkJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhBZ2VUaW1lc3RhbXAgPSB0aW1lc3BhbihvcHRpb25zLm1heEFnZSwgcGF5bG9hZC5pYXQpO1xuICAgICAgaWYgKHR5cGVvZiBtYXhBZ2VUaW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignXCJtYXhBZ2VcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gbWF4QWdlVGltZXN0YW1wICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IFRva2VuRXhwaXJlZEVycm9yKCdtYXhBZ2UgZXhjZWVkZWQnLCBuZXcgRGF0ZShtYXhBZ2VUaW1lc3RhbXAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBkZWNvZGVkVG9rZW4uc2lnbmF0dXJlO1xuXG4gICAgICByZXR1cm4gZG9uZShudWxsLCB7XG4gICAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmUobnVsbCwgcGF5bG9hZCk7XG4gIH0pO1xufTtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKSB8fCBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID8gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbmNsdWRlcztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCb29sZWFuO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0ludGVnZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbnRlZ2VyO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAzLjAuMyAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8XG4gICAgICBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSAhPSBvYmplY3RUYWcgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCA0LjAuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAdHlwZSBGdW5jdGlvblxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgbiA9IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmIChuIDw9IDEpIHtcbiAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gKiBpbml0aWFsaXplKCk7XG4gKiBpbml0aWFsaXplKCk7XG4gKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICovXG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmNlO1xuIiwKICAgICJjb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCBQU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2xpYi9wc1N1cHBvcnRlZCcpO1xuY29uc3QgdmFsaWRhdGVBc3ltbWV0cmljS2V5ID0gcmVxdWlyZSgnLi9saWIvdmFsaWRhdGVBc3ltbWV0cmljS2V5Jyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IGluY2x1ZGVzID0gcmVxdWlyZSgnbG9kYXNoLmluY2x1ZGVzJyk7XG5jb25zdCBpc0Jvb2xlYW4gPSByZXF1aXJlKCdsb2Rhc2guaXNib29sZWFuJyk7XG5jb25zdCBpc0ludGVnZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNpbnRlZ2VyJyk7XG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2xvZGFzaC5pc251bWJlcicpO1xuY29uc3QgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC5pc3BsYWlub2JqZWN0Jyk7XG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJ2xvZGFzaC5pc3N0cmluZycpO1xuY29uc3Qgb25jZSA9IHJlcXVpcmUoJ2xvZGFzaC5vbmNlJyk7XG5jb25zdCB7IEtleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQcml2YXRlS2V5IH0gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG5jb25zdCBTVVBQT1JURURfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInLCAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLCAnbm9uZSddO1xuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBTVVBQT1JURURfQUxHUy5zcGxpY2UoMywgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbmNvbnN0IHNpZ25fb3B0aW9uc19zY2hlbWEgPSB7XG4gIGV4cGlyZXNJbjogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSB8fCAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuJyB9LFxuICBub3RCZWZvcmU6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgYXVkaWVuY2U6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiYXVkaWVuY2VcIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5JyB9LFxuICBhbGdvcml0aG06IHsgaXNWYWxpZDogaW5jbHVkZXMuYmluZChudWxsLCBTVVBQT1JURURfQUxHUyksIG1lc3NhZ2U6ICdcImFsZ29yaXRobVwiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW51bSB2YWx1ZScgfSxcbiAgaGVhZGVyOiB7IGlzVmFsaWQ6IGlzUGxhaW5PYmplY3QsIG1lc3NhZ2U6ICdcImhlYWRlclwiIG11c3QgYmUgYW4gb2JqZWN0JyB9LFxuICBlbmNvZGluZzogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBpc3N1ZXI6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImlzc3VlclwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIHN1YmplY3Q6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcInN1YmplY3RcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBqd3RpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiand0aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBub1RpbWVzdGFtcDogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcIm5vVGltZXN0YW1wXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGtleWlkOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJrZXlpZFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIG11dGF0ZVBheWxvYWQ6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJtdXRhdGVQYXlsb2FkXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGFsbG93SW5zZWN1cmVLZXlTaXplczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW5zZWN1cmVLZXlTaXplc1wiIG11c3QgYmUgYSBib29sZWFuJ30sXG4gIGFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlc1wiIG11c3QgYmUgYSBib29sZWFuJ31cbn07XG5cbmNvbnN0IHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSA9IHtcbiAgaWF0OiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJpYXRcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgZXhwOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJleHBcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgbmJmOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJuYmZcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGUoc2NoZW1hLCBhbGxvd1Vua25vd24sIG9iamVjdCwgcGFyYW1ldGVyTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCInICsgcGFyYW1ldGVyTmFtZSArICdcIiB0byBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgfVxuICBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIGlmICghYWxsb3dVbmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBrZXkgKyAnXCIgaXMgbm90IGFsbG93ZWQgaW4gXCInICsgcGFyYW1ldGVyTmFtZSArICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWRhdG9yLmlzVmFsaWQob2JqZWN0W2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0b3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiB2YWxpZGF0ZShzaWduX29wdGlvbnNfc2NoZW1hLCBmYWxzZSwgb3B0aW9ucywgJ29wdGlvbnMnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBheWxvYWQpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSwgdHJ1ZSwgcGF5bG9hZCwgJ3BheWxvYWQnKTtcbn1cblxuY29uc3Qgb3B0aW9uc190b19wYXlsb2FkID0ge1xuICAnYXVkaWVuY2UnOiAnYXVkJyxcbiAgJ2lzc3Vlcic6ICdpc3MnLFxuICAnc3ViamVjdCc6ICdzdWInLFxuICAnand0aWQnOiAnanRpJ1xufTtcblxuY29uc3Qgb3B0aW9uc19mb3Jfb2JqZWN0cyA9IFtcbiAgJ2V4cGlyZXNJbicsXG4gICdub3RCZWZvcmUnLFxuICAnbm9UaW1lc3RhbXAnLFxuICAnYXVkaWVuY2UnLFxuICAnaXNzdWVyJyxcbiAgJ3N1YmplY3QnLFxuICAnand0aWQnLFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF5bG9hZCwgc2VjcmV0T3JQcml2YXRlS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhQnVmZmVyLmlzQnVmZmVyKHBheWxvYWQpO1xuXG4gIGNvbnN0IGhlYWRlciA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFsZzogb3B0aW9ucy5hbGdvcml0aG0gfHwgJ0hTMjU2JyxcbiAgICB0eXA6IGlzT2JqZWN0UGF5bG9hZCA/ICdKV1QnIDogdW5kZWZpbmVkLFxuICAgIGtpZDogb3B0aW9ucy5rZXlpZFxuICB9LCBvcHRpb25zLmhlYWRlcik7XG5cbiAgZnVuY3Rpb24gZmFpbHVyZShlcnIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoIXNlY3JldE9yUHJpdmF0ZUtleSAmJiBvcHRpb25zLmFsZ29yaXRobSAhPT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBoYXZlIGEgdmFsdWUnKSk7XG4gIH1cblxuICBpZiAoc2VjcmV0T3JQcml2YXRlS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclByaXZhdGVLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkoc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQcml2YXRlS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHJpdmF0ZUtleSkgOiBzZWNyZXRPclByaXZhdGVLZXkpXG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IGlzIG5vdCB2YWxpZCBrZXkgbWF0ZXJpYWwnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICB9IGVsc2UgaWYgKC9eKD86UlN8UFN8RVMpLy50ZXN0KGhlYWRlci5hbGcpKSB7XG4gICAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleS50eXBlICE9PSAncHJpdmF0ZScpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigoYHNlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGJlIGFuIGFzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJlxuICAgICAgIWhlYWRlci5hbGcuc3RhcnRzV2l0aCgnRVMnKSAmJlxuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgLy9LZXlPYmplY3QuYXN5bW1ldHJpY0tleURldGFpbHMgaXMgc3VwcG9ydGVkIGluIE5vZGUgMTUrXG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkuYXN5bW1ldHJpY0tleURldGFpbHMubW9kdWx1c0xlbmd0aCA8IDIwNDgpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3BheWxvYWQgaXMgcmVxdWlyZWQnKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5tdXRhdGVQYXlsb2FkKSB7XG4gICAgICBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSxwYXlsb2FkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW52YWxpZF9vcHRpb25zID0gb3B0aW9uc19mb3Jfb2JqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zW29wdF0gIT09ICd1bmRlZmluZWQnO1xuICAgIH0pO1xuXG4gICAgaWYgKGludmFsaWRfb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ2ludmFsaWQgJyArIGludmFsaWRfb3B0aW9ucy5qb2luKCcsJykgKyAnIG9wdGlvbiBmb3IgJyArICh0eXBlb2YgcGF5bG9hZCApICsgJyBwYXlsb2FkJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMuZXhwaXJlc0luXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwiZXhwXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy5ub3RCZWZvcmVcIiBvcHRpb24gdGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCJuYmZcIiBwcm9wZXJ0eS4nKSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclByaXZhdGVLZXkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGltZXN0YW1wID0gcGF5bG9hZC5pYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKG9wdGlvbnMubm9UaW1lc3RhbXApIHtcbiAgICBkZWxldGUgcGF5bG9hZC5pYXQ7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgcGF5bG9hZC5pYXQgPSB0aW1lc3RhbXA7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkLm5iZiA9IHRpbWVzcGFuKG9wdGlvbnMubm90QmVmb3JlLCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5leHAgPSB0aW1lc3BhbihvcHRpb25zLmV4cGlyZXNJbiwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJleHBpcmVzSW5cIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMob3B0aW9uc190b19wYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCBjbGFpbSA9IG9wdGlvbnNfdG9fcGF5bG9hZFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1trZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkW2NsYWltXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLicgKyBrZXkgKyAnXCIgb3B0aW9uLiBUaGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcIicgKyBjbGFpbSArICdcIiBwcm9wZXJ0eS4nKSk7XG4gICAgICB9XG4gICAgICBwYXlsb2FkW2NsYWltXSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgb25jZShjYWxsYmFjayk7XG5cbiAgICBqd3MuY3JlYXRlU2lnbih7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIHByaXZhdGVLZXk6IHNlY3JldE9yUHJpdmF0ZUtleSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICB9KS5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKVxuICAgICAgLm9uY2UoJ2RvbmUnLCBmdW5jdGlvbiAoc2lnbmF0dXJlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgICAgICBpZighb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiYgL14oPzpSU3xQUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2lnbmF0dXJlLmxlbmd0aCA8IDI1Nikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNpZ25hdHVyZSk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2lnbmF0dXJlID0gandzLnNpZ24oe2hlYWRlcjogaGVhZGVyLCBwYXlsb2FkOiBwYXlsb2FkLCBzZWNyZXQ6IHNlY3JldE9yUHJpdmF0ZUtleSwgZW5jb2Rpbmc6IGVuY29kaW5nfSk7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGluIGZhdm9yIG9mIHRoZSBtb2R1bHVzIGxlbmd0aCBjaGVjayBiZWZvcmUgc2lnbmluZyBvbmNlIG5vZGUgMTUrIGlzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YClcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hdHVyZVxuICB9XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVjb2RlOiByZXF1aXJlKCcuL2RlY29kZScpLFxuICB2ZXJpZnk6IHJlcXVpcmUoJy4vdmVyaWZ5JyksXG4gIHNpZ246IHJlcXVpcmUoJy4vc2lnbicpLFxuICBKc29uV2ViVG9rZW5FcnJvcjogcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKSxcbiAgTm90QmVmb3JlRXJyb3I6IHJlcXVpcmUoJy4vbGliL05vdEJlZm9yZUVycm9yJyksXG4gIFRva2VuRXhwaXJlZEVycm9yOiByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpLFxufTtcbiIsCiAgICAiKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFV0aWxzXG4gIGZ1bmN0aW9uIGFzc2VydCAodmFsLCBtc2cpIHtcbiAgICBpZiAoIXZhbCkgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgLy8gQ291bGQgdXNlIGBpbmhlcml0c2AgbW9kdWxlLCBidXQgZG9uJ3Qgd2FudCB0byBtb3ZlIGZyb20gc2luZ2xlIGZpbGVcbiAgLy8gYXJjaGl0ZWN0dXJlIHlldC5cbiAgZnVuY3Rpb24gaW5oZXJpdHMgKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICAvLyBCTlxuXG4gIGZ1bmN0aW9uIEJOIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChCTi5pc0JOKG51bWJlcikpIHtcbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgdGhpcy53b3JkcyA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVkdWN0aW9uIGNvbnRleHRcbiAgICB0aGlzLnJlZCA9IG51bGw7XG5cbiAgICBpZiAobnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gJ2xlJyB8fCBiYXNlID09PSAnYmUnKSB7XG4gICAgICAgIGVuZGlhbiA9IGJhc2U7XG4gICAgICAgIGJhc2UgPSAxMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdChudW1iZXIgfHwgMCwgYmFzZSB8fCAxMCwgZW5kaWFuIHx8ICdiZScpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJOO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQk4gPSBCTjtcbiAgfVxuXG4gIEJOLkJOID0gQk47XG4gIEJOLndvcmRTaXplID0gMjY7XG5cbiAgdmFyIEJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBCdWZmZXIgPSB3aW5kb3cuQnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgaWYgKG51bSBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtICE9PSBudWxsICYmIHR5cGVvZiBudW0gPT09ICdvYmplY3QnICYmXG4gICAgICBudW0uY29uc3RydWN0b3Iud29yZFNpemUgPT09IEJOLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkobnVtLndvcmRzKTtcbiAgfTtcblxuICBCTi5tYXggPSBmdW5jdGlvbiBtYXggKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA+IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5taW4gPSBmdW5jdGlvbiBtaW4gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA8IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBiYXNlID0gMTY7XG4gICAgfVxuICAgIGFzc2VydChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTtcblxuICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICBzdGFydCsrO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgbnVtYmVyLmxlbmd0aCkge1xuICAgICAgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQsIGVuZGlhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgICAgIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgICAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleDRCaXRzIChzdHJpbmcsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpbmRleCk7XG4gICAgLy8gJ0EnIC0gJ0YnXG4gICAgaWYgKGMgPj0gNjUgJiYgYyA8PSA3MCkge1xuICAgICAgcmV0dXJuIGMgLSA1NTtcbiAgICAvLyAnYScgLSAnZidcbiAgICB9IGVsc2UgaWYgKGMgPj0gOTcgJiYgYyA8PSAxMDIpIHtcbiAgICAgIHJldHVybiBjIC0gODc7XG4gICAgLy8gJzAnIC0gJzknXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoYyAtIDQ4KSAmIDB4ZjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhleEJ5dGUgKHN0cmluZywgbG93ZXJCb3VuZCwgaW5kZXgpIHtcbiAgICB2YXIgciA9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGluZGV4IC0gMSA+PSBsb3dlckJvdW5kKSB7XG4gICAgICByIHw9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCAtIDEpIDw8IDQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCwgZW5kaWFuKSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gMjQtYml0cyBjaHVua3NcbiAgICB2YXIgb2ZmID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaSAtPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnNlTGVuZ3RoID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChpID0gcGFyc2VMZW5ndGggJSAyID09PSAwID8gc3RhcnQgKyAxIDogc3RhcnQ7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUJhc2UgKHN0ciwgc3RhcnQsIGVuZCwgbXVsKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgKj0gbXVsO1xuXG4gICAgICAvLyAnYSdcbiAgICAgIGlmIChjID49IDQ5KSB7XG4gICAgICAgIHIgKz0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQSdcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNykge1xuICAgICAgICByICs9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByICs9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgIC8vIEZpbmQgbGVuZ3RoIG9mIGxpbWIgaW4gYmFzZVxuICAgIGZvciAodmFyIGxpbWJMZW4gPSAwLCBsaW1iUG93ID0gMTsgbGltYlBvdyA8PSAweDNmZmZmZmY7IGxpbWJQb3cgKj0gYmFzZSkge1xuICAgICAgbGltYkxlbisrO1xuICAgIH1cbiAgICBsaW1iTGVuLS07XG4gICAgbGltYlBvdyA9IChsaW1iUG93IC8gYmFzZSkgfCAwO1xuXG4gICAgdmFyIHRvdGFsID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgIHZhciBtb2QgPSB0b3RhbCAlIGxpbWJMZW47XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvdGFsLCB0b3RhbCAtIG1vZCkgKyBzdGFydDtcblxuICAgIHZhciB3b3JkID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gbGltYkxlbikge1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIGkgKyBsaW1iTGVuLCBiYXNlKTtcblxuICAgICAgdGhpcy5pbXVsbihsaW1iUG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kICE9PSAwKSB7XG4gICAgICB2YXIgcG93ID0gMTtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBudW1iZXIubGVuZ3RoLCBiYXNlKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG1vZDsgaSsrKSB7XG4gICAgICAgIHBvdyAqPSBiYXNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltdWxuKHBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZGVzdCkge1xuICAgIGRlc3Qud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzdC53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgfVxuICAgIGRlc3QubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZGVzdC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSB0aGlzLnJlZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgdmFyIHIgPSBuZXcgQk4obnVsbCk7XG4gICAgdGhpcy5jb3B5KHIpO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24gX2V4cGFuZCAoc2l6ZSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy53b3Jkc1swXTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldCArPSB0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMHgwMSkge1xuICAgICAgLy8gTk9URTogYXQgdGhpcyBzdGFnZSBpdCBpcyBrbm93biB0aGF0IHRoZSB0b3AgYml0IGlzIHNldFxuICAgICAgcmV0ICs9IDB4MTAwMDAwMDAwMDAwMDAgKyAodGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ051bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cycpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubmVnYXRpdmUgIT09IDApID8gLXJldCA6IHJldDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbiB0b0FycmF5TGlrZSAoQXJyYXlUeXBlLCBlbmRpYW4sIGxlbmd0aCkge1xuICAgIHZhciBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoKCk7XG4gICAgdmFyIHJlcUxlbmd0aCA9IGxlbmd0aCB8fCBNYXRoLm1heCgxLCBieXRlTGVuZ3RoKTtcbiAgICBhc3NlcnQoYnl0ZUxlbmd0aCA8PSByZXFMZW5ndGgsICdieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoJyk7XG4gICAgYXNzZXJ0KHJlcUxlbmd0aCA+IDAsICdSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAnKTtcblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgICB2YXIgbGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSAnbGUnO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCk7XG5cbiAgICB2YXIgYiwgaTtcbiAgICB2YXIgcSA9IHRoaXMuY2xvbmUoKTtcbiAgICBpZiAoIWxpdHRsZUVuZGlhbikge1xuICAgICAgLy8gQXNzdW1lIGJpZy1lbmRpYW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCByZXFMZW5ndGggLSBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW3JlcUxlbmd0aCAtIGkgLSAxXSA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tpXSA9IGI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgcmVxTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGlmIChNYXRoLmNsejMyKSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKHcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICB2YXIgdCA9IHc7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZiAodCA+PSAweDEwMDApIHtcbiAgICAgICAgciArPSAxMztcbiAgICAgICAgdCA+Pj49IDEzO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg0MCkge1xuICAgICAgICByICs9IDc7XG4gICAgICAgIHQgPj4+PSA3O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg4KSB7XG4gICAgICAgIHIgKz0gNDtcbiAgICAgICAgdCA+Pj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDAyKSB7XG4gICAgICAgIHIgKz0gMjtcbiAgICAgICAgdCA+Pj49IDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gciArIHQ7XG4gICAgfTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbiBfemVyb0JpdHMgKHcpIHtcbiAgICAvLyBTaG9ydC1jdXRcbiAgICBpZiAodyA9PT0gMCkgcmV0dXJuIDI2O1xuXG4gICAgdmFyIHQgPSB3O1xuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHQgJiAweDFmZmYpID09PSAwKSB7XG4gICAgICByICs9IDEzO1xuICAgICAgdCA+Pj49IDEzO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDdmKSA9PT0gMCkge1xuICAgICAgciArPSA3O1xuICAgICAgdCA+Pj49IDc7XG4gICAgfVxuICAgIGlmICgodCAmIDB4ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNDtcbiAgICAgIHQgPj4+PSA0O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDMpID09PSAwKSB7XG4gICAgICByICs9IDI7XG4gICAgICB0ID4+Pj0gMjtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgxKSA9PT0gMCkge1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZXR1cm4gbnVtYmVyIG9mIHVzZWQgYml0cyBpbiBhIEJOXG4gIEJOLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiBiaXRMZW5ndGggKCkge1xuICAgIHZhciB3ID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBoaSA9IHRoaXMuX2NvdW50Qml0cyh3KTtcbiAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGhpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRvQml0QXJyYXkgKG51bSkge1xuICAgIHZhciB3ID0gbmV3IEFycmF5KG51bS5iaXRMZW5ndGgoKSk7XG5cbiAgICBmb3IgKHZhciBiaXQgPSAwOyBiaXQgPCB3Lmxlbmd0aDsgYml0KyspIHtcbiAgICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICAgIHdbYml0XSA9IChudW0ud29yZHNbb2ZmXSAmICgxIDw8IHdiaXQpKSA+Pj4gd2JpdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbiBpb3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1b3IobnVtKTtcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pb3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaW9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbiB1b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdW9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbiBpdWFuZCAobnVtKSB7XG4gICAgLy8gYiA9IG1pbi1sZW5ndGgobnVtLCB0aGlzKVxuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gJiBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBiLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbiBpYW5kIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdWFuZChudW0pO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFuZCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uIHVhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uIGl1eG9yIChudW0pIHtcbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXSBeIGIud29yZHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMgIT09IGEpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24gbm90biAod2lkdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHdpZHRoKTtcbiAgfTtcblxuICAvLyBTZXQgYGJpdGAgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24gc2V0biAoYml0LCB2YWwpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuXG4gICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICB0aGlzLl9leHBhbmQob2ZmICsgMSk7XG5cbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gfCAoMSA8PCB3Yml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdICYgfigxIDw8IHdiaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKG51bSkge1xuICAgIHZhciByO1xuXG4gICAgLy8gbmVnYXRpdmUgKyBwb3NpdGl2ZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcblxuICAgIC8vIHBvc2l0aXZlICsgbmVnYXRpdmVcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgd29yZHNcbiAgICB9IGVsc2UgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG51bSkge1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gdGhpcy5zdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKG51bS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IG51bS5zdWIodGhpcyk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkKG51bSk7XG5cbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKG51bSkge1xuICAgIC8vIHRoaXMgLSAoLW51bSkgPSB0aGlzICsgbnVtXG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHZhciByID0gdGhpcy5pYWRkKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG5cbiAgICAvLyAtdGhpcyAtIG51bSA9IC0odGhpcyArIG51bSlcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZVxuICAgIHZhciBjbXAgPSB0aGlzLmNtcChudW0pO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uIC0gemVyb2lmeVxuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBhID4gYlxuICAgIHZhciBhLCBiO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgLSAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gQ29weSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIGlmIChjYXJyeSA9PT0gMCAmJiBpIDwgYS5sZW5ndGggJiYgYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkpO1xuXG4gICAgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogaXQgbWF5IGJlIHJlYXNvbmFibGUgdG8gb21pdCBpdCBmb3IgdXNlcnMgd2hvIGRvbid0IG5lZWRcbiAgLy8gdG8gd29yayB3aXRoIDI1Ni1iaXQgbnVtYmVycywgb3RoZXJ3aXNlIGl0IGdpdmVzIDIwJSBpbXByb3ZlbWVudCBmb3IgMjU2LWJpdFxuICAvLyBtdWx0aXBsaWNhdGlvbiAobGlrZSBlbGxpcHRpYyBzZWNwMjU2azEpLlxuICB2YXIgY29tYjEwTXVsVG8gPSBmdW5jdGlvbiBjb21iMTBNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgYSA9IHNlbGYud29yZHM7XG4gICAgdmFyIGIgPSBudW0ud29yZHM7XG4gICAgdmFyIG8gPSBvdXQud29yZHM7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBsbztcbiAgICB2YXIgbWlkO1xuICAgIHZhciBoaTtcbiAgICB2YXIgYTAgPSBhWzBdIHwgMDtcbiAgICB2YXIgYWwwID0gYTAgJiAweDFmZmY7XG4gICAgdmFyIGFoMCA9IGEwID4+PiAxMztcbiAgICB2YXIgYTEgPSBhWzFdIHwgMDtcbiAgICB2YXIgYWwxID0gYTEgJiAweDFmZmY7XG4gICAgdmFyIGFoMSA9IGExID4+PiAxMztcbiAgICB2YXIgYTIgPSBhWzJdIHwgMDtcbiAgICB2YXIgYWwyID0gYTIgJiAweDFmZmY7XG4gICAgdmFyIGFoMiA9IGEyID4+PiAxMztcbiAgICB2YXIgYTMgPSBhWzNdIHwgMDtcbiAgICB2YXIgYWwzID0gYTMgJiAweDFmZmY7XG4gICAgdmFyIGFoMyA9IGEzID4+PiAxMztcbiAgICB2YXIgYTQgPSBhWzRdIHwgMDtcbiAgICB2YXIgYWw0ID0gYTQgJiAweDFmZmY7XG4gICAgdmFyIGFoNCA9IGE0ID4+PiAxMztcbiAgICB2YXIgYTUgPSBhWzVdIHwgMDtcbiAgICB2YXIgYWw1ID0gYTUgJiAweDFmZmY7XG4gICAgdmFyIGFoNSA9IGE1ID4+PiAxMztcbiAgICB2YXIgYTYgPSBhWzZdIHwgMDtcbiAgICB2YXIgYWw2ID0gYTYgJiAweDFmZmY7XG4gICAgdmFyIGFoNiA9IGE2ID4+PiAxMztcbiAgICB2YXIgYTcgPSBhWzddIHwgMDtcbiAgICB2YXIgYWw3ID0gYTcgJiAweDFmZmY7XG4gICAgdmFyIGFoNyA9IGE3ID4+PiAxMztcbiAgICB2YXIgYTggPSBhWzhdIHwgMDtcbiAgICB2YXIgYWw4ID0gYTggJiAweDFmZmY7XG4gICAgdmFyIGFoOCA9IGE4ID4+PiAxMztcbiAgICB2YXIgYTkgPSBhWzldIHwgMDtcbiAgICB2YXIgYWw5ID0gYTkgJiAweDFmZmY7XG4gICAgdmFyIGFoOSA9IGE5ID4+PiAxMztcbiAgICB2YXIgYjAgPSBiWzBdIHwgMDtcbiAgICB2YXIgYmwwID0gYjAgJiAweDFmZmY7XG4gICAgdmFyIGJoMCA9IGIwID4+PiAxMztcbiAgICB2YXIgYjEgPSBiWzFdIHwgMDtcbiAgICB2YXIgYmwxID0gYjEgJiAweDFmZmY7XG4gICAgdmFyIGJoMSA9IGIxID4+PiAxMztcbiAgICB2YXIgYjIgPSBiWzJdIHwgMDtcbiAgICB2YXIgYmwyID0gYjIgJiAweDFmZmY7XG4gICAgdmFyIGJoMiA9IGIyID4+PiAxMztcbiAgICB2YXIgYjMgPSBiWzNdIHwgMDtcbiAgICB2YXIgYmwzID0gYjMgJiAweDFmZmY7XG4gICAgdmFyIGJoMyA9IGIzID4+PiAxMztcbiAgICB2YXIgYjQgPSBiWzRdIHwgMDtcbiAgICB2YXIgYmw0ID0gYjQgJiAweDFmZmY7XG4gICAgdmFyIGJoNCA9IGI0ID4+PiAxMztcbiAgICB2YXIgYjUgPSBiWzVdIHwgMDtcbiAgICB2YXIgYmw1ID0gYjUgJiAweDFmZmY7XG4gICAgdmFyIGJoNSA9IGI1ID4+PiAxMztcbiAgICB2YXIgYjYgPSBiWzZdIHwgMDtcbiAgICB2YXIgYmw2ID0gYjYgJiAweDFmZmY7XG4gICAgdmFyIGJoNiA9IGI2ID4+PiAxMztcbiAgICB2YXIgYjcgPSBiWzddIHwgMDtcbiAgICB2YXIgYmw3ID0gYjcgJiAweDFmZmY7XG4gICAgdmFyIGJoNyA9IGI3ID4+PiAxMztcbiAgICB2YXIgYjggPSBiWzhdIHwgMDtcbiAgICB2YXIgYmw4ID0gYjggJiAweDFmZmY7XG4gICAgdmFyIGJoOCA9IGI4ID4+PiAxMztcbiAgICB2YXIgYjkgPSBiWzldIHwgMDtcbiAgICB2YXIgYmw5ID0gYjkgJiAweDFmZmY7XG4gICAgdmFyIGJoOSA9IGI5ID4+PiAxMztcblxuICAgIG91dC5uZWdhdGl2ZSA9IHNlbGYubmVnYXRpdmUgXiBudW0ubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IDE5O1xuICAgIC8qIGsgPSAwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwwLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDAsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDAsIGJoMCk7XG4gICAgdmFyIHcwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MCA+Pj4gMjYpKSB8IDA7XG4gICAgdzAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwxLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDEsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDEsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgxKSkgfCAwO1xuICAgIHZhciB3MSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEgPj4+IDI2KSkgfCAwO1xuICAgIHcxICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwyLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgyLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDIpKSB8IDA7XG4gICAgdmFyIHcyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MiA+Pj4gMjYpKSB8IDA7XG4gICAgdzIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwzLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDMsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDMsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDMpKSB8IDA7XG4gICAgdmFyIHczID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MyA+Pj4gMjYpKSB8IDA7XG4gICAgdzMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw0LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDQsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDQsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg0KSkgfCAwO1xuICAgIHZhciB3NCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzQgPj4+IDI2KSkgfCAwO1xuICAgIHc0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw1LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg1LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDUpKSB8IDA7XG4gICAgdmFyIHc1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NSA+Pj4gMjYpKSB8IDA7XG4gICAgdzUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw2LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDYsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDYsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDYpKSB8IDA7XG4gICAgdmFyIHc2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NiA+Pj4gMjYpKSB8IDA7XG4gICAgdzYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw3LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDcsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDcsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg3KSkgfCAwO1xuICAgIHZhciB3NyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzcgPj4+IDI2KSkgfCAwO1xuICAgIHc3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw4LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg4LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDgpKSB8IDA7XG4gICAgdmFyIHc4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OCA+Pj4gMjYpKSB8IDA7XG4gICAgdzggJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA5ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDkpKSB8IDA7XG4gICAgdmFyIHc5ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OSA+Pj4gMjYpKSB8IDA7XG4gICAgdzkgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwxKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDEpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDEpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDEpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEwID4+PiAyNikpIHwgMDtcbiAgICB3MTAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwyKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDIpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDIpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDIpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzExID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTEgPj4+IDI2KSkgfCAwO1xuICAgIHcxMSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDMpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEyID4+PiAyNikpIHwgMDtcbiAgICB3MTIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw0KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDQpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDQpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDQpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEzID4+PiAyNikpIHwgMDtcbiAgICB3MTMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw1KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDUpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDUpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDUpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTQgPj4+IDI2KSkgfCAwO1xuICAgIHcxNCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDYpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE1ID4+PiAyNikpIHwgMDtcbiAgICB3MTUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw3KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDcpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDcpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDcpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE2ID4+PiAyNikpIHwgMDtcbiAgICB3MTYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw4KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDgpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDgpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDgpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTcgPj4+IDI2KSkgfCAwO1xuICAgIHcxNyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDkpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOSk7XG4gICAgdmFyIHcxOCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE4ID4+PiAyNikpIHwgMDtcbiAgICB3MTggJj0gMHgzZmZmZmZmO1xuICAgIG9bMF0gPSB3MDtcbiAgICBvWzFdID0gdzE7XG4gICAgb1syXSA9IHcyO1xuICAgIG9bM10gPSB3MztcbiAgICBvWzRdID0gdzQ7XG4gICAgb1s1XSA9IHc1O1xuICAgIG9bNl0gPSB3NjtcbiAgICBvWzddID0gdzc7XG4gICAgb1s4XSA9IHc4O1xuICAgIG9bOV0gPSB3OTtcbiAgICBvWzEwXSA9IHcxMDtcbiAgICBvWzExXSA9IHcxMTtcbiAgICBvWzEyXSA9IHcxMjtcbiAgICBvWzEzXSA9IHcxMztcbiAgICBvWzE0XSA9IHcxNDtcbiAgICBvWzE1XSA9IHcxNTtcbiAgICBvWzE2XSA9IHcxNjtcbiAgICBvWzE3XSA9IHcxNztcbiAgICBvWzE4XSA9IHcxODtcbiAgICBpZiAoYyAhPT0gMCkge1xuICAgICAgb1sxOV0gPSBjO1xuICAgICAgb3V0Lmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuXG4gIC8vIFBvbHlmaWxsIGNvbWJcbiAgaWYgKCFNYXRoLmltdWwpIHtcbiAgICBjb21iMTBNdWxUbyA9IHNtYWxsTXVsVG87XG4gIH1cblxuICBmdW5jdGlvbiBiaWdNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSBzZWxmLmxlbmd0aCArIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIHZhciBobmNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG91dC5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICAgIGhuY2FycnkgPSAwO1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSBrIC0gajtcbiAgICAgICAgdmFyIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgdmFyIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAoKHIgLyAweDQwMDAwMDApIHwgMCkpIHwgMDtcbiAgICAgICAgbG8gPSAobG8gKyByd29yZCkgfCAwO1xuICAgICAgICByd29yZCA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKGxvID4+PiAyNikpIHwgMDtcblxuICAgICAgICBobmNhcnJ5ICs9IG5jYXJyeSA+Pj4gMjY7XG4gICAgICAgIG5jYXJyeSAmPSAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5O1xuICAgICAgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bWJvTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGZmdG0gPSBuZXcgRkZUTSgpO1xuICAgIHJldHVybiBmZnRtLm11bHAoc2VsZiwgbnVtLCBvdXQpO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24gbXVsVG8gKG51bSwgb3V0KSB7XG4gICAgdmFyIHJlcztcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMTAgJiYgbnVtLmxlbmd0aCA9PT0gMTApIHtcbiAgICAgIHJlcyA9IGNvbWIxME11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDYzKSB7XG4gICAgICByZXMgPSBzbWFsbE11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDEwMjQpIHtcbiAgICAgIHJlcyA9IGJpZ011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGZvciBGRlRcbiAgLy8gc2xpZ2h0bHkgcmV2aXNpdGVkIHRvIHJlbHkgb24gbG9vcGluZyBpbnN0ZWFkIG9mIHJlY3Vyc2lvblxuXG4gIGZ1bmN0aW9uIEZGVE0gKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBGRlRNLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24gbWFrZVJCVCAoTikge1xuICAgIHZhciB0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBsID0gQk4ucHJvdG90eXBlLl9jb3VudEJpdHMoTikgLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB0W2ldID0gdGhpcy5yZXZCaW4oaSwgbCwgTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBiaW5hcnktcmV2ZXJzZWQgcmVwcmVzZW50YXRpb24gb2YgYHhgXG4gIEZGVE0ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uIHJldkJpbiAoeCwgbCwgTikge1xuICAgIGlmICh4ID09PSAwIHx8IHggPT09IE4gLSAxKSByZXR1cm4geDtcblxuICAgIHZhciByYiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJiIHw9ICh4ICYgMSkgPDwgKGwgLSBpIC0gMSk7XG4gICAgICB4ID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiByYjtcbiAgfTtcblxuICAvLyBQZXJmb3JtcyBcInR3ZWVkbGluZ1wiIHBoYXNlLCB0aGVyZWZvcmUgJ2VtdWxhdGluZydcbiAgLy8gYmVoYXZpb3VyIG9mIHRoZSByZWN1cnNpdmUgYWxnb3JpdGhtXG4gIEZGVE0ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlIChyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHJ0d3NbaV0gPSByd3NbcmJ0W2ldXTtcbiAgICAgIGl0d3NbaV0gPSBpd3NbcmJ0W2ldXTtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtIChyd3MsIGl3cywgcnR3cywgaXR3cywgTiwgcmJ0KSB7XG4gICAgdGhpcy5wZXJtdXRlKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pO1xuXG4gICAgZm9yICh2YXIgcyA9IDE7IHMgPCBOOyBzIDw8PSAxKSB7XG4gICAgICB2YXIgbCA9IHMgPDwgMTtcblxuICAgICAgdmFyIHJ0d2RmID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKTtcbiAgICAgIHZhciBpdHdkZiA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgTjsgcCArPSBsKSB7XG4gICAgICAgIHZhciBydHdkZl8gPSBydHdkZjtcbiAgICAgICAgdmFyIGl0d2RmXyA9IGl0d2RmO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlID0gcnR3c1twICsgal07XG4gICAgICAgICAgdmFyIGllID0gaXR3c1twICsgal07XG5cbiAgICAgICAgICB2YXIgcm8gPSBydHdzW3AgKyBqICsgc107XG4gICAgICAgICAgdmFyIGlvID0gaXR3c1twICsgaiArIHNdO1xuXG4gICAgICAgICAgdmFyIHJ4ID0gcnR3ZGZfICogcm8gLSBpdHdkZl8gKiBpbztcblxuICAgICAgICAgIGlvID0gcnR3ZGZfICogaW8gKyBpdHdkZl8gKiBybztcbiAgICAgICAgICBybyA9IHJ4O1xuXG4gICAgICAgICAgcnR3c1twICsgal0gPSByZSArIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGpdID0gaWUgKyBpbztcblxuICAgICAgICAgIHJ0d3NbcCArIGogKyBzXSA9IHJlIC0gcm87XG4gICAgICAgICAgaXR3c1twICsgaiArIHNdID0gaWUgLSBpbztcblxuICAgICAgICAgIC8qIGpzaGludCBtYXhkZXB0aCA6IGZhbHNlICovXG4gICAgICAgICAgaWYgKGogIT09IGwpIHtcbiAgICAgICAgICAgIHJ4ID0gcnR3ZGYgKiBydHdkZl8gLSBpdHdkZiAqIGl0d2RmXztcblxuICAgICAgICAgICAgaXR3ZGZfID0gcnR3ZGYgKiBpdHdkZl8gKyBpdHdkZiAqIHJ0d2RmXztcbiAgICAgICAgICAgIHJ0d2RmXyA9IHJ4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uIGd1ZXNzTGVuMTNiIChuLCBtKSB7XG4gICAgdmFyIE4gPSBNYXRoLm1heChtLCBuKSB8IDE7XG4gICAgdmFyIG9kZCA9IE4gJiAxO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKE4gPSBOIC8gMiB8IDA7IE47IE4gPSBOID4+PiAxKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgPDwgaSArIDEgKyBvZGQ7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24gY29uanVnYXRlIChyd3MsIGl3cywgTikge1xuICAgIGlmIChOIDw9IDEpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHQgPSByd3NbaV07XG5cbiAgICAgIHJ3c1tpXSA9IHJ3c1tOIC0gaSAtIDFdO1xuICAgICAgcndzW04gLSBpIC0gMV0gPSB0O1xuXG4gICAgICB0ID0gaXdzW2ldO1xuXG4gICAgICBpd3NbaV0gPSAtaXdzW04gLSBpIC0gMV07XG4gICAgICBpd3NbTiAtIGkgLSAxXSA9IC10O1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbiBub3JtYWxpemUxM2IgKHdzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB3ID0gTWF0aC5yb3VuZCh3c1syICogaSArIDFdIC8gTikgKiAweDIwMDAgK1xuICAgICAgICBNYXRoLnJvdW5kKHdzWzIgKiBpXSAvIE4pICtcbiAgICAgICAgY2Fycnk7XG5cbiAgICAgIHdzW2ldID0gdyAmIDB4M2ZmZmZmZjtcblxuICAgICAgaWYgKHcgPCAweDQwMDAwMDApIHtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FycnkgPSB3IC8gMHg0MDAwMDAwIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3M7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uIGNvbnZlcnQxM2IgKHdzLCBsZW4sIHJ3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FycnkgPSBjYXJyeSArICh3c1tpXSB8IDApO1xuXG4gICAgICByd3NbMiAqIGldID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgICAgcndzWzIgKiBpICsgMV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgfVxuXG4gICAgLy8gUGFkIHdpdGggemVyb2VzXG4gICAgZm9yIChpID0gMiAqIGxlbjsgaSA8IE47ICsraSkge1xuICAgICAgcndzW2ldID0gMDtcbiAgICB9XG5cbiAgICBhc3NlcnQoY2FycnkgPT09IDApO1xuICAgIGFzc2VydCgoY2FycnkgJiB+MHgxZmZmKSA9PT0gMCk7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uIHN0dWIgKE4pIHtcbiAgICB2YXIgcGggPSBuZXcgQXJyYXkoTik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHBoW2ldID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGg7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uIG11bHAgKHgsIHksIG91dCkge1xuICAgIHZhciBOID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgsIHkubGVuZ3RoKTtcblxuICAgIHZhciByYnQgPSB0aGlzLm1ha2VSQlQoTik7XG5cbiAgICB2YXIgXyA9IHRoaXMuc3R1YihOKTtcblxuICAgIHZhciByd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIHJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGl3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgbnJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbnJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5pd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIHJtd3MgPSBvdXQud29yZHM7XG4gICAgcm13cy5sZW5ndGggPSBOO1xuXG4gICAgdGhpcy5jb252ZXJ0MTNiKHgud29yZHMsIHgubGVuZ3RoLCByd3MsIE4pO1xuICAgIHRoaXMuY29udmVydDEzYih5LndvcmRzLCB5Lmxlbmd0aCwgbnJ3cywgTik7XG5cbiAgICB0aGlzLnRyYW5zZm9ybShyd3MsIF8sIHJ3c3QsIGl3c3QsIE4sIHJidCk7XG4gICAgdGhpcy50cmFuc2Zvcm0obnJ3cywgXywgbnJ3c3QsIG5pd3N0LCBOLCByYnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHZhciByeCA9IHJ3c3RbaV0gKiBucndzdFtpXSAtIGl3c3RbaV0gKiBuaXdzdFtpXTtcbiAgICAgIGl3c3RbaV0gPSByd3N0W2ldICogbml3c3RbaV0gKyBpd3N0W2ldICogbnJ3c3RbaV07XG4gICAgICByd3N0W2ldID0gcng7XG4gICAgfVxuXG4gICAgdGhpcy5jb25qdWdhdGUocndzdCwgaXdzdCwgTik7XG4gICAgdGhpcy50cmFuc2Zvcm0ocndzdCwgaXdzdCwgcm13cywgXywgTiwgcmJ0KTtcbiAgICB0aGlzLmNvbmp1Z2F0ZShybXdzLCBfLCBOKTtcbiAgICB0aGlzLm5vcm1hbGl6ZTEzYihybXdzLCBOKTtcblxuICAgIG91dC5uZWdhdGl2ZSA9IHgubmVnYXRpdmUgXiB5Lm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSB4Lmxlbmd0aCArIHkubGVuZ3RoO1xuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBgdGhpc2AgYnkgYG51bWBcbiAgQk4ucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tdWxUbyhudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgZW1wbG95aW5nIEZGVFxuICBCTi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uIG11bGYgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIE11bHRpcGxpY2F0aW9uXG4gIEJOLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uIGltdWxuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuXG4gICAgLy8gQ2FycnlcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICogbnVtO1xuICAgICAgdmFyIGxvID0gKHcgJiAweDNmZmZmZmYpICsgKGNhcnJ5ICYgMHgzZmZmZmZmKTtcbiAgICAgIGNhcnJ5ID4+PSAyNjtcbiAgICAgIGNhcnJ5ICs9ICh3IC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAvLyBOT1RFOiBsbyBpcyAyN2JpdCBtYXhpbXVtXG4gICAgICBjYXJyeSArPSBsbyA+Pj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IG51bSA9PT0gMCA/IDEgOiB0aGlzLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24gbXVsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpO1xuICB9O1xuXG4gIC8vIE1hdGgucG93KGB0aGlzYCwgYG51bWApXG4gIEJOLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKG51bSkge1xuICAgIHZhciB3ID0gdG9CaXRBcnJheShudW0pO1xuICAgIGlmICh3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBCTigxKTtcblxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXNcbiAgICB2YXIgcmVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcubGVuZ3RoOyBpKyssIHJlcyA9IHJlcy5zcXIoKSkge1xuICAgICAgaWYgKHdbaV0gIT09IDApIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgrK2kgPCB3Lmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgcSA9IHJlcy5zcXIoKTsgaSA8IHcubGVuZ3RoOyBpKyssIHEgPSBxLnNxcigpKSB7XG4gICAgICAgIGlmICh3W2ldID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSByZXMubXVsKHEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24gaXVzaGxuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuICAgIHZhciBjYXJyeU1hc2sgPSAoMHgzZmZmZmZmID4+PiAoMjYgLSByKSkgPDwgKDI2IC0gcik7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0NhcnJ5ID0gdGhpcy53b3Jkc1tpXSAmIGNhcnJ5TWFzaztcbiAgICAgICAgdmFyIGMgPSAoKHRoaXMud29yZHNbaV0gfCAwKSAtIG5ld0NhcnJ5KSA8PCByO1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYyB8IGNhcnJ5O1xuICAgICAgICBjYXJyeSA9IG5ld0NhcnJ5ID4+PiAoMjYgLSByKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcnJ5KSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyBzXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbiBpc2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaHJuKGJpdHMsIGhpbnQsIGV4dGVuZGVkKTtcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0XG4gIEJOLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24gc2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24gdXNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodFxuICBCTi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uIHNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uIHVzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyk7XG4gIH07XG5cbiAgLy8gVGVzdCBpZiBuIGJpdCBpcyBzZXRcbiAgQk4ucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24gdGVzdG4gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgYml0IGFuZCByZXR1cm5cbiAgICB2YXIgdyA9IHRoaXMud29yZHNbc107XG5cbiAgICByZXR1cm4gISEodyAmIHEpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlciAoaW4tcGxhY2UpXG4gIEJOLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbiBpbWFza24gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG5cbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ2ltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycycpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICBzKys7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5taW4ocywgdGhpcy5sZW5ndGgpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IG1hc2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXJcbiAgQk4ucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24gbWFza24gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihiaXRzKTtcbiAgfTtcblxuICAvLyBBZGQgcGxhaW4gbnVtYmVyIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbiBpYWRkbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaXN1Ym4oLW51bSk7XG5cbiAgICAvLyBQb3NzaWJsZSBzaWduIGNoYW5nZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IG51bSkge1xuICAgICAgICB0aGlzLndvcmRzWzBdID0gbnVtIC0gKHRoaXMud29yZHNbMF0gfCAwKTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaXN1Ym4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhvdXQgY2hlY2tzXG4gICAgcmV0dXJuIHRoaXMuX2lhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uIF9pYWRkbiAobnVtKSB7XG4gICAgdGhpcy53b3Jkc1swXSArPSBudW07XG5cbiAgICAvLyBDYXJyeVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA+PSAweDQwMDAwMDA7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSAtPSAweDQwMDAwMDA7XG4gICAgICBpZiAoaSA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkgKyAxKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IHBsYWluIG51bWJlciBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbiBpc3VibiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaWFkZG4oLW51bSk7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGRuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMud29yZHNbMF0gLT0gbnVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF07XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FycnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA8IDA7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldICs9IDB4NDAwMDAwMDtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24gYWRkbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24gc3VibiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24gaWFicyAoKSB7XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24gYWJzICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24gX2lzaGxuc3VibXVsIChudW0sIG11bCwgc2hpZnQpIHtcbiAgICB2YXIgbGVuID0gbnVtLmxlbmd0aCArIHNoaWZ0O1xuICAgIHZhciBpO1xuXG4gICAgdGhpcy5fZXhwYW5kKGxlbik7XG5cbiAgICB2YXIgdztcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIHZhciByaWdodCA9IChudW0ud29yZHNbaV0gfCAwKSAqIG11bDtcbiAgICAgIHcgLT0gcmlnaHQgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9ICh3ID4+IDI2KSAtICgocmlnaHQgLyAweDQwMDAwMDApIHwgMCk7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoIC0gc2hpZnQ7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgPT09IDApIHJldHVybiB0aGlzLnN0cmlwKCk7XG5cbiAgICAvLyBTdWJ0cmFjdGlvbiBvdmVyZmxvd1xuICAgIGFzc2VydChjYXJyeSA9PT0gLTEpO1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9IC0odGhpcy53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uIF93b3JkRGl2IChudW0sIG1vZGUpIHtcbiAgICB2YXIgc2hpZnQgPSB0aGlzLmxlbmd0aCAtIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIHZhciBiaGlCaXRzID0gdGhpcy5fY291bnRCaXRzKGJoaSk7XG4gICAgc2hpZnQgPSAyNiAtIGJoaUJpdHM7XG4gICAgaWYgKHNoaWZ0ICE9PSAwKSB7XG4gICAgICBiID0gYi51c2hsbihzaGlmdCk7XG4gICAgICBhLml1c2hsbihzaGlmdCk7XG4gICAgICBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcXVvdGllbnRcbiAgICB2YXIgbSA9IGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgdmFyIHE7XG5cbiAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgIHEgPSBuZXcgQk4obnVsbCk7XG4gICAgICBxLmxlbmd0aCA9IG0gKyAxO1xuICAgICAgcS53b3JkcyA9IG5ldyBBcnJheShxLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcS53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRpZmYgPSBhLmNsb25lKCkuX2lzaGxuc3VibXVsKGIsIDEsIG0pO1xuICAgIGlmIChkaWZmLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBhID0gZGlmZjtcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbbV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSBtIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIHZhciBxaiA9IChhLndvcmRzW2IubGVuZ3RoICsgal0gfCAwKSAqIDB4NDAwMDAwMCArXG4gICAgICAgIChhLndvcmRzW2IubGVuZ3RoICsgaiAtIDFdIHwgMCk7XG5cbiAgICAgIC8vIE5PVEU6IChxaiAvIGJoaSkgaXMgKDB4M2ZmZmZmZiAqIDB4NDAwMDAwMCArIDB4M2ZmZmZmZikgLyAweDIwMDAwMDAgbWF4XG4gICAgICAvLyAoMHg3ZmZmZmZmKVxuICAgICAgcWogPSBNYXRoLm1pbigocWogLyBiaGkpIHwgMCwgMHgzZmZmZmZmKTtcblxuICAgICAgYS5faXNobG5zdWJtdWwoYiwgcWosIGopO1xuICAgICAgd2hpbGUgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgcWotLTtcbiAgICAgICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIGEuX2lzaGxuc3VibXVsKGIsIDEsIGopO1xuICAgICAgICBpZiAoIWEuaXNaZXJvKCkpIHtcbiAgICAgICAgICBhLm5lZ2F0aXZlIF49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbal0gPSBxajtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHEpIHtcbiAgICAgIHEuc3RyaXAoKTtcbiAgICB9XG4gICAgYS5zdHJpcCgpO1xuXG4gICAgLy8gRGVub3JtYWxpemVcbiAgICBpZiAobW9kZSAhPT0gJ2RpdicgJiYgc2hpZnQgIT09IDApIHtcbiAgICAgIGEuaXVzaHJuKHNoaWZ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGl2OiBxIHx8IG51bGwsXG4gICAgICBtb2Q6IGFcbiAgICB9O1xuICB9O1xuXG4gIC8vIE5PVEU6IDEpIGBtb2RlYCBjYW4gYmUgc2V0IHRvIGBtb2RgIHRvIHJlcXVlc3QgbW9kIG9ubHksXG4gIC8vICAgICAgIHRvIGBkaXZgIHRvIHJlcXVlc3QgZGl2IG9ubHksIG9yIGJlIGFic2VudCB0b1xuICAvLyAgICAgICByZXF1ZXN0IGJvdGggZGl2ICYgbW9kXG4gIC8vICAgICAgIDIpIGBwb3NpdGl2ZWAgaXMgdHJ1ZSBpZiB1bnNpZ25lZCBtb2QgaXMgcmVxdWVzdGVkXG4gIEJOLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbiBkaXZtb2QgKG51bSwgbW9kZSwgcG9zaXRpdmUpIHtcbiAgICBhc3NlcnQoIW51bS5pc1plcm8oKSk7XG5cbiAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogbmV3IEJOKDApXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkaXYsIG1vZCwgcmVzO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlhZGQobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogcmVzLm1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMubmVnYXRpdmUgJiBudW0ubmVnYXRpdmUpICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pc3ViKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiByZXMuZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlIGF0IHRoaXMgcG9pbnRcblxuICAgIC8vIFN0cmlwIGJvdGggbnVtYmVycyB0byBhcHByb3hpbWF0ZSBzaGlmdCB2YWx1ZVxuICAgIGlmIChudW0ubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAobnVtKSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IHRoaXNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyeSBzaG9ydCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKG1vZGUgPT09ICdkaXYnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdtb2QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmREaXYobnVtLCBtb2RlKTtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAvIGBudW1gXG4gIEJOLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbiBkaXYgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdkaXYnLCBmYWxzZSkuZGl2O1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgICUgYG51bWBcbiAgQk4ucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uIG1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIGZhbHNlKS5tb2Q7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbiB1bW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgdHJ1ZSkubW9kO1xuICB9O1xuXG4gIC8vIEZpbmQgUm91bmQoYHRoaXNgIC8gYG51bWApXG4gIEJOLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uIGRpdlJvdW5kIChudW0pIHtcbiAgICB2YXIgZG0gPSB0aGlzLmRpdm1vZChudW0pO1xuXG4gICAgLy8gRmFzdCBjYXNlIC0gZXhhY3QgZGl2aXNpb25cbiAgICBpZiAoZG0ubW9kLmlzWmVybygpKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgdmFyIG1vZCA9IGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLm1vZC5pc3ViKG51bSkgOiBkbS5tb2Q7XG5cbiAgICB2YXIgaGFsZiA9IG51bS51c2hybigxKTtcbiAgICB2YXIgcjIgPSBudW0uYW5kbG4oMSk7XG4gICAgdmFyIGNtcCA9IG1vZC5jbXAoaGFsZik7XG5cbiAgICAvLyBSb3VuZCBkb3duXG4gICAgaWYgKGNtcCA8IDAgfHwgcjIgPT09IDEgJiYgY21wID09PSAwKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgLy8gUm91bmQgdXBcbiAgICByZXR1cm4gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0uZGl2LmlzdWJuKDEpIDogZG0uZGl2LmlhZGRuKDEpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24gbW9kbiAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuICAgIHZhciBwID0gKDEgPDwgMjYpICUgbnVtO1xuXG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGFjYyA9IChwICogYWNjICsgKHRoaXMud29yZHNbaV0gfCAwKSkgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBkaXZpc2lvbiBieSBudW1iZXJcbiAgQk4ucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24gaWRpdm4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5ICogMHg0MDAwMDAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9ICh3IC8gbnVtKSB8IDA7XG4gICAgICBjYXJyeSA9IHcgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uIGRpdm4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uIGVnY2QgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciB4ID0gdGhpcztcbiAgICB2YXIgeSA9IHAuY2xvbmUoKTtcblxuICAgIGlmICh4Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB4ID0geC51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geC5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8vIEEgKiB4ICsgQiAqIHkgPSB4XG4gICAgdmFyIEEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIEIgPSBuZXcgQk4oMCk7XG5cbiAgICAvLyBDICogeCArIEQgKiB5ID0geVxuICAgIHZhciBDID0gbmV3IEJOKDApO1xuICAgIHZhciBEID0gbmV3IEJOKDEpO1xuXG4gICAgdmFyIGcgPSAwO1xuXG4gICAgd2hpbGUgKHguaXNFdmVuKCkgJiYgeS5pc0V2ZW4oKSkge1xuICAgICAgeC5pdXNocm4oMSk7XG4gICAgICB5Lml1c2hybigxKTtcbiAgICAgICsrZztcbiAgICB9XG5cbiAgICB2YXIgeXAgPSB5LmNsb25lKCk7XG4gICAgdmFyIHhwID0geC5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKCF4LmlzWmVybygpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoeC53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHguaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmIChBLmlzT2RkKCkgfHwgQi5pc09kZCgpKSB7XG4gICAgICAgICAgICBBLmlhZGQoeXApO1xuICAgICAgICAgICAgQi5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBBLml1c2hybigxKTtcbiAgICAgICAgICBCLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoeS53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIHkuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmIChDLmlzT2RkKCkgfHwgRC5pc09kZCgpKSB7XG4gICAgICAgICAgICBDLmlhZGQoeXApO1xuICAgICAgICAgICAgRC5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBDLml1c2hybigxKTtcbiAgICAgICAgICBELml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoeC5jbXAoeSkgPj0gMCkge1xuICAgICAgICB4LmlzdWIoeSk7XG4gICAgICAgIEEuaXN1YihDKTtcbiAgICAgICAgQi5pc3ViKEQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeS5pc3ViKHgpO1xuICAgICAgICBDLmlzdWIoQSk7XG4gICAgICAgIEQuaXN1YihCKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYTogQyxcbiAgICAgIGI6IEQsXG4gICAgICBnY2Q6IHkuaXVzaGxuKGcpXG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGlzIHJlZHVjZWQgaW5jYXJuYXRpb24gb2YgdGhlIGJpbmFyeSBFRUFcbiAgLy8gYWJvdmUsIGRlc2lnbmF0ZWQgdG8gaW52ZXJ0IG1lbWJlcnMgb2YgdGhlXG4gIC8vIF9wcmltZV8gZmllbGRzIEYocCkgYXQgYSBtYXhpbWFsIHNwZWVkXG4gIEJOLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbiBfaW52bXAgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciBhID0gdGhpcztcbiAgICB2YXIgYiA9IHAuY2xvbmUoKTtcblxuICAgIGlmIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBhID0gYS51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgICB2YXIgeDIgPSBuZXcgQk4oMCk7XG5cbiAgICB2YXIgZGVsdGEgPSBiLmNsb25lKCk7XG5cbiAgICB3aGlsZSAoYS5jbXBuKDEpID4gMCAmJiBiLmNtcG4oMSkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoYS53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGEuaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmICh4MS5pc09kZCgpKSB7XG4gICAgICAgICAgICB4MS5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4MS5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKGIud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICBiLml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDIuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDIuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhLmNtcChiKSA+PSAwKSB7XG4gICAgICAgIGEuaXN1YihiKTtcbiAgICAgICAgeDEuaXN1Yih4Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiLmlzdWIoYSk7XG4gICAgICAgIHgyLmlzdWIoeDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXM7XG4gICAgaWYgKGEuY21wbigxKSA9PT0gMCkge1xuICAgICAgcmVzID0geDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHgyO1xuICAgIH1cblxuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uIGdjZCAobnVtKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiBudW0uYWJzKCk7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIHRoaXMuYWJzKCk7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bS5jbG9uZSgpO1xuICAgIGEubmVnYXRpdmUgPSAwO1xuICAgIGIubmVnYXRpdmUgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGNvbW1vbiBmYWN0b3Igb2YgdHdvXG4gICAgZm9yICh2YXIgc2hpZnQgPSAwOyBhLmlzRXZlbigpICYmIGIuaXNFdmVuKCk7IHNoaWZ0KyspIHtcbiAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgYi5pdXNocm4oMSk7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKGEuaXNFdmVuKCkpIHtcbiAgICAgICAgYS5pdXNocm4oMSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYi5pc0V2ZW4oKSkge1xuICAgICAgICBiLml1c2hybigxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBhLmNtcChiKTtcbiAgICAgIGlmIChyIDwgMCkge1xuICAgICAgICAvLyBTd2FwIGBhYCBhbmQgYGJgIHRvIG1ha2UgYGFgIGFsd2F5cyBiaWdnZXIgdGhhbiBgYmBcbiAgICAgICAgdmFyIHQgPSBhO1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYiA9IHQ7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IDAgfHwgYi5jbXBuKDEpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBhLmlzdWIoYik7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICByZXR1cm4gYi5pdXNobG4oc2hpZnQpO1xuICB9O1xuXG4gIC8vIEludmVydCBudW1iZXIgaW4gdGhlIGZpZWxkIEYobnVtKVxuICBCTi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7XG4gIH07XG5cbiAgLy8gQW5kIGZpcnN0IHdvcmQgYW5kIG51bVxuICBCTi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbiBhbmRsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBudW07XG4gIH07XG5cbiAgLy8gSW5jcmVtZW50IGF0IHRoZSBiaXQgcG9zaXRpb24gaW4tbGluZVxuICBCTi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbiBiaW5jbiAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICB0aGlzLl9leHBhbmQocyArIDEpO1xuICAgICAgdGhpcy53b3Jkc1tzXSB8PSBxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJpdCBhbmQgcHJvcGFnYXRlLCBpZiBuZWVkZWRcbiAgICB2YXIgY2FycnkgPSBxO1xuICAgIGZvciAodmFyIGkgPSBzOyBjYXJyeSAhPT0gMCAmJiBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHcgKz0gY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4+IDI2O1xuICAgICAgdyAmPSAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdztcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uIGNtcG4gKG51bSkge1xuICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhbmVnYXRpdmUpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBuZWdhdGl2ZSkgcmV0dXJuIDE7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJlcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICBudW0gPSAtbnVtO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZiwgJ051bWJlciBpcyB0b28gYmlnJyk7XG5cbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1swXSB8IDA7XG4gICAgICByZXMgPSB3ID09PSBudW0gPyAwIDogdyA8IG51bSA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvbXBhcmUgdHdvIG51bWJlcnMgYW5kIHJldHVybjpcbiAgLy8gMSAtIGlmIGB0aGlzYCA+IGBudW1gXG4gIC8vIDAgLSBpZiBgdGhpc2AgPT0gYG51bWBcbiAgLy8gLTEgLSBpZiBgdGhpc2AgPCBgbnVtYFxuICBCTi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24gY21wIChudW0pIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHJldHVybiAxO1xuXG4gICAgdmFyIHJlcyA9IHRoaXMudWNtcChudW0pO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBVbnNpZ25lZCBjb21wYXJpc29uXG4gIEJOLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24gdWNtcCAobnVtKSB7XG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgaGF2ZSB0aGUgc2FtZSBzaWduXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBhID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB2YXIgYiA9IG51bS53b3Jkc1tpXSB8IDA7XG5cbiAgICAgIGlmIChhID09PSBiKSBjb250aW51ZTtcbiAgICAgIGlmIChhIDwgYikge1xuICAgICAgICByZXMgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgcmVzID0gMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbiBndG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbiBndCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbiBndGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24gZ3RlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbiBsdG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gbHQgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uIGx0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbiBsdGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uIGVxbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMDtcbiAgfTtcblxuICAvL1xuICAvLyBBIHJlZHVjZSBjb250ZXh0LCBjb3VsZCBiZSB1c2luZyBtb250Z29tZXJ5IG9yIHNvbWV0aGluZyBiZXR0ZXIsIGRlcGVuZGluZ1xuICAvLyBvbiB0aGUgYG1gIGl0c2VsZi5cbiAgLy9cbiAgQk4ucmVkID0gZnVuY3Rpb24gcmVkIChudW0pIHtcbiAgICByZXR1cm4gbmV3IFJlZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uIHRvUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICByZXR1cm4gY3R4LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uIGZyb21SZWQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ2Zyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uIF9mb3JjZVJlZCAoY3R4KSB7XG4gICAgdGhpcy5yZWQgPSBjdHg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24gZm9yY2VSZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uIHJlZEFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5hZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uIHJlZElBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlhZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24gcmVkU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24gcmVkSVN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbiByZWRTaGwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc2hsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uIHJlZE11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24gcmVkSU11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmltdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24gcmVkU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uIHJlZElTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gIH07XG5cbiAgLy8gU3F1YXJlIHJvb3Qgb3ZlciBwXG4gIEJOLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24gcmVkU3FydCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uIHJlZEludm0gKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmludm0odGhpcyk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYCAlIGByZWQgbW9kdWxvYFxuICBCTi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24gcmVkTmVnICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm5lZyh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24gcmVkUG93IChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQgJiYgIW51bS5yZWQsICdyZWRQb3cobm9ybWFsTnVtKScpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5wb3codGhpcywgbnVtKTtcbiAgfTtcblxuICAvLyBQcmltZSBudW1iZXJzIHdpdGggZWZmaWNpZW50IHJlZHVjdGlvblxuICB2YXIgcHJpbWVzID0ge1xuICAgIGsyNTY6IG51bGwsXG4gICAgcDIyNDogbnVsbCxcbiAgICBwMTkyOiBudWxsLFxuICAgIHAyNTUxOTogbnVsbFxuICB9O1xuXG4gIC8vIFBzZXVkby1NZXJzZW5uZSBwcmltZVxuICBmdW5jdGlvbiBNUHJpbWUgKG5hbWUsIHApIHtcbiAgICAvLyBQID0gMiBeIE4gLSBLXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnAgPSBuZXcgQk4ocCwgMTYpO1xuICAgIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKTtcbiAgICB0aGlzLmsgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApO1xuXG4gICAgdGhpcy50bXAgPSB0aGlzLl90bXAoKTtcbiAgfVxuXG4gIE1QcmltZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uIF90bXAgKCkge1xuICAgIHZhciB0bXAgPSBuZXcgQk4obnVsbCk7XG4gICAgdG1wLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpO1xuICAgIHJldHVybiB0bXA7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24gaXJlZHVjZSAobnVtKSB7XG4gICAgLy8gQXNzdW1lcyB0aGF0IGBudW1gIGlzIGxlc3MgdGhhbiBgUF4yYFxuICAgIC8vIG51bSA9IEhJICogKDIgXiBOIC0gSykgKyBISSAqIEsgKyBMTyA9IEhJICogSyArIExPIChtb2QgUClcbiAgICB2YXIgciA9IG51bTtcbiAgICB2YXIgcmxlbjtcblxuICAgIGRvIHtcbiAgICAgIHRoaXMuc3BsaXQociwgdGhpcy50bXApO1xuICAgICAgciA9IHRoaXMuaW11bEsocik7XG4gICAgICByID0gci5pYWRkKHRoaXMudG1wKTtcbiAgICAgIHJsZW4gPSByLmJpdExlbmd0aCgpO1xuICAgIH0gd2hpbGUgKHJsZW4gPiB0aGlzLm4pO1xuXG4gICAgdmFyIGNtcCA9IHJsZW4gPCB0aGlzLm4gPyAtMSA6IHIudWNtcCh0aGlzLnApO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHIud29yZHNbMF0gPSAwO1xuICAgICAgci5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgci5pc3ViKHRoaXMucCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyLnN0cmlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NCBpbnN0YW5jZVxuICAgICAgICByLnN0cmlwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByIGlzIEJOIHY1IGluc3RhbmNlXG4gICAgICAgIHIuX3N0cmlwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsCiAgICAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwKICAgICJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwKICAgICIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbnZhciBzYWZlciA9IHt9XG5cbnZhciBrZXlcblxuZm9yIChrZXkgaW4gYnVmZmVyKSB7XG4gIGlmICghYnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdTbG93QnVmZmVyJyB8fCBrZXkgPT09ICdCdWZmZXInKSBjb250aW51ZVxuICBzYWZlcltrZXldID0gYnVmZmVyW2tleV1cbn1cblxudmFyIFNhZmVyID0gc2FmZXIuQnVmZmVyID0ge31cbmZvciAoa2V5IGluIEJ1ZmZlcikge1xuICBpZiAoIUJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnYWxsb2NVbnNhZmUnIHx8IGtleSA9PT0gJ2FsbG9jVW5zYWZlU2xvdycpIGNvbnRpbnVlXG4gIFNhZmVyW2tleV0gPSBCdWZmZXJba2V5XVxufVxuXG5zYWZlci5CdWZmZXIucHJvdG90eXBlID0gQnVmZmVyLnByb3RvdHlwZVxuXG5pZiAoIVNhZmVyLmZyb20gfHwgU2FmZXIuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSB7XG4gIFNhZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG59XG5cbmlmICghU2FmZXIuYWxsb2MpIHtcbiAgU2FmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHNpemUpXG4gICAgfVxuICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IDIgKiAoMSA8PCAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICAgIH1cbiAgICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gICAgaWYgKCFmaWxsIHx8IGZpbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICBidWYuZmlsbCgwKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICAgIHJldHVybiBidWZcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgdHJ5IHtcbiAgICBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoID0gcHJvY2Vzcy5iaW5kaW5nKCdidWZmZXInKS5rU3RyaW5nTWF4TGVuZ3RoXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyB3ZSBjYW4ndCBkZXRlcm1pbmUga1N0cmluZ01heExlbmd0aCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgcHJvY2Vzcy5iaW5kaW5nXG4gICAgLy8gaXMgdW5zdXBwb3J0ZWQsIHNvIGxldCdzIG5vdCBzZXQgaXRcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmNvbnN0YW50cykge1xuICBzYWZlci5jb25zdGFudHMgPSB7XG4gICAgTUFYX0xFTkdUSDogc2FmZXIua01heExlbmd0aFxuICB9XG4gIGlmIChzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gICAgc2FmZXIuY29uc3RhbnRzLk1BWF9TVFJJTkdfTEVOR1RIID0gc2FmZXIua1N0cmluZ01heExlbmd0aFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIFJlcG9ydGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5fcmVwb3J0ZXJTdGF0ZSA9IHtcbiAgICBvYmo6IG51bGwsXG4gICAgcGF0aDogW10sXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG59XG5leHBvcnRzLlJlcG9ydGVyID0gUmVwb3J0ZXI7XG5cblJlcG9ydGVyLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5vYmogPSBkYXRhLm9iajtcbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgZGF0YS5wYXRoTGVuKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlcktleSA9IGZ1bmN0aW9uIGVudGVyS2V5KGtleSkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLnB1c2goa2V5KTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5leGl0S2V5ID0gZnVuY3Rpb24gZXhpdEtleShpbmRleCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgaW5kZXggLSAxKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZUtleSA9IGZ1bmN0aW9uIGxlYXZlS2V5KGluZGV4LCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB0aGlzLmV4aXRLZXkoaW5kZXgpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbignLycpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyT2JqZWN0ID0gZnVuY3Rpb24gZW50ZXJPYmplY3QoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBwcmV2ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSB7fTtcbiAgcmV0dXJuIHByZXY7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVPYmplY3QgPSBmdW5jdGlvbiBsZWF2ZU9iamVjdChwcmV2KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBub3cgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHByZXY7XG4gIHJldHVybiBub3c7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgbGV0IGVycjtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IGluaGVyaXRlZCA9IG1zZyBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG4gIGlmIChpbmhlcml0ZWQpIHtcbiAgICBlcnIgPSBtc2c7XG4gIH0gZWxzZSB7XG4gICAgZXJyID0gbmV3IFJlcG9ydGVyRXJyb3Ioc3RhdGUucGF0aC5tYXAoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuICdbJyArIEpTT04uc3RyaW5naWZ5KGVsZW0pICsgJ10nO1xuICAgIH0pLmpvaW4oJycpLCBtc2cubWVzc2FnZSB8fCBtc2csIG1zZy5zdGFjayk7XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICB0aHJvdyBlcnI7XG5cbiAgaWYgKCFpbmhlcml0ZWQpXG4gICAgc3RhdGUuZXJyb3JzLnB1c2goZXJyKTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLndyYXBSZXN1bHQgPSBmdW5jdGlvbiB3cmFwUmVzdWx0KHJlc3VsdCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN1bHQ6IHRoaXMuaXNFcnJvcihyZXN1bHQpID8gbnVsbCA6IHJlc3VsdCxcbiAgICBlcnJvcnM6IHN0YXRlLmVycm9yc1xuICB9O1xufTtcblxuZnVuY3Rpb24gUmVwb3J0ZXJFcnJvcihwYXRoLCBtc2cpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5yZXRocm93KG1zZyk7XG59XG5pbmhlcml0cyhSZXBvcnRlckVycm9yLCBFcnJvcik7XG5cblJlcG9ydGVyRXJyb3IucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbiByZXRocm93KG1zZykge1xuICB0aGlzLm1lc3NhZ2UgPSBtc2cgKyAnIGF0OiAnICsgKHRoaXMucGF0aCB8fCAnKHNoYWxsb3cpJyk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXBvcnRlckVycm9yKTtcblxuICBpZiAoIXRoaXMuc3RhY2spIHtcbiAgICB0cnkge1xuICAgICAgLy8gSUUgb25seSBhZGRzIHN0YWNrIHdoZW4gdGhyb3duXG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0YWNrID0gZS5zdGFjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZS9yZXBvcnRlcicpLlJlcG9ydGVyO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0RlY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERlY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YS5iYXNlKSAmJlxuICAgIGRhdGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ0RlY29kZXJCdWZmZXInICYmXG4gICAgdHlwZW9mIGRhdGEub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5zYXZlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVzdG9yZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yZWFkVUludDggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5za2lwID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmF3ID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgcmV0dXJuIHsgb2Zmc2V0OiB0aGlzLm9mZnNldCwgcmVwb3J0ZXI6IFJlcG9ydGVyLnByb3RvdHlwZS5zYXZlLmNhbGwodGhpcykgfTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKHNhdmUpIHtcbiAgLy8gUmV0dXJuIHNraXBwZWQgZGF0YVxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuICByZXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICBSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsIHNhdmUucmVwb3J0ZXIpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKSB7XG4gIGlmICh0aGlzLm9mZnNldCArIDEgPD0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGJ5dGVzLCBmYWlsKSB7XG4gIGlmICghKHRoaXMub2Zmc2V0ICsgYnl0ZXMgPD0gdGhpcy5sZW5ndGgpKVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xuXG4gIGNvbnN0IHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG5cbiAgLy8gU2hhcmUgcmVwb3J0ZXIgc3RhdGVcbiAgcmVzLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldCArIGJ5dGVzO1xuICB0aGlzLm9mZnNldCArPSBieXRlcztcbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uIHJhdyhzYXZlKSB7XG4gIHJldHVybiB0aGlzLmJhc2Uuc2xpY2Uoc2F2ZSA/IHNhdmUub2Zmc2V0IDogdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoKTtcbn07XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIoaXRlbSkpXG4gICAgICAgIGl0ZW0gPSBuZXcgRW5jb2RlckJ1ZmZlcihpdGVtLCByZXBvcnRlcik7XG4gICAgICB0aGlzLmxlbmd0aCArPSBpdGVtLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoISgwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4ZmYpKVxuICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlJyk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbnN1cHBvcnRlZCB0eXBlOiAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0cy5FbmNvZGVyQnVmZmVyID0gRW5jb2RlckJ1ZmZlcjtcblxuRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0VuY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVuY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbmNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5qb2luID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBCdWZmZXIuYWxsb2ModGhpcy5sZW5ndGgpO1xuICBpZiAoIW9mZnNldClcbiAgICBvZmZzZXQgPSAwO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gb3V0O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uam9pbihvdXQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gaXRlbS5sZW5ndGg7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgIG91dFtvZmZzZXRdID0gdGhpcy52YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICBvdXQud3JpdGUodGhpcy52YWx1ZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodGhpcy52YWx1ZSkpXG4gICAgICB0aGlzLnZhbHVlLmNvcHkob3V0LCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xuY29uc3QgdGFncyA9IFtcbiAgJ3NlcScsICdzZXFvZicsICdzZXQnLCAnc2V0b2YnLCAnb2JqaWQnLCAnYm9vbCcsXG4gICdnZW50aW1lJywgJ3V0Y3RpbWUnLCAnbnVsbF8nLCAnZW51bScsICdpbnQnLCAnb2JqRGVzYycsXG4gICdiaXRzdHInLCAnYm1wc3RyJywgJ2NoYXJzdHInLCAnZ2Vuc3RyJywgJ2dyYXBoc3RyJywgJ2lhNXN0cicsICdpc282NDZzdHInLFxuICAnbnVtc3RyJywgJ29jdHN0cicsICdwcmludHN0cicsICd0NjFzdHInLCAndW5pc3RyJywgJ3V0ZjhzdHInLCAndmlkZW9zdHInXG5dO1xuXG4vLyBQdWJsaWMgbWV0aG9kcyBsaXN0XG5jb25zdCBtZXRob2RzID0gW1xuICAna2V5JywgJ29iaicsICd1c2UnLCAnb3B0aW9uYWwnLCAnZXhwbGljaXQnLCAnaW1wbGljaXQnLCAnZGVmJywgJ2Nob2ljZScsXG4gICdhbnknLCAnY29udGFpbnMnXG5dLmNvbmNhdCh0YWdzKTtcblxuLy8gT3ZlcnJpZGVkIG1ldGhvZHMgbGlzdFxuY29uc3Qgb3ZlcnJpZGVkID0gW1xuICAnX3BlZWtUYWcnLCAnX2RlY29kZVRhZycsICdfdXNlJyxcbiAgJ19kZWNvZGVTdHInLCAnX2RlY29kZU9iamlkJywgJ19kZWNvZGVUaW1lJyxcbiAgJ19kZWNvZGVOdWxsJywgJ19kZWNvZGVJbnQnLCAnX2RlY29kZUJvb2wnLCAnX2RlY29kZUxpc3QnLFxuXG4gICdfZW5jb2RlQ29tcG9zaXRlJywgJ19lbmNvZGVTdHInLCAnX2VuY29kZU9iamlkJywgJ19lbmNvZGVUaW1lJyxcbiAgJ19lbmNvZGVOdWxsJywgJ19lbmNvZGVJbnQnLCAnX2VuY29kZUJvb2wnXG5dO1xuXG5mdW5jdGlvbiBOb2RlKGVuYywgcGFyZW50LCBuYW1lKSB7XG4gIGNvbnN0IHN0YXRlID0ge307XG4gIHRoaXMuX2Jhc2VTdGF0ZSA9IHN0YXRlO1xuXG4gIHN0YXRlLm5hbWUgPSBuYW1lO1xuICBzdGF0ZS5lbmMgPSBlbmM7XG5cbiAgc3RhdGUucGFyZW50ID0gcGFyZW50IHx8IG51bGw7XG4gIHN0YXRlLmNoaWxkcmVuID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBzdGF0ZS50YWcgPSBudWxsO1xuICBzdGF0ZS5hcmdzID0gbnVsbDtcbiAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBudWxsO1xuICBzdGF0ZS5jaG9pY2UgPSBudWxsO1xuICBzdGF0ZS5vcHRpb25hbCA9IGZhbHNlO1xuICBzdGF0ZS5hbnkgPSBmYWxzZTtcbiAgc3RhdGUub2JqID0gZmFsc2U7XG4gIHN0YXRlLnVzZSA9IG51bGw7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBudWxsO1xuICBzdGF0ZS5rZXkgPSBudWxsO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gbnVsbDtcbiAgc3RhdGUuZXhwbGljaXQgPSBudWxsO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmNvbnRhaW5zID0gbnVsbDtcblxuICAvLyBTaG91bGQgY3JlYXRlIG5ldyBpbnN0YW5jZSBvbiBlYWNoIG1ldGhvZFxuICBpZiAoIXN0YXRlLnBhcmVudCkge1xuICAgIHN0YXRlLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5fd3JhcCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cbmNvbnN0IHN0YXRlUHJvcHMgPSBbXG4gICdlbmMnLCAncGFyZW50JywgJ2NoaWxkcmVuJywgJ3RhZycsICdhcmdzJywgJ3JldmVyc2VBcmdzJywgJ2Nob2ljZScsXG4gICdvcHRpb25hbCcsICdhbnknLCAnb2JqJywgJ3VzZScsICdhbHRlcmVkVXNlJywgJ2tleScsICdkZWZhdWx0JywgJ2V4cGxpY2l0JyxcbiAgJ2ltcGxpY2l0JywgJ2NvbnRhaW5zJ1xuXTtcblxuTm9kZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGNzdGF0ZSA9IHt9O1xuICBzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGNzdGF0ZVtwcm9wXSA9IHN0YXRlW3Byb3BdO1xuICB9KTtcbiAgY29uc3QgcmVzID0gbmV3IHRoaXMuY29uc3RydWN0b3IoY3N0YXRlLnBhcmVudCk7XG4gIHJlcy5fYmFzZVN0YXRlID0gY3N0YXRlO1xuICByZXR1cm4gcmVzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbiB3cmFwKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCkge1xuICAgICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLnB1c2goY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lW21ldGhvZF0uYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgdGhpcyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoYm9keSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgYm9keS5jYWxsKHRoaXMpO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlblxuICBzdGF0ZS5jaGlsZHJlbiA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9PT0gdGhpcztcbiAgfSwgdGhpcyk7XG4gIGFzc2VydC5lcXVhbChzdGF0ZS5jaGlsZHJlbi5sZW5ndGgsIDEsICdSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl91c2VBcmdzID0gZnVuY3Rpb24gdXNlQXJncyhhcmdzKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlbiBhbmQgYXJnc1xuICBjb25zdCBjaGlsZHJlbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yO1xuICB9LCB0aGlzKTtcbiAgYXJncyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiAhKGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpO1xuICB9LCB0aGlzKTtcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmNoaWxkcmVuID09PSBudWxsKTtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgbGlua1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID0gdGhpcztcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBpZiAoYXJncy5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuYXJncyA9PT0gbnVsbCk7XG4gICAgc3RhdGUuYXJncyA9IGFyZ3M7XG4gICAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyB8fCBhcmcuY29uc3RydWN0b3IgIT09IE9iamVjdClcbiAgICAgICAgcmV0dXJuIGFyZztcblxuICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT0gKGtleSB8IDApKVxuICAgICAgICAgIGtleSB8PSAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldO1xuICAgICAgICByZXNbdmFsdWVdID0ga2V5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59O1xuXG4vL1xuLy8gT3ZlcnJpZGVkIG1ldGhvZHNcbi8vXG5cbm92ZXJyaWRlZC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBOb2RlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gX292ZXJyaWRlZCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQgZm9yIGVuY29kaW5nOiAnICsgc3RhdGUuZW5jKTtcbiAgfTtcbn0pO1xuXG4vL1xuLy8gUHVibGljIG1ldGhvZHNcbi8vXG5cbnRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpIHtcbiAgTm9kZS5wcm90b3R5cGVbdGFnXSA9IGZ1bmN0aW9uIF90YWdNZXRob2QoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhc3NlcnQoc3RhdGUudGFnID09PSBudWxsKTtcbiAgICBzdGF0ZS50YWcgPSB0YWc7XG5cbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuTm9kZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGl0ZW0pIHtcbiAgYXNzZXJ0KGl0ZW0pO1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmRlZiA9IGZ1bmN0aW9uIGRlZih2YWwpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gdmFsO1xuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5leHBsaWNpdCA9IGZ1bmN0aW9uIGV4cGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gb2JqKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmtleSA9PT0gbnVsbCk7XG4gIHN0YXRlLmtleSA9IG5ld0tleTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmFueSA9IGZ1bmN0aW9uIGFueSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgc3RhdGUuYW55ID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNob2ljZSA9IGZ1bmN0aW9uIGNob2ljZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUuY29udGFpbnMgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIERlY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gaW5wdXQud3JhcFJlc3VsdChzdGF0ZS5jaGlsZHJlblswXS5fZGVjb2RlKGlucHV0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHJlc3VsdCA9IHN0YXRlWydkZWZhdWx0J107XG4gIGxldCBwcmVzZW50ID0gdHJ1ZTtcblxuICBsZXQgcHJldktleSA9IG51bGw7XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwpXG4gICAgcHJldktleSA9IGlucHV0LmVudGVyS2V5KHN0YXRlLmtleSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFnIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCkge1xuICAgIGxldCB0YWcgPSBudWxsO1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmV4cGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuaW1wbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUudGFnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCAmJiAhc3RhdGUuYW55KSB7XG4gICAgICAvLyBUcmlhbCBhbmQgRXJyb3JcbiAgICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKVxuICAgICAgICAgIHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJlc2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlc2VudCA9IHRoaXMuX3BlZWtUYWcoaW5wdXQsIHRhZywgc3RhdGUuYW55KTtcblxuICAgICAgaWYgKGlucHV0LmlzRXJyb3IocHJlc2VudCkpXG4gICAgICAgIHJldHVybiBwcmVzZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggb2JqZWN0IG9uIHN0YWNrXG4gIGxldCBwcmV2T2JqO1xuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcHJldk9iaiA9IGlucHV0LmVudGVyT2JqZWN0KCk7XG5cbiAgaWYgKHByZXNlbnQpIHtcbiAgICAvLyBVbndyYXAgZXhwbGljaXQgdmFsdWVzXG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuX2RlY29kZVRhZyhpbnB1dCwgc3RhdGUuZXhwbGljaXQpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKVxuICAgICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgICBpbnB1dCA9IGV4cGxpY2l0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQub2Zmc2V0O1xuXG4gICAgLy8gVW53cmFwIGltcGxpY2l0IGFuZCBub3JtYWwgdmFsdWVzXG4gICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIGxldCBzYXZlO1xuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9kZWNvZGVUYWcoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnLFxuICAgICAgICBzdGF0ZS5hbnlcbiAgICAgICk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihib2R5KSlcbiAgICAgICAgcmV0dXJuIGJvZHk7XG5cbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHJlc3VsdCA9IGlucHV0LnJhdyhzYXZlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgaW5wdXQgPSBib2R5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIHN0YXJ0LCBpbnB1dC5sZW5ndGgsICd0YWdnZWQnKTtcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIGlucHV0Lm9mZnNldCwgaW5wdXQubGVuZ3RoLCAnY29udGVudCcpO1xuXG4gICAgLy8gU2VsZWN0IHByb3BlciBtZXRob2QgZm9yIHRhZ1xuICAgIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmlzRXJyb3IocmVzdWx0KSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAvLyBEZWNvZGUgY2hpbGRyZW5cbiAgICBpZiAoIXN0YXRlLmFueSAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwgJiYgc3RhdGUuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gZGVjb2RlQ2hpbGRyZW4oY2hpbGQpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGlnbm9yaW5nIGVycm9ycyBoZXJlLCB0byBsZXQgcGFyc2VyIGNvbnRpbnVlIHdpdGggb3RoZXJcbiAgICAgICAgLy8gcGFydHMgb2YgZW5jb2RlZCBkYXRhXG4gICAgICAgIGNoaWxkLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIGNvbnRhaW5lZC9lbmNvZGVkIGJ5IHNjaGVtYSwgb25seSBpbiBiaXQgb3Igb2N0ZXQgc3RyaW5nc1xuICAgIGlmIChzdGF0ZS5jb250YWlucyAmJiAoc3RhdGUudGFnID09PSAnb2N0c3RyJyB8fCBzdGF0ZS50YWcgPT09ICdiaXRzdHInKSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgICAgLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9wIG9iamVjdFxuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcmVzdWx0ID0gaW5wdXQubGVhdmVPYmplY3QocHJldk9iaik7XG5cbiAgLy8gU2V0IGtleVxuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsICYmIChyZXN1bHQgIT09IG51bGwgfHwgcHJlc2VudCA9PT0gdHJ1ZSkpXG4gICAgaW5wdXQubGVhdmVLZXkocHJldktleSwgc3RhdGUua2V5LCByZXN1bHQpO1xuICBlbHNlIGlmIChwcmV2S2V5ICE9PSBudWxsKVxuICAgIGlucHV0LmV4aXRLZXkocHJldktleSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdzZXEnIHx8IHRhZyA9PT0gJ3NldCcpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgPT09ICdzZXFvZicgfHwgdGFnID09PSAnc2V0b2YnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVMaXN0KGlucHV0LCB0YWcsIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgc3RhdGUuYXJnc1swXSwgc3RhdGUuYXJnc1sxXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIG51bGwsIG51bGwsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlVGltZShpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVOdWxsKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUJvb2woaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVJbnQoaW5wdXQsIHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG5cbiAgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCd1bmtub3duIHRhZzogJyArIHRhZyk7XG4gIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIC8vIENyZWF0ZSBhbHRlcmVkIHVzZSBkZWNvZGVyIGlmIGltcGxpY2l0IGlzIHNldFxuICBzdGF0ZS51c2VEZWNvZGVyID0gdGhpcy5fdXNlKGVudGl0eSwgb2JqKTtcbiAgYXNzZXJ0KHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdO1xuICBpZiAoc3RhdGUuaW1wbGljaXQgIT09IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCkge1xuICAgIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLmNsb25lKCk7XG4gICAgc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ID0gc3RhdGUuaW1wbGljaXQ7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnVzZURlY29kZXI7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24gZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGV0IG1hdGNoID0gZmFsc2U7XG5cbiAgT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKS5zb21lKGZ1bmN0aW9uKGtleSkge1xuICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgY29uc3Qgbm9kZSA9IHN0YXRlLmNob2ljZVtrZXldO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGUuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcih2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIW1hdGNoKVxuICAgIHJldHVybiBpbnB1dC5lcnJvcignQ2hvaWNlIG5vdCBtYXRjaGVkJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vXG4vLyBFbmNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBjcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgcmV0dXJuIG5ldyBFbmNvZGVyQnVmZmVyKGRhdGEsIHRoaXMucmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSB0aGlzLl9lbmNvZGVWYWx1ZShkYXRhLCByZXBvcnRlciwgcGFyZW50KTtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBpZiAodGhpcy5fc2tpcERlZmF1bHQocmVzdWx0LCByZXBvcnRlciwgcGFyZW50KSlcbiAgICByZXR1cm47XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW5bMF0uX2VuY29kZShkYXRhLCByZXBvcnRlciB8fCBuZXcgUmVwb3J0ZXIoKSk7XG5cbiAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgLy8gU2V0IHJlcG9ydGVyIHRvIHNoYXJlIGl0IHdpdGggYSBjaGlsZCBjbGFzc1xuICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0YSBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwgJiYgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwpXG4gICAgICBkYXRhID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbmNvZGUgY2hpbGRyZW4gZmlyc3RcbiAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICBsZXQgcHJpbWl0aXZlID0gZmFsc2U7XG4gIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAvLyBBbnl0aGluZyB0aGF0IHdhcyBnaXZlbiBpcyB0cmFuc2xhdGVkIHRvIGJ1ZmZlclxuICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlKSB7XG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jb250YWlucykge1xuICAgIGNvbnRlbnQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaGlsZHJlbikge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLnRhZyA9PT0gJ251bGxfJylcbiAgICAgICAgcmV0dXJuIGNoaWxkLl9lbmNvZGUobnVsbCwgcmVwb3J0ZXIsIGRhdGEpO1xuXG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXknKTtcbiAgICAgIGNvbnN0IHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGNoaWxkLl9lbmNvZGUoZGF0YVtjaGlsZC5fYmFzZVN0YXRlLmtleV0sIHJlcG9ydGVyLCBkYXRhKTtcbiAgICAgIHJlcG9ydGVyLmxlYXZlS2V5KHByZXZLZXkpO1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHRoaXMpLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xuICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICdzZXFvZicgfHwgc3RhdGUudGFnID09PSAnc2V0b2YnKSB7XG4gICAgICAvLyBUT0RPKGluZHV0bnkpOiB0aGlzIHNob3VsZCBiZSB0aHJvd24gb24gRFNMIGxldmVsXG4gICAgICBpZiAoIShzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3MubGVuZ3RoID09PSAxKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdUb28gbWFueSBhcmdzIGZvciA6ICcgKyBzdGF0ZS50YWcpO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignc2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheScpO1xuXG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICAgICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgY29uc3QgdGFnID0gc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZztcbiAgICBjb25zdCBjbHMgPSBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCA/ICd1bml2ZXJzYWwnIDogJ2NvbnRleHQnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVwb3J0ZXIuZXJyb3IoJ1RhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLCBwcmltaXRpdmUsIGNscywgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcCBpbiBleHBsaWNpdFxuICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCBmYWxzZSwgJ2NvbnRleHQnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2VbZGF0YS50eXBlXTtcbiAgaWYgKCFub2RlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgZmFsc2UsXG4gICAgICBkYXRhLnR5cGUgKyAnIG5vdCBmb3VuZCBpbiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKTtcbiAgfVxuICByZXR1cm4gbm9kZS5fZW5jb2RlKGRhdGEudmFsdWUsIHJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmUgPSBmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUodGFnLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIHN0YXRlLnJldmVyc2VBcmdzWzBdLCBzdGF0ZS5hcmdzWzFdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChkYXRhLCBzdGF0ZS5hcmdzICYmIHN0YXRlLnJldmVyc2VBcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2woZGF0YSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdGFnOiAnICsgdGFnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc051bXN0ciA9IGZ1bmN0aW9uIGlzTnVtc3RyKHN0cikge1xuICByZXR1cm4gL15bMC05IF0qJC8udGVzdChzdHIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzUHJpbnRzdHIgPSBmdW5jdGlvbiBpc1ByaW50c3RyKHN0cikge1xuICByZXR1cm4gL15bQS1aYS16MC05ICcoKSssLS4vOj0/XSokLy50ZXN0KHN0cik7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlclxuZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnQ2xhc3MpO1xuXG5leHBvcnRzLnRhZyA9IHtcbiAgMHgwMDogJ2VuZCcsXG4gIDB4MDE6ICdib29sJyxcbiAgMHgwMjogJ2ludCcsXG4gIDB4MDM6ICdiaXRzdHInLFxuICAweDA0OiAnb2N0c3RyJyxcbiAgMHgwNTogJ251bGxfJyxcbiAgMHgwNjogJ29iamlkJyxcbiAgMHgwNzogJ29iakRlc2MnLFxuICAweDA4OiAnZXh0ZXJuYWwnLFxuICAweDA5OiAncmVhbCcsXG4gIDB4MGE6ICdlbnVtJyxcbiAgMHgwYjogJ2VtYmVkJyxcbiAgMHgwYzogJ3V0ZjhzdHInLFxuICAweDBkOiAncmVsYXRpdmVPaWQnLFxuICAweDEwOiAnc2VxJyxcbiAgMHgxMTogJ3NldCcsXG4gIDB4MTI6ICdudW1zdHInLFxuICAweDEzOiAncHJpbnRzdHInLFxuICAweDE0OiAndDYxc3RyJyxcbiAgMHgxNTogJ3ZpZGVvc3RyJyxcbiAgMHgxNjogJ2lhNXN0cicsXG4gIDB4MTc6ICd1dGN0aW1lJyxcbiAgMHgxODogJ2dlbnRpbWUnLFxuICAweDE5OiAnZ3JhcGhzdHInLFxuICAweDFhOiAnaXNvNjQ2c3RyJyxcbiAgMHgxYjogJ2dlbnN0cicsXG4gIDB4MWM6ICd1bmlzdHInLFxuICAweDFkOiAnY2hhcnN0cicsXG4gIDB4MWU6ICdibXBzdHInXG59O1xuZXhwb3J0cy50YWdCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkVuY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBOb2RlLmNhbGwodGhpcywgJ2RlcicsIHBhcmVudCk7XG59XG5pbmhlcml0cyhERVJOb2RlLCBOb2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcsXG4gIHByaW1pdGl2ZSxcbiAgY2xzLFxuICBjb250ZW50KSB7XG4gIGNvbnN0IGVuY29kZWRUYWcgPSBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgdGhpcy5yZXBvcnRlcik7XG5cbiAgLy8gU2hvcnQgZm9ybVxuICBpZiAoY29udGVudC5sZW5ndGggPCAweDgwKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gICAgaGVhZGVyWzFdID0gY29udGVudC5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgLy8gQ291bnQgb2N0ZXRzIHJlcXVpcmVkIHRvIHN0b3JlIGxlbmd0aFxuICBsZXQgbGVuT2N0ZXRzID0gMTtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIGxlbk9jdGV0cysrO1xuXG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoc3RyLmNoYXJDb2RlQXQoaSksIGkgKiAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYnVmKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGRpZ2l0cyBhbmQgc3BhY2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGxhdGluIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZ2l0cywgc3BhY2UsIGFwb3N0cm9waGUsIGxlZnQgYW5kIHJpZ3RoICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudGhlc2lzLCBwbHVzIHNpZ24sIGNvbW1hLCBoeXBoZW4sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvdCwgc2xhc2gsIGNvbG9uLCBlcXVhbCBzaWduLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWVzdGlvbiBtYXJrJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQgPSBmdW5jdGlvbiBlbmNvZGVPYmppZChpZCwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ3N0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAnKTtcbiAgICBpZCA9IHZhbHVlc1tpZF0uc3BsaXQoL1tcXHMuXSsvZyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBpZCA9IGlkLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3Q6ICcgKyBKU09OLnN0cmluZ2lmeShpZCkpO1xuICB9XG5cbiAgaWYgKCFyZWxhdGl2ZSkge1xuICAgIGlmIChpZFsxXSA+PSA0MClcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0InKTtcbiAgICBpZC5zcGxpY2UoMCwgMiwgaWRbMF0gKiA0MCArIGlkWzFdKTtcbiAgfVxuXG4gIC8vIENvdW50IG51bWJlciBvZiBvY3RldHNcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgZm9yIChzaXplKys7IGlkZW50ID49IDB4ODA7IGlkZW50ID4+PSA3KVxuICAgICAgc2l6ZSsrO1xuICB9XG5cbiAgY29uc3Qgb2JqaWQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgbGV0IHN0cjtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuXG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihzdHIsICdvY3RzdHInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVOdWxsID0gZnVuY3Rpb24gZW5jb2RlTnVsbCgpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoJycpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0sIHZhbHVlcykge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkobnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1ZhbHVlcyBtYXAgZG9lc25cXCd0IGNvbnRhaW46ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobnVtKSk7XG4gICAgfVxuICAgIG51bSA9IHZhbHVlc1tudW1dO1xuICB9XG5cbiAgLy8gQmlnbnVtLCBhc3N1bWUgYmlnIGVuZGlhblxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgJiYgIUJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgY29uc3QgbnVtQXJyYXkgPSBudW0udG9BcnJheSgpO1xuICAgIGlmICghbnVtLnNpZ24gJiYgbnVtQXJyYXlbMF0gJiAweDgwKSB7XG4gICAgICBudW1BcnJheS51bnNoaWZ0KDApO1xuICAgIH1cbiAgICBudW0gPSBCdWZmZXIuZnJvbShudW1BcnJheSk7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICBsZXQgc2l6ZSA9IG51bS5sZW5ndGg7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBzaXplKys7XG5cbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDA7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob3V0KTtcbiAgfVxuXG4gIGlmIChudW0gPCAweDgwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG51bSk7XG5cbiAgaWYgKG51bSA8IDB4MTAwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBudW1dKTtcblxuICBsZXQgc2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBudW07IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgc2l6ZSsrO1xuXG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yIChsZXQgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKEJ1ZmZlci5mcm9tKG91dCkpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUJvb2wgPSBmdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHZhbHVlID8gMHhmZiA6IDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RW5jb2RlcignZGVyJykudHJlZTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwRGVmYXVsdCA9IGZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGxldCBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGF0YSA9IGRhdGFCdWZmZXIuam9pbigpO1xuICBpZiAoc3RhdGUuZGVmYXVsdEJ1ZmZlciA9PT0gdW5kZWZpbmVkKVxuICAgIHN0YXRlLmRlZmF1bHRCdWZmZXIgPSB0aGlzLl9lbmNvZGVWYWx1ZShzdGF0ZVsnZGVmYXVsdCddLCByZXBvcnRlciwgcGFyZW50KS5qb2luKCk7XG5cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkYXRhW2ldICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCByZXBvcnRlcikge1xuICBsZXQgcmVzO1xuXG4gIGlmICh0YWcgPT09ICdzZXFvZicpXG4gICAgdGFnID0gJ3NlcSc7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ3NldG9mJylcbiAgICB0YWcgPSAnc2V0JztcblxuICBpZiAoZGVyLnRhZ0J5TmFtZS5oYXNPd25Qcm9wZXJ0eSh0YWcpKVxuICAgIHJlcyA9IGRlci50YWdCeU5hbWVbdGFnXTtcbiAgZWxzZSBpZiAodHlwZW9mIHRhZyA9PT0gJ251bWJlcicgJiYgKHRhZyB8IDApID09PSB0YWcpXG4gICAgcmVzID0gdGFnO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbmtub3duIHRhZzogJyArIHRhZyk7XG5cbiAgaWYgKHJlcyA+PSAweDFmKVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignTXVsdGktb2N0ZXQgdGFnIGVuY29kaW5nIHVuc3VwcG9ydGVkJyk7XG5cbiAgaWYgKCFwcmltaXRpdmUpXG4gICAgcmVzIHw9IDB4MjA7XG5cbiAgcmVzIHw9IChkZXIudGFnQ2xhc3NCeU5hbWVbY2xzIHx8ICd1bml2ZXJzYWwnXSA8PCA2KTtcblxuICByZXR1cm4gcmVzO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgREVSRW5jb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTUVuY29kZXIoZW50aXR5KSB7XG4gIERFUkVuY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufVxuaW5oZXJpdHMoUEVNRW5jb2RlciwgREVSRW5jb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTUVuY29kZXI7XG5cblBFTUVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIGNvbnN0IHAgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBjb25zdCBvdXQgPSBbICctLS0tLUJFR0lOICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpICs9IDY0KVxuICAgIG91dC5wdXNoKHAuc2xpY2UoaSwgaSArIDY0KSk7XG4gIG91dC5wdXNoKCctLS0tLUVORCAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScpO1xuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcbmNvbnN0IERlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkRlY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIoZGF0YSkpIHtcbiAgICBkYXRhID0gbmV3IERlY29kZXJCdWZmZXIoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy50cmVlLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCAnRmFpbGVkIHRvIHBlZWsgdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcblxuICByZXR1cm4gZGVjb2RlZFRhZy50YWcgPT09IHRhZyB8fCBkZWNvZGVkVGFnLnRhZ1N0ciA9PT0gdGFnIHx8XG4gICAgKGRlY29kZWRUYWcudGFnU3RyICsgJ29mJykgPT09IHRhZyB8fCBhbnk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlVGFnID0gZnVuY3Rpb24gZGVjb2RlVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgY29uc3QgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsXG4gICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgbGV0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoXG4gICAgYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB0YWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodGFnKSlcbiAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3QgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgbGV0IHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pO1xuICAgIGVsc2VcbiAgICAgIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpO1xuXG4gICAgLy8gRmFpbHVyZVxuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgICAgcmV0dXJuIHJlcztcblxuICAgIGlmICh0YWcudGFnU3RyID09PSAnZW5kJylcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTGlzdCA9IGZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLCB0YWcsIGRlY29kZXIsXG4gIG9wdGlvbnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIGNvbnN0IHBvc3NpYmxlRW5kID0gdGhpcy5fcGVla1RhZyhidWZmZXIsICdlbmQnKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocG9zc2libGVFbmQpKVxuICAgICAgcmV0dXJuIHBvc3NpYmxlRW5kO1xuXG4gICAgY29uc3QgcmVzID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLCAnZGVyJywgb3B0aW9ucyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykgJiYgcG9zc2libGVFbmQpXG4gICAgICBicmVhaztcbiAgICByZXN1bHQucHVzaChyZXMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlU3RyID0gZnVuY3Rpb24gZGVjb2RlU3RyKGJ1ZmZlciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgY29uc3QgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgICBpZiAocmF3Lmxlbmd0aCAlIDIgPT09IDEpXG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogYm1wc3RyIGxlbmd0aCBtaXNtYXRjaCcpO1xuXG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRShpICogMikpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBjb25zdCBudW1zdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihudW1zdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gbnVtc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBjb25zdCBwcmludHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBwcmludHN0cjtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgaWRlbnRpZmllcnMgPSBbXTtcbiAgbGV0IGlkZW50ID0gMDtcbiAgbGV0IHN1YmlkZW50ID0gMDtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgc3ViaWRlbnQgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gICAgaWRlbnQgPDw9IDc7XG4gICAgaWRlbnQgfD0gc3ViaWRlbnQgJiAweDdmO1xuICAgIGlmICgoc3ViaWRlbnQgJiAweDgwKSA9PT0gMCkge1xuICAgICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG4gICAgICBpZGVudCA9IDA7XG4gICAgfVxuICB9XG4gIGlmIChzdWJpZGVudCAmIDB4ODApXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG5cbiAgY29uc3QgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICBjb25zdCBzZWNvbmQgPSBpZGVudGlmaWVyc1swXSAlIDQwO1xuXG4gIGlmIChyZWxhdGl2ZSlcbiAgICByZXN1bHQgPSBpZGVudGlmaWVycztcbiAgZWxzZVxuICAgIHJlc3VsdCA9IFtmaXJzdCwgc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpO1xuXG4gIGlmICh2YWx1ZXMpIHtcbiAgICBsZXQgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcgJyldO1xuICAgIGlmICh0bXAgPT09IHVuZGVmaW5lZClcbiAgICAgIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignLicpXTtcbiAgICBpZiAodG1wICE9PSB1bmRlZmluZWQpXG4gICAgICByZXN1bHQgPSB0bXA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbiBkZWNvZGVUaW1lKGJ1ZmZlciwgdGFnKSB7XG4gIGNvbnN0IHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuXG4gIGxldCB5ZWFyO1xuICBsZXQgbW9uO1xuICBsZXQgZGF5O1xuICBsZXQgaG91cjtcbiAgbGV0IG1pbjtcbiAgbGV0IHNlYztcbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCA0KSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgc2VjID0gc3RyLnNsaWNlKDEyLCAxNCkgfCAwO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCAyKSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBpZiAoeWVhciA8IDcwKVxuICAgICAgeWVhciA9IDIwMDAgKyB5ZWFyO1xuICAgIGVsc2VcbiAgICAgIHllYXIgPSAxOTAwICsgeWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gRGF0ZS5VVEMoeWVhciwgbW9uIC0gMSwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbCA9IGZ1bmN0aW9uIGRlY29kZU51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUJvb2wgPSBmdW5jdGlvbiBkZWNvZGVCb29sKGJ1ZmZlcikge1xuICBjb25zdCByZXMgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgIHJldHVybiByZXM7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVzICE9PSAwO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChidWZmZXIsIHZhbHVlcykge1xuICAvLyBCaWdpbnQsIHJldHVybiBhcyBpdCBpcyAoYXNzdW1lIGJpZyBlbmRpYW4pXG4gIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgbGV0IHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICBsZXQgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICBjb25zdCBjbHMgPSBkZXIudGFnQ2xhc3NbdGFnID4+IDZdO1xuICBjb25zdCBwcmltaXRpdmUgPSAodGFnICYgMHgyMCkgPT09IDA7XG5cbiAgLy8gTXVsdGktb2N0ZXQgdGFnIC0gbG9hZFxuICBpZiAoKHRhZyAmIDB4MWYpID09PSAweDFmKSB7XG4gICAgbGV0IG9jdCA9IHRhZztcbiAgICB0YWcgPSAwO1xuICAgIHdoaWxlICgob2N0ICYgMHg4MCkgPT09IDB4ODApIHtcbiAgICAgIG9jdCA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgICBpZiAoYnVmLmlzRXJyb3Iob2N0KSlcbiAgICAgICAgcmV0dXJuIG9jdDtcblxuICAgICAgdGFnIDw8PSA3O1xuICAgICAgdGFnIHw9IG9jdCAmIDB4N2Y7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhZyAmPSAweDFmO1xuICB9XG4gIGNvbnN0IHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICBsZXQgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIGNvbnN0IG51bSA9IGxlbiAmIDB4N2Y7XG4gIGlmIChudW0gPiA0KVxuICAgIHJldHVybiBidWYuZXJyb3IoJ2xlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmcnKTtcblxuICBsZW4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgbGVuIDw8PSA4O1xuICAgIGNvbnN0IGogPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgIGlmIChidWYuaXNFcnJvcihqKSlcbiAgICAgIHJldHVybiBqO1xuICAgIGxlbiB8PSBqO1xuICB9XG5cbiAgcmV0dXJuIGxlbjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbmNvbnN0IERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTURlY29kZXIsIERFUkRlY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1EZWNvZGVyO1xuXG5QRU1EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBsaW5lcyA9IGRhdGEudG9TdHJpbmcoKS5zcGxpdCgvW1xcclxcbl0rL2cpO1xuXG4gIGNvbnN0IGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IHJlID0gL14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1tpXS5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAobWF0Y2hbMl0gIT09IGxhYmVsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdCRUdJTicpXG4gICAgICAgIGJyZWFrO1xuICAgICAgc3RhcnQgPSBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdFTkQnKVxuICAgICAgICBicmVhaztcbiAgICAgIGVuZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcignUEVNIHNlY3Rpb24gbm90IGZvdW5kIGZvcjogJyArIGxhYmVsKTtcblxuICBjb25zdCBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTkrLz1dKy9naSwgJycpO1xuXG4gIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0Jyk7XG4gIHJldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBpbnB1dCwgb3B0aW9ucyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSByZXF1aXJlKCcuL2VuY29kZXJzJyk7XG5jb25zdCBkZWNvZGVycyA9IHJlcXVpcmUoJy4vZGVjb2RlcnMnKTtcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYXBpID0gZXhwb3J0cztcblxuYXBpLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShuYW1lLCBib2R5KSB7XG4gIHJldHVybiBuZXcgRW50aXR5KG5hbWUsIGJvZHkpO1xufTtcblxuZnVuY3Rpb24gRW50aXR5KG5hbWUsIGJvZHkpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5ib2R5ID0gYm9keTtcblxuICB0aGlzLmRlY29kZXJzID0ge307XG4gIHRoaXMuZW5jb2RlcnMgPSB7fTtcbn1cblxuRW50aXR5LnByb3RvdHlwZS5fY3JlYXRlTmFtZWQgPSBmdW5jdGlvbiBjcmVhdGVOYW1lZChCYXNlKSB7XG4gIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgZnVuY3Rpb24gR2VuZXJhdGVkKGVudGl0eSkge1xuICAgIHRoaXMuX2luaXROYW1lZChlbnRpdHksIG5hbWUpO1xuICB9XG4gIGluaGVyaXRzKEdlbmVyYXRlZCwgQmFzZSk7XG4gIEdlbmVyYXRlZC5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uIF9pbml0TmFtZWQoZW50aXR5LCBuYW1lKSB7XG4gICAgQmFzZS5jYWxsKHRoaXMsIGVudGl0eSwgbmFtZSk7XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBHZW5lcmF0ZWQodGhpcyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24gX2dldERlY29kZXIoZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAnZGVyJztcbiAgLy8gTGF6aWx5IGNyZWF0ZSBkZWNvZGVyXG4gIGlmICghdGhpcy5kZWNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZGVjb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGRlY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5kZWNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKGVuYykuZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZW5jb2RlclxuICBpZiAoIXRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmVuY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChlbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IGV4cG9ydHM7XG5cbi8vIEhlbHBlclxuY29uc3RhbnRzLl9yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5jb25zdGFudHMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhc24xID0gZXhwb3J0cztcblxuYXNuMS5iaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuXG5hc24xLmRlZmluZSA9IHJlcXVpcmUoJy4vYXNuMS9hcGknKS5kZWZpbmU7XG5hc24xLmJhc2UgPSByZXF1aXJlKCcuL2FzbjEvYmFzZScpO1xuYXNuMS5jb25zdGFudHMgPSByZXF1aXJlKCcuL2FzbjEvY29uc3RhbnRzJyk7XG5hc24xLmRlY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2RlY29kZXJzJyk7XG5hc24xLmVuY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2VuY29kZXJzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxudXRpbHMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGFyciwgZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0b0hleChhcnIpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgbWluQXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIG1pblV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xuXG51dGlscy5hc3NlcnQgPSBtaW5Bc3NlcnQ7XG51dGlscy50b0FycmF5ID0gbWluVXRpbHMudG9BcnJheTtcbnV0aWxzLnplcm8yID0gbWluVXRpbHMuemVybzI7XG51dGlscy50b0hleCA9IG1pblV0aWxzLnRvSGV4O1xudXRpbHMuZW5jb2RlID0gbWluVXRpbHMuZW5jb2RlO1xuXG4vLyBSZXByZXNlbnQgbnVtIGluIGEgdy1OQUYgZm9ybVxuZnVuY3Rpb24gZ2V0TkFGKG51bSwgdywgYml0cykge1xuICB2YXIgbmFmID0gbmV3IEFycmF5KE1hdGgubWF4KG51bS5iaXRMZW5ndGgoKSwgYml0cykgKyAxKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBuYWZbaV0gPSAwO1xuICB9XG5cbiAgdmFyIHdzID0gMSA8PCAodyArIDEpO1xuICB2YXIgayA9IG51bS5jbG9uZSgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgejtcbiAgICB2YXIgbW9kID0gay5hbmRsbih3cyAtIDEpO1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIGlmIChtb2QgPiAod3MgPj4gMSkgLSAxKVxuICAgICAgICB6ID0gKHdzID4+IDEpIC0gbW9kO1xuICAgICAgZWxzZVxuICAgICAgICB6ID0gbW9kO1xuICAgICAgay5pc3Vibih6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgeiA9IDA7XG4gICAgfVxuXG4gICAgbmFmW2ldID0gejtcbiAgICBrLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdLFxuICBdO1xuXG4gIGsxID0gazEuY2xvbmUoKTtcbiAgazIgPSBrMi5jbG9uZSgpO1xuICB2YXIgZDEgPSAwO1xuICB2YXIgZDIgPSAwO1xuICB2YXIgbTg7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcbiAgICAvLyBGaXJzdCBwaGFzZVxuICAgIHZhciBtMTQgPSAoazEuYW5kbG4oMykgKyBkMSkgJiAzO1xuICAgIHZhciBtMjQgPSAoazIuYW5kbG4oMykgKyBkMikgJiAzO1xuICAgIGlmIChtMTQgPT09IDMpXG4gICAgICBtMTQgPSAtMTtcbiAgICBpZiAobTI0ID09PSAzKVxuICAgICAgbTI0ID0gLTE7XG4gICAgdmFyIHUxO1xuICAgIGlmICgobTE0ICYgMSkgPT09IDApIHtcbiAgICAgIHUxID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMi5hbmRsbig3KSArIGQyKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMTQgPT09IDIpXG4gICAgICAgIHUyID0gLW0yNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTIgPSBtMjQ7XG4gICAgfVxuICAgIGpzZlsxXS5wdXNoKHUyKTtcblxuICAgIC8vIFNlY29uZCBwaGFzZVxuICAgIGlmICgyICogZDEgPT09IHUxICsgMSlcbiAgICAgIGQxID0gMSAtIGQxO1xuICAgIGlmICgyICogZDIgPT09IHUyICsgMSlcbiAgICAgIGQyID0gMSAtIGQyO1xuICAgIGsxLml1c2hybigxKTtcbiAgICBrMi5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4ganNmO1xufVxudXRpbHMuZ2V0SlNGID0gZ2V0SlNGO1xuXG5mdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eShvYmosIG5hbWUsIGNvbXB1dGVyKSB7XG4gIHZhciBrZXkgPSAnXycgKyBuYW1lO1xuICBvYmoucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpc1trZXldIDpcbiAgICAgIHRoaXNba2V5XSA9IGNvbXB1dGVyLmNhbGwodGhpcyk7XG4gIH07XG59XG51dGlscy5jYWNoZWRQcm9wZXJ0eSA9IGNhY2hlZFByb3BlcnR5O1xuXG5mdW5jdGlvbiBwYXJzZUJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiB0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnID8gdXRpbHMudG9BcnJheShieXRlcywgJ2hleCcpIDpcbiAgICBieXRlcztcbn1cbnV0aWxzLnBhcnNlQnl0ZXMgPSBwYXJzZUJ5dGVzO1xuXG5mdW5jdGlvbiBpbnRGcm9tTEUoYnl0ZXMpIHtcbiAgcmV0dXJuIG5ldyBCTihieXRlcywgJ2hleCcsICdsZScpO1xufVxudXRpbHMuaW50RnJvbUxFID0gaW50RnJvbUxFO1xuXG4iLAogICAgInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG4vLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcblJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKVxuICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMobik7XG5cbiAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKylcbiAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICByZXR1cm4gcmVzO1xufTtcblxuaWYgKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0Jykge1xuICBpZiAoc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChzZWxmLm1zQ3J5cHRvICYmIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gSUVcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG5cbiAgLy8gU2FmYXJpJ3MgV2ViV29ya2VycyBkbyBub3QgaGF2ZSBgY3J5cHRvYFxuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyIHdpdGggbm8gY3J5cHRvIHN1cHBvcnRcbiAgdHJ5IHtcbiAgICB2YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKTtcblxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyhuKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBnZXROQUYgPSB1dGlscy5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHMuZ2V0SlNGO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmFzZUN1cnZlKHR5cGUsIGNvbmYpIHtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wID0gbmV3IEJOKGNvbmYucCwgMTYpO1xuXG4gIC8vIFVzZSBNb250Z29tZXJ5LCB3aGVuIHRoZXJlIGlzIG5vIGZhc3QgcmVkdWN0aW9uIGZvciB0aGUgcHJpbWVcbiAgdGhpcy5yZWQgPSBjb25mLnByaW1lID8gQk4ucmVkKGNvbmYucHJpbWUpIDogQk4ubW9udCh0aGlzLnApO1xuXG4gIC8vIFVzZWZ1bCBmb3IgbWFueSBjdXJ2ZXNcbiAgdGhpcy56ZXJvID0gbmV3IEJOKDApLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5vbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8gQ3VydmUgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxcbiAgdGhpcy5uID0gY29uZi5uICYmIG5ldyBCTihjb25mLm4sIDE2KTtcbiAgdGhpcy5nID0gY29uZi5nICYmIHRoaXMucG9pbnRGcm9tSlNPTihjb25mLmcsIGNvbmYuZ1JlZCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGFycmF5c1xuICB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5fYml0TGVuZ3RoID0gdGhpcy5uID8gdGhpcy5uLmJpdExlbmd0aCgpIDogMDtcblxuICAvLyBHZW5lcmFsaXplZCBHcmVnIE1heHdlbGwncyB0cmlja1xuICB2YXIgYWRqdXN0Q291bnQgPSB0aGlzLm4gJiYgdGhpcy5wLmRpdih0aGlzLm4pO1xuICBpZiAoIWFkanVzdENvdW50IHx8IGFkanVzdENvdW50LmNtcG4oMTAwKSA+IDApIHtcbiAgICB0aGlzLnJlZE4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX21heHdlbGxUcmljayA9IHRydWU7XG4gICAgdGhpcy5yZWROID0gdGhpcy5uLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ3VydmU7XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsID0gZnVuY3Rpb24gX2ZpeGVkTmFmTXVsKHAsIGspIHtcbiAgYXNzZXJ0KHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEsIHRoaXMuX2JpdExlbmd0aCk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIHZhciBqO1xuICB2YXIgbmFmVztcbiAgZm9yIChqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgbCA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBsID49IGo7IGwtLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltsXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAoaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcsIHRoaXMuX2JpdExlbmd0aCk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgbCA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGwrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgbCsrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGwpO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICBwb2ludHMsXG4gIGNvZWZmcyxcbiAgbGVuLFxuICBqYWNvYmlhblJlc3VsdCkge1xuICB2YXIgd25kV2lkdGggPSB0aGlzLl93bmFmVDE7XG4gIHZhciB3bmQgPSB0aGlzLl93bmFmVDI7XG4gIHZhciBuYWYgPSB0aGlzLl93bmFmVDM7XG5cbiAgLy8gRmlsbCBhbGwgYXJyYXlzXG4gIHZhciBtYXggPSAwO1xuICB2YXIgaTtcbiAgdmFyIGo7XG4gIHZhciBwO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHMoZGVmVyk7XG4gICAgd25kV2lkdGhbaV0gPSBuYWZQb2ludHMud25kO1xuICAgIHduZFtpXSA9IG5hZlBvaW50cy5wb2ludHM7XG4gIH1cblxuICAvLyBDb21iIHNtYWxsIHdpbmRvdyBOQUZzXG4gIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMTsgaSAtPSAyKSB7XG4gICAgdmFyIGEgPSBpIC0gMTtcbiAgICB2YXIgYiA9IGk7XG4gICAgaWYgKHduZFdpZHRoW2FdICE9PSAxIHx8IHduZFdpZHRoW2JdICE9PSAxKSB7XG4gICAgICBuYWZbYV0gPSBnZXROQUYoY29lZmZzW2FdLCB3bmRXaWR0aFthXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2FdLmxlbmd0aCwgbWF4KTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZltiXS5sZW5ndGgsIG1heCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY29tYiA9IFtcbiAgICAgIHBvaW50c1thXSwgLyogMSAqL1xuICAgICAgbnVsbCwgLyogMyAqL1xuICAgICAgbnVsbCwgLyogNSAqL1xuICAgICAgcG9pbnRzW2JdLCAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMsICAvKiAxIDEgKi9cbiAgICBdO1xuXG4gICAgdmFyIGpzZiA9IGdldEpTRihjb2VmZnNbYV0sIGNvZWZmc1tiXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgoanNmWzBdLmxlbmd0aCwgbWF4KTtcbiAgICBuYWZbYV0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBuYWZbYl0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAoaSA9IG1heDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgayA9IDA7XG5cbiAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICB2YXIgemVybyA9IHRydWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgdG1wW2pdID0gbmFmW2pdW2ldIHwgMDtcbiAgICAgICAgaWYgKHRtcFtqXSAhPT0gMClcbiAgICAgICAgICB6ZXJvID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXplcm8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgaysrO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHA7XG4gICAgICBpZiAoeiA9PT0gMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBlbHNlIGlmICh6ID4gMClcbiAgICAgICAgcCA9IHduZFtqXVsoeiAtIDEpID4+IDFdO1xuICAgICAgZWxzZSBpZiAoeiA8IDApXG4gICAgICAgIHAgPSB3bmRbal1bKC16IC0gMSkgPj4gMV0ubmVnKCk7XG5cbiAgICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQocCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICB9XG4gIC8vIFplcm9pZnkgcmVmZXJlbmNlc1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgd25kW2ldID0gbnVsbDtcblxuICBpZiAoamFjb2JpYW5SZXN1bHQpXG4gICAgcmV0dXJuIGFjYztcbiAgZWxzZVxuICAgIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDApO1xuICAgIGVsc2UgaWYgKGJ5dGVzWzBdID09PSAweDA3KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7XG5cbiAgICB2YXIgcmVzID0gIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICBieXRlcy5zbGljZSgxICsgbGVuLCAxICsgMiAqIGxlbikpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICgoYnl0ZXNbMF0gPT09IDB4MDIgfHwgYnl0ZXNbMF0gPT09IDB4MDMpICYmXG4gICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksIGJ5dGVzWzBdID09PSAweDAzKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcG9pbnQgZm9ybWF0Jyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQgPSBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYykge1xuICByZXR1cm4gdGhpcy5lbmNvZGUoZW5jLCB0cnVlKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHggPSB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIGxlbik7XG5cbiAgaWYgKGNvbXBhY3QpXG4gICAgcmV0dXJuIFsgdGhpcy5nZXRZKCkuaXNFdmVuKCkgPyAweDAyIDogMHgwMyBdLmNvbmNhdCh4KTtcblxuICByZXR1cm4gWyAweDA0IF0uY29uY2F0KHgsIHRoaXMuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLl9lbmNvZGUoY29tcGFjdCksIGVuYyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciBwcmVjb21wdXRlZCA9IHtcbiAgICBkb3VibGVzOiBudWxsLFxuICAgIG5hZjogbnVsbCxcbiAgICBiZXRhOiBudWxsLFxuICB9O1xuICBwcmVjb21wdXRlZC5uYWYgPSB0aGlzLl9nZXROQUZQb2ludHMoOCk7XG4gIHByZWNvbXB1dGVkLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIHBvd2VyKTtcbiAgcHJlY29tcHV0ZWQuYmV0YSA9IHRoaXMuX2dldEJldGEoKTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IHByZWNvbXB1dGVkO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uIF9oYXNEb3VibGVzKGspIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgZG91YmxlcyA9IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcbiAgaWYgKCFkb3VibGVzKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG91Ymxlcy5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSArIDEpIC8gZG91Ymxlcy5zdGVwKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldERvdWJsZXMgPSBmdW5jdGlvbiBfZ2V0RG91YmxlcyhzdGVwLCBwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcblxuICB2YXIgZG91YmxlcyA9IFsgdGhpcyBdO1xuICB2YXIgYWNjID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3dlcjsgaSArPSBzdGVwKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdGVwOyBqKyspXG4gICAgICBhY2MgPSBhY2MuZGJsKCk7XG4gICAgZG91Ymxlcy5wdXNoKGFjYyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHBvaW50czogZG91YmxlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChrKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspXG4gICAgciA9IHIuZGJsKCk7XG4gIHJldHVybiByO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaG9ydEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdzaG9ydCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKTtcblxuICB0aGlzLnplcm9BID0gdGhpcy5hLmZyb21SZWQoKS5jbXBuKDApID09PSAwO1xuICB0aGlzLnRocmVlQSA9IHRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMykgPT09IDA7XG5cbiAgLy8gSWYgdGhlIGN1cnZlIGlzIGVuZG9tb3JwaGljLCBwcmVjYWxjdWxhdGUgYmV0YSBhbmQgbGFtYmRhXG4gIHRoaXMuZW5kbyA9IHRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKTtcbiAgdGhpcy5fZW5kb1duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fZW5kb1duYWZUMiA9IG5ldyBBcnJheSg0KTtcbn1cbmluaGVyaXRzKFNob3J0Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBTaG9ydEN1cnZlO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtID0gZnVuY3Rpb24gX2dldEVuZG9tb3JwaGlzbShjb25mKSB7XG4gIC8vIE5vIGVmZmljaWVudCBlbmRvbW9ycGhpc21cbiAgaWYgKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSlcbiAgICByZXR1cm47XG5cbiAgLy8gQ29tcHV0ZSBiZXRhIGFuZCBsYW1iZGEsIHRoYXQgbGFtYmRhICogUCA9IChiZXRhICogUHg7IFB5KVxuICB2YXIgYmV0YTtcbiAgdmFyIGxhbWJkYTtcbiAgaWYgKGNvbmYuYmV0YSkge1xuICAgIGJldGEgPSBuZXcgQk4oY29uZi5iZXRhLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiZXRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO1xuICAgIC8vIENob29zZSB0aGUgc21hbGxlc3QgYmV0YVxuICAgIGJldGEgPSBiZXRhc1swXS5jbXAoYmV0YXNbMV0pIDwgMCA/IGJldGFzWzBdIDogYmV0YXNbMV07XG4gICAgYmV0YSA9IGJldGEudG9SZWQodGhpcy5yZWQpO1xuICB9XG4gIGlmIChjb25mLmxhbWJkYSkge1xuICAgIGxhbWJkYSA9IG5ldyBCTihjb25mLmxhbWJkYSwgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIENob29zZSB0aGUgbGFtYmRhIHRoYXQgaXMgbWF0Y2hpbmcgc2VsZWN0ZWQgYmV0YVxuICAgIHZhciBsYW1iZGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7XG4gICAgaWYgKHRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCkge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1sxXTtcbiAgICAgIGFzc2VydCh0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzLFxuICB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uIF9nZXRFbmRvUm9vdHMobnVtKSB7XG4gIC8vIEZpbmQgcm9vdHMgb2YgZm9yIHheMiArIHggKyAxIGluIEZcbiAgLy8gUm9vdCA9ICgtMSArLSBTcXJ0KC0zKSkgLyAyXG4gIC8vXG4gIHZhciByZWQgPSBudW0gPT09IHRoaXMucCA/IHRoaXMucmVkIDogQk4ubW9udChudW0pO1xuICB2YXIgdGludiA9IG5ldyBCTigyKS50b1JlZChyZWQpLnJlZEludm0oKTtcbiAgdmFyIG50aW52ID0gdGludi5yZWROZWcoKTtcblxuICB2YXIgcyA9IG5ldyBCTigzKS50b1JlZChyZWQpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwodGludik7XG5cbiAgdmFyIGwxID0gbnRpbnYucmVkQWRkKHMpLmZyb21SZWQoKTtcbiAgdmFyIGwyID0gbnRpbnYucmVkU3ViKHMpLmZyb21SZWQoKTtcbiAgcmV0dXJuIFsgbDEsIGwyIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzID0gZnVuY3Rpb24gX2dldEVuZG9CYXNpcyhsYW1iZGEpIHtcbiAgLy8gYXByeFNxcnQgPj0gc3FydCh0aGlzLm4pXG4gIHZhciBhcHJ4U3FydCA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKTtcblxuICAvLyAzLjc0XG4gIC8vIFJ1biBFR0NELCB1bnRpbCByKEwgKyAxKSA8IGFwcnhTcXJ0XG4gIHZhciB1ID0gbGFtYmRhO1xuICB2YXIgdiA9IHRoaXMubi5jbG9uZSgpO1xuICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gIHZhciB5MSA9IG5ldyBCTigwKTtcbiAgdmFyIHgyID0gbmV3IEJOKDApO1xuICB2YXIgeTIgPSBuZXcgQk4oMSk7XG5cbiAgLy8gTk9URTogYWxsIHZlY3RvcnMgYXJlIHJvb3RzIG9mOiBhICsgYiAqIGxhbWJkYSA9IDAgKG1vZCBuKVxuICB2YXIgYTA7XG4gIHZhciBiMDtcbiAgLy8gRmlyc3QgdmVjdG9yXG4gIHZhciBhMTtcbiAgdmFyIGIxO1xuICAvLyBTZWNvbmQgdmVjdG9yXG4gIHZhciBhMjtcbiAgdmFyIGIyO1xuXG4gIHZhciBwcmV2UjtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcjtcbiAgdmFyIHg7XG4gIHdoaWxlICh1LmNtcG4oMCkgIT09IDApIHtcbiAgICB2YXIgcSA9IHYuZGl2KHUpO1xuICAgIHIgPSB2LnN1YihxLm11bCh1KSk7XG4gICAgeCA9IHgyLnN1YihxLm11bCh4MSkpO1xuICAgIHZhciB5ID0geTIuc3ViKHEubXVsKHkxKSk7XG5cbiAgICBpZiAoIWExICYmIHIuY21wKGFwcnhTcXJ0KSA8IDApIHtcbiAgICAgIGEwID0gcHJldlIubmVnKCk7XG4gICAgICBiMCA9IHgxO1xuICAgICAgYTEgPSByLm5lZygpO1xuICAgICAgYjEgPSB4O1xuICAgIH0gZWxzZSBpZiAoYTEgJiYgKytpID09PSAyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcHJldlIgPSByO1xuXG4gICAgdiA9IHU7XG4gICAgdSA9IHI7XG4gICAgeDIgPSB4MTtcbiAgICB4MSA9IHg7XG4gICAgeTIgPSB5MTtcbiAgICB5MSA9IHk7XG4gIH1cbiAgYTIgPSByLm5lZygpO1xuICBiMiA9IHg7XG5cbiAgdmFyIGxlbjEgPSBhMS5zcXIoKS5hZGQoYjEuc3FyKCkpO1xuICB2YXIgbGVuMiA9IGEyLnNxcigpLmFkZChiMi5zcXIoKSk7XG4gIGlmIChsZW4yLmNtcChsZW4xKSA+PSAwKSB7XG4gICAgYTIgPSBhMDtcbiAgICBiMiA9IGIwO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHNpZ25zXG4gIGlmIChhMS5uZWdhdGl2ZSkge1xuICAgIGExID0gYTEubmVnKCk7XG4gICAgYjEgPSBiMS5uZWcoKTtcbiAgfVxuICBpZiAoYTIubmVnYXRpdmUpIHtcbiAgICBhMiA9IGEyLm5lZygpO1xuICAgIGIyID0gYjIubmVnKCk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgYTogYTEsIGI6IGIxIH0sXG4gICAgeyBhOiBhMiwgYjogYjIgfSxcbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCBqYWNvYmlhblJlc3VsdCkge1xuICAgICAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICAgICAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgICAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICAgICAgfVxuICAgICAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIsIGphY29iaWFuUmVzdWx0KTtcblxuICAgICAgLy8gQ2xlYW4tdXAgcmVmZXJlbmNlcyB0byBwb2ludHMgYW5kIGNvZWZmaWNpZW50c1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgICAgICBuY29lZmZzW2pdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIGlzUmVkKSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdhZmZpbmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IG51bGw7XG4gICAgdGhpcy55ID0gbnVsbDtcbiAgICB0aGlzLmluZiA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIC8vIEZvcmNlIHJlZGdvbWVyeSByZXByZXNlbnRhdGlvbiB3aGVuIGxvYWRpbmcgZnJvbSBKU09OXG4gICAgaWYgKGlzUmVkKSB7XG4gICAgICB0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgICAgdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuaW5mID0gZmFsc2U7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgaXNSZWQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCBpc1JlZCk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmosIHJlZCkge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqLCByZWQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybjtcblxuICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgaWYgKHByZSAmJiBwcmUuYmV0YSlcbiAgICByZXR1cm4gcHJlLmJldGE7XG5cbiAgdmFyIGJldGEgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLCB0aGlzLnkpO1xuICBpZiAocHJlKSB7XG4gICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZTtcbiAgICB2YXIgZW5kb011bCA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBjdXJ2ZS5wb2ludChwLngucmVkTXVsKGN1cnZlLmVuZG8uYmV0YSksIHAueSk7XG4gICAgfTtcbiAgICBwcmUuYmV0YSA9IGJldGE7XG4gICAgYmV0YS5wcmVjb21wdXRlZCA9IHtcbiAgICAgIGJldGE6IG51bGwsXG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gYmV0YTtcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSBdO1xuXG4gIHJldHVybiBbIHRoaXMueCwgdGhpcy55LCB0aGlzLnByZWNvbXB1dGVkICYmIHtcbiAgICBkb3VibGVzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgfSBdO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqLCByZWQpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIG9iaiA9IEpTT04ucGFyc2Uob2JqKTtcbiAgdmFyIHJlcyA9IGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICBpZiAoIW9ialsyXSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGZ1bmN0aW9uIG9iajJwb2ludChvYmopIHtcbiAgICByZXR1cm4gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIH1cblxuICB2YXIgcHJlID0gb2JqWzJdO1xuICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgYmV0YTogbnVsbCxcbiAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUuZG91Ymxlcy5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICB9O1xuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICByZXR1cm4gdGhpcy5pbmY7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIFAgKyBQID0gMlBcbiAgaWYgKHRoaXMuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgLy8gUCArICgtUCkgPSBPXG4gIGlmICh0aGlzLm5lZygpLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIC8vIFAgKyBRID0gT1xuICBpZiAodGhpcy54LmNtcChwLngpID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBjID0gdGhpcy55LnJlZFN1YihwLnkpO1xuICBpZiAoYy5jbXBuKDApICE9PSAwKVxuICAgIGMgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKHAueCkucmVkSW52bSgpKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1YihwLngpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDJQID0gT1xuICB2YXIgeXMxID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICBpZiAoeXMxLmNtcG4oMCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgdmFyIHgyID0gdGhpcy54LnJlZFNxcigpO1xuICB2YXIgZHlpbnYgPSB5czEucmVkSW52bSgpO1xuICB2YXIgYyA9IHgyLnJlZEFkZCh4MikucmVkSUFkZCh4MikucmVkSUFkZChhKS5yZWRNdWwoZHlpbnYpO1xuXG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngucmVkQWRkKHRoaXMueCkpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgayA9IG5ldyBCTihrLCAxNik7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoWyB0aGlzIF0sIFsgayBdKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuam11bEFkZCA9IGZ1bmN0aW9uIGptdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMsIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICByZXR1cm4gdGhpcyA9PT0gcCB8fFxuICAgICAgICAgdGhpcy5pbmYgPT09IHAuaW5mICYmXG4gICAgICAgICAgICAgKHRoaXMuaW5mIHx8IHRoaXMueC5jbXAocC54KSA9PT0gMCAmJiB0aGlzLnkuY21wKHAueSkgPT09IDApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyhfcHJlY29tcHV0ZSkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCkpO1xuICBpZiAoX3ByZWNvbXB1dGUgJiYgdGhpcy5wcmVjb21wdXRlZCkge1xuICAgIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICAgIHZhciBuZWdhdGUgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gcC5uZWcoKTtcbiAgICB9O1xuICAgIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSiA9IGZ1bmN0aW9uIHRvSigpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnksIHRoaXMuY3VydmUub25lKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIEpQb2ludChjdXJ2ZSwgeCwgeSwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnamFjb2JpYW4nKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gbmV3IEJOKDApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSBuZXcgQk4oeiwgMTYpO1xuICB9XG4gIGlmICghdGhpcy54LnJlZClcbiAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMueS5yZWQpXG4gICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnoucmVkKVxuICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG5cbiAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcbn1cbmluaGVyaXRzKEpQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeikge1xuICByZXR1cm4gbmV3IEpQb2ludCh0aGlzLCB4LCB5LCB6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudG9QID0gZnVuY3Rpb24gdG9QKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIHppbnYgPSB0aGlzLnoucmVkSW52bSgpO1xuICB2YXIgemludjIgPSB6aW52LnJlZFNxcigpO1xuICB2YXIgYXggPSB0aGlzLngucmVkTXVsKHppbnYyKTtcbiAgdmFyIGF5ID0gdGhpcy55LnJlZE11bCh6aW52MikucmVkTXVsKHppbnYpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KGF4LCBheSk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpLCB0aGlzLnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMTJNICsgNFMgKyA3QVxuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueC5yZWRNdWwocHoyKTtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueS5yZWRNdWwocHoyLnJlZE11bChwLnopKTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6Mi5yZWRNdWwodGhpcy56KSk7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwocC56KS5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IGZ1bmN0aW9uIG1peGVkQWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcC50b0ooKTtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDhNICsgM1MgKyA3QVxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueDtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6MikucmVkTXVsKHRoaXMueik7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChwb3cpIHtcbiAgaWYgKHBvdyA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAoIXBvdylcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICB2YXIgaTtcbiAgaWYgKHRoaXMuY3VydmUuemVyb0EgfHwgdGhpcy5jdXJ2ZS50aHJlZUEpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKVxuICAgICAgciA9IHIuZGJsKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyAxTSArIDJTICsgMUEgKyBOICogKDRTICsgNU0gKyA4QSlcbiAgLy8gTiA9IDEgPT4gNk0gKyA2UyArIDlBXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuICB2YXIgdGludiA9IHRoaXMuY3VydmUudGludjtcblxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgLy8gUmV1c2UgcmVzdWx0c1xuICB2YXIganlkID0gankucmVkQWRkKGp5KTtcbiAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTW9udEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdtb250JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5pNCA9IG5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpO1xufVxuaW5oZXJpdHMoTW9udEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gTW9udEN1cnZlO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgdmFyIHggPSBwb2ludC5ub3JtYWxpemUoKS54O1xuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0geDIucmVkTXVsKHgpLnJlZEFkZCh4Mi5yZWRNdWwodGhpcy5hKSkucmVkQWRkKHgpO1xuICB2YXIgeSA9IHJocy5yZWRTcXJ0KCk7XG5cbiAgcmV0dXJuIHkucmVkU3FyKCkuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyksIDEpO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHopIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB6KTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAvLyBOby1vcFxufTtcblxuUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpKTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSB8fCBjdXJ2ZS5vbmUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkb3VibGluZy1kYmwtMTk4Ny1tLTNcbiAgLy8gMk0gKyAyUyArIDRBXG5cbiAgLy8gQSA9IFgxICsgWjFcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEFBID0gQV4yXG4gIHZhciBhYSA9IGEucmVkU3FyKCk7XG4gIC8vIEIgPSBYMSAtIFoxXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBCQiA9IEJeMlxuICB2YXIgYmIgPSBiLnJlZFNxcigpO1xuICAvLyBDID0gQUEgLSBCQlxuICB2YXIgYyA9IGFhLnJlZFN1YihiYik7XG4gIC8vIFgzID0gQUEgKiBCQlxuICB2YXIgbnggPSBhYS5yZWRNdWwoYmIpO1xuICAvLyBaMyA9IEMgKiAoQkIgKyBBMjQgKiBDKVxuICB2YXIgbnogPSBjLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpZmZBZGQgPSBmdW5jdGlvbiBkaWZmQWRkKHAsIGRpZmYpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZGlmZmFkZC1kYWRkLTE5ODctbS0zXG4gIC8vIDRNICsgMlMgKyA2QVxuXG4gIC8vIEEgPSBYMiArIFoyXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBCID0gWDIgLSBaMlxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQyA9IFgzICsgWjNcbiAgdmFyIGMgPSBwLngucmVkQWRkKHAueik7XG4gIC8vIEQgPSBYMyAtIFozXG4gIHZhciBkID0gcC54LnJlZFN1YihwLnopO1xuICAvLyBEQSA9IEQgKiBBXG4gIHZhciBkYSA9IGQucmVkTXVsKGEpO1xuICAvLyBDQiA9IEMgKiBCXG4gIHZhciBjYiA9IGMucmVkTXVsKGIpO1xuICAvLyBYNSA9IFoxICogKERBICsgQ0IpXjJcbiAgdmFyIG54ID0gZGlmZi56LnJlZE11bChkYS5yZWRBZGQoY2IpLnJlZFNxcigpKTtcbiAgLy8gWjUgPSBYMSAqIChEQSAtIENCKV4yXG4gIHZhciBueiA9IGRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIHZhciB0ID0gay5jbG9uZSgpO1xuICB2YXIgYSA9IHRoaXM7IC8vIChOIC8gMikgKiBRICsgUVxuICB2YXIgYiA9IHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7IC8vIChOIC8gMikgKiBRXG4gIHZhciBjID0gdGhpczsgLy8gUVxuXG4gIGZvciAodmFyIGJpdHMgPSBbXTsgdC5jbXBuKDApICE9PSAwOyB0Lml1c2hybigxKSlcbiAgICBiaXRzLnB1c2godC5hbmRsbigxKSk7XG5cbiAgZm9yICh2YXIgaSA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYml0c1tpXSA9PT0gMCkge1xuICAgICAgLy8gTiAqIFEgKyBRID0gKChOIC8gMikgKiBRICsgUSkpICsgKE4gLyAyKSAqIFFcbiAgICAgIGEgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKSlcbiAgICAgIGIgPSBiLmRibCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOICogUSA9ICgoTiAvIDIpICogUSArIFEpICsgKChOIC8gMikgKiBRKVxuICAgICAgYiA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRICsgUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKVxuICAgICAgYSA9IGEuZGJsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qdW1sQWRkID0gZnVuY3Rpb24ganVtbEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHRoaXMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKSB7XG4gIC8vIE5PVEU6IEltcG9ydGFudCBhcyB3ZSBhcmUgY3JlYXRpbmcgcG9pbnQgaW4gQmFzZS5jYWxsKClcbiAgdGhpcy50d2lzdGVkID0gKGNvbmYuYSB8IDApICE9PSAxO1xuICB0aGlzLm1PbmVBID0gdGhpcy50d2lzdGVkICYmIChjb25mLmEgfCAwKSA9PT0gLTE7XG4gIHRoaXMuZXh0ZW5kZWQgPSB0aGlzLm1PbmVBO1xuXG4gIEJhc2UuY2FsbCh0aGlzLCAnZWR3YXJkcycsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS51bW9kKHRoaXMucmVkLm0pO1xuICB0aGlzLmEgPSB0aGlzLmEudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMgPSBuZXcgQk4oY29uZi5jLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMyID0gdGhpcy5jLnJlZFNxcigpO1xuICB0aGlzLmQgPSBuZXcgQk4oY29uZi5kLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmRkID0gdGhpcy5kLnJlZEFkZCh0aGlzLmQpO1xuXG4gIGFzc2VydCghdGhpcy50d2lzdGVkIHx8IHRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSA9PT0gMCk7XG4gIHRoaXMub25lQyA9IChjb25mLmMgfCAwKSA9PT0gMTtcbn1cbmluaGVyaXRzKEVkd2FyZHNDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IEVkd2FyZHNDdXJ2ZTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uIF9tdWxBKG51bSkge1xuICBpZiAodGhpcy5tT25lQSlcbiAgICByZXR1cm4gbnVtLnJlZE5lZygpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYS5yZWRNdWwobnVtKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbiBfbXVsQyhudW0pIHtcbiAgaWYgKHRoaXMub25lQylcbiAgICByZXR1cm4gbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYy5yZWRNdWwobnVtKTtcbn07XG5cbi8vIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTaG9ydCBjdXJ2ZVxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5LCB6LCB0KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bCh4MikpO1xuICB2YXIgbGhzID0gdGhpcy5vbmUucmVkU3ViKHRoaXMuYzIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHgyKSk7XG5cbiAgdmFyIHkyID0gcmhzLnJlZE11bChsaHMucmVkSW52bSgpKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWSA9IGZ1bmN0aW9uIHBvaW50RnJvbVkoeSwgb2RkKSB7XG4gIHkgPSBuZXcgQk4oeSwgMTYpO1xuICBpZiAoIXkucmVkKVxuICAgIHkgPSB5LnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyB4XjIgPSAoeV4yIC0gY14yKSAvIChjXjIgZCB5XjIgLSBhKVxuICB2YXIgeTIgPSB5LnJlZFNxcigpO1xuICB2YXIgbGhzID0geTIucmVkU3ViKHRoaXMuYzIpO1xuICB2YXIgcmhzID0geTIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHRoaXMuYzIpLnJlZFN1Yih0aGlzLmEpO1xuICB2YXIgeDIgPSBsaHMucmVkTXVsKHJocy5yZWRJbnZtKCkpO1xuXG4gIGlmICh4Mi5jbXAodGhpcy56ZXJvKSA9PT0gMCkge1xuICAgIGlmIChvZGQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sIHkpO1xuICB9XG5cbiAgdmFyIHggPSB4Mi5yZWRTcXJ0KCk7XG4gIGlmICh4LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgaWYgKHguZnJvbVJlZCgpLmlzT2RkKCkgIT09IG9kZClcbiAgICB4ID0geC5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICBpZiAocG9pbnQuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIEN1cnZlOiBBICogWF4yICsgWV4yID0gQ14yICogKDEgKyBEICogWF4yICogWV4yKVxuICBwb2ludC5ub3JtYWxpemUoKTtcblxuICB2YXIgeDIgPSBwb2ludC54LnJlZFNxcigpO1xuICB2YXIgeTIgPSBwb2ludC55LnJlZFNxcigpO1xuICB2YXIgbGhzID0geDIucmVkTXVsKHRoaXMuYSkucmVkQWRkKHkyKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKHgyKS5yZWRNdWwoeTIpKSk7XG5cbiAgcmV0dXJuIGxocy5jbXAocmhzKSA9PT0gMDtcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCB6LCB0KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdwcm9qZWN0aXZlJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy56T25lID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0geiA/IG5ldyBCTih6LCAxNikgOiB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0ICYmIG5ldyBCTih0LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKHRoaXMudCAmJiAhdGhpcy50LnJlZClcbiAgICAgIHRoaXMudCA9IHRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcblxuICAgIC8vIFVzZSBleHRlbmRlZCBjb29yZGluYXRlc1xuICAgIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkICYmICF0aGlzLnQpIHtcbiAgICAgIHRoaXMudCA9IHRoaXMueC5yZWRNdWwodGhpcy55KTtcbiAgICAgIGlmICghdGhpcy56T25lKVxuICAgICAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICAgIH1cbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIHosIHQpO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoY3VydmUsIG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy54LmNtcG4oMCkgPT09IDAgJiZcbiAgICAodGhpcy55LmNtcCh0aGlzLnopID09PSAwIHx8XG4gICAgKHRoaXMuek9uZSAmJiB0aGlzLnkuY21wKHRoaXMuY3VydmUuYykgPT09IDApKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0RGJsID0gZnVuY3Rpb24gX2V4dERibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtaHdjZFxuICAvLyA0TSArIDRTXG5cbiAgLy8gQSA9IFgxXjJcbiAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEIgPSBZMV4yXG4gIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBDID0gMiAqIFoxXjJcbiAgdmFyIGMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIGMgPSBjLnJlZElBZGQoYyk7XG4gIC8vIEQgPSBhICogQVxuICB2YXIgZCA9IHRoaXMuY3VydmUuX211bEEoYSk7XG4gIC8vIEUgPSAoWDEgKyBZMSleMiAtIEEgLSBCXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihiKTtcbiAgLy8gRyA9IEQgKyBCXG4gIHZhciBnID0gZC5yZWRBZGQoYik7XG4gIC8vIEYgPSBHIC0gQ1xuICB2YXIgZiA9IGcucmVkU3ViKGMpO1xuICAvLyBIID0gRCAtIEJcbiAgdmFyIGggPSBkLnJlZFN1YihiKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qRGJsID0gZnVuY3Rpb24gX3Byb2pEYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWJiamxwXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDctYmxcbiAgLy8gYW5kIG90aGVyc1xuICAvLyBHZW5lcmFsbHkgM00gKyA0UyBvciAyTSArIDRTXG5cbiAgLy8gQiA9IChYMSArIFkxKV4yXG4gIHZhciBiID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpO1xuICAvLyBDID0gWDFeMlxuICB2YXIgYyA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gRCA9IFkxXjJcbiAgdmFyIGQgPSB0aGlzLnkucmVkU3FyKCk7XG5cbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgdmFyIGU7XG4gIHZhciBoO1xuICB2YXIgajtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIEUgPSBhICogQ1xuICAgIGUgPSB0aGlzLmN1cnZlLl9tdWxBKGMpO1xuICAgIC8vIEYgPSBFICsgRFxuICAgIHZhciBmID0gZS5yZWRBZGQoZCk7XG4gICAgaWYgKHRoaXMuek9uZSkge1xuICAgICAgLy8gWDMgPSAoQiAtIEMgLSBEKSAqIChGIC0gMilcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkU3ViKGQpLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEZeMiAtIDIgKiBGXG4gICAgICBueiA9IGYucmVkU3FyKCkucmVkU3ViKGYpLnJlZFN1YihmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSCA9IFoxXjJcbiAgICAgIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICBqID0gZi5yZWRTdWIoaCkucmVkSVN1YihoKTtcbiAgICAgIC8vIFgzID0gKEItQy1EKSpKXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZElTdWIoZCkucmVkTXVsKGopO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEYgKiBKXG4gICAgICBueiA9IGYucmVkTXVsKGopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBFID0gQyArIERcbiAgICBlID0gYy5yZWRBZGQoZCk7XG4gICAgLy8gSCA9IChjICogWjEpXjJcbiAgICBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICBqID0gZS5yZWRTdWIoaCkucmVkU3ViKGgpO1xuICAgIC8vIFgzID0gYyAqIChCIC0gRSkgKiBKXG4gICAgbnggPSB0aGlzLmN1cnZlLl9tdWxDKGIucmVkSVN1YihlKSkucmVkTXVsKGopO1xuICAgIC8vIFkzID0gYyAqIEUgKiAoQyAtIEQpXG4gICAgbnkgPSB0aGlzLmN1cnZlLl9tdWxDKGUpLnJlZE11bChjLnJlZElTdWIoZCkpO1xuICAgIC8vIFozID0gRSAqIEpcbiAgICBueiA9IGUucmVkTXVsKGopO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIERvdWJsZSBpbiBleHRlbmRlZCBjb29yZGluYXRlc1xuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0RGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakRibCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHRBZGQgPSBmdW5jdGlvbiBfZXh0QWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtaHdjZC0zXG4gIC8vIDhNXG5cbiAgLy8gQSA9IChZMSAtIFgxKSAqIChZMiAtIFgyKVxuICB2YXIgYSA9IHRoaXMueS5yZWRTdWIodGhpcy54KS5yZWRNdWwocC55LnJlZFN1YihwLngpKTtcbiAgLy8gQiA9IChZMSArIFgxKSAqIChZMiArIFgyKVxuICB2YXIgYiA9IHRoaXMueS5yZWRBZGQodGhpcy54KS5yZWRNdWwocC55LnJlZEFkZChwLngpKTtcbiAgLy8gQyA9IFQxICogayAqIFQyXG4gIHZhciBjID0gdGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwocC50KTtcbiAgLy8gRCA9IFoxICogMiAqIFoyXG4gIHZhciBkID0gdGhpcy56LnJlZE11bChwLnoucmVkQWRkKHAueikpO1xuICAvLyBFID0gQiAtIEFcbiAgdmFyIGUgPSBiLnJlZFN1YihhKTtcbiAgLy8gRiA9IEQgLSBDXG4gIHZhciBmID0gZC5yZWRTdWIoYyk7XG4gIC8vIEcgPSBEICsgQ1xuICB2YXIgZyA9IGQucmVkQWRkKGMpO1xuICAvLyBIID0gQiArIEFcbiAgdmFyIGggPSBiLnJlZEFkZChhKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qQWRkID0gZnVuY3Rpb24gX3Byb2pBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1iYmpscFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA3LWJsXG4gIC8vIDEwTSArIDFTXG5cbiAgLy8gQSA9IFoxICogWjJcbiAgdmFyIGEgPSB0aGlzLnoucmVkTXVsKHAueik7XG4gIC8vIEIgPSBBXjJcbiAgdmFyIGIgPSBhLnJlZFNxcigpO1xuICAvLyBDID0gWDEgKiBYMlxuICB2YXIgYyA9IHRoaXMueC5yZWRNdWwocC54KTtcbiAgLy8gRCA9IFkxICogWTJcbiAgdmFyIGQgPSB0aGlzLnkucmVkTXVsKHAueSk7XG4gIC8vIEUgPSBkICogQyAqIERcbiAgdmFyIGUgPSB0aGlzLmN1cnZlLmQucmVkTXVsKGMpLnJlZE11bChkKTtcbiAgLy8gRiA9IEIgLSBFXG4gIHZhciBmID0gYi5yZWRTdWIoZSk7XG4gIC8vIEcgPSBCICsgRVxuICB2YXIgZyA9IGIucmVkQWRkKGUpO1xuICAvLyBYMyA9IEEgKiBGICogKChYMSArIFkxKSAqIChYMiArIFkyKSAtIEMgLSBEKVxuICB2YXIgdG1wID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bChwLngucmVkQWRkKHAueSkpLnJlZElTdWIoYykucmVkSVN1YihkKTtcbiAgdmFyIG54ID0gYS5yZWRNdWwoZikucmVkTXVsKHRtcCk7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gYSAqIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIodGhpcy5jdXJ2ZS5fbXVsQShjKSkpO1xuICAgIC8vIFozID0gRiAqIEdcbiAgICBueiA9IGYucmVkTXVsKGcpO1xuICB9IGVsc2Uge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIoYykpO1xuICAgIC8vIFozID0gYyAqIEYgKiBHXG4gICAgbnogPSB0aGlzLmN1cnZlLl9tdWxDKGYpLnJlZE11bChnKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0QWRkKHApO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pBZGQocCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgZmFsc2UpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICBpZiAodGhpcy56T25lKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB2YXIgemkgPSB0aGlzLnoucmVkSW52bSgpO1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHppKTtcbiAgdGhpcy55ID0gdGhpcy55LnJlZE11bCh6aSk7XG4gIGlmICh0aGlzLnQpXG4gICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh6aSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICB0aGlzLnpPbmUgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSxcbiAgICB0aGlzLnksXG4gICAgdGhpcy56LFxuICAgIHRoaXMudCAmJiB0aGlzLnQucmVkTmVnKCkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgICAgIHRoaXMuZ2V0WCgpLmNtcChvdGhlci5nZXRYKCkpID09PSAwICYmXG4gICAgICAgICB0aGlzLmdldFkoKS5jbXAob3RoZXIuZ2V0WSgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTtcbiAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4YyA9IHguY2xvbmUoKTtcbiAgdmFyIHQgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBDb21wYXRpYmlsaXR5IHdpdGggQmFzZUN1cnZlXG5Qb2ludC5wcm90b3R5cGUudG9QID0gUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZTtcblBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IFBvaW50LnByb3RvdHlwZS5hZGQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gZXhwb3J0cztcblxuY3VydmUuYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuY3VydmUuc2hvcnQgPSByZXF1aXJlKCcuL3Nob3J0Jyk7XG5jdXJ2ZS5tb250ID0gcmVxdWlyZSgnLi9tb250Jyk7XG5jdXJ2ZS5lZHdhcmRzID0gcmVxdWlyZSgnLi9lZHdhcmRzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKG1zZywgaSkge1xuICBpZiAoKG1zZy5jaGFyQ29kZUF0KGkpICYgMHhGQzAwKSAhPT0gMHhEODAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpIDwgMCB8fCBpICsgMSA+PSBtc2cubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAobXNnLmNoYXJDb2RlQXQoaSArIDEpICYgMHhGQzAwKSA9PT0gMHhEQzAwO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFlbmMpIHtcbiAgICAgIC8vIEluc3BpcmVkIGJ5IHN0cmluZ1RvVXRmOEJ5dGVBcnJheSgpIGluIGNsb3N1cmUtbGlicmFyeSBieSBHb29nbGVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvODU5OGQ4NzI0MmFmNTlhYWMyMzMyNzA3NDJjODk4NGUyYjJiZGJlMC9jbG9zdXJlL2dvb2cvY3J5cHQvY3J5cHQuanMjTDExNy1MMTQzXG4gICAgICAvLyBBcGFjaGUgTGljZW5zZSAyLjBcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3Vycm9nYXRlUGFpcihtc2csIGkpKSB7XG4gICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzRkYpIDw8IDEwKSArIChtc2cuY2hhckNvZGVBdCgrK2kpICYgMHgwM0ZGKTtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGZ0XzEgPSBzaGFDb21tb24uZnRfMTtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMV9LID0gW1xuICAweDVBODI3OTk5LCAweDZFRDlFQkExLFxuICAweDhGMUJCQ0RDLCAweENBNjJDMUQ2XG5dO1xuXG5mdW5jdGlvbiBTSEExKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMSkpXG4gICAgcmV0dXJuIG5ldyBTSEExKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLFxuICAgIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5XID0gbmV3IEFycmF5KDgwKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoU0hBMSwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMTtcblxuU0hBMS5ibG9ja1NpemUgPSA1MTI7XG5TSEExLm91dFNpemUgPSAxNjA7XG5TSEExLmhtYWNTdHJlbmd0aCA9IDgwO1xuU0hBMS5wYWRMZW5ndGggPSA2NDtcblxuU0hBMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuXG4gIGZvcig7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSByb3RsMzIoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHMgPSB+fihpIC8gMjApO1xuICAgIHZhciB0ID0gc3VtMzJfNShyb3RsMzIoYSwgNSksIGZ0XzEocywgYiwgYywgZCksIGUsIFdbaV0sIHNoYTFfS1tzXSk7XG4gICAgZSA9IGQ7XG4gICAgZCA9IGM7XG4gICAgYyA9IHJvdGwzMihiLCAzMCk7XG4gICAgYiA9IGE7XG4gICAgYSA9IHQ7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xufTtcblxuU0hBMS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBTSEEyNTYgPSByZXF1aXJlKCcuLzI1NicpO1xuXG5mdW5jdGlvbiBTSEEyMjQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKVxuICAgIHJldHVybiBuZXcgU0hBMjI0KCk7XG5cbiAgU0hBMjU2LmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWMoaGFzaCwga2V5LCBlbmMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWMpKVxuICAgIHJldHVybiBuZXcgSG1hYyhoYXNoLCBrZXksIGVuYyk7XG4gIHRoaXMuSGFzaCA9IGhhc2g7XG4gIHRoaXMuYmxvY2tTaXplID0gaGFzaC5ibG9ja1NpemUgLyA4O1xuICB0aGlzLm91dFNpemUgPSBoYXNoLm91dFNpemUgLyA4O1xuICB0aGlzLmlubmVyID0gbnVsbDtcbiAgdGhpcy5vdXRlciA9IG51bGw7XG5cbiAgdGhpcy5faW5pdCh1dGlscy50b0FycmF5KGtleSwgZW5jKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWM7XG5cbkhtYWMucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChrZXkpIHtcbiAgLy8gU2hvcnRlbiBrZXksIGlmIG5lZWRlZFxuICBpZiAoa2V5Lmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplKVxuICAgIGtleSA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKTtcbiAgYXNzZXJ0KGtleS5sZW5ndGggPD0gdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIEFkZCBwYWRkaW5nIHRvIGtleVxuICBmb3IgKHZhciBpID0ga2V5Lmxlbmd0aDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAga2V5LnB1c2goMCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuIiwKICAgICJ2YXIgaGFzaCA9IGV4cG9ydHM7XG5cbmhhc2gudXRpbHMgPSByZXF1aXJlKCcuL2hhc2gvdXRpbHMnKTtcbmhhc2guY29tbW9uID0gcmVxdWlyZSgnLi9oYXNoL2NvbW1vbicpO1xuaGFzaC5zaGEgPSByZXF1aXJlKCcuL2hhc2gvc2hhJyk7XG5oYXNoLnJpcGVtZCA9IHJlcXVpcmUoJy4vaGFzaC9yaXBlbWQnKTtcbmhhc2guaG1hYyA9IHJlcXVpcmUoJy4vaGFzaC9obWFjJyk7XG5cbi8vIFByb3h5IGhhc2ggZnVuY3Rpb25zIHRvIHRoZSBtYWluIG9iamVjdFxuaGFzaC5zaGExID0gaGFzaC5zaGEuc2hhMTtcbmhhc2guc2hhMjU2ID0gaGFzaC5zaGEuc2hhMjU2O1xuaGFzaC5zaGEyMjQgPSBoYXNoLnNoYS5zaGEyMjQ7XG5oYXNoLnNoYTM4NCA9IGhhc2guc2hhLnNoYTM4NDtcbmhhc2guc2hhNTEyID0gaGFzaC5zaGEuc2hhNTEyO1xuaGFzaC5yaXBlbWQxNjAgPSBoYXNoLnJpcGVtZC5yaXBlbWQxNjA7XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5JyxcbiAgICAgICAgJ2QzNTA2ZTBkOWUzYzc5ZWJhNGVmOTdhNTFmZjcxZjVlYWNiNTk1NWFkZDI0MzQ1YzZlZmE2ZmZlZTlmZWQ2OTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEnLFxuICAgICAgICAnOTZlODY3YjU1OTVjYzQ5OGE5MjExMzc0ODg4MjRkNmUyNjYwYTA2NTM3Nzk0OTQ4MDFkYzA2OWQ5ZWIzOWY1ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQnLFxuICAgICAgICAnOWQ3MDYxOTI4OTQwNDA1ZTZiYjZhNDE3NjU5NzUzNWFmMjkyZGQ0MTllMWNlZDc5YTQ0ZjE4ZjI5NDU2YTAwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAnLFxuICAgICAgICAnNWJjMDg3ZDBiYzgwMTA2ZDg4YzllY2NhYzIwZDNjMWMxMzk5OTk4MWUxNDQzNDY5OWRjYjA5NmIwMjI3NzFjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNycsXG4gICAgICAgICc3YzgwYzY4ZTYwMzA1OWJhNjliOGUyYTMwZTQ1YzRkNDdlYTRkZDJmNWMyODEwMDJkODY4OTA2MDNhODQyMTYwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhJyxcbiAgICAgICAgJzUzYTU2Mjg1NmRjYjY2NDZkYzZiNzRjNWQxYzM0MThjNmQ0ZGZmMDhjOTdjZDJiZWQ0Y2I3Zjg4ZDhjOGU1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1JyxcbiAgICAgICAgJzdhOTA4OTc0YmNlMThjZmUxMmEyN2JiMmFkNWE0ODhjZDc0ODRhNzc4NzEwNDg3MGIyNzAzNGY5NGVlZTMxZGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2JyxcbiAgICAgICAgJzZlMDU2OGRiOWIwYjEzMjk3Y2Y2NzRkZWNjYjZhZjkzMTI2YjU5NmI5NzNmN2I3NzcwMWQzZGI3ZjIzY2I5NmYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiJyxcbiAgICAgICAgJ2ZlYmZhYTM4ZjJiYzdlYWU3MjhlYzYwODE4YzM0MGViMDM0MjhkNjMyYmIwNjdlMTc5MzYzZWQ3NWQ3ZDk5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwJyxcbiAgICAgICAgJzczNzBmOTFjZmI2N2U0ZjUwODE4MDlmYTI1ZDQwZjliMTczNWRiZjdjMGExMWExMzBjMGQxYTA0MWUxNzdlYTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEnLFxuICAgICAgICAnMWU2MzYzM2FkMGVmNGYxYzE2NjFhNmQwZWEwMmI3Mjg2Y2M3ZTc0ZWM5NTFkMWM5ODIyYzM4NTc2ZmViNzNiYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYnLFxuICAgICAgICAnNjdjODc2ZDA2ZjNlMDZkZTFkYWRmMTZlNTY2MWRiM2M0YjNhZTZkNDhlMzViMmZmMzBiZjBiNjFhNzFiYTQ1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NicsXG4gICAgICAgICczNWVjNTEwOTJkODcyODA1MDk3NGMyM2ExZDg1ZDRiNWQ1MDZjZGMyODg0OTAxOTJlYmFjMDZjYWQxMGQ1ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYnLFxuICAgICAgICAnNDBhNmJmMjBlNzY2NDBiMmM5MmI5N2FmZTU4Y2Q4MmM0MzJlMTBhN2Y1MTRkOWYzZWU4YmUxMWFlMWIyOGVjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MScsXG4gICAgICAgICcxZjAzNjQ4NDEzYTM4YzBiZTI5ZDQ5NmU1ODJjZjU2NjNlODc1MWU5Njg3NzMzMTU4MmMyMzdhMjRlYjFmOTYyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMycsXG4gICAgICAgICdiZTMyNzllZDViYmJiMDNhYzY5YTgwZjg5ODc5YWE1YTAxYTZiOTY1ZjEzZjdlNTlkNDdhNTMwNWJhNWFkOTNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZScsXG4gICAgICAgICdiMzE4ZTBlYzMzNTQwMjhhZGQ2Njk4MjdmOWQ0YjI4NzBhYWE5NzFkMmY3ZTVlZDFkMGIyOTc0ODNkODNlZmQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMycsXG4gICAgICAgICc3Zjk3MzU1YjhkYjgxYzA5YWJmYjdmM2M1YjI1MTU4ODhiNjc5YTNlNTBkZDZiZDZjZWY3YzczMTExZjRjYzBjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MScsXG4gICAgICAgICdlODJkODZmYjY0NDNmY2I3NTY1YWVlNThiMjk0ODIyMGE3MGY3NTBhZjQ4NGNhNTJkNDE0MjE3NGRjZjg5NDA1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YicsXG4gICAgICAgICc2OWJlMTU5MDA0NjE0NTgwZWY3ZTQzMzQ1M2NjYjBjYTQ4ZjMwMGE4MWQwOTQyZTEzZjQ5NWE5MDdmNmVjYzI3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAnLFxuICAgICAgICAnNjIwZWZhYmJjOGVlMjc4MmUyNGU3YzBjZmI5NWM1ZDczNWI3ODNiZTljZjBmOGU5NTVhZjM0YTMwZTYyYjk0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmOGJkZTRkMWEwNzIwOTM1NWI0YTcyNTBhNWM1MTI4ZTg4Yjg0YmRkYzYxOWFiN2NiYThkNTY5YjI0MGVmZTQnLFxuICAgICAgICAnZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NGFlN2Y4NThhOTQxMWU1ZWY0MjQ2YjcwYzY1YWFjNTY0OTk4MGJlNWMxNzg5MWJiZWMxNzg5NWRhMDA4Y2InLFxuICAgICAgICAnZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGVmZGVhNGNkYjY3Nzc1MGE0MjBmZWU4MDdlYWNmMjFlYjk4OThhZTc5Yjk3Njg3NjZlNGZhYTA0YTJkNGEzNCcsXG4gICAgICAgICc0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmZhMjEwNGQ2YjM4ZDExYjAyMzAwMTA1NTk4NzkxMjRlNDJhYjhkZmVmZjVmZjI5ZGM5Y2RhZGQ0ZWNhY2MzZicsXG4gICAgICAgICcyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDRkMTJjNzA2NWQ4MTJlOGFjZjI4ZDdjYmIxOWY5MDExZWNkOWU5ZmRmMjgxYjBlNmEzYjVlODdkMjJlN2RiJyxcbiAgICAgICAgJzIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDViZGIwMTk5ODE3MThiOTg2ZDBmMDdlODM0Y2IwZDlkZWI4MzYwZmZiN2Y2MWRmOTgyMzQ1ZWYyN2E3NDc5JyxcbiAgICAgICAgJzI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdhOTM3NWFkNjE2N2FkNTRhYTc0YzYzNDhjYzU0ZDM0NGNjNWRjOTQ4N2Q4NDcwNDlkNWVhYmIwZmEwM2M4ZmInLFxuICAgICAgICAnZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3N2YyMzA5MzZlZTg4Y2JiZDczZGY5MzBkNjQ3MDJlZjg4MWQ4MTFlMGUxNDk4ZTJmMWMxM2ViMWZjMzQ1ZDc0JyxcbiAgICAgICAgJzk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTZmODA0MjQ0ZTQ2ZTJhMDkyMzJkNGFmZjNiNTk5NzZiOThmYWMxNDMyOGEyZDFhMzI0OTZiNDk5OThmMjQ3JyxcbiAgICAgICAgJ2NlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjM1Y2E3MmQ3ZTg0MzJjMzM4ZWM1M2NkMTIyMjBiYzAxYzQ4Njg1ZTI0ZjdkYzhjNjAyYTc3NDY5OThlNDM1JyxcbiAgICAgICAgJzkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTg2YjQ4M2QwNTZhMDMzODI2YWU3M2Q4OGY3MzI5ODVjNGNjYjFmMzJiYTM1ZjRiNGNjNDdmZGNmMDRhYTZlYicsXG4gICAgICAgICczYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjkwNzk4YzJiNjQ3NjgzMGRhMTJmZTAyMjg3ZTllNzc3YWEzZmJhMWMzNTViMTdhNzIyZDM2MmY4NDYxNGZiYScsXG4gICAgICAgICdlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTlkYmY0NmY4Yzk0NzU5YmEyMTI3N2MzMzc4NGY0MTY0NWY3YjQ0ZjZjNTk2YTU4Y2U5MmU2NjYxOTFhYmUzZScsXG4gICAgICAgICdjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4ZGNhZGY1OTkwZTA0OGFhMzg3NGQ0NmFiZWY5ZDcwMTg1OGY5NWRlODA0MWQyYTY4MjhjOTllMjI2MjUxOScsXG4gICAgICAgICdlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNjYzMwYWQ2YjQ4M2U0YmM3OWNlMmM5ZGQ4YmM1NDk5M2U5NDdlYjhkZjc4N2I0NDI5NDNkM2Y3YjUyN2VhZicsXG4gICAgICAgICc4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTVkOTQ0MTI1NDk0NTA2NGNmMWExYzMzYmJkM2I0OWY4OTY2YzUwOTIxNzFlNjk5ZWYyNThkZmFiODFjMDQ1YycsXG4gICAgICAgICdkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMTEwOTFkZDk4NjBlOGUyMGVlMTM0NzNjMTE1NWY1ZjY5NjM1ZTM5NDcwNGVhYTc0MDA5NDUyMjQ2Y2ZhOWIzJyxcbiAgICAgICAgJzY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3Yjg3NDBmNzRhOGZiYWFiMWY2ODNkYjhmNDVkZTI2NTQzYTU0OTBiY2E2MjcwODcyMzY5MTI0NjlhMGI0NDgnLFxuICAgICAgICAnZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMDc5YWRiMWRmMTg2MDA3NDM1NmEyNWFhMzgyMDZhNmQ3MTZiMmMzZTY3NDUzZDI4NzY5OGJhZDdiMmIyZDYnLFxuICAgICAgICAnOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc4Yzk0MDc1NDRhYzEzMjY5MmVlMTkxMGEwMjQzOTk1OGFlMDQ4NzcxNTEzNDJlYTk2YzRiNmIzNWE0OWY1MScsXG4gICAgICAgICdmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQxOTE2MzY1YWJiMmI1ZDA5MTkyZjVmMmRiZWFmZWMyMDhmMDIwZjEyNTcwYTE4NGRiYWRjM2U1ODU5NTk5NycsXG4gICAgICAgICc0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2ZTQ2NDFhNTM5NDhmZDQ3NmMzOWY4YTk5ZmQ5NzRlNWVjMDc1NjRiNTMxNWQ4YmY5OTQ3MWJjYTBlZjJmNjYnLFxuICAgICAgICAnZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWUzM2YxYTc0NmM5YzU3NzgxMzMzNDRkOTI5OWZjYWEyMGIwOTM4ZThhY2ZmMjU0NGJiNDAyODRiOGM1ZmI5NCcsXG4gICAgICAgICc2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EwYjFjYWUwNmIwYTg0N2EzZmVhNmU2NzFhYWY4YWRmZGZlNThjYTJmNzY4MTA1YzgwODJiMmU0NDlmY2UyNTInLFxuICAgICAgICAnYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWEwMTYwNmE3YTZjOWNkZDI0OWZkZmNmYWNiOTk1ODQwMDFlZGQyOGFiYmFiNzdiNTEwNGU5OGU4ZTNiMzVkNCcsXG4gICAgICAgICczMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5MWVlMzU1MzEzZDk5NzIxY2Y2OTkzZmZlZDFlM2UzMDE5OTNmZjNlZDI1ODgwMjA3NWVhOGNlZDM5N2UyNDYnLFxuICAgICAgICAnYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NjODcwNGI4YTYwYTBkZWZhM2E5OWE3Mjk5ZjJlOWMzZmJjMzk1YWZiMDRhYzA3ODQyNWVmOGExNzkzY2MwMzAnLFxuICAgICAgICAnYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTZjYmMzMDQ2YmM2YTQ1MGJhYzI0Nzg5ZmExNzExNWE0Yzk3MzllZDc1ZjhmMjFjZTQ0MWY3MmUwYjkwZTZlZicsXG4gICAgICAgICcyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDA3NDdjYzlkMDEyY2IxYTEzYjgxNDgzMDljNmRlN2VjMjVkNjk0NWQ2NTcxNDZiOWQ1OTk0YjhmZWIxMTExJyxcbiAgICAgICAgJzVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjZWUzMWNiZjdlMzRlYzM3OWQ5NGZiODE0ZDNkNzc1YWQ5NTQ1OTVkMTMxNGJhODg0Njk1OWUzZTgyZjc0ZTI2JyxcbiAgICAgICAgJzhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ODQ1NzUyNDgyMGZhNjVhNGY4ZDM1ZWI2OTMwODU3YzAwMzJhY2MwYTRhMmRlNDIyMjMzZWVkYTg5NzYxMmM0JyxcbiAgICAgICAgJzI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNzU2MDVkNTkxMDJhNWEyNjg0NTAwZDNiOTkxZjJlM2YzYzg4YjkzMjI1NTQ3MDM1YWYyNWFmNjZlMDQ1NDFmJyxcbiAgICAgICAgJ2Y1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTE2MzAyNmU5ZmQ2ZmUwMTdjMzhmMDZhNWJlNmZjMTI1NDI0YjM3MWNlMjcwOGU3YmY0NDkxNjkxZTU3NjRhJyxcbiAgICAgICAgJzFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZDhiOTg1NWM3YzA1MmEzNDE0NmZkMjBmZmI2NThiZWE0YjlmNjllMGQ4MjVlYmVjMTZlOGMzY2UyYjUyNmExJyxcbiAgICAgICAgJ2NkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdmMzBlYTI0NzZiMzk5YjQ5NTc1MDljODhmNzdkMDE5MWFmYTJmZjVjYjdiMTRmZDZkOGU3ZDY1YWFhYjExOTMnLFxuICAgICAgICAnY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTJjYjc0ZmRkYzhlOWZiY2QwNzZlZWYyYTdjNzJiMGNlMzdkNTBmMDgyNjlkZmMwNzRiNTgxNTUwNTQ3YTRmNycsXG4gICAgICAgICdkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2ZhZDNmYTg0Y2FmMGYzNGYwZjg5YmZkMmRjZjU0ZmMxNzVkNzY3YWVjM2U1MDY4NGYzYmE0YTRiZjVmNjgzZCcsXG4gICAgICAgICdjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMGU0ZTY3MDQzNTM4NTU1NmU1OTM2NTcxMzU4NDVkMzZmYmI2OTMxZjcyYjA4Y2IxZWQ5NTRmMWUzY2UzZmY2JyxcbiAgICAgICAgJzQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMDE1ZjgwNDRmNWZjYmRjZjIxY2EyNmQ2YzM0ZmI4MTk3ODI5MjA1YzdiN2QyYTdjYjY2NDE4YzE1N2IxMTJjJyxcbiAgICAgICAgJ2FiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNlMjc2M2Q4ODVmOTU4ZmM2NmNkZDIyODAwZjBhNDg3MTk3ZDBhODJlMzc3YjQ5ZjgwYWY4N2M4OTdiMDY1JyxcbiAgICAgICAgJ2JmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMDY4MmE1MDcwMzM3NWY2MDJkNDE2NjY0YmExOWI3ZmM5YmFiNDJjNzI3NDc0NjNhNzFkMDg5NmIyMmY2ZGEzJyxcbiAgICAgICAgJzU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1ZDQ2ZWZlYTM3NzFlNmU2OGFiYjg5YTEzYWQ3NDdlY2YxODkyMzkzZGZjNGYxYjcwMDQ3ODhjNTAzNzRkYTgnLFxuICAgICAgICAnOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmUgPSByZXF1aXJlKCcuL2N1cnZlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFByZXNldEN1cnZlKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3Nob3J0JylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLnNob3J0KG9wdGlvbnMpO1xuICBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdlZHdhcmRzJylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLmVkd2FyZHMob3B0aW9ucyk7XG4gIGVsc2VcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLm1vbnQob3B0aW9ucyk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG5cbiAgYXNzZXJ0KHRoaXMuZy52YWxpZGF0ZSgpLCAnSW52YWxpZCBjdXJ2ZScpO1xuICBhc3NlcnQodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwgJ0ludmFsaWQgY3VydmUsIEcqTiAhPSBPJyk7XG59XG5jdXJ2ZXMuUHJlc2V0Q3VydmUgPSBQcmVzZXRDdXJ2ZTtcblxuZnVuY3Rpb24gZGVmaW5lQ3VydmUobmFtZSwgb3B0aW9ucykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJ2ZSA9IG5ldyBQcmVzZXRDdXJ2ZShvcHRpb25zKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogY3VydmUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZGVmaW5lQ3VydmUoJ3AxOTInLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDE5MicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc2NDIxMDUxOSBlNTljODBlNyAwZmE3ZTlhYiA3MjI0MzA0OSBmZWI4ZGVlYyBjMTQ2YjliMScsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMicsXG4gICAgJzA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjU2Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiJyxcbiAgbjogJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2JyxcbiAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjUnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMzg0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYycsXG4gIGI6ICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiAnICtcbiAgICAgJzUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxICcgK1xuICAgICAnZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMnLFxuICBoYXNoOiBoYXNoLnNoYTM4NCxcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggJyArXG4gICAgJzU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3JyxcbiAgICAnMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgJyArXG4gICAgJzBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdjdXJ2ZTI1NTE5Jywge1xuICB0eXBlOiAnbW9udCcsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnNzZkMDYnLFxuICBiOiAnMScsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzknLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdlZDI1NTE5Jywge1xuICB0eXBlOiAnZWR3YXJkcycsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnLTEnLFxuICBjOiAnMScsXG4gIC8vIC0xMjE2NjUgKiAoMTIxNjY2XigtMSkpIChtb2QgUClcbiAgZDogJzUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTMnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhJyxcblxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4JyxcbiAgXSxcbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycsXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgfSxcbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlLFxuICBdLFxufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjRFJCRyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjRFJCRykpXG4gICAgcmV0dXJuIG5ldyBIbWFjRFJCRyhvcHRpb25zKTtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuICB0aGlzLnByZWRSZXNpc3QgPSAhIW9wdGlvbnMucHJlZFJlc2lzdDtcblxuICB0aGlzLm91dExlbiA9IHRoaXMuaGFzaC5vdXRTaXplO1xuICB0aGlzLm1pbkVudHJvcHkgPSBvcHRpb25zLm1pbkVudHJvcHkgfHwgdGhpcy5oYXNoLmhtYWNTdHJlbmd0aDtcblxuICB0aGlzLl9yZXNlZWQgPSBudWxsO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbDtcbiAgdGhpcy5LID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcblxuICB2YXIgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ2hleCcpO1xuICB2YXIgbm9uY2UgPSB1dGlscy50b0FycmF5KG9wdGlvbnMubm9uY2UsIG9wdGlvbnMubm9uY2VFbmMgfHwgJ2hleCcpO1xuICB2YXIgcGVycyA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5wZXJzLCBvcHRpb25zLnBlcnNFbmMgfHwgJ2hleCcpO1xuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuICB0aGlzLl9pbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hY0RSQkc7XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpIHtcbiAgdmFyIHNlZWQgPSBlbnRyb3B5LmNvbmNhdChub25jZSkuY29uY2F0KHBlcnMpO1xuXG4gIHRoaXMuSyA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICB0aGlzLlYgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlYubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLktbaV0gPSAweDAwO1xuICAgIHRoaXMuVltpXSA9IDB4MDE7XG4gIH1cblxuICB0aGlzLl91cGRhdGUoc2VlZCk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSAweDEwMDAwMDAwMDAwMDA7ICAvLyAyXjQ4XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbiBobWFjKCkge1xuICByZXR1cm4gbmV3IGhhc2guaG1hYyh0aGlzLmhhc2gsIHRoaXMuSyk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVkKSB7XG4gIHZhciBrbWFjID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMCBdKTtcbiAgaWYgKHNlZWQpXG4gICAga21hYyA9IGttYWMudXBkYXRlKHNlZWQpO1xuICB0aGlzLksgPSBrbWFjLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gIGlmICghc2VlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5LID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAxIF0pXG4gICAgICAgICAgICAgICAudXBkYXRlKHNlZWQpXG4gICAgICAgICAgICAgICAuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5yZXNlZWQgPSBmdW5jdGlvbiByZXNlZWQoZW50cm9weSwgZW50cm9weUVuYywgYWRkLCBhZGRFbmMpIHtcbiAgLy8gT3B0aW9uYWwgZW50cm9weSBlbmNcbiAgaWYgKHR5cGVvZiBlbnRyb3B5RW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbnRyb3B5RW5jO1xuICAgIGVudHJvcHlFbmMgPSBudWxsO1xuICB9XG5cbiAgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkoZW50cm9weSwgZW50cm9weUVuYyk7XG4gIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuXG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG5cbiAgdGhpcy5fdXBkYXRlKGVudHJvcHkuY29uY2F0KGFkZCB8fCBbXSkpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLl9yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jIHx8ICdoZXgnKTtcbiAgICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gW107XG4gIHdoaWxlICh0ZW1wLmxlbmd0aCA8IGxlbikge1xuICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgICB0ZW1wID0gdGVtcC5jb25jYXQodGhpcy5WKTtcbiAgfVxuXG4gIHZhciByZXMgPSB0ZW1wLnNsaWNlKDAsIGxlbik7XG4gIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB0aGlzLl9yZXNlZWQrKztcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVjLCBwdWIsIGVuYykge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHB1YjogcHViLFxuICAgIHB1YkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIuZnJvbVByaXZhdGUgPSBmdW5jdGlvbiBmcm9tUHJpdmF0ZShlYywgcHJpdiwgZW5jKSB7XG4gIGlmIChwcml2IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHJpdjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwcml2OiBwcml2LFxuICAgIHByaXZFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB2YXIgcHViID0gdGhpcy5nZXRQdWJsaWMoKTtcblxuICBpZiAocHViLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdJbnZhbGlkIHB1YmxpYyBrZXknIH07XG4gIGlmICghcHViLnZhbGlkYXRlKCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSBpcyBub3QgYSBwb2ludCcgfTtcbiAgaWYgKCFwdWIubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgKiBOICE9IE8nIH07XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhjb21wYWN0LCBlbmMpIHtcbiAgLy8gY29tcGFjdCBpcyBvcHRpb25hbCBhcmd1bWVudFxuICBpZiAodHlwZW9mIGNvbXBhY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gY29tcGFjdDtcbiAgICBjb21wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdGhpcy5wdWIpXG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmcubXVsKHRoaXMucHJpdik7XG5cbiAgaWYgKCFlbmMpXG4gICAgcmV0dXJuIHRoaXMucHViO1xuXG4gIHJldHVybiB0aGlzLnB1Yi5lbmNvZGUoZW5jLCBjb21wYWN0KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFByaXZhdGUgPSBmdW5jdGlvbiBnZXRQcml2YXRlKGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLnByaXY7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZSA9IGZ1bmN0aW9uIF9pbXBvcnRQcml2YXRlKGtleSwgZW5jKSB7XG4gIHRoaXMucHJpdiA9IG5ldyBCTihrZXksIGVuYyB8fCAxNik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgdGhlIHByaXYgd29uJ3QgYmUgYmlnZ2VyIHRoYW4gbiwgb3RoZXJ3aXNlIHdlIG1heSBmYWlsXG4gIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICB0aGlzLnByaXYgPSB0aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uIF9pbXBvcnRQdWJsaWMoa2V5LCBlbmMpIHtcbiAgaWYgKGtleS54IHx8IGtleS55KSB7XG4gICAgLy8gTW9udGdvbWVyeSBwb2ludHMgb25seSBoYXZlIGFuIGB4YCBjb29yZGluYXRlLlxuICAgIC8vIFdlaWVyc3RyYXNzL0Vkd2FyZHMgcG9pbnRzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUgYm90aCBgeGAgYW5kXG4gICAgLy8gYHlgIGNvb3JkaW5hdGVzLlxuICAgIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdtb250Jykge1xuICAgICAgYXNzZXJ0KGtleS54LCAnTmVlZCB4IGNvb3JkaW5hdGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ3Nob3J0JyB8fFxuICAgICAgICAgICAgICAgdGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycpIHtcbiAgICAgIGFzc2VydChrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIGlmKCFwdWIudmFsaWRhdGUoKSkge1xuICAgIGFzc2VydChwdWIudmFsaWRhdGUoKSwgJ3B1YmxpYyBwb2ludCBub3QgdmFsaWRhdGVkJyk7XG4gIH1cbiAgcmV0dXJuIHB1Yi5tdWwodGhpcy5wcml2KS5nZXRYKCk7XG59O1xuXG4vLyBFQ0RTQVxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMuc2lnbihtc2csIHRoaXMsIGVuYywgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMudmVyaWZ5KG1zZywgc2lnbmF0dXJlLCB0aGlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZShvcHRpb25zLCBlbmMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIG9wdGlvbnM7XG5cbiAgaWYgKHRoaXMuX2ltcG9ydERFUihvcHRpb25zLCBlbmMpKVxuICAgIHJldHVybjtcblxuICBhc3NlcnQob3B0aW9ucy5yICYmIG9wdGlvbnMucywgJ1NpZ25hdHVyZSB3aXRob3V0IHIgb3IgcycpO1xuICB0aGlzLnIgPSBuZXcgQk4ob3B0aW9ucy5yLCAxNik7XG4gIHRoaXMucyA9IG5ldyBCTihvcHRpb25zLnMsIDE2KTtcbiAgaWYgKG9wdGlvbnMucmVjb3ZlcnlQYXJhbSA9PT0gdW5kZWZpbmVkKVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG4gIGVsc2VcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBvcHRpb25zLnJlY292ZXJ5UGFyYW07XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGggb3Igb3ZlcmZsb3dcbiAgaWYgKG9jdGV0TGVuID09PSAwIHx8IG9jdGV0TGVuID4gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmKGJ1ZltwLnBsYWNlXSA9PT0gMHgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgICB2YWwgPj4+PSAwO1xuICB9XG5cbiAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAobGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAocmxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChkYXRhW3AucGxhY2VdICYgMTI4KSAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChzbGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YS5sZW5ndGggIT09IHNsZW4gKyBwLnBsYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDApIHtcbiAgICBpZiAoclsxXSAmIDB4ODApIHtcbiAgICAgIHIgPSByLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoc1swXSA9PT0gMCkge1xuICAgIGlmIChzWzFdICYgMHg4MCkge1xuICAgICAgcyA9IHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgSG1hY0RSQkcgPSByZXF1aXJlKCdobWFjLWRyYmcnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgcmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnZlcywgb3B0aW9ucyksXG4gICAgICAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBjdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZvciBmdW5jdGlvbiBmb3IgRFJCR1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2ggfHwgb3B0aW9ucy5jdXJ2ZS5oYXNoO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFQztcblxuRUMucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24ga2V5RnJvbVByaXZhdGUocHJpdiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2VuS2V5UGFpciA9IGZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICAgIGVudHJvcHk6IG9wdGlvbnMuZW50cm9weSB8fCByYW5kKHRoaXMuaGFzaC5obWFjU3RyZW5ndGgpLFxuICAgIGVudHJvcHlFbmM6IG9wdGlvbnMuZW50cm9weSAmJiBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ3V0ZjgnLFxuICAgIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpLFxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLl90cnVuY2F0ZVRvTiA9IGZ1bmN0aW9uIF90cnVuY2F0ZVRvTihtc2csIHRydW5jT25seSwgYml0TGVuZ3RoKSB7XG4gIHZhciBieXRlTGVuZ3RoO1xuICBpZiAoQk4uaXNCTihtc2cpIHx8IHR5cGVvZiBtc2cgPT09ICdudW1iZXInKSB7XG4gICAgbXNnID0gbmV3IEJOKG1zZywgMTYpO1xuICAgIGJ5dGVMZW5ndGggPSBtc2cuYnl0ZUxlbmd0aCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQk4gYXNzdW1lcyBhbiBhcnJheS1saWtlIGlucHV0IGFuZCBhc3NlcnRzIGxlbmd0aFxuICAgIGJ5dGVMZW5ndGggPSBtc2cubGVuZ3RoO1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCTiBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgdmFyIHN0ciA9IG1zZy50b1N0cmluZygpO1xuICAgIC8vIEhFWCBlbmNvZGluZ1xuICAgIGJ5dGVMZW5ndGggPSAoc3RyLmxlbmd0aCArIDEpID4+PiAxO1xuICAgIG1zZyA9IG5ldyBCTihzdHIsIDE2KTtcbiAgfVxuICAvLyBBbGxvdyBvdmVycmlkaW5nXG4gIGlmICh0eXBlb2YgYml0TGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIGJpdExlbmd0aCA9IGJ5dGVMZW5ndGggKiA4O1xuICB9XG4gIHZhciBkZWx0YSA9IGJpdExlbmd0aCAtIHRoaXMubi5iaXRMZW5ndGgoKTtcbiAgaWYgKGRlbHRhID4gMClcbiAgICBtc2cgPSBtc2cudXNocm4oZGVsdGEpO1xuICBpZiAoIXRydW5jT25seSAmJiBtc2cuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gbXNnLnN1Yih0aGlzLm4pO1xuICBlbHNlXG4gICAgcmV0dXJuIG1zZztcbn07XG5cbkVDLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbXNnICE9PSAnbnVtYmVyJyAmJiAhQk4uaXNCTihtc2cpKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmIG1zZyAmJiB0eXBlb2YgbXNnLmxlbmd0aCA9PT0gJ251bWJlcicsXG4gICAgICAnRXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBhbiBhcnJheS1saWtlLCBhIGhleCBzdHJpbmcsIG9yIGEgQk4gaW5zdGFuY2UnKTtcbiAgICBhc3NlcnQoKG1zZy5sZW5ndGggPj4+IDApID09PSBtc2cubGVuZ3RoKTsgLy8gbm9uLW5lZ2F0aXZlIDMyLWJpdCBpbnRlZ2VyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIGFzc2VydCgobXNnW2ldICYgMjU1KSA9PT0gbXNnW2ldKTtcbiAgfVxuXG4gIGtleSA9IHRoaXMua2V5RnJvbVByaXZhdGUoa2V5LCBlbmMpO1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG5cbiAgLy8gV291bGQgZmFpbCBmdXJ0aGVyIGNoZWNrcywgYnV0IGxldCdzIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgY2xlYXJcbiAgYXNzZXJ0KCFtc2cuaXNOZWcoKSwgJ0NhbiBub3Qgc2lnbiBhIG5lZ2F0aXZlIG1lc3NhZ2UnKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gUmVjaGVjayBub25jZSB0byBiZSBiaWplY3RpdmUgdG8gbXNnXG4gIGFzc2VydCgobmV3IEJOKG5vbmNlKSkuZXEobXNnKSwgJ0NhbiBub3Qgc2lnbiBtZXNzYWdlJyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gIH0pO1xuXG4gIC8vIE51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZVxuICB2YXIgbnMxID0gdGhpcy5uLnN1YihuZXcgQk4oMSkpO1xuXG4gIGZvciAodmFyIGl0ZXIgPSAwOyA7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgIG9wdGlvbnMuayhpdGVyKSA6XG4gICAgICBuZXcgQk4oZHJiZy5nZW5lcmF0ZSh0aGlzLm4uYnl0ZUxlbmd0aCgpKSk7XG4gICAgayA9IHRoaXMuX3RydW5jYXRlVG9OKGssIHRydWUpO1xuICAgIGlmIChrLmNtcG4oMSkgPD0gMCB8fCBrLmNtcChuczEpID49IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcCA9IHRoaXMuZy5tdWwoayk7XG4gICAgaWYgKGtwLmlzSW5maW5pdHkoKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwWCA9IGtwLmdldFgoKTtcbiAgICB2YXIgciA9IGtwWC51bW9kKHRoaXMubik7XG4gICAgaWYgKHIuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHMgPSBrLmludm0odGhpcy5uKS5tdWwoci5tdWwoa2V5LmdldFByaXZhdGUoKSkuaWFkZChtc2cpKTtcbiAgICBzID0gcy51bW9kKHRoaXMubik7XG4gICAgaWYgKHMuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHJlY292ZXJ5UGFyYW0gPSAoa3AuZ2V0WSgpLmlzT2RkKCkgPyAxIDogMCkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtwWC5jbXAocikgIT09IDAgPyAyIDogMCk7XG5cbiAgICAvLyBVc2UgY29tcGxlbWVudCBvZiBgc2AsIGlmIGl0IGlzID4gYG4gLyAyYFxuICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbCAmJiBzLmNtcCh0aGlzLm5oKSA+IDApIHtcbiAgICAgIHMgPSB0aGlzLm4uc3ViKHMpO1xuICAgICAgcmVjb3ZlcnlQYXJhbSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHsgcjogciwgczogcywgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHA7XG5cbiAgaWYgKCF0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2spIHtcbiAgICBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgcCA9IHRoaXMuZy5qbXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBDb21wYXJlIGBwLnhgIG9mIEphY29iaWFuIHBvaW50IHdpdGggYHJgLFxuICAvLyB0aGlzIHdpbGwgZG8gYHAueCA9PSByICogcC56XjJgIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgYHAueGAgYnkgdGhlXG4gIC8vIGludmVyc2Ugb2YgYHAuel4yYFxuICByZXR1cm4gcC5lcVhUb1Aocik7XG59O1xuXG5FQy5wcm90b3R5cGUucmVjb3ZlclB1YktleSA9IGZ1bmN0aW9uKG1zZywgc2lnbmF0dXJlLCBqLCBlbmMpIHtcbiAgYXNzZXJ0KCgzICYgaikgPT09IGosICdUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzJyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuXG4gIC8vIEEgc2V0IExTQiBzaWduaWZpZXMgdGhhdCB0aGUgeS1jb29yZGluYXRlIGlzIG9kZFxuICB2YXIgaXNZT2RkID0gaiAmIDE7XG4gIHZhciBpc1NlY29uZEtleSA9IGogPj4gMTtcbiAgaWYgKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpID49IDAgJiYgaXNTZWNvbmRLZXkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUnKTtcblxuICAvLyAxLjEuIExldCB4ID0gciArIGpuLlxuICBpZiAoaXNTZWNvbmRLZXkpXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLmFkZCh0aGlzLmN1cnZlLm4pLCBpc1lPZGQpO1xuICBlbHNlXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLCBpc1lPZGQpO1xuXG4gIHZhciBySW52ID0gc2lnbmF0dXJlLnIuaW52bShuKTtcbiAgdmFyIHMxID0gbi5zdWIoZSkubXVsKHJJbnYpLnVtb2Qobik7XG4gIHZhciBzMiA9IHMubXVsKHJJbnYpLnVtb2Qobik7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICByZXR1cm4gdGhpcy5nLm11bEFkZChzMSwgciwgczIpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUsIFEsIGVuYykge1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKVxuICAgIHJldHVybiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBRcHJpbWU7XG4gICAgdHJ5IHtcbiAgICAgIFFwcmltZSA9IHRoaXMucmVjb3ZlclB1YktleShlLCBzaWduYXR1cmUsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBpbnN0YW5jZVxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcHVibGljL3ByaXZhdGUga2V5IHBhcmFtZXRlcnNcbipcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5zZWNyZXRdIC0gc2VjcmV0IHNlZWQgYnl0ZXNcbiogQHBhcmFtIHtQb2ludH0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCAoYWthIGBBYCBpbiBlZGRzYSB0ZXJtcylcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCBlbmNvZGVkIGFzIGJ5dGVzXG4qXG4qL1xuZnVuY3Rpb24gS2V5UGFpcihlZGRzYSwgcGFyYW1zKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcbiAgdGhpcy5fc2VjcmV0ID0gcGFyc2VCeXRlcyhwYXJhbXMuc2VjcmV0KTtcbiAgaWYgKGVkZHNhLmlzUG9pbnQocGFyYW1zLnB1YikpXG4gICAgdGhpcy5fcHViID0gcGFyYW1zLnB1YjtcbiAgZWxzZVxuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbn1cblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlZGRzYSwgcHViKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBwdWI6IHB1YiB9KTtcbn07XG5cbktleVBhaXIuZnJvbVNlY3JldCA9IGZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2EsIHNlY3JldCkge1xuICBpZiAoc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gc2VjcmV0O1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgc2VjcmV0OiBzZWNyZXQgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiBzZWNyZXQoKSB7XG4gIHJldHVybiB0aGlzLl9zZWNyZXQ7XG59O1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViQnl0ZXMnLCBmdW5jdGlvbiBwdWJCeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YicsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2Qnl0ZXMnLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgYXNzZXJ0KHNpZy5sZW5ndGggPT09IGVkZHNhLmVuY29kaW5nTGVuZ3RoICogMiwgJ1NpZ25hdHVyZSBoYXMgaW52YWxpZCBzaXplJyk7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgfTtcbiAgfVxuXG4gIGFzc2VydChzaWcuUiAmJiBzaWcuUywgJ1NpZ25hdHVyZSB3aXRob3V0IFIgb3IgUycpO1xuXG4gIGlmIChlZGRzYS5pc1BvaW50KHNpZy5SKSlcbiAgICB0aGlzLl9SID0gc2lnLlI7XG4gIGlmIChzaWcuUyBpbnN0YW5jZW9mIEJOKVxuICAgIHRoaXMuX1MgPSBzaWcuUztcblxuICB0aGlzLl9SZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlIpID8gc2lnLlIgOiBzaWcuUmVuY29kZWQ7XG4gIHRoaXMuX1NlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUykgPyBzaWcuUyA6IHNpZy5TZW5jb2RlZDtcbn1cblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUycsIGZ1bmN0aW9uIFMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1InLCBmdW5jdGlvbiBSKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1JlbmNvZGVkJywgZnVuY3Rpb24gUmVuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTZW5jb2RlZCcsIGZ1bmN0aW9uIFNlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpO1xufSk7XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24gdG9IZXgoKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy50b0J5dGVzKCksICdoZXgnKS50b1VwcGVyQ2FzZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIGN1cnZlID0gY3VydmVzW2N1cnZlXS5jdXJ2ZTtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLmcgPSBjdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShjdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgdGhpcy5wb2ludENsYXNzID0gY3VydmUucG9pbnQoKS5jb25zdHJ1Y3RvcjtcbiAgdGhpcy5lbmNvZGluZ0xlbmd0aCA9IE1hdGguY2VpbChjdXJ2ZS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHRoaXMuaGFzaCA9IGhhc2guc2hhNTEyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVERFNBO1xuXG4vKipcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfEtleVBhaXJ9IHNlY3JldCAtIHNlY3JldCBieXRlcyBvciBhIGtleXBhaXJcbiogQHJldHVybnMge1NpZ25hdHVyZX0gLSBzaWduYXR1cmVcbiovXG5FRERTQS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0KSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCk7XG4gIHZhciByID0gdGhpcy5oYXNoSW50KGtleS5tZXNzYWdlUHJlZml4KCksIG1lc3NhZ2UpO1xuICB2YXIgUiA9IHRoaXMuZy5tdWwocik7XG4gIHZhciBSZW5jb2RlZCA9IHRoaXMuZW5jb2RlUG9pbnQoUik7XG4gIHZhciBzXyA9IHRoaXMuaGFzaEludChSZW5jb2RlZCwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpXG4gICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgaWYgKHNpZy5TKCkuZ3RlKHNpZy5lZGRzYS5jdXJ2ZS5uKSB8fCBzaWcuUygpLmlzTmVnKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlID0gZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpIHtcbiAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gc2lnO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLCBzaWcpO1xufTtcblxuLyoqXG4qICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvc2Vmc3Nvbi1lZGRzYS1lZDI1NTE5LTAzI3NlY3Rpb24tNS4yXG4qXG4qIEVERFNBIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvaW50cyBhbmQgaW50ZWdlcnMuIFRoZXNlIGFyZVxuKiBoZWxwZXIgY29udmVuaWVuY2UgbWV0aG9kcywgdGhhdCBwYXNzIGFsb25nIHRvIHV0aWxpdHkgZnVuY3Rpb25zIGltcGxpZWRcbiogcGFyYW1ldGVycy5cbipcbiovXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBlbmNvZGVQb2ludChwb2ludCkge1xuICB2YXIgZW5jID0gcG9pbnQuZ2V0WSgpLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG4gIGVuY1t0aGlzLmVuY29kaW5nTGVuZ3RoIC0gMV0gfD0gcG9pbnQuZ2V0WCgpLmlzT2RkKCkgPyAweDgwIDogMDtcbiAgcmV0dXJuIGVuYztcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKSB7XG4gIGJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcyhieXRlcyk7XG5cbiAgdmFyIGxhc3RJeCA9IGJ5dGVzLmxlbmd0aCAtIDE7XG4gIHZhciBub3JtZWQgPSBieXRlcy5zbGljZSgwLCBsYXN0SXgpLmNvbmNhdChieXRlc1tsYXN0SXhdICYgfjB4ODApO1xuICB2YXIgeElzT2RkID0gKGJ5dGVzW2xhc3RJeF0gJiAweDgwKSAhPT0gMDtcblxuICB2YXIgeSA9IHV0aWxzLmludEZyb21MRShub3JtZWQpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludEZyb21ZKHksIHhJc09kZCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSkge1xuICByZXR1cm4gbnVtLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKSB7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoYnl0ZXMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSBleHBvcnRzO1xuXG5lbGxpcHRpYy52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy91dGlscycpO1xuZWxsaXB0aWMucmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbmVsbGlwdGljLmN1cnZlID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZScpO1xuZWxsaXB0aWMuY3VydmVzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZXMnKTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWMnKTtcbmVsbGlwdGljLmVkZHNhID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lZGRzYScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2FzbjEuanMnKS5iaWdudW0sXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NFRvQmlnTnVtKHZhbCwgemVybykge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20odmFsLCAnYmFzZTY0Jyk7XG5cdHZhciBibiA9IHZhbCA9IG5ldyBCTihidWYsIDEwLCAnYmUnKS5pYWJzKCk7XG5cdGlmICh6ZXJvKSB7XG5cdFx0YnVmLmZpbGwoMCk7XG5cdH1cblx0cmV0dXJuIGJuO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ0FsZ29yaXRobUlkZW50aWZlcicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcblx0XHR0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuYW55KClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1B1YmxpY0tleUluZm8nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgnUHVibGljS2V5JykuYml0c3RyKClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnVmVyc2lvbicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLmludCgpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSByZXF1aXJlKCcuL2FsZ29yaXRobS1pZGVudGlmaWVyJyk7XG52YXIgVmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ByaXZhdGVLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5QWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ2F0dHJpYnV0ZXMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKSxcblx0QnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXIsXG5cdEVDID0gcmVxdWlyZSgnZWxsaXB0aWMnKS5lYztcblxudmFyIGI2NFRvQm4gPSByZXF1aXJlKCcuL2I2NC10by1ibicpO1xuXG52YXIgUHVibGljS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wdWJsaWMta2V5LWluZm8nKSxcblx0UHJpdmF0ZUtleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHJpdmF0ZS1rZXktaW5mbycpLFxuXHRWZXJzaW9uID0gcmVxdWlyZSgnLi9hc24xL3ZlcnNpb24nKTtcblxudmFyIEVDUGFyYW1ldGVycyA9IGFzbjEuZGVmaW5lKCdFQ1BhcmFtZXRlcnMnLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5jaG9pY2Uoe1xuXHRcdG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuXHR9KTtcbn0pO1xuXG52YXIgZWNQcml2a2V5VmVyMSA9IDE7XG5cbnZhciBFQ1ByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5leHBsaWNpdCgwKS5vcHRpb25hbCgpLmFueSgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNLZXknKS5leHBsaWNpdCgxKS5vcHRpb25hbCgpLmJpdHN0cigpXG5cdCk7XG59KTtcblxudmFyIGN1cnZlcyA9IHtcblx0J1AtMjU2JzogJ3AyNTYnLFxuXHQnUC0zODQnOiAncDM4NCcsXG5cdCdQLTUyMSc6ICdwNTIxJ1xufTtcblxudmFyIG9pZHMgPSB7XG5cdCdQLTI1Nic6IFsxLCAyLCA4NDAsIDEwMDQ1LCAzLCAxLCA3XSxcblx0J1AtMzg0JzogWzEsIDMsIDEzMiwgMCwgMzRdLFxuXHQnUC01MjEnOiBbMSwgMywgMTMyLCAwLCAzNV1cbn07XG52YXIgcGFyYW1ldGVycyA9IHt9O1xudmFyIGFsZ29yaXRobXMgPSB7fTtcbk9iamVjdC5rZXlzKG9pZHMpLmZvckVhY2goZnVuY3Rpb24oY3J2KSB7XG5cdHBhcmFtZXRlcnNbY3J2XSA9IEVDUGFyYW1ldGVycy5lbmNvZGUoe1xuXHRcdHR5cGU6ICduYW1lZEN1cnZlJyxcblx0XHR2YWx1ZTogb2lkc1tjcnZdXG5cdH0sICdkZXInKTtcblx0YWxnb3JpdGhtc1tjcnZdID0ge1xuXHRcdGFsZ29yaXRobTogIFsxLCAyLCA4NDAsIDEwMDQ1LCAyLCAxXSxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl1cblx0fTtcbn0pO1xub2lkcyA9IG51bGw7XG5cbmZ1bmN0aW9uIGVjSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5jcnYpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5jcnZcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0dmFyIGhhc0QgPSAnc3RyaW5nJyA9PT0gdHlwZW9mIGp3ay5kO1xuXHR2YXIgeHlUeXBlcyA9IGhhc0Rcblx0XHQ/IFsndW5kZWZpbmVkJywgJ3N0cmluZyddXG5cdFx0OiBbJ3N0cmluZyddO1xuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay54XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay55XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUgJiYgIWhhc0QpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBjdXJ2ZU5hbWUgPSBjdXJ2ZXNbandrLmNydl07XG5cdGlmICghY3VydmVOYW1lKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZSBcIicgKyBqd2suY3J2ICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVOYW1lKTtcblxuXHR2YXIga2V5ID0ge307XG5cblx0dmFyIGhhc1B1YiA9IGp3ay54ICYmIGp3ay55O1xuXHRpZiAoaGFzUHViKSB7XG5cdFx0a2V5LnB1YiA9IHtcblx0XHRcdHg6IGI2NFRvQm4oandrLngsIGZhbHNlKSxcblx0XHRcdHk6IGI2NFRvQm4oandrLnksIGZhbHNlKVxuXHRcdH07XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlIHx8ICFoYXNQdWIpIHtcblx0XHRrZXkucHJpdiA9IGI2NFRvQm4oandrLmQsIHRydWUpO1xuXHR9XG5cblx0a2V5ID0gY3VydmUua2V5UGFpcihrZXkpO1xuXG5cdHZhciBrZXlWYWxpZGF0aW9uID0ga2V5LnZhbGlkYXRlKCk7XG5cdGlmICgha2V5VmFsaWRhdGlvbi5yZXN1bHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGZvciBjdXJ2ZTogXCInICsga2V5VmFsaWRhdGlvbi5yZWFzb24gKyAnXCInKTtcblx0fVxuXG5cdHZhciByZXN1bHQgPSBrZXlUb1BlbShqd2suY3J2LCBrZXksIG9wdHMpO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGtleVRvUGVtKGNydiwga2V5LCBvcHRzKSB7XG5cdHZhciBjb21wYWN0ID0gZmFsc2U7XG5cdHZhciBwdWJsaWNLZXkgPSBrZXkuZ2V0UHVibGljKGNvbXBhY3QsICdoZXgnKTtcblx0cHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IHtcblx0XHR1bnVzZWQ6IDAsXG5cdFx0ZGF0YTogcHVibGljS2V5XG5cdH07XG5cblx0dmFyIHJlc3VsdDtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHZhciBwcml2YXRlS2V5ID0ga2V5LmdldFByaXZhdGUoJ2hleCcpO1xuXHRcdHByaXZhdGVLZXkgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG5cblx0XHRyZXN1bHQgPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdHByaXZhdGVLZXk6IEVDUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiBlY1ByaXZrZXlWZXIxLFxuXHRcdFx0XHRwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl0sXG5cdFx0XHRcdHB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0XHR9LCAnZGVyJylcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQUklWQVRFIEtFWSdcblx0XHR9KTtcblxuXHRcdHByaXZhdGVLZXkuZmlsbCgwKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBQdWJsaWNLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHRhbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdFB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHJlc3VsdC5zbGljZSgtMSkpIHtcblx0XHRyZXN1bHQgKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVjSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyk7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBSU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVByaXZhdGVLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUV4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaW1lMScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnZXhwb25lbnQxJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MicpLmludCgpLFxuXHRcdHRoaXMua2V5KCdjb2VmZmljaWVudCcpLmludCgpXG5cdCk7XG59KTtcblxudmFyIFJTQVB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdSU0FQdWJsaWNLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBhbGdvcml0aG0gPSB7XG5cdGFsZ29yaXRobTogWzEsIDIsIDg0MCwgMTEzNTQ5LCAxLCAxLCAxXSxcblx0cGFyYW1ldGVyczogWzUsIDBdXG59O1xuXG5mdW5jdGlvbiByc2FKd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmUpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5lXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5uKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sublwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5wKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5wXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRwKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnFpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5xaVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHBlbTtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHBlbSA9IFByaXZhdGVLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0cHJpdmF0ZUtleUFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0cHJpdmF0ZUtleTogUlNBUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSksXG5cdFx0XHRcdHByaXZhdGVFeHBvbmVudDogYjY0VG9Cbihqd2suZCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMTogYjY0VG9Cbihqd2sucCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMjogYjY0VG9Cbihqd2sucSwgdHJ1ZSksXG5cdFx0XHRcdGV4cG9uZW50MTogYjY0VG9Cbihqd2suZHAsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDI6IGI2NFRvQm4oandrLmRxLCB0cnVlKSxcblx0XHRcdFx0Y29lZmZpY2llbnQ6IGI2NFRvQm4oandrLnFpLCB0cnVlKVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cGVtID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG0sXG5cdFx0XHRQdWJsaWNLZXk6IHtcblx0XHRcdFx0dW51c2VkOiAwLFxuXHRcdFx0XHRkYXRhOiBSU0FQdWJsaWNLZXkuZW5jb2RlKHtcblx0XHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdFx0cHVibGljRXhwb25lbnQ6IGI2NFRvQm4oandrLmUsIGZhbHNlKVxuXHRcdFx0XHR9LCAnZGVyJylcblx0XHRcdH1cblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQVUJMSUMgS0VZJ1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhpcyBpcyBpbiBhbiBpZiBpbmNhc2UgYXNuMS5qcyBhZGRzIGEgdHJhaWxpbmcgXFxuXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICgnXFxuJyAhPT0gcGVtLnNsaWNlKC0xKSkge1xuXHRcdHBlbSArPSAnXFxuJztcblx0fVxuXG5cdHJldHVybiBwZW07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcnNhSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVjID0gcmVxdWlyZSgnLi9lYycpLFxuXHRyc2EgPSByZXF1aXJlKCcuL3JzYScpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3trdHk6J0VDJywgY3J2OnN0cmluZywgZDpzdHJpbmcsIHg/OnN0cmluZywgeT86c3RyaW5nfSB8IHtrdHk6J0VDJywgY3J2OnN0cmluZywgeDpzdHJpbmcsIHk6c3RyaW5nfSB8IHtrdHk6J1JTQScsIGU6c3RyaW5nLCBuOnN0cmluZywgZD86c3RyaW5nLCBwPzpzdHJpbmcsIHE/OnN0cmluZywgZHA/OnN0cmluZywgZHE/OnN0cmluZywgcWk/OnN0cmluZ319IGp3a1xuICogQHBhcmFtIHt7cHJpdmF0ZTpib29sZWFufT19IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGp3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBqd2sgfHwgbnVsbCA9PT0gandrKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2tcIiB0byBiZSBhbiBPYmplY3QnKTtcblx0fVxuXG5cdHZhciBrdHkgPSBqd2sua3R5O1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBrdHkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5rdHlcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0b3B0cyA9IG9wdHMgfHwge307XG5cdG9wdHMucHJpdmF0ZSA9IG9wdHMucHJpdmF0ZSA9PT0gdHJ1ZTtcblxuXHRzd2l0Y2ggKGt0eSkge1xuXHRcdGNhc2UgJ0VDJzoge1xuXHRcdFx0cmV0dXJuIGVjKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGNhc2UgJ1JTQSc6IHtcblx0XHRcdHJldHVybiByc2EoandrLCBvcHRzKTtcblx0XHR9XG5cdFx0ZGVmYXVsdDoge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBrZXkgdHlwZSBcIicgKyBrdHkgKyAnXCInKTtcblx0XHR9XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqd2tUb0J1ZmZlcjtcbiIsCiAgICAiLy8jcmVnaW9uIHNyYy9lc2kvb3B0aW9ucy50c1xuY29uc3QgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9JRCB8fCBcIlwiO1xuY29uc3QgQ0xJRU5UX1NFQ1JFVCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfU0VDUkVUIHx8IFwiXCI7XG5jb25zdCBDQUxMQkFDS19VUkwgPSBwcm9jZXNzLmVudi5FVkVfQ0FMTEJBQ0tfVVJMIHx8IFwiXCI7XG5jb25zdCBVU0VSX0FHRU5UID0gcHJvY2Vzcy5lbnYuRVNJX1VTRVJfQUdFTlQgfHwgXCJcIjtcbmNvbnN0IG9wdGlvbnMgPSB7XG5cdGNsaWVudF9pZDogQ0xJRU5UX0lELFxuXHRjbGllbnRfc2VjcmV0OiBDTElFTlRfU0VDUkVULFxuXHRjYWxsYmFja191cmw6IENBTExCQUNLX1VSTCxcblx0dXNlcl9hZ2VudDogVVNFUl9BR0VOVFxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBvcHRpb25zIH07IiwKICAgICIvLyNyZWdpb24gcm9sbGRvd246cnVudGltZVxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuXHRmb3IgKHZhciBuYW1lIGluIGFsbCkgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwge1xuXHRcdGdldDogYWxsW25hbWVdLFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IF9fZXhwb3J0IH07IiwKICAgICJleHBvcnQgY2xhc3MgSW52YWxpZFRva2VuRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5JbnZhbGlkVG9rZW5FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiSW52YWxpZFRva2VuRXJyb3JcIjtcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XG4gICAgICAgIGxldCBjb2RlID0gcC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cikge1xuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPT1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gYXRvYihvdXRwdXQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBqd3REZWNvZGUodG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gICAgY29uc3QgcGFydCA9IHRva2VuLnNwbGl0KFwiLlwiKVtwb3NdO1xuICAgIGlmICh0eXBlb2YgcGFydCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcbiAgICB9XG4gICAgbGV0IGRlY29kZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgZGVjb2RlZCA9IGJhc2U2NFVybERlY29kZShwYXJ0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBiYXNlNjQgZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQganNvbiBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2UoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICBsZXQgYnVmZmVyID0gMG47XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA1ICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDhuKSB8IEJpZ0ludChieXRlc1tpICsgal0pO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJCaXRTaXplICUgNSAhPT0gMCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IEJpZ0ludCg1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA1KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyID4+IEJpZ0ludChidWZmZXJCaXRTaXplIC0gNSkpICYgMHgxZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA8PCBCaWdJbnQoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMihlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMySWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDgpICogNSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwbjtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IEJpZ0ludChkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dKSA8PCBCaWdJbnQoKDcgLSBqKSAqIDUpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCA0MCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMzUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMG4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IE51bWJlcigoY2h1bmsgPj4gQmlnSW50KDMyIC0gaSAqIDgpKSAmIDB4ZmZuKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxuY29uc3QgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3XCI7XG5jb25zdCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkRlY29kZU1hcCA9IHtcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDAsXG4gICAgYjogMSxcbiAgICBjOiAyLFxuICAgIGQ6IDMsXG4gICAgZTogNCxcbiAgICBmOiA1LFxuICAgIGc6IDYsXG4gICAgaDogNyxcbiAgICBpOiA4LFxuICAgIGo6IDksXG4gICAgazogMTAsXG4gICAgbDogMTEsXG4gICAgbTogMTIsXG4gICAgbjogMTMsXG4gICAgbzogMTQsXG4gICAgcDogMTUsXG4gICAgcTogMTYsXG4gICAgcjogMTcsXG4gICAgczogMTgsXG4gICAgdDogMTksXG4gICAgdTogMjAsXG4gICAgdjogMjEsXG4gICAgdzogMjIsXG4gICAgeDogMjMsXG4gICAgeTogMjQsXG4gICAgejogMjUsXG4gICAgXCIyXCI6IDI2LFxuICAgIFwiM1wiOiAyNyxcbiAgICBcIjRcIjogMjgsXG4gICAgXCI1XCI6IDI5LFxuICAgIFwiNlwiOiAzMCxcbiAgICBcIjdcIjogMzFcbn07XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0Tm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDA7XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgYnl0ZXNbaSArIGpdO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA2KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPj4gKGJ1ZmZlckJpdFNpemUgLSA2KSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyIDw8ICg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgYmFzZTY0QWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcbmNvbnN0IGJhc2U2NHVybEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjRJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmxJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gNCkgKiAzKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDA7XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkICYmIGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUgJiZcbiAgICAgICAgICAgICAgICAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dIDw8ICgoMyAtIGopICogNik7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDI0KSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMikge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gKGNodW5rID4+ICgxNiAtIGkgKiA4KSkgJiAweGZmO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbmNvbnN0IGJhc2U2NERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIitcIjogNjIsXG4gICAgXCIvXCI6IDYzXG59O1xuY29uc3QgYmFzZTY0dXJsRGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiLVwiOiA2MixcbiAgICBfOiA2M1xufTtcbiIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5pbXBvcnQgeyBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcgfSBmcm9tIFwiQG9zbG9qcy9lbmNvZGluZ1wiO1xuaW1wb3J0IGp3dCBmcm9tIFwianNvbndlYnRva2VuXCI7XG5pbXBvcnQgandrVG9QZW0gZnJvbSBcImp3ay10by1wZW1cIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvYXV0aC50c1xudmFyIGF1dGhfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoYXV0aF9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcklkRnJvbVRva2VuOiAoKSA9PiBjaGFyYWN0ZXJJZEZyb21Ub2tlbixcblx0Y3JlYXRlQXV0aG9yaXphdGlvblVSTDogKCkgPT4gY3JlYXRlQXV0aG9yaXphdGlvblVSTCxcblx0cmVmcmVzaDogKCkgPT4gcmVmcmVzaCxcblx0dmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZTogKCkgPT4gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSxcblx0dmFsaWRhdGVUb2tlbjogKCkgPT4gdmFsaWRhdGVUb2tlblxufSk7XG5mdW5jdGlvbiBnZW5lcmF0ZVN0YXRlKCkge1xuXHRjb25zdCByYW5kb21WYWx1ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tVmFsdWVzKTtcblx0cmV0dXJuIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhyYW5kb21WYWx1ZXMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblVSTChzY29wZXMgPSBcInB1YmxpY0RhdGFcIikge1xuXHRjb25zdCBzdGF0ZSA9IGdlbmVyYXRlU3RhdGUoKTtcblx0Y29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC9hdXRob3JpemUvXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlZGlyZWN0X3VyaVwiLCBvcHRpb25zLmNhbGxiYWNrX3VybCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50X2lkXCIsIG9wdGlvbnMuY2xpZW50X2lkKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGF0ZVwiLCBzdGF0ZSk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2NvcGVcIiwgQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzKTtcblx0cmV0dXJuIHtcblx0XHR1cmwsXG5cdFx0c3RhdGVcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUoY29kZSkge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcblx0XHRcdFx0Z3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcblx0XHRcdFx0Y29kZVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgYXV0aG9yaXphdGlvbiBjb2RlYCwgZXJyb3IpO1xuXHRcdHRocm93IGAke2Vycm9yfWA7XG5cdH1cbn1cbmxldCBldmVBdXRoUHVibGljS2V5O1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUb2tlbih0b2tlbikge1xuXHRpZiAoIWV2ZUF1dGhQdWJsaWNLZXkpIHRyeSB7XG5cdFx0Y29uc3QgZXZlSldLUyA9IGF3YWl0IChhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCIpKS5qc29uKCk7XG5cdFx0ZXZlQXV0aFB1YmxpY0tleSA9IGp3a1RvUGVtKGV2ZUpXS1Mua2V5c1swXSk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byBnZXQgRVZFIEF1dGggcHVibGljIGtleXNgLCBlcnIpO1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dC52ZXJpZnkodG9rZW4sIGV2ZUF1dGhQdWJsaWNLZXkpO1xuXHRcdHJldHVybiBkZWNvZGVkO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIHRva2VuYCwgZXJyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW4gfSwgc2NvcGVzKSB7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRncmFudF90eXBlOiBcInJlZnJlc2hfdG9rZW5cIixcblx0XHRyZWZyZXNoX3Rva2VuLFxuXHRcdHNjb3BlOiBcIlwiXG5cdH07XG5cdGlmIChzY29wZXMpIHBhcmFtc1tcInNjb3BlXCJdID0gQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzO1xuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdH0sXG5cdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpXG5cdH0pO1xuXHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySWRGcm9tVG9rZW4odG9rZW4pIHtcblx0Y29uc3QgcGF5bG9hZCA9IGp3dERlY29kZSh0b2tlbik7XG5cdHJldHVybiBwYXJzZUludChwYXlsb2FkLnN1Yi5zcGxpdChcIjpcIilbMl0pO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGF1dGhfZXhwb3J0cywgY2hhcmFjdGVySWRGcm9tVG9rZW4sIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsIHJlZnJlc2gsIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsIHZhbGlkYXRlVG9rZW4gfTsiLAogICAgImltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL3Njb3Blcy50c1xuY29uc3QgRVZFX0pXS1NfVVJMID0gXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vb2F1dGgvandrc1wiO1xuY29uc3QgRVZFX0lTU1VFUiA9IFwibG9naW4uZXZlb25saW5lLmNvbVwiO1xuY29uc3QgRVZFX0FVRElFTkNFID0gXCJldmVvbmxpbmVcIjtcbmNvbnN0IEVTSV9MQVRFU1RfVVJMID0gXCJodHRwczovL2VzaS5ldmV0ZWNoLm5ldC9sYXRlc3RcIjtcbmNvbnN0IERBVEFfU09VUkNFID0gXCJ0cmFucXVpbGl0eVwiO1xuZnVuY3Rpb24gam9pblNjb3BlcyguLi5zY29wZXMpIHtcblx0cmV0dXJuIHNjb3Blcy5qb2luKFwiIFwiKTtcbn1cbmxldCBTQ09QRVMgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oU0NPUEVTJDEpIHtcblx0U0NPUEVTJDFbXCJQVUJMSUNfREFUQVwiXSA9IFwicHVibGljRGF0YVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFU1BPTkRfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVzcG9uZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDQUxFTkRBUl9SRUFEX0NBTEVOREFSX0VWRU5UU1wiXSA9IFwiZXNpLWNhbGVuZGFyLnJlYWRfY2FsZW5kYXJfZXZlbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTE9DQVRJT05fUkVBRF9MT0NBVElPTlwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX1NISVBfVFlQRVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfc2hpcF90eXBlLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9PUkdBTklaRV9NQUlMXCJdID0gXCJlc2ktbWFpbC5vcmdhbml6ZV9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9SRUFEX01BSUxcIl0gPSBcImVzaS1tYWlsLnJlYWRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIk1BSUxfU0VORF9NQUlMXCJdID0gXCJlc2ktbWFpbC5zZW5kX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFNcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHMudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFFVRVVFXCJdID0gXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxxdWV1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NIQVJBQ1RFUl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ09SUE9SQVRJT05fV0FMTEVUXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiU0VBUkNIX1NFQVJDSF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktc2VhcmNoLnNlYXJjaF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0xPTkVTX1JFQURfQ0xPTkVTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfY2xvbmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiVU5JVkVSU0VfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktdW5pdmVyc2UucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09SUE9SQVRJT05fTUVNQkVSU0hJUFwiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvcnBvcmF0aW9uX21lbWJlcnNoaXAudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX01BTkFHRV9QTEFORVRTXCJdID0gXCJlc2ktcGxhbmV0cy5tYW5hZ2VfcGxhbmV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19SRUFEX0ZMRUVUXCJdID0gXCJlc2ktZmxlZXRzLnJlYWRfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJGTEVFVFNfV1JJVEVfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMud3JpdGVfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9PUEVOX1dJTkRPV1wiXSA9IFwiZXNpLXVpLm9wZW5fd2luZG93LnYxXCI7XG5cdFNDT1BFUyQxW1wiVUlfV1JJVEVfV0FZUE9JTlRcIl0gPSBcImVzaS11aS53cml0ZV93YXlwb2ludC52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfV1JJVEVfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLndyaXRlX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRklUVElOR1NfUkVBRF9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLnJlYWRfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19XUklURV9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLndyaXRlX2ZpdHRpbmdzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19TVFJVQ1RVUkVfTUFSS0VUU1wiXSA9IFwiZXNpLW1hcmtldHMuc3RydWN0dXJlX21hcmtldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfc3RydWN0dXJlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9MT1lBTFRZXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2xveWFsdHkudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfT1BQT1JUVU5JVElFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9vcHBvcnR1bml0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NIQVRfQ0hBTk5FTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY2hhdF9jaGFubmVscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9NRURBTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQUdFTlRTX1JFU0VBUkNIXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9qb2JzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19SRUFEX0NIQVJBQ1RFUl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY2hhcmFjdGVyX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09SUE9SQVRJT05fUk9MRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29ycG9yYXRpb25fcm9sZXMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX09OTElORVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09OVFJBQ1RTX1JFQURfQ0hBUkFDVEVSX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NoYXJhY3Rlcl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9JTVBMQU5UU1wiXSA9IFwiZXNpLWNsb25lcy5yZWFkX2ltcGxhbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZBVElHVUVcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfZmF0aWd1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIktJTExNQUlMU19SRUFEX0NPUlBPUkFUSU9OX0tJTExNQUlMU1wiXSA9IFwiZXNpLWtpbGxtYWlscy5yZWFkX2NvcnBvcmF0aW9uX2tpbGxtYWlscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19UUkFDS19NRU1CRVJTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnRyYWNrX21lbWJlcnMudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRTXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9OT1RJRklDQVRJT05TXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9ESVZJU0lPTlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9kaXZpc2lvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQVNTRVRTX1JFQURfQ09SUE9SQVRJT05fQVNTRVRTXCJdID0gXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfVElUTEVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQkxVRVBSSU5UU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DT1JQT1JBVElPTl9DT05UUkFDVFNcIl0gPSBcImVzaS1jb250cmFjdHMucmVhZF9jb3Jwb3JhdGlvbl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFORElOR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFSQkFTRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFyYmFzZXMudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NvcnBvcmF0aW9uX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ09SUE9SQVRJT05fT1JERVJTXCJdID0gXCJlc2ktbWFya2V0cy5yZWFkX2NvcnBvcmF0aW9uX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBSU5FUl9MT0dTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFpbmVyX2xvZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NIQVJBQ1RFUl9NSU5JTkdcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fbWluaW5nLnYxXCI7XG5cdFNDT1BFUyQxW1wiUExBTkVUU19SRUFEX0NVU1RPTVNfT0ZGSUNFU1wiXSA9IFwiZXNpLXBsYW5ldHMucmVhZF9jdXN0b21zX29mZmljZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9GQUNJTElUSUVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZmFjaWxpdGllcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX21lZGFscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQUxMSUFOQ0VTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1hbGxpYW5jZXMucmVhZF9jb250YWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9GV19TVEFUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZndfc3RhdHMudjFcIjtcblx0cmV0dXJuIFNDT1BFUyQxO1xufSh7fSk7XG5mdW5jdGlvbiB0b2tlbkhhc1Njb3BlcyhhY2Nlc3NfdG9rZW4sIC4uLnNjb3Blcykge1xuXHRsZXQgdG9rZW5TY29wZXMgPSBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKSk7XG59XG5mdW5jdGlvbiBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKSB7XG5cdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHR5cGVvZiBkZWNvZGVkLnNjcCA9PT0gXCJzdHJpbmdcIiA/IFtkZWNvZGVkLnNjcF0gOiBkZWNvZGVkLnNjcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBEQVRBX1NPVVJDRSwgRVNJX0xBVEVTVF9VUkwsIEVWRV9BVURJRU5DRSwgRVZFX0lTU1VFUiwgRVZFX0pXS1NfVVJMLCBTQ09QRVMsIGdldFNjb3Blc0Zyb21Ub2tlbiwgam9pblNjb3BlcywgdG9rZW5IYXNTY29wZXMgfTsiLAogICAgImNvbnN0IGVudGl0eUtpbmQgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTplbnRpdHlLaW5kXCIpO1xuY29uc3QgaGFzT3duRW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmhhc093bkVudGl0eUtpbmRcIik7XG5mdW5jdGlvbiBpcyh2YWx1ZSwgdHlwZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiB0eXBlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHlwZSwgZW50aXR5S2luZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2xhc3MgXCIke3R5cGUubmFtZSA/PyBcIjx1bmtub3duPlwifVwiIGRvZXNuJ3QgbG9vayBsaWtlIGEgRHJpenpsZSBlbnRpdHkuIElmIHRoaXMgaXMgaW5jb3JyZWN0IGFuZCB0aGUgY2xhc3MgaXMgcHJvdmlkZWQgYnkgRHJpenpsZSwgcGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnLmBcbiAgICApO1xuICB9XG4gIGxldCBjbHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpLmNvbnN0cnVjdG9yO1xuICBpZiAoY2xzKSB7XG4gICAgd2hpbGUgKGNscykge1xuICAgICAgaWYgKGVudGl0eUtpbmQgaW4gY2xzICYmIGNsc1tlbnRpdHlLaW5kXSA9PT0gdHlwZVtlbnRpdHlLaW5kXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQge1xuICBlbnRpdHlLaW5kLFxuICBoYXNPd25FbnRpdHlLaW5kLFxuICBpc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudGl0eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBjb25maWcua2V5QXNOYW1lO1xuICAgIHRoaXMubm90TnVsbCA9IGNvbmZpZy5ub3ROdWxsO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0O1xuICAgIHRoaXMuZGVmYXVsdEZuID0gY29uZmlnLmRlZmF1bHRGbjtcbiAgICB0aGlzLm9uVXBkYXRlRm4gPSBjb25maWcub25VcGRhdGVGbjtcbiAgICB0aGlzLmhhc0RlZmF1bHQgPSBjb25maWcuaGFzRGVmYXVsdDtcbiAgICB0aGlzLnByaW1hcnkgPSBjb25maWcucHJpbWFyeUtleTtcbiAgICB0aGlzLmlzVW5pcXVlID0gY29uZmlnLmlzVW5pcXVlO1xuICAgIHRoaXMudW5pcXVlTmFtZSA9IGNvbmZpZy51bmlxdWVOYW1lO1xuICAgIHRoaXMudW5pcXVlVHlwZSA9IGNvbmZpZy51bmlxdWVUeXBlO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBjb25maWcuZGF0YVR5cGU7XG4gICAgdGhpcy5jb2x1bW5UeXBlID0gY29uZmlnLmNvbHVtblR5cGU7XG4gICAgdGhpcy5nZW5lcmF0ZWQgPSBjb25maWcuZ2VuZXJhdGVkO1xuICAgIHRoaXMuZ2VuZXJhdGVkSWRlbnRpdHkgPSBjb25maWcuZ2VuZXJhdGVkSWRlbnRpdHk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uXCI7XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgcHJpbWFyeTtcbiAgbm90TnVsbDtcbiAgZGVmYXVsdDtcbiAgZGVmYXVsdEZuO1xuICBvblVwZGF0ZUZuO1xuICBoYXNEZWZhdWx0O1xuICBpc1VuaXF1ZTtcbiAgdW5pcXVlTmFtZTtcbiAgdW5pcXVlVHlwZTtcbiAgZGF0YVR5cGU7XG4gIGNvbHVtblR5cGU7XG4gIGVudW1WYWx1ZXMgPSB2b2lkIDA7XG4gIGdlbmVyYXRlZCA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkSWRlbnRpdHkgPSB2b2lkIDA7XG4gIGNvbmZpZztcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLy8gKiogQGludGVybmFsICovXG4gIHNob3VsZERpc2FibGVJbnNlcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZCAhPT0gdm9pZCAwICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlZC50eXBlICE9PSBcImJ5RGVmYXVsdFwiO1xuICB9XG59XG5leHBvcnQge1xuICBDb2x1bW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQnVpbGRlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAga2V5QXNOYW1lOiBuYW1lID09PSBcIlwiLFxuICAgICAgbm90TnVsbDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiB2b2lkIDAsXG4gICAgICBoYXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHByaW1hcnlLZXk6IGZhbHNlLFxuICAgICAgaXNVbmlxdWU6IGZhbHNlLFxuICAgICAgdW5pcXVlTmFtZTogdm9pZCAwLFxuICAgICAgdW5pcXVlVHlwZTogdm9pZCAwLFxuICAgICAgZGF0YVR5cGUsXG4gICAgICBjb2x1bW5UeXBlLFxuICAgICAgZ2VuZXJhdGVkOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi4gQ29tbW9ubHkgdXNlZCB3aXRoIGBqc29uYCBjb2x1bW5zLiBBbHNvLCB1c2VmdWwgZm9yIGJyYW5kZWQgdHlwZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IHVzZXJzID0gcGdUYWJsZSgndXNlcnMnLCB7XG4gICAqIFx0aWQ6IGludGVnZXIoJ2lkJykuJHR5cGU8VXNlcklkPigpLnByaW1hcnlLZXkoKSxcbiAgICogXHRkZXRhaWxzOiBqc29uKCdkZXRhaWxzJykuJHR5cGU8VXNlckRldGFpbHM+KCkubm90TnVsbCgpLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAkdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBub3QgbnVsbGAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQWZmZWN0cyB0aGUgYHNlbGVjdGAgbW9kZWwgb2YgdGhlIHRhYmxlIC0gY29sdW1ucyAqd2l0aG91dCogYG5vdCBudWxsYCB3aWxsIGJlIG51bGxhYmxlIG9uIHNlbGVjdC5cbiAgICovXG4gIG5vdE51bGwoKSB7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgZGVmYXVsdCA8dmFsdWU+YCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgaW5zZXJ0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRoKiBgZGVmYXVsdGAgYXJlIG9wdGlvbmFsIG9uIGluc2VydC5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlLCB1c2Uge0BsaW5rICRkZWZhdWx0Rm59IGluc3RlYWQuXG4gICAqL1xuICBkZWZhdWx0KHZhbHVlKSB7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdCA9IHZhbHVlO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUuXG4gICAqXG4gICAqICoqTm90ZToqKiBUaGlzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCB0aGUgYGRyaXp6bGUta2l0YCBiZWhhdmlvciwgaXQgaXMgb25seSB1c2VkIGF0IHJ1bnRpbWUgaW4gYGRyaXp6bGUtb3JtYC5cbiAgICovXG4gICRkZWZhdWx0Rm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0Rm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkZGVmYXVsdEZufS5cbiAgICovXG4gICRkZWZhdWx0ID0gdGhpcy4kZGVmYXVsdEZuO1xuICAvKipcbiAgICogQWRkcyBhIGR5bmFtaWMgdXBkYXRlIHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgdXBkYXRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZSBpZiBub25lIGlzIHByb3ZpZGVkLlxuICAgKiBJZiBubyBgZGVmYXVsdGAgKG9yIGAkZGVmYXVsdEZuYCkgdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQgYXMgd2VsbCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJG9uVXBkYXRlRm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5vblVwZGF0ZUZuID0gZm47XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgJG9uVXBkYXRlRm59LlxuICAgKi9cbiAgJG9uVXBkYXRlID0gdGhpcy4kb25VcGRhdGVGbjtcbiAgLyoqXG4gICAqIEFkZHMgYSBgcHJpbWFyeSBrZXlgIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uIFRoaXMgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGBub3QgbnVsbGAuXG4gICAqXG4gICAqIEluIFNRTGl0ZSwgYGludGVnZXIgcHJpbWFyeSBrZXlgIGltcGxpY2l0bHkgbWFrZXMgdGhlIGNvbHVtbiBhdXRvLWluY3JlbWVudGluZy5cbiAgICovXG4gIHByaW1hcnlLZXkoKSB7XG4gICAgdGhpcy5jb25maWcucHJpbWFyeUtleSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdGhlIGtleSB3aXRoaW4gdGhlIHRhYmxlIGRlZmluaXRpb24gaWYgYSBuYW1lIHdhcyBub3QgZ2l2ZW4uICovXG4gIHNldE5hbWUobmFtZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5uYW1lICE9PSBcIlwiKSByZXR1cm47XG4gICAgdGhpcy5jb25maWcubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4tYnVpbGRlci5qcy5tYXAiLAogICAgImNvbnN0IFRhYmxlTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk5hbWVcIik7XG5leHBvcnQge1xuICBUYWJsZU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS51dGlscy5qcy5tYXAiLAogICAgImZ1bmN0aW9uIGlpZmUoZm4sIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xufVxuZXhwb3J0IHtcbiAgaWlmZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmctdXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IGZhbHNlO1xuICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm51bGxzTm90RGlzdGluY3RDb25maWcsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50QnVpbGRlcihjb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG51bGxzTm90RGlzdGluY3QsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IHVuaXF1ZUtleU5hbWUodGhpcy50YWJsZSwgdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkpO1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdCA9IG51bGxzTm90RGlzdGluY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIG51bGxzTm90RGlzdGluY3QgPSBmYWxzZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBVbmlxdWVDb25zdHJhaW50LFxuICBVbmlxdWVDb25zdHJhaW50QnVpbGRlcixcbiAgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcixcbiAgdW5pcXVlLFxuICB1bmlxdWVLZXlOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWNvbnN0cmFpbnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuLi8uLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyB1bmlxdWVLZXlOYW1lIH0gZnJvbSBcIi4uL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBtYWtlUGdBcnJheSwgcGFyc2VQZ0FycmF5IH0gZnJvbSBcIi4uL3V0aWxzL2FycmF5LmpzXCI7XG5jbGFzcyBQZ0NvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgZm9yZWlnbktleUNvbmZpZ3MgPSBbXTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdDb2x1bW5CdWlsZGVyXCI7XG4gIGFycmF5KHNpemUpIHtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXlCdWlsZGVyKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMsIHNpemUpO1xuICB9XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVOYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVUeXBlID0gY29uZmlnPy5udWxscztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZW5lcmF0ZWRBbHdheXNBcyhhcykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IFwic3RvcmVkXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gaWlmZShcbiAgICAgICAgKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBGb3JlaWduS2V5QnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZixcbiAgICAgICAgYWN0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRXh0cmFDb25maWdDb2x1bW4odGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEV4dHJhQ29uZmlnQ29sdW1uKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFBnQ29sdW1uIGV4dGVuZHMgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLnVuaXF1ZU5hbWUpIHtcbiAgICAgIGNvbmZpZy51bmlxdWVOYW1lID0gdW5pcXVlS2V5TmFtZSh0YWJsZSwgW2NvbmZpZy5uYW1lXSk7XG4gICAgfVxuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtblwiO1xufVxuY2xhc3MgRXh0cmFDb25maWdDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4dHJhQ29uZmlnQ29sdW1uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U1FMVHlwZSgpO1xuICB9XG4gIGluZGV4Q29uZmlnID0ge1xuICAgIG9yZGVyOiB0aGlzLmNvbmZpZy5vcmRlciA/PyBcImFzY1wiLFxuICAgIG51bGxzOiB0aGlzLmNvbmZpZy5udWxscyA/PyBcImxhc3RcIixcbiAgICBvcENsYXNzOiB0aGlzLmNvbmZpZy5vcENsYXNzXG4gIH07XG4gIGRlZmF1bHRDb25maWcgPSB7XG4gICAgb3JkZXI6IFwiYXNjXCIsXG4gICAgbnVsbHM6IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHZvaWQgMFxuICB9O1xuICBhc2MoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcmRlciA9IFwiYXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJkZXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNGaXJzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJmaXJzdFwiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG51bGxzTGFzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJsYXN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqICMjIyBQb3N0Z3JlU1FMIGRvY3VtZW50YXRpb24gcXVvdGVcbiAgICpcbiAgICogPiBBbiBvcGVyYXRvciBjbGFzcyB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBjb2x1bW4gb2YgYW4gaW5kZXguXG4gICAqIFRoZSBvcGVyYXRvciBjbGFzcyBpZGVudGlmaWVzIHRoZSBvcGVyYXRvcnMgdG8gYmUgdXNlZCBieSB0aGUgaW5kZXggZm9yIHRoYXQgY29sdW1uLlxuICAgKiBGb3IgZXhhbXBsZSwgYSBCLXRyZWUgaW5kZXggb24gZm91ci1ieXRlIGludGVnZXJzIHdvdWxkIHVzZSB0aGUgaW50NF9vcHMgY2xhc3M7XG4gICAqIHRoaXMgb3BlcmF0b3IgY2xhc3MgaW5jbHVkZXMgY29tcGFyaXNvbiBmdW5jdGlvbnMgZm9yIGZvdXItYnl0ZSBpbnRlZ2Vycy5cbiAgICogSW4gcHJhY3RpY2UgdGhlIGRlZmF1bHQgb3BlcmF0b3IgY2xhc3MgZm9yIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgaXMgdXN1YWxseSBzdWZmaWNpZW50LlxuICAgKiBUaGUgbWFpbiBwb2ludCBvZiBoYXZpbmcgb3BlcmF0b3IgY2xhc3NlcyBpcyB0aGF0IGZvciBzb21lIGRhdGEgdHlwZXMsIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgbWVhbmluZ2Z1bCBvcmRlcmluZy5cbiAgICogRm9yIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gc29ydCBhIGNvbXBsZXgtbnVtYmVyIGRhdGEgdHlwZSBlaXRoZXIgYnkgYWJzb2x1dGUgdmFsdWUgb3IgYnkgcmVhbCBwYXJ0LlxuICAgKiBXZSBjb3VsZCBkbyB0aGlzIGJ5IGRlZmluaW5nIHR3byBvcGVyYXRvciBjbGFzc2VzIGZvciB0aGUgZGF0YSB0eXBlIGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvcGVyIGNsYXNzIHdoZW4gY3JlYXRpbmcgYW4gaW5kZXguXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3BlcmF0b3IgY2xhc3NlcyBjaGVjazpcbiAgICpcbiAgICogIyMjIFVzZWZ1bCBsaW5rc1xuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvc3FsLWNyZWF0ZWluZGV4Lmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2luZGV4ZXMtb3BjbGFzcy5odG1sXG4gICAqXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC94aW5kZXguaHRtbFxuICAgKlxuICAgKiAjIyMgQWRkaXRpb25hbCB0eXBlc1xuICAgKiBJZiB5b3UgaGF2ZSB0aGUgYHBnX3ZlY3RvcmAgZXh0ZW5zaW9uIGluc3RhbGxlZCBpbiB5b3VyIGRhdGFiYXNlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICogYHZlY3Rvcl9sMl9vcHNgLCBgdmVjdG9yX2lwX29wc2AsIGB2ZWN0b3JfY29zaW5lX29wc2AsIGB2ZWN0b3JfbDFfb3BzYCwgYGJpdF9oYW1taW5nX29wc2AsIGBiaXRfamFjY2FyZF9vcHNgLCBgaGFsZnZlY19sMl9vcHNgLCBgc3BhcnNldmVjX2wyX29wc2Agb3B0aW9ucywgd2hpY2ggYXJlIHByZWRlZmluZWQgdHlwZXMuXG4gICAqXG4gICAqICoqWW91IGNhbiBhbHdheXMgc3BlY2lmeSBhbnkgc3RyaW5nIHlvdSB3YW50IGluIHRoZSBvcGVyYXRvciBjbGFzcywgaW4gY2FzZSBEcml6emxlIGRvZXNuJ3QgaGF2ZSBpdCBuYXRpdmVseSBpbiBpdHMgdHlwZXMqKlxuICAgKlxuICAgKiBAcGFyYW0gb3BDbGFzc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgb3Aob3BDbGFzcykge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3BDbGFzcyA9IG9wQ2xhc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIEluZGV4ZWRDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJJbmRleGVkQ29sdW1uXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGtleUFzTmFtZSwgdHlwZSwgaW5kZXhDb25maWcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMua2V5QXNOYW1lID0ga2V5QXNOYW1lO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pbmRleENvbmZpZyA9IGluZGV4Q29uZmlnO1xuICB9XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgdHlwZTtcbiAgaW5kZXhDb25maWc7XG59XG5jbGFzcyBQZ0FycmF5QnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQXJyYXlCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGJhc2VCdWlsZGVyLCBzaXplKSB7XG4gICAgc3VwZXIobmFtZSwgXCJhcnJheVwiLCBcIlBnQXJyYXlcIik7XG4gICAgdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIgPSBiYXNlQnVpbGRlcjtcbiAgICB0aGlzLmNvbmZpZy5zaXplID0gc2l6ZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgY29uc3QgYmFzZUNvbHVtbiA9IHRoaXMuY29uZmlnLmJhc2VCdWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXkoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgYmFzZUNvbHVtblxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnQXJyYXkgZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcsIGJhc2VDb2x1bW4sIHJhbmdlKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5iYXNlQ29sdW1uID0gYmFzZUNvbHVtbjtcbiAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgdGhpcy5zaXplID0gY29uZmlnLnNpemU7XG4gIH1cbiAgc2l6ZTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheVwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmJhc2VDb2x1bW4uZ2V0U1FMVHlwZSgpfVske3R5cGVvZiB0aGlzLnNpemUgPT09IFwibnVtYmVyXCIgPyB0aGlzLnNpemUgOiBcIlwifV1gO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VQZ0FycmF5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT4gdGhpcy5iYXNlQ29sdW1uLm1hcEZyb21Ecml2ZXJWYWx1ZSh2KSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSwgaXNOZXN0ZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgY29uc3QgYSA9IHZhbHVlLm1hcChcbiAgICAgICh2KSA9PiB2ID09PSBudWxsID8gbnVsbCA6IGlzKHRoaXMuYmFzZUNvbHVtbiwgUGdBcnJheSkgPyB0aGlzLmJhc2VDb2x1bW4ubWFwVG9Ecml2ZXJWYWx1ZSh2LCB0cnVlKSA6IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYpXG4gICAgKTtcbiAgICBpZiAoaXNOZXN0ZWRBcnJheSkgcmV0dXJuIGE7XG4gICAgcmV0dXJuIG1ha2VQZ0FycmF5KGEpO1xuICB9XG59XG5leHBvcnQge1xuICBFeHRyYUNvbmZpZ0NvbHVtbixcbiAgSW5kZXhlZENvbHVtbixcbiAgUGdBcnJheSxcbiAgUGdBcnJheUJ1aWxkZXIsXG4gIFBnQ29sdW1uLFxuICBQZ0NvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdDb2x1bW4sIFBnQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1PYmplY3RDb2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1PYmplY3RDb2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1PYmplY3RDb2x1bW5cIjtcbiAgZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuY29uc3QgaXNQZ0VudW1TeW0gPSBTeW1ib2wuZm9yKFwiZHJpenpsZTppc1BnRW51bVwiKTtcbmZ1bmN0aW9uIGlzUGdFbnVtKG9iaikge1xuICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIGlzUGdFbnVtU3ltIGluIG9iaiAmJiBvYmpbaXNQZ0VudW1TeW1dID09PSB0cnVlO1xufVxuY2xhc3MgUGdFbnVtQ29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtQ29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1Db2x1bW5cIjtcbiAgZW51bSA9IHRoaXMuY29uZmlnLmVudW07XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtLmVudW1WYWx1ZXM7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmVudW0gPSBjb25maWcuZW51bTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmVudW0uZW51bU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHBnRW51bShlbnVtTmFtZSwgaW5wdXQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgWy4uLmlucHV0XSwgdm9pZCAwKSA6IHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIGlucHV0LCB2b2lkIDApO1xufVxuZnVuY3Rpb24gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bUNvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogdmFsdWVzLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIHZhbHVlcywgc2NoZW1hKSB7XG4gIGNvbnN0IGVudW1JbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgKG5hbWUpID0+IG5ldyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyKG5hbWUgPz8gXCJcIiwgZW51bUluc3RhbmNlKSxcbiAgICB7XG4gICAgICBlbnVtTmFtZSxcbiAgICAgIGVudW1WYWx1ZXM6IE9iamVjdC52YWx1ZXModmFsdWVzKSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIFtpc1BnRW51bVN5bV06IHRydWVcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbnVtSW5zdGFuY2U7XG59XG5leHBvcnQge1xuICBQZ0VudW1Db2x1bW4sXG4gIFBnRW51bUNvbHVtbkJ1aWxkZXIsXG4gIFBnRW51bU9iamVjdENvbHVtbixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlcixcbiAgaXNQZ0VudW0sXG4gIHBnRW51bSxcbiAgcGdFbnVtT2JqZWN0V2l0aFNjaGVtYSxcbiAgcGdFbnVtV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudW0uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN1YnF1ZXJ5XCI7XG4gIGNvbnN0cnVjdG9yKHNxbCwgZmllbGRzLCBhbGlhcywgaXNXaXRoID0gZmFsc2UsIHVzZWRUYWJsZXMgPSBbXSkge1xuICAgIHRoaXMuXyA9IHtcbiAgICAgIGJyYW5kOiBcIlN1YnF1ZXJ5XCIsXG4gICAgICBzcWwsXG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgYWxpYXMsXG4gICAgICBpc1dpdGgsXG4gICAgICB1c2VkVGFibGVzXG4gICAgfTtcbiAgfVxuICAvLyBnZXRTUUwoKTogU1FMPHVua25vd24+IHtcbiAgLy8gXHRyZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICAvLyB9XG59XG5jbGFzcyBXaXRoU3VicXVlcnkgZXh0ZW5kcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIldpdGhTdWJxdWVyeVwiO1xufVxuZXhwb3J0IHtcbiAgU3VicXVlcnksXG4gIFdpdGhTdWJxdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnF1ZXJ5LmpzLm1hcCIsCiAgICAiLy8gcGFja2FnZS5qc29uXG52YXIgdmVyc2lvbiA9IFwiMC40NC41XCI7XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgY29tcGF0aWJpbGl0eVZlcnNpb24gPSAxMDtcbmV4cG9ydCB7XG4gIGNvbXBhdGliaWxpdHlWZXJzaW9uLFxuICB2ZXJzaW9uIGFzIG5wbVZlcnNpb25cbn07XG4iLAogICAgImltcG9ydCB7IGlpZmUgfSBmcm9tIFwiLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyBucG1WZXJzaW9uIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xubGV0IG90ZWw7XG5sZXQgcmF3VHJhY2VyO1xuY29uc3QgdHJhY2VyID0ge1xuICBzdGFydEFjdGl2ZVNwYW4obmFtZSwgZm4pIHtcbiAgICBpZiAoIW90ZWwpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICBpZiAoIXJhd1RyYWNlcikge1xuICAgICAgcmF3VHJhY2VyID0gb3RlbC50cmFjZS5nZXRUcmFjZXIoXCJkcml6emxlLW9ybVwiLCBucG1WZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGlpZmUoXG4gICAgICAob3RlbDIsIHJhd1RyYWNlcjIpID0+IHJhd1RyYWNlcjIuc3RhcnRBY3RpdmVTcGFuKFxuICAgICAgICBuYW1lLFxuICAgICAgICAoc3BhbikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oc3Bhbik7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICBjb2RlOiBvdGVsMi5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCJcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1pbnN0YW5jZW9mL25vLWluc3RhbmNlb2ZcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBvdGVsLFxuICAgICAgcmF3VHJhY2VyXG4gICAgKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIHRyYWNlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmcuanMubWFwIiwKICAgICJjb25zdCBWaWV3QmFzZUNvbmZpZyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlZpZXdCYXNlQ29uZmlnXCIpO1xuZXhwb3J0IHtcbiAgVmlld0Jhc2VDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuL3RhYmxlLnV0aWxzLmpzXCI7XG5jb25zdCBTY2hlbWEgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTY2hlbWFcIik7XG5jb25zdCBDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Q29sdW1uc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQ29sdW1ucyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQ29sdW1uc1wiKTtcbmNvbnN0IE9yaWdpbmFsTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk9yaWdpbmFsTmFtZVwiKTtcbmNvbnN0IEJhc2VOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6QmFzZU5hbWVcIik7XG5jb25zdCBJc0FsaWFzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNBbGlhc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQnVpbGRlciA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQnVpbGRlclwiKTtcbmNvbnN0IElzRHJpenpsZVRhYmxlID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVGFibGVcIik7XG5jbGFzcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IHtcbiAgICBOYW1lOiBUYWJsZU5hbWUsXG4gICAgU2NoZW1hLFxuICAgIE9yaWdpbmFsTmFtZSxcbiAgICBDb2x1bW5zLFxuICAgIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgICBCYXNlTmFtZSxcbiAgICBJc0FsaWFzLFxuICAgIEV4dHJhQ29uZmlnQnVpbGRlclxuICB9O1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIENhbiBiZSBjaGFuZ2VkIGlmIHRoZSB0YWJsZSBpcyBhbGlhc2VkLlxuICAgKi9cbiAgW1RhYmxlTmFtZV07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgdGFibGUsIGJlZm9yZSBhbnkgYWxpYXNpbmcuXG4gICAqL1xuICBbT3JpZ2luYWxOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbU2NoZW1hXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQ29sdW1uc107XG4gIC8qKlxuICAgKiAgQGludGVybmFsXG4gICAqIFVzZWQgdG8gc3RvcmUgdGhlIHRhYmxlIG5hbWUgYmVmb3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiB2aWEgdGhlIGB0YWJsZUNyZWF0b3JgIGZ1bmN0aW9ucy5cbiAgICovXG4gIFtCYXNlTmFtZV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzQWxpYXNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzRHJpenpsZVRhYmxlXSA9IHRydWU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpIHtcbiAgICB0aGlzW1RhYmxlTmFtZV0gPSB0aGlzW09yaWdpbmFsTmFtZV0gPSBuYW1lO1xuICAgIHRoaXNbU2NoZW1hXSA9IHNjaGVtYTtcbiAgICB0aGlzW0Jhc2VOYW1lXSA9IGJhc2VOYW1lO1xuICB9XG59XG5mdW5jdGlvbiBpc1RhYmxlKHRhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdGFibGUgPT09IFwib2JqZWN0XCIgJiYgdGFibGUgIT09IG51bGwgJiYgSXNEcml6emxlVGFibGUgaW4gdGFibGU7XG59XG5mdW5jdGlvbiBnZXRUYWJsZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIHRhYmxlW1RhYmxlTmFtZV07XG59XG5mdW5jdGlvbiBnZXRUYWJsZVVuaXF1ZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1NjaGVtYV0gPz8gXCJwdWJsaWNcIn0uJHt0YWJsZVtUYWJsZU5hbWVdfWA7XG59XG5leHBvcnQge1xuICBCYXNlTmFtZSxcbiAgQ29sdW1ucyxcbiAgRXh0cmFDb25maWdCdWlsZGVyLFxuICBFeHRyYUNvbmZpZ0NvbHVtbnMsXG4gIElzQWxpYXMsXG4gIE9yaWdpbmFsTmFtZSxcbiAgU2NoZW1hLFxuICBUYWJsZSxcbiAgZ2V0VGFibGVOYW1lLFxuICBnZXRUYWJsZVVuaXF1ZU5hbWUsXG4gIGlzVGFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgaXNQZ0VudW0gfSBmcm9tIFwiLi4vcGctY29yZS9jb2x1bW5zL2VudW0uanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyB0cmFjZXIgfSBmcm9tIFwiLi4vdHJhY2luZy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IElzQWxpYXMsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5jbGFzcyBGYWtlUHJpbWl0aXZlUGFyYW0ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJGYWtlUHJpbWl0aXZlUGFyYW1cIjtcbn1cbmZ1bmN0aW9uIGlzU1FMV3JhcHBlcih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCAmJiB0eXBlb2YgdmFsdWUuZ2V0U1FMID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBtZXJnZVF1ZXJpZXMocXVlcmllcykge1xuICBjb25zdCByZXN1bHQgPSB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICByZXN1bHQuc3FsICs9IHF1ZXJ5LnNxbDtcbiAgICByZXN1bHQucGFyYW1zLnB1c2goLi4ucXVlcnkucGFyYW1zKTtcbiAgICBpZiAocXVlcnkudHlwaW5ncz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIXJlc3VsdC50eXBpbmdzKSB7XG4gICAgICAgIHJlc3VsdC50eXBpbmdzID0gW107XG4gICAgICB9XG4gICAgICByZXN1bHQudHlwaW5ncy5wdXNoKC4uLnF1ZXJ5LnR5cGluZ3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgU3RyaW5nQ2h1bmsge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTdHJpbmdDaHVua1wiO1xuICB2YWx1ZTtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmNsYXNzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5Q2h1bmtzKSB7XG4gICAgdGhpcy5xdWVyeUNodW5rcyA9IHF1ZXJ5Q2h1bmtzO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgcXVlcnlDaHVua3MpIHtcbiAgICAgIGlmIChpcyhjaHVuaywgVGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgdGhpcy51c2VkVGFibGVzLnB1c2goXG4gICAgICAgICAgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdIDogc2NoZW1hTmFtZSArIFwiLlwiICsgY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGRlY29kZXIgPSBub29wRGVjb2RlcjtcbiAgc2hvdWxkSW5saW5lUGFyYW1zID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgdXNlZFRhYmxlcyA9IFtdO1xuICBhcHBlbmQocXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzLnB1c2goLi4ucXVlcnkucXVlcnlDaHVua3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvUXVlcnkoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRyYWNlci5zdGFydEFjdGl2ZVNwYW4oXCJkcml6emxlLmJ1aWxkU1FMXCIsIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXModGhpcy5xdWVyeUNodW5rcywgY29uZmlnKTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBcImRyaXp6bGUucXVlcnkudGV4dFwiOiBxdWVyeS5zcWwsXG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS5wYXJhbXNcIjogSlNPTi5zdHJpbmdpZnkocXVlcnkucGFyYW1zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfSk7XG4gIH1cbiAgYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmtzLCBfY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgX2NvbmZpZywge1xuICAgICAgaW5saW5lUGFyYW1zOiBfY29uZmlnLmlubGluZVBhcmFtcyB8fCB0aGlzLnNob3VsZElubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleDogX2NvbmZpZy5wYXJhbVN0YXJ0SW5kZXggfHwgeyB2YWx1ZTogMCB9XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtLFxuICAgICAgcHJlcGFyZVR5cGluZyxcbiAgICAgIGlubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleFxuICAgIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIG1lcmdlUXVlcmllcyhjaHVua3MubWFwKChjaHVuaykgPT4ge1xuICAgICAgaWYgKGlzKGNodW5rLCBTdHJpbmdDaHVuaykpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBjaHVuay52YWx1ZS5qb2luKFwiXCIpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay52YWx1ZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpXTtcbiAgICAgICAgZm9yIChjb25zdCBbaSwgcF0gb2YgY2h1bmsuZW50cmllcygpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocCk7XG4gICAgICAgICAgaWYgKGkgPCBjaHVuay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU3RyaW5nQ2h1bmsoXCIsIFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIilcIikpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhyZXN1bHQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFNRTCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmsucXVlcnlDaHVua3MsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgaW5saW5lUGFyYW1zOiBpbmxpbmVQYXJhbXMgfHwgY2h1bmsuc2hvdWxkSW5saW5lUGFyYW1zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbSXNBbGlhc10gPyBlc2NhcGVOYW1lKHRhYmxlTmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHRhYmxlTmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBDb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBjYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNodW5rKTtcbiAgICAgICAgaWYgKF9jb25maWcuaW52b2tlU291cmNlID09PSBcImluZGV4ZXNcIikge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjb2x1bW5OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IGNodW5rLnRhYmxlW0lzQWxpYXNdIHx8IHNjaGVtYU5hbWUgPT09IHZvaWQgMCA/IGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFZpZXcpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tWaWV3QmFzZUNvbmZpZ10uc2NoZW1hO1xuICAgICAgICBjb25zdCB2aWV3TmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogc2NoZW1hTmFtZSA9PT0gdm9pZCAwIHx8IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5pc0FsaWFzID8gZXNjYXBlTmFtZSh2aWV3TmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHZpZXdOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBhcmFtKSkge1xuICAgICAgICBpZiAoaXMoY2h1bmsudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBjaHVuay52YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaHVuay5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUoY2h1bmsudmFsdWUpO1xuICAgICAgICBpZiAoaXMobWFwcGVkVmFsdWUsIFNRTCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbbWFwcGVkVmFsdWVdLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0obWFwcGVkVmFsdWUsIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwaW5ncyA9IFtcIm5vbmVcIl07XG4gICAgICAgIGlmIChwcmVwYXJlVHlwaW5nKSB7XG4gICAgICAgICAgdHlwaW5ncyA9IFtwcmVwYXJlVHlwaW5nKGNodW5rLmVuY29kZXIpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBtYXBwZWRWYWx1ZSksIHBhcmFtczogW21hcHBlZFZhbHVlXSwgdHlwaW5ncyB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMLkFsaWFzZWQpICYmIGNodW5rLmZpZWxkQWxpYXMgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZmllbGRBbGlhcyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU3VicXVlcnkpKSB7XG4gICAgICAgIGlmIChjaHVuay5fLmlzV2l0aCkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5fLmFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLl8uc3FsLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIikgXCIpLFxuICAgICAgICAgIG5ldyBOYW1lKGNodW5rLl8uYWxpYXMpXG4gICAgICAgIF0sIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQZ0VudW0oY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zY2hlbWEpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuc2NoZW1hKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZW51bU5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXNTUUxXcmFwcGVyKGNodW5rKSkge1xuICAgICAgICBpZiAoY2h1bmsuc2hvdWxkT21pdFNRTFBhcmVucz8uKCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbY2h1bmsuZ2V0U1FMKCldLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLmdldFNRTCgpLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiB0aGlzLm1hcElubGluZVBhcmFtKGNodW5rLCBjb25maWcpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgIH0pKTtcbiAgfVxuICBtYXBJbmxpbmVQYXJhbShjaHVuaywgeyBlc2NhcGVTdHJpbmcgfSkge1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaHVuayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBjaHVuay50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKGNodW5rKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWVBc1N0cmluZyA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobWFwcGVkVmFsdWVBc1N0cmluZyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGNodW5rKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKG1hcHBlZFZhbHVlQXNTdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHBhcmFtIHZhbHVlOiBcIiArIGNodW5rKTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMLkFsaWFzZWQodGhpcywgYWxpYXMpO1xuICB9XG4gIG1hcFdpdGgoZGVjb2Rlcikge1xuICAgIHRoaXMuZGVjb2RlciA9IHR5cGVvZiBkZWNvZGVyID09PSBcImZ1bmN0aW9uXCIgPyB7IG1hcEZyb21Ecml2ZXJWYWx1ZTogZGVjb2RlciB9IDogZGVjb2RlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbmxpbmVQYXJhbXMoKSB7XG4gICAgdGhpcy5zaG91bGRJbmxpbmVQYXJhbXMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHBhcnQgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gQ29uZGl0aW9uIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIGl0c2VsZiBpZiB0aGUgY29uZGl0aW9uIGlzIGB0cnVlYCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgXG4gICAqL1xuICBpZihjb25kaXRpb24pIHtcbiAgICByZXR1cm4gY29uZGl0aW9uID8gdGhpcyA6IHZvaWQgMDtcbiAgfVxufVxuY2xhc3MgTmFtZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5hbWVcIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBuYW1lKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgTmFtZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBpc0RyaXZlclZhbHVlRW5jb2Rlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwibWFwVG9Ecml2ZXJWYWx1ZVwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tYXBUb0RyaXZlclZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBub29wRGVjb2RlciA9IHtcbiAgbWFwRnJvbURyaXZlclZhbHVlOiAodmFsdWUpID0+IHZhbHVlXG59O1xuY29uc3Qgbm9vcEVuY29kZXIgPSB7XG4gIG1hcFRvRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wTWFwcGVyID0ge1xuICAuLi5ub29wRGVjb2RlcixcbiAgLi4ubm9vcEVuY29kZXJcbn07XG5jbGFzcyBQYXJhbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQYXJhbWV0ZXIgdmFsdWVcbiAgICogQHBhcmFtIGVuY29kZXIgLSBFbmNvZGVyIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgZHJpdmVyIHBhcmFtZXRlclxuICAgKi9cbiAgY29uc3RydWN0b3IodmFsdWUsIGVuY29kZXIgPSBub29wRW5jb2Rlcikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBhcmFtXCI7XG4gIGJyYW5kO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyYW0odmFsdWUsIGVuY29kZXIpIHtcbiAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgZW5jb2Rlcik7XG59XG5mdW5jdGlvbiBzcWwoc3RyaW5ncywgLi4ucGFyYW1zKSB7XG4gIGNvbnN0IHF1ZXJ5Q2h1bmtzID0gW107XG4gIGlmIChwYXJhbXMubGVuZ3RoID4gMCB8fCBzdHJpbmdzLmxlbmd0aCA+IDAgJiYgc3RyaW5nc1swXSAhPT0gXCJcIikge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gobmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbMF0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtwYXJhbUluZGV4LCBwYXJhbTJdIG9mIHBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICBxdWVyeUNodW5rcy5wdXNoKHBhcmFtMiwgbmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbcGFyYW1JbmRleCArIDFdKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwocXVlcnlDaHVua3MpO1xufVxuKChzcWwyKSA9PiB7XG4gIGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiBuZXcgU1FMKFtdKTtcbiAgfVxuICBzcWwyLmVtcHR5ID0gZW1wdHk7XG4gIGZ1bmN0aW9uIGZyb21MaXN0KGxpc3QpIHtcbiAgICByZXR1cm4gbmV3IFNRTChsaXN0KTtcbiAgfVxuICBzcWwyLmZyb21MaXN0ID0gZnJvbUxpc3Q7XG4gIGZ1bmN0aW9uIHJhdyhzdHIpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbbmV3IFN0cmluZ0NodW5rKHN0cildKTtcbiAgfVxuICBzcWwyLnJhdyA9IHJhdztcbiAgZnVuY3Rpb24gam9pbihjaHVua3MsIHNlcGFyYXRvcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ksIGNodW5rXSBvZiBjaHVua3MuZW50cmllcygpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgc2VwYXJhdG9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwocmVzdWx0KTtcbiAgfVxuICBzcWwyLmpvaW4gPSBqb2luO1xuICBmdW5jdGlvbiBpZGVudGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbiAgfVxuICBzcWwyLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICBmdW5jdGlvbiBwbGFjZWhvbGRlcjIobmFtZTIpIHtcbiAgICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbiAgfVxuICBzcWwyLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIyO1xuICBmdW5jdGlvbiBwYXJhbTIodmFsdWUsIGVuY29kZXIpIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbiAgfVxuICBzcWwyLnBhcmFtID0gcGFyYW0yO1xufSkoc3FsIHx8IChzcWwgPSB7fSkpO1xuKChTUUwyKSA9PiB7XG4gIGNsYXNzIEFsaWFzZWQge1xuICAgIGNvbnN0cnVjdG9yKHNxbDIsIGZpZWxkQWxpYXMpIHtcbiAgICAgIHRoaXMuc3FsID0gc3FsMjtcbiAgICAgIHRoaXMuZmllbGRBbGlhcyA9IGZpZWxkQWxpYXM7XG4gICAgfVxuICAgIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTC5BbGlhc2VkXCI7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGlzU2VsZWN0aW9uRmllbGQgPSBmYWxzZTtcbiAgICBnZXRTUUwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcWw7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgQWxpYXNlZCh0aGlzLnNxbCwgdGhpcy5maWVsZEFsaWFzKTtcbiAgICB9XG4gIH1cbiAgU1FMMi5BbGlhc2VkID0gQWxpYXNlZDtcbn0pKFNRTCB8fCAoU1FMID0ge30pKTtcbmNsYXNzIFBsYWNlaG9sZGVyIHtcbiAgY29uc3RydWN0b3IobmFtZTIpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lMjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQbGFjZWhvbGRlclwiO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGxhY2Vob2xkZXIobmFtZTIpIHtcbiAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihuYW1lMik7XG59XG5mdW5jdGlvbiBmaWxsUGxhY2Vob2xkZXJzKHBhcmFtcywgdmFsdWVzKSB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgaWYgKGlzKHAsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXNbcC5uYW1lXTtcbiAgICB9XG4gICAgaWYgKGlzKHAsIFBhcmFtKSAmJiBpcyhwLnZhbHVlLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmICghKHAudmFsdWUubmFtZSBpbiB2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsdWUgZm9yIHBsYWNlaG9sZGVyIFwiJHtwLnZhbHVlLm5hbWV9XCIgd2FzIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcC5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUodmFsdWVzW3AudmFsdWUubmFtZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSk7XG59XG5jb25zdCBJc0RyaXp6bGVWaWV3ID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVmlld1wiKTtcbmNsYXNzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJWaWV3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1ZpZXdCYXNlQ29uZmlnXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVmlld10gPSB0cnVlO1xuICBjb25zdHJ1Y3Rvcih7IG5hbWU6IG5hbWUyLCBzY2hlbWEsIHNlbGVjdGVkRmllbGRzLCBxdWVyeSB9KSB7XG4gICAgdGhpc1tWaWV3QmFzZUNvbmZpZ10gPSB7XG4gICAgICBuYW1lOiBuYW1lMixcbiAgICAgIG9yaWdpbmFsTmFtZTogbmFtZTIsXG4gICAgICBzY2hlbWEsXG4gICAgICBzZWxlY3RlZEZpZWxkcyxcbiAgICAgIHF1ZXJ5LFxuICAgICAgaXNFeGlzdGluZzogIXF1ZXJ5LFxuICAgICAgaXNBbGlhczogZmFsc2VcbiAgICB9O1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZpZXcodmlldykge1xuICByZXR1cm4gdHlwZW9mIHZpZXcgPT09IFwib2JqZWN0XCIgJiYgdmlldyAhPT0gbnVsbCAmJiBJc0RyaXp6bGVWaWV3IGluIHZpZXc7XG59XG5mdW5jdGlvbiBnZXRWaWV3TmFtZSh2aWV3KSB7XG4gIHJldHVybiB2aWV3W1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xufVxuQ29sdW1uLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5UYWJsZS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuU3VicXVlcnkucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcbmV4cG9ydCB7XG4gIEZha2VQcmltaXRpdmVQYXJhbSxcbiAgTmFtZSxcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIFN0cmluZ0NodW5rLFxuICBWaWV3LFxuICBmaWxsUGxhY2Vob2xkZXJzLFxuICBnZXRWaWV3TmFtZSxcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgaXNWaWV3LFxuICBuYW1lLFxuICBub29wRGVjb2RlcixcbiAgbm9vcEVuY29kZXIsXG4gIG5vb3BNYXBwZXIsXG4gIHBhcmFtLFxuICBwbGFjZWhvbGRlcixcbiAgc3FsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtbkFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldChjb2x1bW5PYmosIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJ0YWJsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbk9ialtwcm9wXTtcbiAgfVxufVxuY2xhc3MgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzLCByZXBsYWNlT3JpZ2luYWxOYW1lKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSA9IHJlcGxhY2VPcmlnaW5hbE5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5Jc0FsaWFzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSAmJiBwcm9wID09PSBUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YXJnZXRbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBuYW1lOiB0aGlzLmFsaWFzLFxuICAgICAgICBpc0FsaWFzOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLkNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YXJnZXRbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJveGllZENvbHVtbnMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIHByb3hpZWRDb2x1bW5zW2tleV0gPSBuZXcgUHJveHkoXG4gICAgICAgICAgY29sdW1uc1trZXldLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb3hpZWRDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtwcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmNsYXNzIFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwic291cmNlVGFibGVcIikge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZSh0YXJnZXQuc291cmNlVGFibGUsIHRoaXMuYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICB9XG59XG5mdW5jdGlvbiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eSh0YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRSZWxhdGlvbihyZWxhdGlvbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHJlbGF0aW9uLCBuZXcgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZUNvbHVtbihjb2x1bW4sIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICBjb2x1bW4sXG4gICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eShjb2x1bW4udGFibGUsIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMsIGZhbHNlKSkpXG4gICk7XG59XG5mdW5jdGlvbiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZChtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHF1ZXJ5LnNxbCwgYWxpYXMpLCBxdWVyeS5maWVsZEFsaWFzKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnksIGFsaWFzKSB7XG4gIHJldHVybiBzcWwuam9pbihxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwpKSB7XG4gICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiBjO1xuICB9KSk7XG59XG5leHBvcnQge1xuICBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcixcbiAgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBUYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBhbGlhc2VkUmVsYXRpb24sXG4gIGFsaWFzZWRUYWJsZSxcbiAgYWxpYXNlZFRhYmxlQ29sdW1uLFxuICBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyxcbiAgbWFwQ29sdW1uc0luU1FMVG9BbGlhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWFzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuZnVuY3Rpb24gbWFwUmVzdWx0Um93KGNvbHVtbnMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkge1xuICBjb25zdCBudWxsaWZ5TWFwID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGNvbHVtbnMucmVkdWNlKFxuICAgIChyZXN1bHQyLCB7IHBhdGgsIGZpZWxkIH0sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBsZXQgZGVjb2RlcjtcbiAgICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQ7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5kZWNvZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLnNxbC5kZWNvZGVyO1xuICAgICAgfVxuICAgICAgbGV0IG5vZGUgPSByZXN1bHQyO1xuICAgICAgZm9yIChjb25zdCBbcGF0aENodW5rSW5kZXgsIHBhdGhDaHVua10gb2YgcGF0aC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHBhdGhDaHVua0luZGV4IDwgcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCEocGF0aENodW5rIGluIG5vZGUpKSB7XG4gICAgICAgICAgICBub2RlW3BhdGhDaHVua10gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IG5vZGVbcGF0aENodW5rXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJvd1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBub2RlW3BhdGhDaHVua10gPSByYXdWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgaWYgKGpvaW5zTm90TnVsbGFibGVNYXAgJiYgaXMoZmllbGQsIENvbHVtbikgJiYgcGF0aC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdE5hbWUgPSBwYXRoWzBdO1xuICAgICAgICAgICAgaWYgKCEob2JqZWN0TmFtZSBpbiBudWxsaWZ5TWFwKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gdmFsdWUgPT09IG51bGwgPyBnZXRUYWJsZU5hbWUoZmllbGQudGFibGUpIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudWxsaWZ5TWFwW29iamVjdE5hbWVdID09PSBcInN0cmluZ1wiICYmIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gIT09IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkpIHtcbiAgICAgICAgICAgICAgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgfSxcbiAgICB7fVxuICApO1xuICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBPYmplY3Qua2V5cyhudWxsaWZ5TWFwKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbb2JqZWN0TmFtZSwgdGFibGVOYW1lXSBvZiBPYmplY3QuZW50cmllcyhudWxsaWZ5TWFwKSkge1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgIWpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSkge1xuICAgICAgICByZXN1bHRbb2JqZWN0TmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMsIHBhdGhQcmVmaXgpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpZWxkcykucmVkdWNlKChyZXN1bHQsIFtuYW1lLCBmaWVsZF0pID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoUHJlZml4ID8gWy4uLnBhdGhQcmVmaXgsIG5hbWVdIDogW25hbWVdO1xuICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSB8fCBpcyhmaWVsZCwgU1FMKSB8fCBpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHBhdGg6IG5ld1BhdGgsIGZpZWxkIH0pO1xuICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFRhYmxlKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZFtUYWJsZS5TeW1ib2wuQ29sdW1uc10sIG5ld1BhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZCwgbmV3UGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBoYXZlU2FtZUtleXMobGVmdCwgcmlnaHQpIHtcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KTtcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpO1xuICBpZiAobGVmdEtleXMubGVuZ3RoICE9PSByaWdodEtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGxlZnRLZXlzLmVudHJpZXMoKSkge1xuICAgIGlmIChrZXkgIT09IHJpZ2h0S2V5c1tpbmRleF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBtYXBVcGRhdGVTZXQodGFibGUsIHZhbHVlcykge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHZvaWQgMCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoaXModmFsdWUsIFNRTCkgfHwgaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBba2V5LCBuZXcgUGFyYW0odmFsdWUsIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVtrZXldKV07XG4gICAgfVxuICB9KTtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWVzIHRvIHNldFwiKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuZnVuY3Rpb24gYXBwbHlNaXhpbnMoYmFzZUNsYXNzLCBleHRlbmRlZENsYXNzZXMpIHtcbiAgZm9yIChjb25zdCBleHRlbmRlZENsYXNzIG9mIGV4dGVuZGVkQ2xhc3Nlcykge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbmRlZENsYXNzLnByb3RvdHlwZSkpIHtcbiAgICAgIGlmIChuYW1lID09PSBcImNvbnN0cnVjdG9yXCIpIGNvbnRpbnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBiYXNlQ2xhc3MucHJvdG90eXBlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlLCBuYW1lKSB8fCAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld1NlbGVjdGVkRmllbGRzKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgVmlldykgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gdGFibGVbVGFibGUuU3ltYm9sLk5hbWVdIDogdGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYikge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHR5cGVvZiBhID09PSBcInN0cmluZ1wiICYmIGEubGVuZ3RoID4gMCA/IGEgOiBcIlwiLFxuICAgIGNvbmZpZzogdHlwZW9mIGEgPT09IFwib2JqZWN0XCIgPyBhIDogYlxuICB9O1xufVxuY29uc3QgXyA9IHt9O1xuY29uc3QgX18gPSB7fTtcbmZ1bmN0aW9uIGlzQ29uZmlnKGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEuY29uc3RydWN0b3IubmFtZSAhPT0gXCJPYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoXCJsb2dnZXJcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdO1xuICAgIGlmICh0eXBlICE9PSBcImJvb2xlYW5cIiAmJiAodHlwZSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZGF0YVtcImxvZ2dlclwiXVtcImxvZ1F1ZXJ5XCJdICE9PSBcImZ1bmN0aW9uXCIpICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJzY2hlbWFcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wic2NoZW1hXCJdO1xuICAgIGlmICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjYXNpbmdcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY2FzaW5nXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJtb2RlXCIgaW4gZGF0YSkge1xuICAgIGlmIChkYXRhW1wibW9kZVwiXSAhPT0gXCJkZWZhdWx0XCIgfHwgZGF0YVtcIm1vZGVcIl0gIT09IFwicGxhbmV0c2NhbGVcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gdm9pZCAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY29ubmVjdGlvblwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjb25uZWN0aW9uXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNsaWVudFwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjbGllbnRcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgdGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCk7XG5leHBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBnZXRWaWV3U2VsZWN0ZWRGaWVsZHMsXG4gIGhhdmVTYW1lS2V5cyxcbiAgaXNDb25maWcsXG4gIG1hcFJlc3VsdFJvdyxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzLFxuICB0ZXh0RGVjb2RlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuY2xhc3MgRm9yZWlnbktleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVGb3JlaWduS2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIHJlZmVyZW5jZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25VcGRhdGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uRGVsZXRlO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIGFjdGlvbnMpIHtcbiAgICB0aGlzLnJlZmVyZW5jZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucywgZm9yZWlnblRhYmxlOiBmb3JlaWduQ29sdW1uc1swXS50YWJsZSwgZm9yZWlnbkNvbHVtbnMgfTtcbiAgICB9O1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICB0aGlzLl9vblVwZGF0ZSA9IGFjdGlvbnMub25VcGRhdGU7XG4gICAgICB0aGlzLl9vbkRlbGV0ZSA9IGFjdGlvbnMub25EZWxldGU7XG4gICAgfVxuICB9XG4gIG9uVXBkYXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9uRGVsZXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXkodGFibGUsIHRoaXMpO1xuICB9XG59XG5jbGFzcyBGb3JlaWduS2V5IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGJ1aWxkZXIpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSBidWlsZGVyLnJlZmVyZW5jZTtcbiAgICB0aGlzLm9uVXBkYXRlID0gYnVpbGRlci5fb25VcGRhdGU7XG4gICAgdGhpcy5vbkRlbGV0ZSA9IGJ1aWxkZXIuX29uRGVsZXRlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlcIjtcbiAgcmVmZXJlbmNlO1xuICBvblVwZGF0ZTtcbiAgb25EZWxldGU7XG4gIGdldE5hbWUoKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gdGhpcy5yZWZlcmVuY2UoKTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICBjb25zdCBmb3JlaWduQ29sdW1uTmFtZXMgPSBmb3JlaWduQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGNodW5rcyA9IFtcbiAgICAgIHRoaXMudGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmNvbHVtbk5hbWVzLFxuICAgICAgZm9yZWlnbkNvbHVtbnNbMF0udGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmZvcmVpZ25Db2x1bW5OYW1lc1xuICAgIF07XG4gICAgcmV0dXJuIG5hbWUgPz8gYCR7Y2h1bmtzLmpvaW4oXCJfXCIpfV9ma2A7XG4gIH1cbn1cbmZ1bmN0aW9uIGZvcmVpZ25LZXkoY29uZmlnKSB7XG4gIGZ1bmN0aW9uIG1hcHBlZENvbmZpZygpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSBjb25maWcoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGZvcmVpZ25Db2x1bW5zXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIHJldHVybiBuZXcgRm9yZWlnbktleUJ1aWxkZXIobWFwcGVkQ29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIEZvcmVpZ25LZXksXG4gIEZvcmVpZ25LZXlCdWlsZGVyLFxuICBmb3JlaWduS2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yZWlnbi1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuZnVuY3Rpb24gdW5pcXVlS2V5TmFtZSh0YWJsZSwgY29sdW1ucykge1xuICByZXR1cm4gYCR7dGFibGVbVGFibGVOYW1lXX1fJHtjb2x1bW5zLmpvaW4oXCJfXCIpfV91bmlxdWVgO1xufVxuZnVuY3Rpb24gdW5pcXVlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyKG5hbWUpO1xufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludFwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmNsYXNzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uQnVpbGRlclwiO1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICByZWZlcmVuY2VzKHJlZiwgYWN0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mb3JlaWduS2V5Q29uZmlncy5wdXNoKHsgcmVmLCBhY3Rpb25zIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHVuaXF1ZShuYW1lKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzLCBjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgPSB7XG4gICAgICBhcyxcbiAgICAgIHR5cGU6IFwiYWx3YXlzXCIsXG4gICAgICBtb2RlOiBjb25maWc/Lm1vZGUgPz8gXCJ2aXJ0dWFsXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gKChyZWYyLCBhY3Rpb25zMikgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgIHJldHVybiB7IGNvbHVtbnM6IFtjb2x1bW5dLCBmb3JlaWduQ29sdW1uczogW2ZvcmVpZ25Db2x1bW5dIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uVXBkYXRlKGFjdGlvbnMyLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uRGVsZXRlKGFjdGlvbnMyLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICB9KShyZWYsIGFjdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvbHVtblwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ29sdW1uLFxuICBTUUxpdGVDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcsIHRleHREZWNvZGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJiaWdpbnRcIiwgXCJTUUxpdGVCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmlnSW50KHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJpZ0ludCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJpZ0ludFwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gQmlnSW50KGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZUJsb2JKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmZyb20pIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZS5idWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYnVmZmVyXCIsIFwiU1FMaXRlQmxvYkJ1ZmZlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JCdWZmZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGJsb2IoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnRCdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIobmFtZSk7XG59XG5leHBvcnQge1xuICBTUUxpdGVCaWdJbnQsXG4gIFNRTGl0ZUJpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyLFxuICBTUUxpdGVCbG9iSnNvbixcbiAgU1FMaXRlQmxvYkpzb25CdWlsZGVyLFxuICBibG9iXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmxvYi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWVsZENvbmZpZywgY3VzdG9tVHlwZVBhcmFtcykge1xuICAgIHN1cGVyKG5hbWUsIFwiY3VzdG9tXCIsIFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmZpZWxkQ29uZmlnID0gZmllbGRDb25maWc7XG4gICAgdGhpcy5jb25maWcuY3VzdG9tVHlwZVBhcmFtcyA9IGN1c3RvbVR5cGVQYXJhbXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUN1c3RvbUNvbHVtblwiO1xuICBzcWxOYW1lO1xuICBtYXBUbztcbiAgbWFwRnJvbTtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuc3FsTmFtZSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmRhdGFUeXBlKGNvbmZpZy5maWVsZENvbmZpZyk7XG4gICAgdGhpcy5tYXBUbyA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLnRvRHJpdmVyO1xuICAgIHRoaXMubWFwRnJvbSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmZyb21Ecml2ZXI7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zcWxOYW1lO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBGcm9tID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcEZyb20odmFsdWUpIDogdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBUbyA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5tYXBUbyh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY3VzdG9tVHlwZShjdXN0b21UeXBlUGFyYW1zKSB7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcihcbiAgICAgIG5hbWUsXG4gICAgICBjb25maWcsXG4gICAgICBjdXN0b21UeXBlUGFyYW1zXG4gICAgKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUN1c3RvbUNvbHVtbixcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcixcbiAgY3VzdG9tVHlwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN1c3RvbS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgc3VwZXIobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpO1xuICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSBmYWxzZTtcbiAgfVxuICBwcmltYXJ5S2V5KGNvbmZpZykge1xuICAgIGlmIChjb25maWc/LmF1dG9JbmNyZW1lbnQpIHtcbiAgICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc3VwZXIucHJpbWFyeUtleSgpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJhc2VJbnRlZ2VyXCI7XG4gIGF1dG9JbmNyZW1lbnQgPSB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50O1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnRlZ2VyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVJbnRlZ2VyXCIpO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUludGVnZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJcIjtcbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUaW1lc3RhbXBCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImRhdGVcIiwgXCJTUUxpdGVUaW1lc3RhbXBcIik7XG4gICAgdGhpcy5jb25maWcubW9kZSA9IG1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZGVmYXVsdCgpYCB3aXRoIHlvdXIgb3duIGV4cHJlc3Npb24gaW5zdGVhZC5cbiAgICpcbiAgICogQWRkcyBgREVGQVVMVCAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCB0byB0aGUgY29sdW1uLCB3aGljaCBpcyB0aGUgY3VycmVudCBlcG9jaCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZGVmYXVsdE5vdygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHNxbGAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCk7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUaW1lc3RhbXAgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcFwiO1xuICBtb2RlID0gdGhpcy5jb25maWcubW9kZTtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSAqIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IHVuaXggPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHVuaXggLyAxZTMpO1xuICAgIH1cbiAgICByZXR1cm4gdW5peDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQm9vbGVhbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBtb2RlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJib29sZWFuXCIsIFwiU1FMaXRlQm9vbGVhblwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQm9vbGVhbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSA9PT0gMTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGludGVnZXIoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIiB8fCBjb25maWc/Lm1vZGUgPT09IFwidGltZXN0YW1wX21zXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIobmFtZSwgY29uZmlnLm1vZGUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyQnVpbGRlcihuYW1lKTtcbn1cbmNvbnN0IGludCA9IGludGVnZXI7XG5leHBvcnQge1xuICBTUUxpdGVCYXNlSW50ZWdlcixcbiAgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyLFxuICBTUUxpdGVCb29sZWFuLFxuICBTUUxpdGVCb29sZWFuQnVpbGRlcixcbiAgU1FMaXRlSW50ZWdlcixcbiAgU1FMaXRlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZVRpbWVzdGFtcCxcbiAgU1FMaXRlVGltZXN0YW1wQnVpbGRlcixcbiAgaW50LFxuICBpbnRlZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZWdlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZU51bWVyaWNCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZU51bWVyaWNcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpYyhcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY1wiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZU51bWVyaWNOdW1iZXJcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY051bWJlcihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljTnVtYmVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlclwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY0JpZ0ludChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUgPSBCaWdJbnQ7XG4gIG1hcFRvRHJpdmVyVmFsdWUgPSBTdHJpbmc7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5mdW5jdGlvbiBudW1lcmljKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGNvbnN0IG1vZGUgPSBjb25maWc/Lm1vZGU7XG4gIHJldHVybiBtb2RlID09PSBcIm51bWJlclwiID8gbmV3IFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyKG5hbWUpIDogbW9kZSA9PT0gXCJiaWdpbnRcIiA/IG5ldyBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlcihuYW1lKSA6IG5ldyBTUUxpdGVOdW1lcmljQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZU51bWVyaWMsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnQsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljQnVpbGRlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIsXG4gIG51bWVyaWNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1lcmljLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlUmVhbEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmVhbEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlUmVhbFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVJlYWwgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwicmVhbFwiO1xuICB9XG59XG5mdW5jdGlvbiByZWFsKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsQnVpbGRlcihuYW1lID8/IFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmVhbCxcbiAgU1FMaXRlUmVhbEJ1aWxkZXIsXG4gIHJlYWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlVGV4dEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgY29uZmlnKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJTUUxpdGVUZXh0XCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW1WYWx1ZXMgPSBjb25maWcuZW51bTtcbiAgICB0aGlzLmNvbmZpZy5sZW5ndGggPSBjb25maWcubGVuZ3RoO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHQoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRcIjtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW1WYWx1ZXM7XG4gIGxlbmd0aCA9IHRoaXMuY29uZmlnLmxlbmd0aDtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGB0ZXh0JHt0aGlzLmNvbmZpZy5sZW5ndGggPyBgKCR7dGhpcy5jb25maWcubGVuZ3RofSlgIDogXCJcIn1gO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImpzb25cIiwgXCJTUUxpdGVUZXh0SnNvblwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0SnNvbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRKc29uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gdGV4dChhLCBiID0ge30pIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWcubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZVRleHRCdWlsZGVyKG5hbWUsIGNvbmZpZyk7XG59XG5leHBvcnQge1xuICBTUUxpdGVUZXh0LFxuICBTUUxpdGVUZXh0QnVpbGRlcixcbiAgU1FMaXRlVGV4dEpzb24sXG4gIFNRTGl0ZVRleHRKc29uQnVpbGRlcixcbiAgdGV4dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciwgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB9IGZyb20gXCIuL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTZWxlY3Rpb25Qcm94eUhhbmRsZXJcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gIH1cbiAgZ2V0KHN1YnF1ZXJ5LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwiX1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtcIl9cIl0sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBWaWV3QmFzZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3VicXVlcnlbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBzZWxlY3RlZEZpZWxkczogbmV3IFByb3h5KFxuICAgICAgICAgIHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgcmV0dXJuIHN1YnF1ZXJ5W3Byb3BdO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gaXMoc3VicXVlcnksIFN1YnF1ZXJ5KSA/IHN1YnF1ZXJ5Ll8uc2VsZWN0ZWRGaWVsZHMgOiBpcyhzdWJxdWVyeSwgVmlldykgPyBzdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiBzdWJxdWVyeTtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbnNbcHJvcF07XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxBbGlhc2VkQmVoYXZpb3IgPT09IFwic3FsXCIgJiYgIXZhbHVlLmlzU2VsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNxbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUuY2xvbmUoKTtcbiAgICAgIG5ld1ZhbHVlLmlzU2VsZWN0aW9uRmllbGQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIFNRTCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxCZWhhdmlvciA9PT0gXCJzcWxcIikge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgdHJpZWQgdG8gcmVmZXJlbmNlIFwiJHtwcm9wfVwiIGZpZWxkIGZyb20gYSBzdWJxdWVyeSwgd2hpY2ggaXMgYSByYXcgU1FMIGZpZWxkLCBidXQgaXQgZG9lc24ndCBoYXZlIGFuIGFsaWFzIGRlY2xhcmVkLiBQbGVhc2UgYWRkIGFuIGFsaWFzIHRvIHRoZSBmaWVsZCB1c2luZyBcIi5hcygnYWxpYXMnKVwiIG1ldGhvZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihcbiAgICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgICAgdmFsdWUudGFibGUsXG4gICAgICAgICAgICAgIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnLmFsaWFzLCB0aGlzLmNvbmZpZy5yZXBsYWNlT3JpZ2luYWxOYW1lID8/IGZhbHNlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNlbGVjdGlvblByb3h5SGFuZGxlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdGlvbi1wcm94eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFF1ZXJ5UHJvbWlzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlF1ZXJ5UHJvbWlzZVwiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5UHJvbWlzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LXByb21pc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBibG9iIH0gZnJvbSBcIi4vYmxvYi5qc1wiO1xuaW1wb3J0IHsgY3VzdG9tVHlwZSB9IGZyb20gXCIuL2N1c3RvbS5qc1wiO1xuaW1wb3J0IHsgaW50ZWdlciB9IGZyb20gXCIuL2ludGVnZXIuanNcIjtcbmltcG9ydCB7IG51bWVyaWMgfSBmcm9tIFwiLi9udW1lcmljLmpzXCI7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSBcIi4vcmVhbC5qc1wiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuL3RleHQuanNcIjtcbmZ1bmN0aW9uIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzKCkge1xuICByZXR1cm4ge1xuICAgIGJsb2IsXG4gICAgY3VzdG9tVHlwZSxcbiAgICBpbnRlZ2VyLFxuICAgIG51bWVyaWMsXG4gICAgcmVhbCxcbiAgICB0ZXh0XG4gIH07XG59XG5leHBvcnQge1xuICBnZXRTUUxpdGVDb2x1bW5CdWlsZGVyc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsbC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTUUxpdGVJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNsYXNzIFNRTGl0ZVRhYmxlIGV4dGVuZHMgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5c1xuICB9KTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAvKiogQGludGVybmFsICovXG4gIFtJbmxpbmVGb3JlaWduS2V5c10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG59XG5mdW5jdGlvbiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFNRTGl0ZVRhYmxlKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpO1xuICBjb25zdCBwYXJzZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbHVtbnMoZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdGFibGUgPSBPYmplY3QuYXNzaWduKHJhd1RhYmxlLCBidWlsdENvbHVtbnMpO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiB0YWJsZTtcbn1cbmNvbnN0IHNxbGl0ZVRhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpO1xufTtcbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBzcWxpdGVUYWJsZUJhc2UoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIElubGluZUZvcmVpZ25LZXlzLFxuICBTUUxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGUsXG4gIHNxbGl0ZVRhYmxlQ3JlYXRvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIEluZGV4QnVpbGRlck9uIHtcbiAgY29uc3RydWN0b3IobmFtZSwgdW5pcXVlKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVuaXF1ZSA9IHVuaXF1ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleEJ1aWxkZXJPblwiO1xuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXIodGhpcy5uYW1lLCBjb2x1bW5zLCB0aGlzLnVuaXF1ZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgY29sdW1ucywgdW5pcXVlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHVuaXF1ZSxcbiAgICAgIHdoZXJlOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDb25kaXRpb24gZm9yIHBhcnRpYWwgaW5kZXguXG4gICAqL1xuICB3aGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IGNvbmRpdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleCh0aGlzLmNvbmZpZywgdGFibGUpO1xuICB9XG59XG5jbGFzcyBJbmRleCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4XCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IoY29uZmlnLCB0YWJsZSkge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIHRhYmxlIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCBmYWxzZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVJbmRleChuYW1lKSB7XG4gIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyT24obmFtZSwgdHJ1ZSk7XG59XG5leHBvcnQge1xuICBJbmRleCxcbiAgSW5kZXhCdWlsZGVyLFxuICBJbmRleEJ1aWxkZXJPbixcbiAgaW5kZXgsXG4gIHVuaXF1ZUluZGV4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlcy5qcy5tYXAiLAogICAgImltcG9ydCB7IGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENoZWNrQnVpbGRlciB9IGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IEluZGV4QnVpbGRlciB9IGZyb20gXCIuL2luZGV4ZXMuanNcIjtcbmltcG9ydCB7IFByaW1hcnlLZXlCdWlsZGVyIH0gZnJvbSBcIi4vcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB9IGZyb20gXCIuL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5mdW5jdGlvbiBnZXRUYWJsZUNvbmZpZyh0YWJsZSkge1xuICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICBjb25zdCBpbmRleGVzID0gW107XG4gIGNvbnN0IGNoZWNrcyA9IFtdO1xuICBjb25zdCBwcmltYXJ5S2V5cyA9IFtdO1xuICBjb25zdCB1bmlxdWVDb25zdHJhaW50cyA9IFtdO1xuICBjb25zdCBmb3JlaWduS2V5cyA9IE9iamVjdC52YWx1ZXModGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLklubGluZUZvcmVpZ25LZXlzXSk7XG4gIGNvbnN0IG5hbWUgPSB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIGNvbnN0IGV4dHJhQ29uZmlnQnVpbGRlciA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdO1xuICBpZiAoZXh0cmFDb25maWdCdWlsZGVyICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCBleHRyYUNvbmZpZyA9IGV4dHJhQ29uZmlnQnVpbGRlcih0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICAgIGNvbnN0IGV4dHJhVmFsdWVzID0gQXJyYXkuaXNBcnJheShleHRyYUNvbmZpZykgPyBleHRyYUNvbmZpZy5mbGF0KDEpIDogT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZyk7XG4gICAgZm9yIChjb25zdCBidWlsZGVyIG9mIE9iamVjdC52YWx1ZXMoZXh0cmFWYWx1ZXMpKSB7XG4gICAgICBpZiAoaXMoYnVpbGRlciwgSW5kZXhCdWlsZGVyKSkge1xuICAgICAgICBpbmRleGVzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBDaGVja0J1aWxkZXIpKSB7XG4gICAgICAgIGNoZWNrcy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIpKSB7XG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgcHJpbWFyeUtleXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIEZvcmVpZ25LZXlCdWlsZGVyKSkge1xuICAgICAgICBmb3JlaWduS2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW5zLFxuICAgIGluZGV4ZXMsXG4gICAgZm9yZWlnbktleXMsXG4gICAgY2hlY2tzLFxuICAgIHByaW1hcnlLZXlzLFxuICAgIHVuaXF1ZUNvbnN0cmFpbnRzLFxuICAgIG5hbWVcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVc2VkVGFibGUodGFibGUpIHtcbiAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICByZXR1cm4gW2Ake3RhYmxlW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV19YF07XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTdWJxdWVyeSkpIHtcbiAgICByZXR1cm4gdGFibGUuXy51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIGlmIChpcyh0YWJsZSwgU1FMKSkge1xuICAgIHJldHVybiB0YWJsZS51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGdldFZpZXdDb25maWcodmlldykge1xuICByZXR1cm4ge1xuICAgIC4uLnZpZXdbVmlld0Jhc2VDb25maWddXG4gICAgLy8gLi4udmlld1tTUUxpdGVWaWV3Q29uZmlnXSxcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGV4dHJhY3RVc2VkVGFibGUsXG4gIGdldFRhYmxlQ29uZmlnLFxuICBnZXRWaWV3Q29uZmlnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlRGVsZXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgdGFibGUsIHdpdGhMaXN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGVsZXRlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICAvKipcbiAgICogQWRkcyBhIGB3aGVyZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGRlbGV0ZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9kZWxldGV9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGREZWxldGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVEZWxldGVCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVsZXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMubWFwKCh3b3JkKSA9PiB3b3JkLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJfXCIpO1xufVxuZnVuY3Rpb24gdG9DYW1lbENhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMucmVkdWNlKChhY2MsIHdvcmQsIGkpID0+IHtcbiAgICBjb25zdCBmb3JtYXR0ZWRXb3JkID0gaSA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IGAke3dvcmRbMF0udG9VcHBlckNhc2UoKX0ke3dvcmQuc2xpY2UoMSl9YDtcbiAgICByZXR1cm4gYWNjICsgZm9ybWF0dGVkV29yZDtcbiAgfSwgXCJcIik7XG59XG5mdW5jdGlvbiBub29wQ2FzZShpbnB1dCkge1xuICByZXR1cm4gaW5wdXQ7XG59XG5jbGFzcyBDYXNpbmdDYWNoZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNhc2luZ0NhY2hlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FjaGUgPSB7fTtcbiAgY2FjaGVkVGFibGVzID0ge307XG4gIGNvbnZlcnQ7XG4gIGNvbnN0cnVjdG9yKGNhc2luZykge1xuICAgIHRoaXMuY29udmVydCA9IGNhc2luZyA9PT0gXCJzbmFrZV9jYXNlXCIgPyB0b1NuYWtlQ2FzZSA6IGNhc2luZyA9PT0gXCJjYW1lbENhc2VcIiA/IHRvQ2FtZWxDYXNlIDogbm9vcENhc2U7XG4gIH1cbiAgZ2V0Q29sdW1uQ2FzaW5nKGNvbHVtbikge1xuICAgIGlmICghY29sdW1uLmtleUFzTmFtZSkgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICBjb25zdCBrZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfS4ke2NvbHVtbi5uYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlW2tleV0pIHtcbiAgICAgIHRoaXMuY2FjaGVUYWJsZShjb2x1bW4udGFibGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICB9XG4gIGNhY2hlVGFibGUodGFibGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IHRhYmxlS2V5ID0gYCR7c2NoZW1hfS4ke3RhYmxlTmFtZX1gO1xuICAgIGlmICghdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gYCR7dGFibGVLZXl9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICAgICAgdGhpcy5jYWNoZVtjb2x1bW5LZXldID0gdGhpcy5jb252ZXJ0KGNvbHVtbi5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGVkVGFibGVzW3RhYmxlS2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgIHRoaXMuY2FjaGVkVGFibGVzID0ge307XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENhc2luZ0NhY2hlLFxuICB0b0NhbWVsQ2FzZSxcbiAgdG9TbmFrZUNhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXNpbmcuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBEcml6emxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRyaXp6bGVFcnJvclwiO1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNhdXNlIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkRyaXp6bGVFcnJvclwiO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgRHJpenpsZVF1ZXJ5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5LCBwYXJhbXMsIGNhdXNlKSB7XG4gICAgc3VwZXIoYEZhaWxlZCBxdWVyeTogJHtxdWVyeX1cbnBhcmFtczogJHtwYXJhbXN9YCk7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBEcml6emxlUXVlcnlFcnJvcik7XG4gICAgaWYgKGNhdXNlKSB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cbmNsYXNzIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciBleHRlbmRzIERyaXp6bGVFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclwiO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IG1lc3NhZ2U6IFwiUm9sbGJhY2tcIiB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRHJpenpsZUVycm9yLFxuICBEcml6emxlUXVlcnlFcnJvcixcbiAgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRQZ0NvbHVtbkJ1aWxkZXJzIH0gZnJvbSBcIi4vY29sdW1ucy9hbGwuanNcIjtcbmNvbnN0IElubGluZUZvcmVpZ25LZXlzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6UGdJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNvbnN0IEVuYWJsZVJMUyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkVuYWJsZVJMU1wiKTtcbmNsYXNzIFBnVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGUuU3ltYm9sLCB7XG4gICAgSW5saW5lRm9yZWlnbktleXMsXG4gICAgRW5hYmxlUkxTXG4gIH0pO1xuICAvKipAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtFbmFibGVSTFNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IHt9O1xufVxuZnVuY3Rpb24gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFBnVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRQZ0NvbHVtbkJ1aWxkZXJzKCkpIDogY29sdW1ucztcbiAgY29uc3QgYnVpbHRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkKHJhd1RhYmxlKTtcbiAgICAgIHJhd1RhYmxlW0lubGluZUZvcmVpZ25LZXlzXS5wdXNoKC4uLmNvbEJ1aWxkZXIuYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHJhd1RhYmxlKSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkRXh0cmFDb25maWdDb2x1bW4ocmF3VGFibGUpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnNGb3JFeHRyYUNvbmZpZztcbiAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgdGFibGVbUGdUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHRhYmxlLCB7XG4gICAgZW5hYmxlUkxTOiAoKSA9PiB7XG4gICAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FbmFibGVSTFNdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgcGdUYWJsZSA9IChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCk7XG59O1xuZnVuY3Rpb24gcGdUYWJsZUNyZWF0b3IoY3VzdG9taXplVGFibGVOYW1lKSB7XG4gIHJldHVybiAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIEVuYWJsZVJMUyxcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFBnVGFibGUsXG4gIHBnVGFibGUsXG4gIHBnVGFibGVDcmVhdG9yLFxuICBwZ1RhYmxlV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBnVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gcHJpbWFyeUtleSguLi5jb25maWcpIHtcbiAgaWYgKGNvbmZpZ1swXS5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWdbMF0uY29sdW1ucywgY29uZmlnWzBdLm5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgUHJpbWFyeUtleUJ1aWxkZXIoY29uZmlnKTtcbn1cbmNsYXNzIFByaW1hcnlLZXlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFByaW1hcnlLZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZSA/PyBgJHt0aGlzLnRhYmxlW1BnVGFibGUuU3ltYm9sLk5hbWVdfV8ke3RoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpLmpvaW4oXCJfXCIpfV9wa2A7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByaW1hcnlLZXksXG4gIFByaW1hcnlLZXlCdWlsZGVyLFxuICBwcmltYXJ5S2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbWFyeS1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIHNxbCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXdcbn0gZnJvbSBcIi4uL3NxbC5qc1wiO1xuZnVuY3Rpb24gYmluZElmUGFyYW0odmFsdWUsIGNvbHVtbikge1xuICBpZiAoaXNEcml2ZXJWYWx1ZUVuY29kZXIoY29sdW1uKSAmJiAhaXNTUUxXcmFwcGVyKHZhbHVlKSAmJiAhaXModmFsdWUsIFBhcmFtKSAmJiAhaXModmFsdWUsIFBsYWNlaG9sZGVyKSAmJiAhaXModmFsdWUsIENvbHVtbikgJiYgIWlzKHZhbHVlLCBUYWJsZSkgJiYgIWlzKHZhbHVlLCBWaWV3KSkge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGNvbHVtbik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgZXEgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBuZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBhbmQoLi4udW5maWx0ZXJlZENvbmRpdGlvbnMpIHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IHVuZmlsdGVyZWRDb25kaXRpb25zLmZpbHRlcihcbiAgICAoYykgPT4gYyAhPT0gdm9pZCAwXG4gICk7XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoY29uZGl0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwoW1xuICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgc3FsLmpvaW4oY29uZGl0aW9ucywgbmV3IFN0cmluZ0NodW5rKFwiIGFuZCBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBvciguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgb3IgXCIpKSxcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gIF0pO1xufVxuZnVuY3Rpb24gbm90KGNvbmRpdGlvbikge1xuICByZXR1cm4gc3FsYG5vdCAke2NvbmRpdGlvbn1gO1xufVxuY29uc3QgZ3QgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBndGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID49ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbHQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDwgJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDw9ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuZnVuY3Rpb24gaW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgZmFsc2VgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaW4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIG5vdEluQXJyYXkoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3FsYHRydWVgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaW4gJHt2YWx1ZXMubWFwKCh2KSA9PiBiaW5kSWZQYXJhbSh2LCBjb2x1bW4pKX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHt2YWx1ZX0gaXMgbnVsbGA7XG59XG5mdW5jdGlvbiBpc05vdE51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBub3QgbnVsbGA7XG59XG5mdW5jdGlvbiBleGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBleGlzdHMgJHtzdWJxdWVyeX1gO1xufVxuZnVuY3Rpb24gbm90RXhpc3RzKHN1YnF1ZXJ5KSB7XG4gIHJldHVybiBzcWxgbm90IGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBiZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYmV0d2VlbiAke2JpbmRJZlBhcmFtKG1pbiwgY29sdW1uKX0gYW5kICR7YmluZElmUGFyYW0oXG4gICAgbWF4LFxuICAgIGNvbHVtblxuICApfWA7XG59XG5mdW5jdGlvbiBub3RCZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGJldHdlZW4gJHtiaW5kSWZQYXJhbShcbiAgICBtaW4sXG4gICAgY29sdW1uXG4gICl9IGFuZCAke2JpbmRJZlBhcmFtKG1heCwgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90TGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIGlsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90SWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWlucyhjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbnMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBAPiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWluZWQoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheUNvbnRhaW5lZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IDxAICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheU92ZXJsYXBzKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlPdmVybGFwcyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59ICYmICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5leHBvcnQge1xuICBhbmQsXG4gIGFycmF5Q29udGFpbmVkLFxuICBhcnJheUNvbnRhaW5zLFxuICBhcnJheU92ZXJsYXBzLFxuICBiZXR3ZWVuLFxuICBiaW5kSWZQYXJhbSxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmRpdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBhc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGFzY2A7XG59XG5mdW5jdGlvbiBkZXNjKGNvbHVtbikge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBkZXNjYDtcbn1cbmV4cG9ydCB7XG4gIGFzYyxcbiAgZGVzY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGdldFRhYmxlVW5pcXVlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wZy1jb3JlL3ByaW1hcnkta2V5cy5qc1wiO1xuaW1wb3J0IHtcbiAgYW5kLFxuICBhc2MsXG4gIGJldHdlZW4sXG4gIGRlc2MsXG4gIGVxLFxuICBleGlzdHMsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbGlrZSxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdCxcbiAgbm90QmV0d2VlbixcbiAgbm90RXhpc3RzLFxuICBub3RJbGlrZSxcbiAgbm90SW5BcnJheSxcbiAgbm90TGlrZSxcbiAgb3Jcbn0gZnJvbSBcIi4vc3FsL2V4cHJlc3Npb25zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmNsYXNzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgcmVsYXRpb25OYW1lKSB7XG4gICAgdGhpcy5zb3VyY2VUYWJsZSA9IHNvdXJjZVRhYmxlO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlID0gcmVmZXJlbmNlZFRhYmxlO1xuICAgIHRoaXMucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25cIjtcbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTtcbiAgZmllbGROYW1lO1xufVxuY2xhc3MgUmVsYXRpb25zIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvbnNcIjtcbn1cbmNsYXNzIE9uZSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnLCBpc051bGxhYmxlKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaXNOdWxsYWJsZSA9IGlzTnVsbGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiT25lXCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgT25lKFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICB0aGlzLmlzTnVsbGFibGVcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmNsYXNzIE1hbnkgZXh0ZW5kcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZz8ucmVsYXRpb25OYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJNYW55XCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgTWFueShcbiAgICAgIHRoaXMuc291cmNlVGFibGUsXG4gICAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgICByZWxhdGlvbi5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYW5kLFxuICAgIGJldHdlZW4sXG4gICAgZXEsXG4gICAgZXhpc3RzLFxuICAgIGd0LFxuICAgIGd0ZSxcbiAgICBpbGlrZSxcbiAgICBpbkFycmF5LFxuICAgIGlzTnVsbCxcbiAgICBpc05vdE51bGwsXG4gICAgbGlrZSxcbiAgICBsdCxcbiAgICBsdGUsXG4gICAgbmUsXG4gICAgbm90LFxuICAgIG5vdEJldHdlZW4sXG4gICAgbm90RXhpc3RzLFxuICAgIG5vdExpa2UsXG4gICAgbm90SWxpa2UsXG4gICAgbm90SW5BcnJheSxcbiAgICBvcixcbiAgICBzcWxcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldE9yZGVyQnlPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgc3FsLFxuICAgIGFzYyxcbiAgICBkZXNjXG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhzY2hlbWEsIGNvbmZpZ0hlbHBlcnMpIHtcbiAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkubGVuZ3RoID09PSAxICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYSAmJiAhaXMoc2NoZW1hW1wiZGVmYXVsdFwiXSwgVGFibGUpKSB7XG4gICAgc2NoZW1hID0gc2NoZW1hW1wiZGVmYXVsdFwiXTtcbiAgfVxuICBjb25zdCB0YWJsZU5hbWVzTWFwID0ge307XG4gIGNvbnN0IHJlbGF0aW9uc0J1ZmZlciA9IHt9O1xuICBjb25zdCB0YWJsZXNDb25maWcgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGlmIChpcyh2YWx1ZSwgVGFibGUpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUpO1xuICAgICAgY29uc3QgYnVmZmVyZWRSZWxhdGlvbnMgPSByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXTtcbiAgICAgIHRhYmxlTmFtZXNNYXBbZGJOYW1lXSA9IGtleTtcbiAgICAgIHRhYmxlc0NvbmZpZ1trZXldID0ge1xuICAgICAgICB0c05hbWU6IGtleSxcbiAgICAgICAgZGJOYW1lOiB2YWx1ZVtUYWJsZS5TeW1ib2wuTmFtZV0sXG4gICAgICAgIHNjaGVtYTogdmFsdWVbVGFibGUuU3ltYm9sLlNjaGVtYV0sXG4gICAgICAgIGNvbHVtbnM6IHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgcmVsYXRpb25zOiBidWZmZXJlZFJlbGF0aW9ucz8ucmVsYXRpb25zID8/IHt9LFxuICAgICAgICBwcmltYXJ5S2V5OiBidWZmZXJlZFJlbGF0aW9ucz8ucHJpbWFyeUtleSA/PyBbXVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgICAgIHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVxuICAgICAgKSkge1xuICAgICAgICBpZiAoY29sdW1uLnByaW1hcnkpIHtcbiAgICAgICAgICB0YWJsZXNDb25maWdba2V5XS5wcmltYXJ5S2V5LnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZXh0cmFDb25maWcgPSB2YWx1ZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXT8uKHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdKTtcbiAgICAgIGlmIChleHRyYUNvbmZpZykge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0VudHJ5IG9mIE9iamVjdC52YWx1ZXMoZXh0cmFDb25maWcpKSB7XG4gICAgICAgICAgaWYgKGlzKGNvbmZpZ0VudHJ5LCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaCguLi5jb25maWdFbnRyeS5jb2x1bW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzKHZhbHVlLCBSZWxhdGlvbnMpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUudGFibGUpO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lc01hcFtkYk5hbWVdO1xuICAgICAgY29uc3QgcmVsYXRpb25zMiA9IHZhbHVlLmNvbmZpZyhcbiAgICAgICAgY29uZmlnSGVscGVycyh2YWx1ZS50YWJsZSlcbiAgICAgICk7XG4gICAgICBsZXQgcHJpbWFyeUtleTtcbiAgICAgIGZvciAoY29uc3QgW3JlbGF0aW9uTmFtZSwgcmVsYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIpKSB7XG4gICAgICAgIGlmICh0YWJsZU5hbWUpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUNvbmZpZyA9IHRhYmxlc0NvbmZpZ1t0YWJsZU5hbWVdO1xuICAgICAgICAgIHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgICAgaWYgKHByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHRhYmxlQ29uZmlnLnByaW1hcnlLZXkucHVzaCguLi5wcmltYXJ5S2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEoZGJOYW1lIGluIHJlbGF0aW9uc0J1ZmZlcikpIHtcbiAgICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdID0ge1xuICAgICAgICAgICAgICByZWxhdGlvbnM6IHt9LFxuICAgICAgICAgICAgICBwcmltYXJ5S2V5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXS5yZWxhdGlvbnNbcmVsYXRpb25OYW1lXSA9IHJlbGF0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHRhYmxlczogdGFibGVzQ29uZmlnLCB0YWJsZU5hbWVzTWFwIH07XG59XG5mdW5jdGlvbiByZWxhdGlvbnModGFibGUsIHJlbGF0aW9uczIpIHtcbiAgcmV0dXJuIG5ldyBSZWxhdGlvbnMoXG4gICAgdGFibGUsXG4gICAgKGhlbHBlcnMpID0+IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIoaGVscGVycykpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUud2l0aEZpZWxkTmFtZShrZXkpXG4gICAgICBdKVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9uZShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25lKHRhYmxlLCBjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IE9uZShcbiAgICAgIHNvdXJjZVRhYmxlLFxuICAgICAgdGFibGUsXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWc/LmZpZWxkcy5yZWR1Y2UoKHJlcywgZikgPT4gcmVzICYmIGYubm90TnVsbCwgdHJ1ZSkgPz8gZmFsc2VcbiAgICApO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTWFueShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWFueShyZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgTWFueShzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcpO1xuICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbikge1xuICBpZiAoaXMocmVsYXRpb24sIE9uZSkgJiYgcmVsYXRpb24uY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkczogcmVsYXRpb24uY29uZmlnLmZpZWxkcyxcbiAgICAgIHJlZmVyZW5jZXM6IHJlbGF0aW9uLmNvbmZpZy5yZWZlcmVuY2VzXG4gICAgfTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VkVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUpXTtcbiAgaWYgKCFyZWZlcmVuY2VkVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3JlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZUNvbmZpZyA9IHNjaGVtYVtyZWZlcmVuY2VkVGFibGVUc05hbWVdO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZUNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYCk7XG4gIH1cbiAgY29uc3Qgc291cmNlVGFibGUgPSByZWxhdGlvbi5zb3VyY2VUYWJsZTtcbiAgY29uc3Qgc291cmNlVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShzb3VyY2VUYWJsZSldO1xuICBpZiAoIXNvdXJjZVRhYmxlVHNOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIFwiJHtzb3VyY2VUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJldmVyc2VSZWxhdGlvbnMgPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkVGFibGVSZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKFxuICAgIHJlZmVyZW5jZWRUYWJsZUNvbmZpZy5yZWxhdGlvbnNcbiAgKSkge1xuICAgIGlmIChyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVsYXRpb24gIT09IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uICYmIHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uLnJlbGF0aW9uTmFtZSA9PT0gcmVsYXRpb24ucmVsYXRpb25OYW1lIHx8ICFyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlID09PSByZWxhdGlvbi5zb3VyY2VUYWJsZSkge1xuICAgICAgcmV2ZXJzZVJlbGF0aW9ucy5wdXNoKHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uKTtcbiAgICB9XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IHJlbGF0aW9uLnJlbGF0aW9uTmFtZSA/IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIHdpdGggbmFtZSBcIiR7cmVsYXRpb24ucmVsYXRpb25OYW1lfVwiIGluIHRhYmxlIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCJgXG4gICAgKSA6IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIGJldHdlZW4gXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBhbmQgXCIke3JlbGF0aW9uLnNvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIi4gUGxlYXNlIHNwZWNpZnkgcmVsYXRpb24gbmFtZWBcbiAgICApO1xuICB9XG4gIGlmIChyZXZlcnNlUmVsYXRpb25zWzBdICYmIGlzKHJldmVyc2VSZWxhdGlvbnNbMF0sIE9uZSkgJiYgcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5yZWZlcmVuY2VzLFxuICAgICAgcmVmZXJlbmNlczogcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcuZmllbGRzXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5mZXIgcmVsYXRpb24gXCIke3NvdXJjZVRhYmxlVHNOYW1lfS4ke3JlbGF0aW9uLmZpZWxkTmFtZX1cImBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyhzb3VyY2VUYWJsZSkge1xuICByZXR1cm4ge1xuICAgIG9uZTogY3JlYXRlT25lKHNvdXJjZVRhYmxlKSxcbiAgICBtYW55OiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKVxuICB9O1xufVxuZnVuY3Rpb24gbWFwUmVsYXRpb25hbFJvdyh0YWJsZXNDb25maWcsIHRhYmxlQ29uZmlnLCByb3csIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlID0gKHZhbHVlKSA9PiB2YWx1ZSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBbXG4gICAgc2VsZWN0aW9uSXRlbUluZGV4LFxuICAgIHNlbGVjdGlvbkl0ZW1cbiAgXSBvZiBidWlsZFF1ZXJ5UmVzdWx0U2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgIGlmIChzZWxlY3Rpb25JdGVtLmlzSnNvbikge1xuICAgICAgY29uc3QgcmVsYXRpb24gPSB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbc2VsZWN0aW9uSXRlbS50c0tleV07XG4gICAgICBjb25zdCByYXdTdWJSb3dzID0gcm93W3NlbGVjdGlvbkl0ZW1JbmRleF07XG4gICAgICBjb25zdCBzdWJSb3dzID0gdHlwZW9mIHJhd1N1YlJvd3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHJhd1N1YlJvd3MpIDogcmF3U3ViUm93cztcbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IGlzKHJlbGF0aW9uLCBPbmUpID8gc3ViUm93cyAmJiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICB0YWJsZXNDb25maWcsXG4gICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgIHN1YlJvd3MsXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgKSA6IHN1YlJvd3MubWFwKFxuICAgICAgICAoc3ViUm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgICB0YWJsZXNDb25maWdbc2VsZWN0aW9uSXRlbS5yZWxhdGlvblRhYmxlVHNLZXldLFxuICAgICAgICAgIHN1YlJvdyxcbiAgICAgICAgICBzZWxlY3Rpb25JdGVtLnNlbGVjdGlvbixcbiAgICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG1hcENvbHVtblZhbHVlKHJvd1tzZWxlY3Rpb25JdGVtSW5kZXhdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2VsZWN0aW9uSXRlbS5maWVsZDtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICByZXN1bHRbc2VsZWN0aW9uSXRlbS50c0tleV0gPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQge1xuICBNYW55LFxuICBPbmUsXG4gIFJlbGF0aW9uLFxuICBSZWxhdGlvbnMsXG4gIGNyZWF0ZU1hbnksXG4gIGNyZWF0ZU9uZSxcbiAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzLFxuICBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyxcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBtYXBSZWxhdGlvbmFsUm93LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgcmVsYXRpb25zXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsYXRpb25zLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgU1FMaXRlVmlld0Jhc2UgZXh0ZW5kcyBWaWV3IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVmlld0Jhc2VcIjtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVZpZXdCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlldy1iYXNlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgYWxpYXNlZFRhYmxlLCBhbGlhc2VkVGFibGVDb2x1bW4sIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLCBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzIH0gZnJvbSBcIi4uL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDYXNpbmdDYWNoZSB9IGZyb20gXCIuLi9jYXNpbmcuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBNYW55LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgT25lXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IGFuZCwgZXEgfSBmcm9tIFwiLi4vc3FsL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1ucy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGlhbGVjdFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNhc2luZztcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jYXNpbmcgPSBuZXcgQ2FzaW5nQ2FjaGUoY29uZmlnPy5jYXNpbmcpO1xuICB9XG4gIGVzY2FwZU5hbWUobmFtZSkge1xuICAgIHJldHVybiBgXCIke25hbWV9XCJgO1xuICB9XG4gIGVzY2FwZVBhcmFtKF9udW0pIHtcbiAgICByZXR1cm4gXCI/XCI7XG4gIH1cbiAgZXNjYXBlU3RyaW5nKHN0cikge1xuICAgIHJldHVybiBgJyR7c3RyLnJlcGxhY2UoLycvZywgXCInJ1wiKX0nYDtcbiAgfVxuICBidWlsZFdpdGhDVEUocXVlcmllcykge1xuICAgIGlmICghcXVlcmllcz8ubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuICAgIGNvbnN0IHdpdGhTcWxDaHVua3MgPSBbc3FsYHdpdGggYF07XG4gICAgZm9yIChjb25zdCBbaSwgd10gb2YgcXVlcmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgJHtzcWwuaWRlbnRpZmllcih3Ll8uYWxpYXMpfSBhcyAoJHt3Ll8uc3FsfSlgKTtcbiAgICAgIGlmIChpIDwgcXVlcmllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAgYCk7XG4gICAgcmV0dXJuIHNxbC5qb2luKHdpdGhTcWxDaHVua3MpO1xuICB9XG4gIGJ1aWxkRGVsZXRlUXVlcnkoeyB0YWJsZSwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGxpbWl0LCBvcmRlckJ5IH0pIHtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWRlbGV0ZSBmcm9tICR7dGFibGV9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIGJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChjb2xOYW1lKSA9PiBzZXRbY29sTmFtZV0gIT09IHZvaWQgMCB8fCB0YWJsZUNvbHVtbnNbY29sTmFtZV0/Lm9uVXBkYXRlRm4gIT09IHZvaWQgMFxuICAgICk7XG4gICAgY29uc3Qgc2V0U2l6ZSA9IGNvbHVtbk5hbWVzLmxlbmd0aDtcbiAgICByZXR1cm4gc3FsLmpvaW4oY29sdW1uTmFtZXMuZmxhdE1hcCgoY29sTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgY29sID0gdGFibGVDb2x1bW5zW2NvbE5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPSBzZXRbY29sTmFtZV0gPz8gc3FsLnBhcmFtKGNvbC5vblVwZGF0ZUZuKCksIGNvbCk7XG4gICAgICBjb25zdCByZXMgPSBzcWxgJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sKSl9ID0gJHt2YWx1ZX1gO1xuICAgICAgaWYgKGkgPCBzZXRTaXplIC0gMSkge1xuICAgICAgICByZXR1cm4gW3Jlcywgc3FsLnJhdyhcIiwgXCIpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbcmVzXTtcbiAgICB9KSk7XG4gIH1cbiAgYnVpbGRVcGRhdGVRdWVyeSh7IHRhYmxlLCBzZXQsIHdoZXJlLCByZXR1cm5pbmcsIHdpdGhMaXN0LCBqb2lucywgZnJvbSwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5idWlsZFVwZGF0ZVNldCh0YWJsZSwgc2V0KTtcbiAgICBjb25zdCBmcm9tU3FsID0gZnJvbSAmJiBzcWwuam9pbihbc3FsLnJhdyhcIiBmcm9tIFwiKSwgdGhpcy5idWlsZEZyb21UYWJsZShmcm9tKV0pO1xuICAgIGNvbnN0IGpvaW5zU3FsID0gdGhpcy5idWlsZEpvaW5zKGpvaW5zKTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH11cGRhdGUgJHt0YWJsZX0gc2V0ICR7c2V0U3FsfSR7ZnJvbVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtyZXR1cm5pbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9YDtcbiAgfVxuICAvKipcbiAgICogQnVpbGRzIHNlbGVjdGlvbiBTUUwgd2l0aCBwcm92aWRlZCBmaWVsZHMvZXhwcmVzc2lvbnNcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqIGBzZWxlY3QgPHNlbGVjdGlvbj4gZnJvbWBcbiAgICpcbiAgICogYGluc2VydCAuLi4gcmV0dXJuaW5nIDxzZWxlY3Rpb24+YFxuICAgKlxuICAgKiBJZiBgaXNTaW5nbGVUYWJsZWAgaXMgdHJ1ZSwgdGhlbiBjb2x1bW5zIHdvbid0IGJlIHByZWZpeGVkIHdpdGggdGFibGUgbmFtZVxuICAgKi9cbiAgYnVpbGRTZWxlY3Rpb24oZmllbGRzLCB7IGlzU2luZ2xlVGFibGUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICBjb25zdCBjb2x1bW5zTGVuID0gZmllbGRzLmxlbmd0aDtcbiAgICBjb25zdCBjaHVua3MgPSBmaWVsZHMuZmxhdE1hcCgoeyBmaWVsZCB9LCBpKSA9PiB7XG4gICAgICBjb25zdCBjaHVuayA9IFtdO1xuICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgJiYgZmllbGQuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICBjaHVuay5wdXNoKHNxbC5pZGVudGlmaWVyKGZpZWxkLmZpZWxkQWxpYXMpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSB8fCBpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgPyBmaWVsZC5zcWwgOiBmaWVsZDtcbiAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgbmV3IFNRTChcbiAgICAgICAgICAgICAgcXVlcnkucXVlcnlDaHVua3MubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGMsIENvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNodW5rLnB1c2gocXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICAgICAgY2h1bmsucHVzaChzcWxgIGFzICR7c3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmllbGQudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICBpZiAoZmllbGQuY29sdW1uVHlwZSA9PT0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCIpIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfSBhcyB0ZXh0KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgICBzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGNvbHVtbnNMZW4gLSAxKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsYCwgYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNxbC5qb2luKGNodW5rcyk7XG4gIH1cbiAgYnVpbGRKb2lucyhqb2lucykge1xuICAgIGlmICgham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCBqb2luc0FycmF5ID0gW107XG4gICAgaWYgKGpvaW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgam9pbk1ldGFdIG9mIGpvaW5zLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IGpvaW5NZXRhLnRhYmxlO1xuICAgICAgICBjb25zdCBvblNxbCA9IGpvaW5NZXRhLm9uID8gc3FsYCBvbiAke2pvaW5NZXRhLm9ufWAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChpcyh0YWJsZSwgU1FMaXRlVGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICAgIGNvbnN0IHRhYmxlU2NoZW1hID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgICAgY29uc3Qgb3JpZ1RhYmxlTmFtZSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGFibGVOYW1lID09PSBvcmlnVGFibGVOYW1lID8gdm9pZCAwIDogam9pbk1ldGEuYWxpYXM7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZVNjaGVtYSA/IHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlU2NoZW1hKX0uYCA6IHZvaWQgMH0ke3NxbC5pZGVudGlmaWVyKG9yaWdUYWJsZU5hbWUpfSR7YWxpYXMgJiYgc3FsYCAke3NxbC5pZGVudGlmaWVyKGFsaWFzKX1gfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZX0ke29uU3FsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IGpvaW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3FsLmpvaW4oam9pbnNBcnJheSk7XG4gIH1cbiAgYnVpbGRMaW1pdChsaW1pdCkge1xuICAgIHJldHVybiB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZE9yZGVyQnkob3JkZXJCeSkge1xuICAgIGNvbnN0IG9yZGVyQnlMaXN0ID0gW107XG4gICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBvcmRlckJ5VmFsdWVdIG9mIG9yZGVyQnkuZW50cmllcygpKSB7XG4gICAgICAgIG9yZGVyQnlMaXN0LnB1c2gob3JkZXJCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgb3JkZXJCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3JkZXJCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JkZXJCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZEZyb21UYWJsZSh0YWJsZSkge1xuICAgIGlmIChpcyh0YWJsZSwgVGFibGUpICYmIHRhYmxlW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSkge1xuICAgICAgcmV0dXJuIHNxbGAke3NxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwiXCIpfS5gLmlmKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdKX0ke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdKX0gJHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pfWA7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZTtcbiAgfVxuICBidWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICB3aXRoTGlzdCxcbiAgICBmaWVsZHMsXG4gICAgZmllbGRzRmxhdCxcbiAgICB3aGVyZSxcbiAgICBoYXZpbmcsXG4gICAgdGFibGUsXG4gICAgam9pbnMsXG4gICAgb3JkZXJCeSxcbiAgICBncm91cEJ5LFxuICAgIGxpbWl0LFxuICAgIG9mZnNldCxcbiAgICBkaXN0aW5jdCxcbiAgICBzZXRPcGVyYXRvcnNcbiAgfSkge1xuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBmaWVsZHNGbGF0ID8/IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzTGlzdCkge1xuICAgICAgaWYgKGlzKGYuZmllbGQsIENvbHVtbikgJiYgZ2V0VGFibGVOYW1lKGYuZmllbGQudGFibGUpICE9PSAoaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgU1FMaXRlVmlld0Jhc2UpID8gdGFibGVbVmlld0Jhc2VDb25maWddLm5hbWUgOiBpcyh0YWJsZSwgU1FMKSA/IHZvaWQgMCA6IGdldFRhYmxlTmFtZSh0YWJsZSkpICYmICEoKHRhYmxlMikgPT4gam9pbnM/LnNvbWUoXG4gICAgICAgICh7IGFsaWFzIH0pID0+IGFsaWFzID09PSAodGFibGUyW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSA/IGdldFRhYmxlTmFtZSh0YWJsZTIpIDogdGFibGUyW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV0pXG4gICAgICApKShmLmZpZWxkLnRhYmxlKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91ciBcIiR7Zi5wYXRoLmpvaW4oXCItPlwiKX1cIiBmaWVsZCByZWZlcmVuY2VzIGEgY29sdW1uIFwiJHt0YWJsZU5hbWV9XCIuXCIke2YuZmllbGQubmFtZX1cIiwgYnV0IHRoZSB0YWJsZSBcIiR7dGFibGVOYW1lfVwiIGlzIG5vdCBwYXJ0IG9mIHRoZSBxdWVyeSEgRGlkIHlvdSBmb3JnZXQgdG8gam9pbiBpdD9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzU2luZ2xlVGFibGUgPSAham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgZGlzdGluY3RTcWwgPSBkaXN0aW5jdCA/IHNxbGAgZGlzdGluY3RgIDogdm9pZCAwO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuYnVpbGRTZWxlY3Rpb24oZmllbGRzTGlzdCwgeyBpc1NpbmdsZVRhYmxlIH0pO1xuICAgIGNvbnN0IHRhYmxlU3FsID0gdGhpcy5idWlsZEZyb21UYWJsZSh0YWJsZSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBoYXZpbmdTcWwgPSBoYXZpbmcgPyBzcWxgIGhhdmluZyAke2hhdmluZ31gIDogdm9pZCAwO1xuICAgIGNvbnN0IGdyb3VwQnlMaXN0ID0gW107XG4gICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBncm91cEJ5VmFsdWVdIG9mIGdyb3VwQnkuZW50cmllcygpKSB7XG4gICAgICAgIGdyb3VwQnlMaXN0LnB1c2goZ3JvdXBCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgZ3JvdXBCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBncm91cEJ5U3FsID0gZ3JvdXBCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgZ3JvdXAgYnkgJHtzcWwuam9pbihncm91cEJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZmluYWxRdWVyeSA9IHNxbGAke3dpdGhTcWx9c2VsZWN0JHtkaXN0aW5jdFNxbH0gJHtzZWxlY3Rpb259IGZyb20gJHt0YWJsZVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtncm91cEJ5U3FsfSR7aGF2aW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gICAgaWYgKHNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoZmluYWxRdWVyeSwgc2V0T3BlcmF0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmFsUXVlcnk7XG4gIH1cbiAgYnVpbGRTZXRPcGVyYXRpb25zKGxlZnRTZWxlY3QsIHNldE9wZXJhdG9ycykge1xuICAgIGNvbnN0IFtzZXRPcGVyYXRvciwgLi4ucmVzdF0gPSBzZXRPcGVyYXRvcnM7XG4gICAgaWYgKCFzZXRPcGVyYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBhc3MgdW5kZWZpbmVkIHZhbHVlcyB0byBhbnkgc2V0IG9wZXJhdG9yXCIpO1xuICAgIH1cbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25zKFxuICAgICAgdGhpcy5idWlsZFNldE9wZXJhdGlvblF1ZXJ5KHsgbGVmdFNlbGVjdCwgc2V0T3BlcmF0b3IgfSksXG4gICAgICByZXN0XG4gICAgKTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvblF1ZXJ5KHtcbiAgICBsZWZ0U2VsZWN0LFxuICAgIHNldE9wZXJhdG9yOiB7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCwgbGltaXQsIG9yZGVyQnksIG9mZnNldCB9XG4gIH0pIHtcbiAgICBjb25zdCBsZWZ0Q2h1bmsgPSBzcWxgJHtsZWZ0U2VsZWN0LmdldFNRTCgpfSBgO1xuICAgIGNvbnN0IHJpZ2h0Q2h1bmsgPSBzcWxgJHtyaWdodFNlbGVjdC5nZXRTUUwoKX1gO1xuICAgIGxldCBvcmRlckJ5U3FsO1xuICAgIGlmIChvcmRlckJ5ICYmIG9yZGVyQnkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3JkZXJCeVZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzaW5nbGVPcmRlckJ5IG9mIG9yZGVyQnkpIHtcbiAgICAgICAgaWYgKGlzKHNpbmdsZU9yZGVyQnksIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsLmlkZW50aWZpZXIoc2luZ2xlT3JkZXJCeS5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMKSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzW2ldO1xuICAgICAgICAgICAgaWYgKGlzKGNodW5rLCBTUUxpdGVDb2x1bW4pKSB7XG4gICAgICAgICAgICAgIHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV0gPSBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9yZGVyQnlTcWwgPSBzcWxgIG9yZGVyIGJ5ICR7c3FsLmpvaW4ob3JkZXJCeVZhbHVlcywgc3FsYCwgYCl9YDtcbiAgICB9XG4gICAgY29uc3QgbGltaXRTcWwgPSB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcGVyYXRvckNodW5rID0gc3FsLnJhdyhgJHt0eXBlfSAke2lzQWxsID8gXCJhbGwgXCIgOiBcIlwifWApO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHNxbGAke2xlZnRDaHVua30ke29wZXJhdG9yQ2h1bmt9JHtyaWdodENodW5rfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gIH1cbiAgYnVpbGRJbnNlcnRRdWVyeSh7IHRhYmxlLCB2YWx1ZXM6IHZhbHVlc09yU2VsZWN0LCBvbkNvbmZsaWN0LCByZXR1cm5pbmcsIHdpdGhMaXN0LCBzZWxlY3QgfSkge1xuICAgIGNvbnN0IHZhbHVlc1NxbExpc3QgPSBbXTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbEVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb2x1bW5zKS5maWx0ZXIoXG4gICAgICAoW18sIGNvbF0pID0+ICFjb2wuc2hvdWxkRGlzYWJsZUluc2VydCgpXG4gICAgKTtcbiAgICBjb25zdCBpbnNlcnRPcmRlciA9IGNvbEVudHJpZXMubWFwKChbLCBjb2x1bW5dKSA9PiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sdW1uKSkpO1xuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdDIgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIGlmIChpcyhzZWxlY3QyLCBTUUwpKSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyLmdldFNRTCgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzT3JTZWxlY3Q7XG4gICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc3FsLnJhdyhcInZhbHVlcyBcIikpO1xuICAgICAgZm9yIChjb25zdCBbdmFsdWVJbmRleCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVMaXN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgY29sXSBvZiBjb2xFbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgY29sVmFsdWUgPSB2YWx1ZVtmaWVsZE5hbWVdO1xuICAgICAgICAgIGlmIChjb2xWYWx1ZSA9PT0gdm9pZCAwIHx8IGlzKGNvbFZhbHVlLCBQYXJhbSkgJiYgY29sVmFsdWUudmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjb2wuZGVmYXVsdCAhPT0gbnVsbCAmJiBjb2wuZGVmYXVsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGNvbC5kZWZhdWx0LCBTUUwpID8gY29sLmRlZmF1bHQgOiBzcWwucGFyYW0oY29sLmRlZmF1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0Rm4gIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm5SZXN1bHQgPSBjb2wuZGVmYXVsdEZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGRlZmF1bHRGblJlc3VsdCwgU1FMKSA/IGRlZmF1bHRGblJlc3VsdCA6IHNxbC5wYXJhbShkZWZhdWx0Rm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2wuZGVmYXVsdCAmJiBjb2wub25VcGRhdGVGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9uVXBkYXRlRm5SZXN1bHQgPSBjb2wub25VcGRhdGVGbigpO1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhvblVwZGF0ZUZuUmVzdWx0LCBTUUwpID8gb25VcGRhdGVGblJlc3VsdCA6IHNxbC5wYXJhbShvblVwZGF0ZUZuUmVzdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gc3FsYG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goY29sVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2godmFsdWVMaXN0KTtcbiAgICAgICAgaWYgKHZhbHVlSW5kZXggPCB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHZhbHVlc1NxbCA9IHNxbC5qb2luKHZhbHVlc1NxbExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9uQ29uZmxpY3RTcWwgPSBvbkNvbmZsaWN0Py5sZW5ndGggPyBzcWwuam9pbihvbkNvbmZsaWN0KSA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH1pbnNlcnQgaW50byAke3RhYmxlfSAke2luc2VydE9yZGVyfSAke3ZhbHVlc1NxbH0ke29uQ29uZmxpY3RTcWx9JHtyZXR1cm5pbmdTcWx9YDtcbiAgfVxuICBzcWxUb1F1ZXJ5KHNxbDIsIGludm9rZVNvdXJjZSkge1xuICAgIHJldHVybiBzcWwyLnRvUXVlcnkoe1xuICAgICAgY2FzaW5nOiB0aGlzLmNhc2luZyxcbiAgICAgIGVzY2FwZU5hbWU6IHRoaXMuZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtOiB0aGlzLmVzY2FwZVBhcmFtLFxuICAgICAgZXNjYXBlU3RyaW5nOiB0aGlzLmVzY2FwZVN0cmluZyxcbiAgICAgIGludm9rZVNvdXJjZVxuICAgIH0pO1xuICB9XG4gIGJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICBmdWxsU2NoZW1hLFxuICAgIHNjaGVtYSxcbiAgICB0YWJsZU5hbWVzTWFwLFxuICAgIHRhYmxlLFxuICAgIHRhYmxlQ29uZmlnLFxuICAgIHF1ZXJ5Q29uZmlnOiBjb25maWcsXG4gICAgdGFibGVBbGlhcyxcbiAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uLFxuICAgIGpvaW5PblxuICB9KSB7XG4gICAgbGV0IHNlbGVjdGlvbiA9IFtdO1xuICAgIGxldCBsaW1pdCwgb2Zmc2V0LCBvcmRlckJ5ID0gW10sIHdoZXJlO1xuICAgIGNvbnN0IGpvaW5zID0gW107XG4gICAgaWYgKGNvbmZpZyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uRW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgZGJLZXk6IHZhbHVlLm5hbWUsXG4gICAgICAgIHRzS2V5OiBrZXksXG4gICAgICAgIGZpZWxkOiBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpLFxuICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0aW9uOiBbXVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbGlhc2VkQ29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyldKVxuICAgICAgKTtcbiAgICAgIGlmIChjb25maWcud2hlcmUpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVTcWwgPSB0eXBlb2YgY29uZmlnLndoZXJlID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcud2hlcmUoYWxpYXNlZENvbHVtbnMsIGdldE9wZXJhdG9ycygpKSA6IGNvbmZpZy53aGVyZTtcbiAgICAgICAgd2hlcmUgPSB3aGVyZVNxbCAmJiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHdoZXJlU3FsLCB0YWJsZUFsaWFzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkc1NlbGVjdGlvbiA9IFtdO1xuICAgICAgbGV0IHNlbGVjdGVkQ29sdW1ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgIGxldCBpc0luY2x1ZGVNb2RlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbHVtbnMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQgaW4gdGFibGVDb25maWcuY29sdW1ucykge1xuICAgICAgICAgICAgaWYgKCFpc0luY2x1ZGVNb2RlICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlzSW5jbHVkZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLnB1c2goZmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBpc0luY2x1ZGVNb2RlID8gc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcigoYykgPT4gY29uZmlnLmNvbHVtbnM/LltjXSA9PT0gdHJ1ZSkgOiBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5maWx0ZXIoKGtleSkgPT4gIXNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRDb2x1bW5zID0gT2JqZWN0LmtleXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlbGVjdGVkQ29sdW1ucykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0YWJsZUNvbmZpZy5jb2x1bW5zW2ZpZWxkXTtcbiAgICAgICAgZmllbGRzU2VsZWN0aW9uLnB1c2goeyB0c0tleTogZmllbGQsIHZhbHVlOiBjb2x1bW4gfSk7XG4gICAgICB9XG4gICAgICBsZXQgc2VsZWN0ZWRSZWxhdGlvbnMgPSBbXTtcbiAgICAgIGlmIChjb25maWcud2l0aCkge1xuICAgICAgICBzZWxlY3RlZFJlbGF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKGNvbmZpZy53aXRoKS5maWx0ZXIoKGVudHJ5KSA9PiAhIWVudHJ5WzFdKS5tYXAoKFt0c0tleSwgcXVlcnlDb25maWddKSA9PiAoeyB0c0tleSwgcXVlcnlDb25maWcsIHJlbGF0aW9uOiB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbdHNLZXldIH0pKTtcbiAgICAgIH1cbiAgICAgIGxldCBleHRyYXM7XG4gICAgICBpZiAoY29uZmlnLmV4dHJhcykge1xuICAgICAgICBleHRyYXMgPSB0eXBlb2YgY29uZmlnLmV4dHJhcyA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLmV4dHJhcyhhbGlhc2VkQ29sdW1ucywgeyBzcWwgfSkgOiBjb25maWcuZXh0cmFzO1xuICAgICAgICBmb3IgKGNvbnN0IFt0c0tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dHJhcykpIHtcbiAgICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgICB0c0tleSxcbiAgICAgICAgICAgIHZhbHVlOiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyh2YWx1ZSwgdGFibGVBbGlhcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7IHRzS2V5LCB2YWx1ZSB9IG9mIGZpZWxkc1NlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgZGJLZXk6IGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkgPyB2YWx1ZS5maWVsZEFsaWFzIDogdGFibGVDb25maWcuY29sdW1uc1t0c0tleV0ubmFtZSxcbiAgICAgICAgICB0c0tleSxcbiAgICAgICAgICBmaWVsZDogaXModmFsdWUsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpIDogdmFsdWUsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB2b2lkIDAsXG4gICAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGV0IG9yZGVyQnlPcmlnID0gdHlwZW9mIGNvbmZpZy5vcmRlckJ5ID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcub3JkZXJCeShhbGlhc2VkQ29sdW1ucywgZ2V0T3JkZXJCeU9wZXJhdG9ycygpKSA6IGNvbmZpZy5vcmRlckJ5ID8/IFtdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyQnlPcmlnKSkge1xuICAgICAgICBvcmRlckJ5T3JpZyA9IFtvcmRlckJ5T3JpZ107XG4gICAgICB9XG4gICAgICBvcmRlckJ5ID0gb3JkZXJCeU9yaWcubWFwKChvcmRlckJ5VmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzKG9yZGVyQnlWYWx1ZSwgQ29sdW1uKSkge1xuICAgICAgICAgIHJldHVybiBhbGlhc2VkVGFibGVDb2x1bW4ob3JkZXJCeVZhbHVlLCB0YWJsZUFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgfSk7XG4gICAgICBsaW1pdCA9IGNvbmZpZy5saW1pdDtcbiAgICAgIG9mZnNldCA9IGNvbmZpZy5vZmZzZXQ7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgcXVlcnlDb25maWc6IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSxcbiAgICAgICAgcmVsYXRpb25cbiAgICAgIH0gb2Ygc2VsZWN0ZWRSZWxhdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aW9uID0gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW3JlbGF0aW9uVGFibGVOYW1lXTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZUFsaWFzID0gYCR7dGFibGVBbGlhc31fJHtzZWxlY3RlZFJlbGF0aW9uVHNLZXl9YDtcbiAgICAgICAgY29uc3Qgam9pbk9uMiA9IGFuZChcbiAgICAgICAgICAuLi5ub3JtYWxpemVkUmVsYXRpb24uZmllbGRzLm1hcChcbiAgICAgICAgICAgIChmaWVsZDIsIGkpID0+IGVxKFxuICAgICAgICAgICAgICBhbGlhc2VkVGFibGVDb2x1bW4obm9ybWFsaXplZFJlbGF0aW9uLnJlZmVyZW5jZXNbaV0sIHJlbGF0aW9uVGFibGVBbGlhcyksXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZDIsIHRhYmxlQWxpYXMpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBidWlsdFJlbGF0aW9uID0gdGhpcy5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICAgICAgZnVsbFNjaGVtYSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgdGFibGVOYW1lc01hcCxcbiAgICAgICAgICB0YWJsZTogZnVsbFNjaGVtYVtyZWxhdGlvblRhYmxlVHNOYW1lXSxcbiAgICAgICAgICB0YWJsZUNvbmZpZzogc2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHF1ZXJ5Q29uZmlnOiBpcyhyZWxhdGlvbiwgT25lKSA/IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSA9PT0gdHJ1ZSA/IHsgbGltaXQ6IDEgfSA6IHsgLi4uc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLCBsaW1pdDogMSB9IDogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICAgIHRhYmxlQWxpYXM6IHJlbGF0aW9uVGFibGVBbGlhcyxcbiAgICAgICAgICBqb2luT246IGpvaW5PbjIsXG4gICAgICAgICAgbmVzdGVkUXVlcnlSZWxhdGlvbjogcmVsYXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3FsYCgke2J1aWx0UmVsYXRpb24uc3FsfSlgLmFzKHNlbGVjdGVkUmVsYXRpb25Uc0tleSk7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICAgIHRzS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiByZWxhdGlvblRhYmxlVHNOYW1lLFxuICAgICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IGJ1aWx0UmVsYXRpb24uc2VsZWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IGBObyBmaWVsZHMgc2VsZWN0ZWQgZm9yIHRhYmxlIFwiJHt0YWJsZUNvbmZpZy50c05hbWV9XCIgKFwiJHt0YWJsZUFsaWFzfVwiKS4gWW91IG5lZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbSBpbiBcImNvbHVtbnNcIiwgXCJ3aXRoXCIgb3IgXCJleHRyYXNcIi4gSWYgeW91IG5lZWQgdG8gc2VsZWN0IGFsbCBjb2x1bW5zLCBvbWl0IHRoZSBcImNvbHVtbnNcIiBrZXkgb3Igc2V0IGl0IHRvIHVuZGVmaW5lZC5gXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDtcbiAgICB3aGVyZSA9IGFuZChqb2luT24sIHdoZXJlKTtcbiAgICBpZiAobmVzdGVkUXVlcnlSZWxhdGlvbikge1xuICAgICAgbGV0IGZpZWxkID0gc3FsYGpzb25fYXJyYXkoJHtzcWwuam9pbihcbiAgICAgICAgc2VsZWN0aW9uLm1hcChcbiAgICAgICAgICAoeyBmaWVsZDogZmllbGQyIH0pID0+IGlzKGZpZWxkMiwgU1FMaXRlQ29sdW1uKSA/IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZDIpKSA6IGlzKGZpZWxkMiwgU1FMLkFsaWFzZWQpID8gZmllbGQyLnNxbCA6IGZpZWxkMlxuICAgICAgICApLFxuICAgICAgICBzcWxgLCBgXG4gICAgICApfSlgO1xuICAgICAgaWYgKGlzKG5lc3RlZFF1ZXJ5UmVsYXRpb24sIE1hbnkpKSB7XG4gICAgICAgIGZpZWxkID0gc3FsYGNvYWxlc2NlKGpzb25fZ3JvdXBfYXJyYXkoJHtmaWVsZH0pLCBqc29uX2FycmF5KCkpYDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZFNlbGVjdGlvbiA9IFt7XG4gICAgICAgIGRiS2V5OiBcImRhdGFcIixcbiAgICAgICAgdHNLZXk6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZDogZmllbGQuYXMoXCJkYXRhXCIpLFxuICAgICAgICBpc0pzb246IHRydWUsXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdGFibGVDb25maWcudHNOYW1lLFxuICAgICAgICBzZWxlY3Rpb25cbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmVlZHNTdWJxdWVyeSA9IGxpbWl0ICE9PSB2b2lkIDAgfHwgb2Zmc2V0ICE9PSB2b2lkIDAgfHwgb3JkZXJCeS5sZW5ndGggPiAwO1xuICAgICAgaWYgKG5lZWRzU3VicXVlcnkpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICAgIGZpZWxkc0ZsYXQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgIGZpZWxkOiBzcWwucmF3KFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIG9yZGVyQnksXG4gICAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgd2hlcmUgPSB2b2lkIDA7XG4gICAgICAgIGxpbWl0ID0gdm9pZCAwO1xuICAgICAgICBvZmZzZXQgPSB2b2lkIDA7XG4gICAgICAgIG9yZGVyQnkgPSB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgdGFibGU6IGlzKHJlc3VsdCwgU1FMaXRlVGFibGUpID8gcmVzdWx0IDogbmV3IFN1YnF1ZXJ5KHJlc3VsdCwge30sIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBuZXN0ZWRTZWxlY3Rpb24ubWFwKCh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gKHtcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICBmaWVsZDogaXMoZmllbGQyLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcykgOiBmaWVsZDJcbiAgICAgICAgfSkpLFxuICAgICAgICBqb2lucyxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9yZGVyQnksXG4gICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgZmllbGRzRmxhdDogc2VsZWN0aW9uLm1hcCgoeyBmaWVsZCB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZCwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZCwgdGFibGVBbGlhcykgOiBmaWVsZFxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICBzcWw6IHJlc3VsdCxcbiAgICAgIHNlbGVjdGlvblxuICAgIH07XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNEaWFsZWN0IGV4dGVuZHMgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVN5bmNEaWFsZWN0XCI7XG4gIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIHNlc3Npb24ucnVuKHNxbGBCRUdJTmApO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBzZXNzaW9uLnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbi5ydW4oXG4gICAgICAgICAgICBzcWxgSU5TRVJUIElOVE8gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXCJoYXNoXCIsIFwiY3JlYXRlZF9hdFwiKSBWQUxVRVMoJHttaWdyYXRpb24uaGFzaH0sICR7bWlncmF0aW9uLmZvbGRlck1pbGxpc30pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNlc3Npb24ucnVuKHNxbGBDT01NSVRgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXNzaW9uLnJ1bihzcWxgUk9MTEJBQ0tgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVBc3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNEaWFsZWN0XCI7XG4gIGFzeW5jIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgYXdhaXQgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IGF3YWl0IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIGF3YWl0IHNlc3Npb24udHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBhd2FpdCB0eC5ydW4oc3FsLnJhdyhzdG10KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHR4LnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVBc3luY0RpYWxlY3QsXG4gIFNRTGl0ZURpYWxlY3QsXG4gIFNRTGl0ZVN5bmNEaWFsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlhbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlR5cGVkUXVlcnlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuXy5zZWxlY3RlZEZpZWxkcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgVHlwZWRRdWVyeUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1idWlsZGVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUeXBlZFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuLi8uLi9xdWVyeS1idWlsZGVycy9xdWVyeS1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBWaWV3IH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgYXBwbHlNaXhpbnMsXG4gIGdldFRhYmxlQ29sdW1ucyxcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgaGF2ZVNhbWVLZXlzLFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlU2VsZWN0QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdEJ1aWxkZXJcIjtcbiAgZmllbGRzO1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICB3aXRoTGlzdDtcbiAgZGlzdGluY3Q7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuZmllbGRzID0gY29uZmlnLmZpZWxkcztcbiAgICB0aGlzLnNlc3Npb24gPSBjb25maWcuc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBjb25maWcuZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gY29uZmlnLndpdGhMaXN0O1xuICAgIHRoaXMuZGlzdGluY3QgPSBjb25maWcuZGlzdGluY3Q7XG4gIH1cbiAgZnJvbShzb3VyY2UpIHtcbiAgICBjb25zdCBpc1BhcnRpYWxTZWxlY3QgPSAhIXRoaXMuZmllbGRzO1xuICAgIGxldCBmaWVsZHM7XG4gICAgaWYgKHRoaXMuZmllbGRzKSB7XG4gICAgICBmaWVsZHMgPSB0aGlzLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU3VicXVlcnkpKSB7XG4gICAgICBmaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZS5fLnNlbGVjdGVkRmllbGRzKS5tYXAoKGtleSkgPT4gW2tleSwgc291cmNlW2tleV1dKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU1FMaXRlVmlld0Jhc2UpKSB7XG4gICAgICBmaWVsZHMgPSBzb3VyY2VbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUwpKSB7XG4gICAgICBmaWVsZHMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRzID0gZ2V0VGFibGVDb2x1bW5zKHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QmFzZSh7XG4gICAgICB0YWJsZTogc291cmNlLFxuICAgICAgZmllbGRzLFxuICAgICAgaXNQYXJ0aWFsU2VsZWN0LFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgd2l0aExpc3Q6IHRoaXMud2l0aExpc3QsXG4gICAgICBkaXN0aW5jdDogdGhpcy5kaXN0aW5jdFxuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIGV4dGVuZHMgVHlwZWRRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJcIjtcbiAgXztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIHRhYmxlTmFtZTtcbiAgaXNQYXJ0aWFsU2VsZWN0O1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICBjYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgdXNlZFRhYmxlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHsgdGFibGUsIGZpZWxkcywgaXNQYXJ0aWFsU2VsZWN0LCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgZGlzdGluY3QgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB3aXRoTGlzdCxcbiAgICAgIHRhYmxlLFxuICAgICAgZmllbGRzOiB7IC4uLmZpZWxkcyB9LFxuICAgICAgZGlzdGluY3QsXG4gICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgfTtcbiAgICB0aGlzLmlzUGFydGlhbFNlbGVjdCA9IGlzUGFydGlhbFNlbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5fID0ge1xuICAgICAgc2VsZWN0ZWRGaWVsZHM6IGZpZWxkcyxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICB9O1xuICAgIHRoaXMudGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gdHlwZW9mIHRoaXMudGFibGVOYW1lID09PSBcInN0cmluZ1wiID8geyBbdGhpcy50YWJsZU5hbWVdOiB0cnVlIH0gOiB7fTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRVc2VkVGFibGVzKCkge1xuICAgIHJldHVybiBbLi4udGhpcy51c2VkVGFibGVzXTtcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IGJhc2VUYWJsZU5hbWUgPSB0aGlzLnRhYmxlTmFtZTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhY3RVc2VkVGFibGUodGFibGUpKSB0aGlzLnVzZWRUYWJsZXMuYWRkKGl0ZW0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnM/LnNvbWUoKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IHRhYmxlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGlhcyBcIiR7dGFibGVOYW1lfVwiIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHF1ZXJ5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNQYXJ0aWFsU2VsZWN0KSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYmFzZVRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyA9IHtcbiAgICAgICAgICAgIFtiYXNlVGFibGVOYW1lXTogdGhpcy5jb25maWcuZmllbGRzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAhaXModGFibGUsIFNRTCkpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHNbdGFibGVOYW1lXSA9IHNlbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmpvaW5zKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmpvaW5zID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN3aXRjaCAoam9pblR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwibGVmdFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJyaWdodFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubWFwKChba2V5XSkgPT4gW2tleSwgZmFsc2VdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY3Jvc3NcIjpcbiAgICAgICAgICBjYXNlIFwiaW5uZXJcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJmdWxsXCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgbGVmdCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgam9pbmVkIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBqb2luZWQgdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNsZWZ0LWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmxlZnRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlciB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgcmlnaHQgam9pbmAgb3BlcmF0aW9uIGJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFzc29jaWF0ZXMgZWFjaCByb3cgb2YgdGhlIGpvaW5lZCB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBtYWluIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBtYWluIHRhYmxlIHRvIG51bGwuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjcmlnaHQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIHJpZ2h0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcInJpZ2h0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gYGlubmVyIGpvaW5gIG9wZXJhdGlvbiwgY3JlYXRpbmcgYSBuZXcgdGFibGUgYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIHRoYXQgaGF2ZSBtYXRjaGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIHJvd3MgdGhhdCBoYXZlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBib3RoIGpvaW5lZCB0YWJsZXMuIFJvd3Mgd2l0aG91dCBtYXRjaGluZyBlbnRyaWVzIGluIGVpdGhlciB0YWJsZSBhcmUgZXhjbHVkZWQsIHJlc3VsdGluZyBpbiBhIHRhYmxlIHRoYXQgaW5jbHVkZXMgb25seSBtYXRjaGluZyBwYWlycy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNpbm5lci1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmlubmVySm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgZnVsbCBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIHJvd3Mgd2l0aCBtYXRjaGluZyB2YWx1ZXMgYW5kIGZpbGxpbmcgaW4gYG51bGxgIGZvciBub24tbWF0Y2hpbmcgY29sdW1ucy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNmdWxsLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXIgfCBudWxsOyBwZXRzOiBQZXQgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXIgfCBudWxsOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBjcm9zcyBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIGFsbCByb3dzIGZyb20gZWFjaCB0YWJsZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNjcm9zcy1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMsIGVhY2ggdXNlciB3aXRoIGV2ZXJ5IHBldFxuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmNyb3NzSm9pbihwZXRzKVxuICAgKiBgYGBcbiAgICovXG4gIGNyb3NzSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImNyb3NzXCIpO1xuICBjcmVhdGVTZXRPcGVyYXRvcih0eXBlLCBpc0FsbCkge1xuICAgIHJldHVybiAocmlnaHRTZWxlY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJpZ2h0U2VsZWN0ID0gdHlwZW9mIHJpZ2h0U2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyByaWdodFNlbGVjdGlvbihnZXRTUUxpdGVTZXRPcGVyYXRvcnMoKSkgOiByaWdodFNlbGVjdGlvbjtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKHRoaXMuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgcmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCh7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYHVuaW9uYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0IHNldHMgb2YgdGhlIGBzZWxlY3RgIHN0YXRlbWVudHMgYW5kIHJlbW92ZSBhbnkgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb259XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdW5pcXVlIG5hbWVzIGZyb20gY3VzdG9tZXJzIGFuZCB1c2VycyB0YWJsZXNcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC51bmlvbihcbiAgICogICAgIGRiLnNlbGVjdCh7IG5hbWU6IGN1c3RvbWVycy5uYW1lIH0pLmZyb20oY3VzdG9tZXJzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uKFxuICAgKiAgIGRiLnNlbGVjdCh7IG5hbWU6IHVzZXJzLm5hbWUgfSkuZnJvbSh1c2VycyksXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb24gPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgdW5pb24gYWxsYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0LXNldCBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQga2VlcCBhbGwgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb24tYWxsfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHRyYW5zYWN0aW9uIGlkcyBmcm9tIGJvdGggb25saW5lIGFuZCBpbi1zdG9yZSBzYWxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KVxuICAgKiAgIC5mcm9tKG9ubGluZVNhbGVzKVxuICAgKiAgIC51bmlvbkFsbChcbiAgICogICAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyB1bmlvbkFsbCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCB1bmlvbkFsbChcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKG9ubGluZVNhbGVzKSxcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogaW5TdG9yZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShpblN0b3JlU2FsZXMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb25BbGwgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgdHJ1ZSk7XG4gIC8qKlxuICAgKiBBZGRzIGBpbnRlcnNlY3RgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXRhaW4gb25seSB0aGUgcm93cyB0aGF0IGFyZSBwcmVzZW50IGluIGJvdGggcmVzdWx0IHNldHMgYW5kIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2ludGVyc2VjdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGNvdXJzZSBuYW1lcyB0aGF0IGFyZSBvZmZlcmVkIGluIGJvdGggZGVwYXJ0bWVudHMgQSBhbmQgQlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSlcbiAgICogICAuZnJvbShkZXBBKVxuICAgKiAgIC5pbnRlcnNlY3QoXG4gICAqICAgICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IGludGVyc2VjdCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCBpbnRlcnNlY3QoXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQSksXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnRlcnNlY3QgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGV4Y2VwdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFsbCB1bmlxdWUgcm93cyBmcm9tIHRoZSBsZWZ0IHF1ZXJ5LCBleGNlcHQgZm9yIHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHJlc3VsdCBzZXQgb2YgdGhlIHJpZ2h0IHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2V4Y2VwdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBjb3Vyc2VzIG9mZmVyZWQgaW4gZGVwYXJ0bWVudCBBIGJ1dCBub3QgaW4gZGVwYXJ0bWVudCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmV4Y2VwdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgZXhjZXB0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGV4Y2VwdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGV4Y2VwdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuICAvKiogQGludGVybmFsICovXG4gIGFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpIHtcbiAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCguLi5zZXRPcGVyYXRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNmaWx0ZXJpbmd9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIGlmICh0eXBlb2Ygd2hlcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgd2hlcmUgPSB3aGVyZShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGhhdmluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNlbGVjdCBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi4gSXQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRvIGZpbHRlciB0aGUgYWdncmVnYXRlZCBkYXRhIGJhc2VkIG9uIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjYWdncmVnYXRpb25zfVxuICAgKlxuICAgKiBAcGFyYW0gaGF2aW5nIHRoZSBgaGF2aW5nYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgYnJhbmRzIHdpdGggbW9yZSB0aGFuIG9uZSBjYXJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogXHRicmFuZDogY2Fycy5icmFuZCxcbiAgICogXHRjb3VudDogc3FsPG51bWJlcj5gY2FzdChjb3VudCgke2NhcnMuaWR9KSBhcyBpbnQpYCxcbiAgICogfSlcbiAgICogICAuZnJvbShjYXJzKVxuICAgKiAgIC5ncm91cEJ5KGNhcnMuYnJhbmQpXG4gICAqICAgLmhhdmluZygoeyBjb3VudCB9KSA9PiBndChjb3VudCwgMSkpO1xuICAgKiBgYGBcbiAgICovXG4gIGhhdmluZyhoYXZpbmcpIHtcbiAgICBpZiAodHlwZW9mIGhhdmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBoYXZpbmcgPSBoYXZpbmcoXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuaGF2aW5nID0gaGF2aW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyb3VwQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBncm91cEJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5ncm91cEJ5ID0gQXJyYXkuaXNBcnJheShncm91cEJ5KSA/IGdyb3VwQnkgOiBbZ3JvdXBCeV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBjb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBsaW1pdGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIGxpbWl0IHRoZSBgbGltaXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSBmaXJzdCAxMCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLmxpbWl0ID0gbGltaXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvZmZzZXRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBza2lwIGEgbnVtYmVyIG9mIHJvd3Mgd2hlbiByZXR1cm5pbmcgcmVzdWx0cyBmcm9tIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2xpbWl0LS1vZmZzZXR9XG4gICAqXG4gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGBvZmZzZXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSAxMHRoLTIwdGggcGVvcGxlIGZyb20gdGhpcyBxdWVyeS5cbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShwZW9wbGUpLm9mZnNldCgxMCkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIG9mZnNldChvZmZzZXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRTZWxlY3RRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBjb25zdCB1c2VkVGFibGVzID0gW107XG4gICAgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpKTtcbiAgICBpZiAodGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgdGhpcy5jb25maWcuam9pbnMpIHVzZWRUYWJsZXMucHVzaCguLi5leHRyYWN0VXNlZFRhYmxlKGl0LnRhYmxlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICBuZXcgU3VicXVlcnkodGhpcy5nZXRTUUwoKSwgdGhpcy5jb25maWcuZmllbGRzLCBhbGlhcywgZmFsc2UsIFsuLi5uZXcgU2V0KHVzZWRUYWJsZXMpXSksXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNlbGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXM6IHRoaXMudGFibGVOYW1lLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdEJhc2UgZXh0ZW5kcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBleGVjdXRlIGEgcXVlcnkgb24gYSBxdWVyeSBidWlsZGVyLiBQbGVhc2UgdXNlIGEgZGF0YWJhc2UgaW5zdGFuY2UgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBvcmRlclNlbGVjdGVkRmllbGRzKHRoaXMuY29uZmlnLmZpZWxkcyk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICBmaWVsZHNMaXN0LFxuICAgICAgXCJhbGxcIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIHRhYmxlczogWy4uLnRoaXMudXNlZFRhYmxlc11cbiAgICAgIH0sXG4gICAgICB0aGlzLmNhY2hlQ29uZmlnXG4gICAgKTtcbiAgICBxdWVyeS5qb2luc05vdE51bGxhYmxlTWFwID0gdGhpcy5qb2luc05vdE51bGxhYmxlTWFwO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuICAkd2l0aENhY2hlKGNvbmZpZykge1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjb25maWcgPT09IHZvaWQgMCA/IHsgY29uZmlnOiB7fSwgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9IDogY29uZmlnID09PSBmYWxzZSA/IHsgZW5hYmxlOiBmYWxzZSB9IDogeyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlLCAuLi5jb25maWcgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsKCk7XG4gIH1cbn1cbmFwcGx5TWl4aW5zKFNRTGl0ZVNlbGVjdEJhc2UsIFtRdWVyeVByb21pc2VdKTtcbmZ1bmN0aW9uIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gIHJldHVybiAobGVmdFNlbGVjdCwgcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzKSA9PiB7XG4gICAgY29uc3Qgc2V0T3BlcmF0b3JzID0gW3JpZ2h0U2VsZWN0LCAuLi5yZXN0U2VsZWN0c10ubWFwKChzZWxlY3QpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgaXNBbGwsXG4gICAgICByaWdodFNlbGVjdDogc2VsZWN0XG4gICAgfSkpO1xuICAgIGZvciAoY29uc3Qgc2V0T3BlcmF0b3Igb2Ygc2V0T3BlcmF0b3JzKSB7XG4gICAgICBpZiAoIWhhdmVTYW1lS2V5cyhsZWZ0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCksIHNldE9wZXJhdG9yLnJpZ2h0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlNldCBvcGVyYXRvciBlcnJvciAodW5pb24gLyBpbnRlcnNlY3QgLyBleGNlcHQpOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVmdFNlbGVjdC5hZGRTZXRPcGVyYXRvcnMoc2V0T3BlcmF0b3JzKTtcbiAgfTtcbn1cbmNvbnN0IGdldFNRTGl0ZVNldE9wZXJhdG9ycyA9ICgpID0+ICh7XG4gIHVuaW9uLFxuICB1bmlvbkFsbCxcbiAgaW50ZXJzZWN0LFxuICBleGNlcHRcbn0pO1xuY29uc3QgdW5pb24gPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIGZhbHNlKTtcbmNvbnN0IHVuaW9uQWxsID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbmNvbnN0IGludGVyc2VjdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbmNvbnN0IGV4Y2VwdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiZXhjZXB0XCIsIGZhbHNlKTtcbmV4cG9ydCB7XG4gIFNRTGl0ZVNlbGVjdEJhc2UsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UsXG4gIGV4Y2VwdCxcbiAgaW50ZXJzZWN0LFxuICB1bmlvbixcbiAgdW5pb25BbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZURpYWxlY3QsIFNRTGl0ZVN5bmNEaWFsZWN0IH0gZnJvbSBcIi4uL2RpYWxlY3QuanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU2VsZWN0QnVpbGRlciB9IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuY2xhc3MgUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUXVlcnlCdWlsZGVyXCI7XG4gIGRpYWxlY3Q7XG4gIGRpYWxlY3RDb25maWc7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IGRpYWxlY3QgOiB2b2lkIDA7XG4gICAgdGhpcy5kaWFsZWN0Q29uZmlnID0gaXMoZGlhbGVjdCwgU1FMaXRlRGlhbGVjdCkgPyB2b2lkIDAgOiBkaWFsZWN0O1xuICB9XG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBxdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgIGNvbnN0IGFzID0gKHFiKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHFiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcWIgPSBxYihxdWVyeUJ1aWxkZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgbmV3IFdpdGhTdWJxdWVyeShcbiAgICAgICAgICBxYi5nZXRTUUwoKSxcbiAgICAgICAgICBzZWxlY3Rpb24gPz8gKFwiZ2V0U2VsZWN0ZWRGaWVsZHNcIiBpbiBxYiA/IHFiLmdldFNlbGVjdGVkRmllbGRzKCkgPz8ge30gOiB7fSksXG4gICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHsgYXMgfTtcbiAgfTtcbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0IH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdm9pZCAwLCBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgZGlhbGVjdDogdGhpcy5nZXREaWFsZWN0KCksXG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8vIExhenkgbG9hZCBkaWFsZWN0IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgZ2V0RGlhbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuZGlhbGVjdCkge1xuICAgICAgdGhpcy5kaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHRoaXMuZGlhbGVjdENvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpYWxlY3Q7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IENvbHVtbnMsIFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBoYXZlU2FtZUtleXMsIG1hcFVwZGF0ZVNldCwgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci5qc1wiO1xuY2xhc3MgU1FMaXRlSW5zZXJ0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluc2VydEJ1aWxkZXJcIjtcbiAgdmFsdWVzKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IFt2YWx1ZXNdO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZXMoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgbWFwcGVkVmFsdWVzID0gdmFsdWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgY29uc3QgY29scyA9IHRoaXMudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgZm9yIChjb25zdCBjb2xLZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGNvbnN0IGNvbFZhbHVlID0gZW50cnlbY29sS2V5XTtcbiAgICAgICAgcmVzdWx0W2NvbEtleV0gPSBpcyhjb2xWYWx1ZSwgU1FMKSA/IGNvbFZhbHVlIDogbmV3IFBhcmFtKGNvbFZhbHVlLCBjb2xzW2NvbEtleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgbWFwcGVkVmFsdWVzLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCk7XG4gIH1cbiAgc2VsZWN0KHNlbGVjdFF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VsZWN0ID0gdHlwZW9mIHNlbGVjdFF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3RRdWVyeShuZXcgUXVlcnlCdWlsZGVyKCkpIDogc2VsZWN0UXVlcnk7XG4gICAgaWYgKCFpcyhzZWxlY3QsIFNRTCkgJiYgIWhhdmVTYW1lS2V5cyh0aGlzLnRhYmxlW0NvbHVtbnNdLCBzZWxlY3QuXy5zZWxlY3RlZEZpZWxkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnNlcnQgc2VsZWN0IGVycm9yOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIgY29tcGFyZWQgdG8gdGhlIHRhYmxlIGRlZmluaXRpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCYXNlKHRoaXMudGFibGUsIHNlbGVjdCwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QsIHRoaXMud2l0aExpc3QsIHRydWUpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnNlcnRCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHZhbHVlcywgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QsIHNlbGVjdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgdmFsdWVzLCB3aXRoTGlzdCwgc2VsZWN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdCBkbyBub3RoaW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHNpbXBseSBhdm9pZHMgaW5zZXJ0aW5nIGEgcm93IGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I29uLWNvbmZsaWN0LWRvLW5vdGhpbmd9XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGB0YXJnZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93IGFuZCBjYW5jZWwgdGhlIGluc2VydCBpZiB0aGVyZSdzIGEgY29uZmxpY3RcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZygpO1xuICAgKlxuICAgKiAvLyBFeHBsaWNpdGx5IHNwZWNpZnkgY29uZmxpY3QgdGFyZ2V0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb05vdGhpbmcoeyB0YXJnZXQ6IGNhcnMuaWQgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvTm90aGluZyhjb25maWcgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25maWcub25Db25mbGljdCkgdGhpcy5jb25maWcub25Db25mbGljdCA9IFtdO1xuICAgIGlmIChjb25maWcudGFyZ2V0ID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiBzcWxgYDtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSBkbyBub3RoaW5nJHt3aGVyZVNxbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIHVwZGF0ZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgZXhpc3Rpbmcgcm93IHRoYXQgY29uZmxpY3RzIHdpdGggdGhlIHJvdyBwcm9wb3NlZCBmb3IgaW5zZXJ0aW9uIGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I3Vwc2VydHMtYW5kLWNvbmZsaWN0c31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAsIGBzZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSB0aGUgcm93IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnUG9yc2NoZScgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBVcHNlcnQgd2l0aCAnd2hlcmUnIGNsYXVzZVxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnbmV3Qk1XJyB9LFxuICAgKiAgICAgd2hlcmU6IHNxbGAke2NhcnMuY3JlYXRlZEF0fSA+ICcyMDIzLTAxLTAxJzo6ZGF0ZWAsXG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvVXBkYXRlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcud2hlcmUgJiYgKGNvbmZpZy50YXJnZXRXaGVyZSB8fCBjb25maWcuc2V0V2hlcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgY2Fubm90IHVzZSBib3RoIFwid2hlcmVcIiBhbmQgXCJ0YXJnZXRXaGVyZVwiL1wic2V0V2hlcmVcIiBhdCB0aGUgc2FtZSB0aW1lIC0gXCJ3aGVyZVwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcInRhcmdldFdoZXJlXCIgb3IgXCJzZXRXaGVyZVwiIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0V2hlcmVTcWwgPSBjb25maWcudGFyZ2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnRhcmdldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2V0V2hlcmVTcWwgPSBjb25maWcuc2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnNldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgIGNvbnN0IHNldFNxbCA9IHRoaXMuZGlhbGVjdC5idWlsZFVwZGF0ZVNldCh0aGlzLmNvbmZpZy50YWJsZSwgbWFwVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBjb25maWcuc2V0KSk7XG4gICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKFxuICAgICAgc3FsYCBvbiBjb25mbGljdCAke3RhcmdldFNxbH0ke3RhcmdldFdoZXJlU3FsfSBkbyB1cGRhdGUgc2V0ICR7c2V0U3FsfSR7d2hlcmVTcWx9JHtzZXRXaGVyZVNxbH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkSW5zZXJ0UXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlSW5zZXJ0QmFzZSxcbiAgU1FMaXRlSW5zZXJ0QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc2VydC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIG1hcFVwZGF0ZVNldCxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkc1xufSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVVwZGF0ZUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSB3aXRoTGlzdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVCdWlsZGVyXCI7XG4gIHNldCh2YWx1ZXMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJhc2UoXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgbWFwVXBkYXRlU2V0KHRoaXMudGFibGUsIHZhbHVlcyksXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLndpdGhMaXN0XG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVXBkYXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXQsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHNldCwgdGFibGUsIHdpdGhMaXN0LCBqb2luczogW10gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGZyb20oc291cmNlKSB7XG4gICAgdGhpcy5jb25maWcuZnJvbSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnMuc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5jb25maWcuZnJvbSA/IGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkgPyB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gOiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGZyb20gJiYgbmV3IFByb3h5KFxuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuam9pbnMucHVzaCh7IG9uLCB0YWJsZSwgam9pblR5cGUsIGFsaWFzOiB0YWJsZU5hbWUgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIGxlZnRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwibGVmdFwiKTtcbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBBZGRzIGEgJ3doZXJlJyBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSAnd2hlcmUnIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgdXBkYXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMuY29uZmlnLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlUXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlVXBkYXRlQmFzZSxcbiAgU1FMaXRlVXBkYXRlQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwZGF0ZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVDb3VudEJ1aWxkZXIgZXh0ZW5kcyBTUUwge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRFbWJlZGRlZENvdW50KHBhcmFtcy5zb3VyY2UsIHBhcmFtcy5maWx0ZXJzKS5xdWVyeUNodW5rcyk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zZXNzaW9uID0gcGFyYW1zLnNlc3Npb247XG4gICAgdGhpcy5zcWwgPSBTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRDb3VudChcbiAgICAgIHBhcmFtcy5zb3VyY2UsXG4gICAgICBwYXJhbXMuZmlsdGVyc1xuICAgICk7XG4gIH1cbiAgc3FsO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiU1FMaXRlQ291bnRCdWlsZGVyQXN5bmNcIjtcbiAgc2Vzc2lvbjtcbiAgc3RhdGljIGJ1aWxkRW1iZWRkZWRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYChzZWxlY3QgY291bnQoKikgZnJvbSAke3NvdXJjZX0ke3NxbC5yYXcoXCIgd2hlcmUgXCIpLmlmKGZpbHRlcnMpfSR7ZmlsdGVyc30pYDtcbiAgfVxuICBzdGF0aWMgYnVpbGRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfWA7XG4gIH1cbiAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5zZXNzaW9uLmNvdW50KHRoaXMuc3FsKSkudGhlbihcbiAgICAgIG9uZnVsZmlsbGVkLFxuICAgICAgb25yZWplY3RlZFxuICAgICk7XG4gIH1cbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUNvdW50QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvdW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQge1xuICBtYXBSZWxhdGlvbmFsUm93XG59IGZyb20gXCIuLi8uLi9yZWxhdGlvbnMuanNcIjtcbmNsYXNzIFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbikge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jUmVsYXRpb25hbFF1ZXJ5QnVpbGRlclwiO1xuICBmaW5kTWFueShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApIDogbmV3IFNRTGl0ZVJlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyBjb25maWcgOiB7fSxcbiAgICAgIFwibWFueVwiXG4gICAgKTtcbiAgfVxuICBmaW5kRmlyc3QoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gXCJzeW5jXCIgPyBuZXcgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyB7IC4uLmNvbmZpZywgbGltaXQ6IDEgfSA6IHsgbGltaXQ6IDEgfSxcbiAgICAgIFwiZmlyc3RcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZnVsbFNjaGVtYSwgc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCB0YWJsZSwgdGFibGVDb25maWcsIGRpYWxlY3QsIHNlc3Npb24sIGNvbmZpZywgbW9kZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtb2RlO1xuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KS5zcWw7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyBxdWVyeSwgYnVpbHRRdWVyeSB9ID0gdGhpcy5fdG9TUUwoKTtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIGJ1aWx0UXVlcnksXG4gICAgICB2b2lkIDAsXG4gICAgICB0aGlzLm1vZGUgPT09IFwiZmlyc3RcIiA/IFwiZ2V0XCIgOiBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIChyYXdSb3dzLCBtYXBDb2x1bW5WYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCByb3dzID0gcmF3Um93cy5tYXAoXG4gICAgICAgICAgKHJvdykgPT4gbWFwUmVsYXRpb25hbFJvdyh0aGlzLnNjaGVtYSwgdGhpcy50YWJsZUNvbmZpZywgcm93LCBxdWVyeS5zZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gcm93c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIF90b1NRTCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGlhbGVjdC5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICBmdWxsU2NoZW1hOiB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0YWJsZUNvbmZpZzogdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHF1ZXJ5Q29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHRhYmxlQWxpYXM6IHRoaXMudGFibGVDb25maWcudHNOYW1lXG4gICAgfSk7XG4gICAgY29uc3QgYnVpbHRRdWVyeSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGJ1aWx0UXVlcnkgfTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9TUUwoKS5idWlsdFF1ZXJ5O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXhlY3V0ZVJhdygpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKS5nZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmFsbCgpO1xuICB9XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSYXcoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlcixcbiAgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5LFxuICBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVJhdyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dGUsIGdldFNRTCwgYWN0aW9uLCBkaWFsZWN0LCBtYXBCYXRjaFJlc3VsdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leGVjdXRlID0gZXhlY3V0ZTtcbiAgICB0aGlzLmdldFNRTCA9IGdldFNRTDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMubWFwQmF0Y2hSZXN1bHQgPSBtYXBCYXRjaFJlc3VsdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgYWN0aW9uIH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmF3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBnZXRRdWVyeSgpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSwgbWV0aG9kOiB0aGlzLmNvbmZpZy5hY3Rpb24gfTtcbiAgfVxuICBtYXBSZXN1bHQocmVzdWx0LCBpc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiBpc0Zyb21CYXRjaCA/IHRoaXMubWFwQmF0Y2hSZXN1bHQocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxuICBfcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVJhd1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhdy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHtcbiAgUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVEZWxldGVCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyLFxuICBTUUxpdGVTZWxlY3RCdWlsZGVyLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBXaXRoU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvdW50QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2NvdW50LmpzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVJhdyB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL3Jhdy5qc1wiO1xuY2xhc3MgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0S2luZCwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKSB7XG4gICAgdGhpcy5yZXN1bHRLaW5kID0gcmVzdWx0S2luZDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5fID0gc2NoZW1hID8ge1xuICAgICAgc2NoZW1hOiBzY2hlbWEuc2NoZW1hLFxuICAgICAgZnVsbFNjaGVtYTogc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiBzY2hlbWEudGFibGVOYW1lc01hcFxuICAgIH0gOiB7XG4gICAgICBzY2hlbWE6IHZvaWQgMCxcbiAgICAgIGZ1bGxTY2hlbWE6IHt9LFxuICAgICAgdGFibGVOYW1lc01hcDoge31cbiAgICB9O1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgaWYgKHRoaXMuXy5zY2hlbWEpIHtcbiAgICAgIGZvciAoY29uc3QgW3RhYmxlTmFtZSwgY29sdW1uc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fLnNjaGVtYSkpIHtcbiAgICAgICAgcXVlcnlbdGFibGVOYW1lXSA9IG5ldyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyKFxuICAgICAgICAgIHJlc3VsdEtpbmQsXG4gICAgICAgICAgc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICAgICAgdGhpcy5fLnNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8udGFibGVOYW1lc01hcCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYVt0YWJsZU5hbWVdLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICBzZXNzaW9uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuJGNhY2hlID0geyBpbnZhbGlkYXRlOiBhc3luYyAoX3BhcmFtcykgPT4ge1xuICAgIH0gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJCYXNlU1FMaXRlRGF0YWJhc2VcIjtcbiAgcXVlcnk7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3VicXVlcnkgdGhhdCBkZWZpbmVzIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQgYXMgYSBDVEUuXG4gICAqXG4gICAqIEl0IGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgZG93biBjb21wbGV4IHF1ZXJpZXMgaW50byBzaW1wbGVyIHBhcnRzIGFuZCBmb3IgcmV1c2luZyB0aGUgcmVzdWx0IHNldCBpbiBzdWJzZXF1ZW50IHBhcnRzIG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3Qjd2l0aC1jbGF1c2V9XG4gICAqXG4gICAqIEBwYXJhbSBhbGlhcyBUaGUgYWxpYXMgZm9yIHRoZSBzdWJxdWVyeS5cbiAgICpcbiAgICogRmFpbHVyZSB0byBwcm92aWRlIGFuIGFsaWFzIHdpbGwgcmVzdWx0IGluIGEgRHJpenpsZVR5cGVFcnJvciwgcHJldmVudGluZyB0aGUgc3VicXVlcnkgZnJvbSBiZWluZyByZWZlcmVuY2VkIGluIG90aGVyIHF1ZXJpZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIENyZWF0ZSBhIHN1YnF1ZXJ5IHdpdGggYWxpYXMgJ3NxJyBhbmQgdXNlIGl0IGluIHRoZSBzZWxlY3QgcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3QoKS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgNDIpKSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICpcbiAgICogVG8gc2VsZWN0IGFyYml0cmFyeSBTUUwgdmFsdWVzIGFzIGZpZWxkcyBpbiBhIENURSBhbmQgcmVmZXJlbmNlIHRoZW0gaW4gb3RoZXIgQ1RFcyBvciBpbiB0aGUgbWFpbiBxdWVyeSwgeW91IG5lZWQgdG8gYWRkIGFsaWFzZXMgdG8gdGhlbTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFuIGFyYml0cmFyeSBTUUwgdmFsdWUgYXMgYSBmaWVsZCBpbiBhIENURSBhbmQgcmVmZXJlbmNlIGl0IGluIHRoZSBtYWluIHF1ZXJ5XG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KHtcbiAgICogICBuYW1lOiBzcWw8c3RyaW5nPmB1cHBlcigke3VzZXJzLm5hbWV9KWAuYXMoJ25hbWUnKSxcbiAgICogfSlcbiAgICogLmZyb20odXNlcnMpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KHsgbmFtZTogc3EubmFtZSB9KS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqL1xuICAkd2l0aCA9IChhbGlhcywgc2VsZWN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKG5ldyBRdWVyeUJ1aWxkZXIoc2VsZi5kaWFsZWN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICAkY291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDb3VudEJ1aWxkZXIoeyBzb3VyY2UsIGZpbHRlcnMsIHNlc3Npb246IHRoaXMuc2Vzc2lvbiB9KTtcbiAgfVxuICAvKipcbiAgICogSW5jb3Jwb3JhdGVzIGEgcHJldmlvdXNseSBkZWZpbmVkIENURSAodXNpbmcgYCR3aXRoYCkgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBtYWluIHF1ZXJ5IHRvIHJlZmVyZW5jZSBhIHRlbXBvcmFyeSBuYW1lZCByZXN1bHQgc2V0LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJpZXMgVGhlIENURXMgdG8gaW5jb3Jwb3JhdGUgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVmaW5lIGEgc3VicXVlcnkgJ3NxJyBhcyBhIENURSB1c2luZyAkd2l0aFxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogLy8gSW5jb3Jwb3JhdGUgdGhlIENURSAnc3EnIGludG8gdGhlIG1haW4gcXVlcnkgYW5kIHNlbGVjdCBmcm9tIGl0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gIHdpdGgoLi4ucXVlcmllcykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIHNlbGVjdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHNlbGYuc2Vzc2lvbixcbiAgICAgICAgZGlhbGVjdDogc2VsZi5kaWFsZWN0LFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGUodGFibGUpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQnVpbGRlcih0YWJsZSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnQoaW50bykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCdWlsZGVyKGludG8sIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVsZXRlXyhmcm9tKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0LCB1cGRhdGUsIGluc2VydCwgZGVsZXRlOiBkZWxldGVfIH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLCBkaWFsZWN0OiB0aGlzLmRpYWxlY3QgfSk7XG4gIH1cbiAgc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gdXBkYXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCB1cGRhdGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBVc2UgYC5zZXQoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy91cGRhdGV9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KS53aGVyZShlcShjYXJzLmJyYW5kLCAnQk1XJykpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IHVwZGF0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIudXBkYXRlKGNhcnMpXG4gICAqICAgLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBkYXRlKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgJGNhY2hlO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnNlcnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgbmV3IHJvd3MgaW4gYSB0YWJsZS4gVXNlIGAudmFsdWVzKClgIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIHZhbHVlcyB0byBpbnNlcnQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0fVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBJbnNlcnQgb25lIHJvd1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKHsgYnJhbmQ6ICdCTVcnIH0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgbXVsdGlwbGUgcm93c1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKFt7IGJyYW5kOiAnQk1XJyB9LCB7IGJyYW5kOiAnUG9yc2NoZScgfV0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGluc2VydGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zZXJ0KGludG8pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVsZXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCBkZWxldGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSBkZWxldGVkLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBkZWxldGUgZnJvbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCByb3dzIGluIHRoZSAnY2FycycgdGFibGVcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCBkZWxldGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmRlbGV0ZShjYXJzKVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlKGZyb20pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnJ1bihzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwicnVuXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCk7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24uYWxsKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJhbGxcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKTtcbiAgfVxuICBnZXQocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5nZXQoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImdldFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3R2V0VmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnZhbHVlcyhzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwidmFsdWVzXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCk7XG4gIH1cbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb24udHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZyk7XG4gIH1cbn1cbmNvbnN0IHdpdGhSZXBsaWNhcyA9IChwcmltYXJ5LCByZXBsaWNhcywgZ2V0UmVwbGljYSA9ICgpID0+IHJlcGxpY2FzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJlcGxpY2FzLmxlbmd0aCldKSA9PiB7XG4gIGNvbnN0IHNlbGVjdCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5zZWxlY3QoLi4uYXJncyk7XG4gIGNvbnN0IHNlbGVjdERpc3RpbmN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdERpc3RpbmN0KC4uLmFyZ3MpO1xuICBjb25zdCAkY291bnQgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuJGNvdW50KC4uLmFyZ3MpO1xuICBjb25zdCAkd2l0aCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS53aXRoKC4uLmFyZ3MpO1xuICBjb25zdCB1cGRhdGUgPSAoLi4uYXJncykgPT4gcHJpbWFyeS51cGRhdGUoLi4uYXJncyk7XG4gIGNvbnN0IGluc2VydCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5Lmluc2VydCguLi5hcmdzKTtcbiAgY29uc3QgJGRlbGV0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmRlbGV0ZSguLi5hcmdzKTtcbiAgY29uc3QgcnVuID0gKC4uLmFyZ3MpID0+IHByaW1hcnkucnVuKC4uLmFyZ3MpO1xuICBjb25zdCBhbGwgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5hbGwoLi4uYXJncyk7XG4gIGNvbnN0IGdldCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmdldCguLi5hcmdzKTtcbiAgY29uc3QgdmFsdWVzID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudmFsdWVzKC4uLmFyZ3MpO1xuICBjb25zdCB0cmFuc2FjdGlvbiA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnRyYW5zYWN0aW9uKC4uLmFyZ3MpO1xuICByZXR1cm4ge1xuICAgIC4uLnByaW1hcnksXG4gICAgdXBkYXRlLFxuICAgIGluc2VydCxcbiAgICBkZWxldGU6ICRkZWxldGUsXG4gICAgcnVuLFxuICAgIGFsbCxcbiAgICBnZXQsXG4gICAgdmFsdWVzLFxuICAgIHRyYW5zYWN0aW9uLFxuICAgICRwcmltYXJ5OiBwcmltYXJ5LFxuICAgIHNlbGVjdCxcbiAgICBzZWxlY3REaXN0aW5jdCxcbiAgICAkY291bnQsXG4gICAgd2l0aDogJHdpdGgsXG4gICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgcmV0dXJuIGdldFJlcGxpY2EocmVwbGljYXMpLnF1ZXJ5O1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnQge1xuICBCYXNlU1FMaXRlRGF0YWJhc2UsXG4gIHdpdGhSZXBsaWNhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRiLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmNsYXNzIENhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FjaGVcIjtcbn1cbmNsYXNzIE5vb3BDYWNoZSBleHRlbmRzIENhY2hlIHtcbiAgc3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIFwiYWxsXCI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcENhY2hlXCI7XG4gIGFzeW5jIGdldChfa2V5KSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBhc3luYyBwdXQoX2hhc2hlZFF1ZXJ5LCBfcmVzcG9uc2UsIF90YWJsZXMsIF9jb25maWcpIHtcbiAgfVxuICBhc3luYyBvbk11dGF0ZShfcGFyYW1zKSB7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGhhc2hRdWVyeShzcWwsIHBhcmFtcykge1xuICBjb25zdCBkYXRhVG9IYXNoID0gYCR7c3FsfS0ke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9YDtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoZGF0YVRvSGFzaCk7XG4gIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcIlNIQS0yNTZcIiwgZGF0YSk7XG4gIGNvbnN0IGhhc2hBcnJheSA9IFsuLi5uZXcgVWludDhBcnJheShoYXNoQnVmZmVyKV07XG4gIGNvbnN0IGhhc2hIZXggPSBoYXNoQXJyYXkubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG4gIHJldHVybiBoYXNoSGV4O1xufVxuZXhwb3J0IHtcbiAgQ2FjaGUsXG4gIE5vb3BDYWNoZSxcbiAgaGFzaFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjaGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBoYXNoUXVlcnksIE5vb3BDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS9jb3JlL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERyaXp6bGVFcnJvciwgRHJpenpsZVF1ZXJ5RXJyb3IsIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBCYXNlU1FMaXRlRGF0YWJhc2UgfSBmcm9tIFwiLi9kYi5qc1wiO1xuY2xhc3MgRXhlY3V0ZVJlc3VsdFN5bmMgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRDYikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXN1bHRDYiA9IHJlc3VsdENiO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4ZWN1dGVSZXN1bHRTeW5jXCI7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENiKCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVByZXBhcmVkUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBleGVjdXRlTWV0aG9kLCBxdWVyeSwgY2FjaGUsIHF1ZXJ5TWV0YWRhdGEsIGNhY2hlQ29uZmlnKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmV4ZWN1dGVNZXRob2QgPSBleGVjdXRlTWV0aG9kO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgdGhpcy5xdWVyeU1ldGFkYXRhID0gcXVlcnlNZXRhZGF0YTtcbiAgICB0aGlzLmNhY2hlQ29uZmlnID0gY2FjaGVDb25maWc7XG4gICAgaWYgKGNhY2hlICYmIGNhY2hlLnN0cmF0ZWd5KCkgPT09IFwiYWxsXCIgJiYgY2FjaGVDb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHsgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWc/LmVuYWJsZSkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUHJlcGFyZWRRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgcXVlcnlXaXRoQ2FjaGUocXVlcnlTdHJpbmcsIHBhcmFtcywgcXVlcnkpIHtcbiAgICBpZiAodGhpcy5jYWNoZSA9PT0gdm9pZCAwIHx8IGlzKHRoaXMuY2FjaGUsIE5vb3BDYWNoZSkgfHwgdGhpcy5xdWVyeU1ldGFkYXRhID09PSB2b2lkIDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlQ29uZmlnICYmICF0aGlzLmNhY2hlQ29uZmlnLmVuYWJsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJpbnNlcnRcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJ1cGRhdGVcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJkZWxldGVcIikgJiYgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbcmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBxdWVyeSgpLFxuICAgICAgICAgIHRoaXMuY2FjaGUub25NdXRhdGUoeyB0YWJsZXM6IHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMgfSlcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhY2hlQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIGNvbnN0IGZyb21DYWNoZSA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5hdXRvSW52YWxpZGF0ZVxuICAgICAgKTtcbiAgICAgIGlmIChmcm9tQ2FjaGUgPT09IHZvaWQgMCkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZS5wdXQoXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgPz8gKGF3YWl0IGhhc2hRdWVyeShxdWVyeVN0cmluZywgcGFyYW1zKSksXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZW5kIHRhYmxlcyB0aGF0IHdlcmUgdXNlZCBpbiBhIHF1ZXJ5IG9ubHkgaWYgdXNlciB3YW50cyB0byBpbnZhbGlkYXRlIGl0IG9uIGVhY2ggd3JpdGVcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlID8gdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyA6IFtdLFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnICE9PSB2b2lkIDAsXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5jb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQ2FjaGU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgfVxuICB9XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG4gIG1hcFJ1blJlc3VsdChyZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbWFwQWxsUmVzdWx0KF9yZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBtYXBHZXRSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW3RoaXMuZXhlY3V0ZU1ldGhvZF0ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEV4ZWN1dGVSZXN1bHRTeW5jKCgpID0+IHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcykpO1xuICB9XG4gIG1hcFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZXhlY3V0ZU1ldGhvZCkge1xuICAgICAgY2FzZSBcInJ1blwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcFJ1blJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFsbFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEFsbFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImdldFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEdldFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY2xhc3MgU1FMaXRlU2Vzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlc3Npb25cIjtcbiAgcHJlcGFyZU9uZVRpbWVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlciwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUXVlcnkoXG4gICAgICBxdWVyeSxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXIsXG4gICAgICBxdWVyeU1ldGFkYXRhLFxuICAgICAgY2FjaGVDb25maWdcbiAgICApO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHN0YXRpY1F1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHN0YXRpY1F1ZXJ5LCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5ydW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlRXJyb3IoeyBjYXVzZTogZXJyLCBtZXNzYWdlOiBgRmFpbGVkIHRvIHJ1biB0aGUgcXVlcnkgJyR7c3RhdGljUXVlcnkuc3FsfSdgIH0pO1xuICAgIH1cbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGFsbChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5hbGwoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdBbGxWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5nZXQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS52YWx1ZXMoKTtcbiAgfVxuICBhc3luYyBjb3VudChzcWwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbHVlcyhzcWwpO1xuICAgIHJldHVybiByZXN1bHRbMF1bMF07XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3VmFsdWVzVmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRUeXBlLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEsIG5lc3RlZEluZGV4ID0gMCkge1xuICAgIHN1cGVyKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5uZXN0ZWRJbmRleCA9IG5lc3RlZEluZGV4O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRyYW5zYWN0aW9uXCI7XG4gIHJvbGxiYWNrKCkge1xuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXhlY3V0ZVJlc3VsdFN5bmMsXG4gIFNRTGl0ZVByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZVNlc3Npb24sXG4gIFNRTGl0ZVRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbnNvbGVMb2dXcml0ZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb25zb2xlTG9nV3JpdGVyXCI7XG4gIHdyaXRlKG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgfVxufVxuY2xhc3MgRGVmYXVsdExvZ2dlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRlZmF1bHRMb2dnZXJcIjtcbiAgd3JpdGVyO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLndyaXRlciA9IGNvbmZpZz8ud3JpdGVyID8/IG5ldyBDb25zb2xlTG9nV3JpdGVyKCk7XG4gIH1cbiAgbG9nUXVlcnkocXVlcnksIHBhcmFtcykge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkUGFyYW1zID0gcGFyYW1zLm1hcCgocCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcocCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcGFyYW1zU3RyID0gc3RyaW5naWZpZWRQYXJhbXMubGVuZ3RoID8gYCAtLSBwYXJhbXM6IFske3N0cmluZ2lmaWVkUGFyYW1zLmpvaW4oXCIsIFwiKX1dYCA6IFwiXCI7XG4gICAgdGhpcy53cml0ZXIud3JpdGUoYFF1ZXJ5OiAke3F1ZXJ5fSR7cGFyYW1zU3RyfWApO1xuICB9XG59XG5jbGFzcyBOb29wTG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcExvZ2dlclwiO1xuICBsb2dRdWVyeSgpIHtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29uc29sZUxvZ1dyaXRlcixcbiAgRGVmYXVsdExvZ2dlcixcbiAgTm9vcExvZ2dlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5qcy5tYXAiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IGluZGV4LCBpbnRlZ2VyLCByZWFsLCBzcWxpdGVUYWJsZSwgdGV4dCB9IGZyb20gXCJkcml6emxlLW9ybS9zcWxpdGUtY29yZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25zIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvc2NoZW1hLnRzXG52YXIgc2NoZW1hX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNjaGVtYV9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcnM6ICgpID0+IGNoYXJhY3RlcnMsXG5cdGNoYXJhY3RlcnNSZWxhdGlvbnM6ICgpID0+IGNoYXJhY3RlcnNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzOiAoKSA9PiBtaW5pbmdGbGVldFBhcnRpY2lwYW50cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zLFxuXHRtaW5pbmdGbGVldHM6ICgpID0+IG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRzUmVsYXRpb25zOiAoKSA9PiBtaW5pbmdGbGVldHNSZWxhdGlvbnMsXG5cdHJlc3VtZUNvbW1hbmRzOiAoKSA9PiByZXN1bWVDb21tYW5kcyxcblx0c2hhcmVkOiAoKSA9PiBzaGFyZWQsXG5cdHVzZXJzOiAoKSA9PiB1c2Vycyxcblx0dXNlcnNSZWxhdGlvbnM6ICgpID0+IHVzZXJzUmVsYXRpb25zXG59KTtcbmNvbnN0IHNoYXJlZCA9IHtcblx0Y3JlYXRlZEF0OiBpbnRlZ2VyKFwiY3JlYXRlZF9hdFwiKS5ub3ROdWxsKCksXG5cdHVwZGF0ZWRBdDogaW50ZWdlcihcInVwZGF0ZWRfYXRcIilcbn07XG5jb25zdCB1c2VycyA9IHNxbGl0ZVRhYmxlKFwidXNlcnNcIiwge1xuXHRpZDogaW50ZWdlcigpLnByaW1hcnlLZXkoKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdGRpc2NvcmRJRDogdGV4dChcImRpc2NvcmRfaWRcIikudW5pcXVlKCkubm90TnVsbCgpLFxuXHRtYWluQ2hhcmFjdGVyOiBpbnRlZ2VyKFwibWFpbl9jaGFyYWN0ZXJcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5kaXNjb3JkSUQpLCBpbmRleChcImlkeF9tYWluX2NoYXJhY3RlclwiKS5vbih0YWJsZS5tYWluQ2hhcmFjdGVyKV0pO1xuY29uc3QgdXNlcnNSZWxhdGlvbnMgPSByZWxhdGlvbnModXNlcnMsICh7IG9uZSwgbWFueSB9KSA9PiAoe1xuXHRjaGFyYWN0ZXJzOiBtYW55KGNoYXJhY3RlcnMpLFxuXHRtYWluOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW3VzZXJzLm1haW5DaGFyYWN0ZXJdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuY29uc3QgY2hhcmFjdGVycyA9IHNxbGl0ZVRhYmxlKFwiY2hhcmFjdGVyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdGV2ZUlEOiBpbnRlZ2VyKFwiZXZlX2lkXCIpLm5vdE51bGwoKSxcblx0dXNlcklEOiBpbnRlZ2VyKFwidXNlcl9pZFwiKS5ub3ROdWxsKCksXG5cdG5hbWU6IHRleHQoKS5ub3ROdWxsKCksXG5cdGFjY2Vzc1Rva2VuOiB0ZXh0KFwiYWNjZXNzX3Rva2VuXCIpLm5vdE51bGwoKSxcblx0ZXhwaXJlc0F0OiBpbnRlZ2VyKFwiZXhwaXJlc19hdFwiKS5ub3ROdWxsKCksXG5cdHJlZnJlc2hUb2tlbjogdGV4dChcInJlZnJlc2hfdG9rZW5cIikubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW2luZGV4KFwiaWR4X3VzZXJfaWRcIikub24odGFibGUudXNlcklEKSwgaW5kZXgoXCJpZHhfZXZlX2lkXCIpLm9uKHRhYmxlLmV2ZUlEKV0pO1xuY29uc3QgY2hhcmFjdGVyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhjaGFyYWN0ZXJzLCAoeyBvbmUgfSkgPT4gKHsgdXNlcjogb25lKHVzZXJzLCB7XG5cdGZpZWxkczogW2NoYXJhY3RlcnMudXNlcklEXSxcblx0cmVmZXJlbmNlczogW3VzZXJzLmlkXVxufSkgfSkpO1xuY29uc3QgcmVzdW1lQ29tbWFuZHMgPSBzcWxpdGVUYWJsZShcInJlc3VtZWNvbW1hbmRzXCIsIHtcblx0aWQ6IHRleHQoKS5wcmltYXJ5S2V5KCksXG5cdGNvbW1hbmQ6IHRleHQoKS5ub3ROdWxsKCksXG5cdHBhcmFtczogdGV4dCgpLm5vdE51bGwoKSxcblx0Y29udGV4dDogdGV4dCgpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59KTtcbmNvbnN0IG1pbmluZ0ZsZWV0cyA9IHNxbGl0ZVRhYmxlKFwibWluaW5nX2ZsZWV0c1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdG5hbWU6IHRleHQoXCJuYW1lXCIpLm5vdE51bGwoKSxcblx0ZGVzY3JpcHRpb246IHRleHQoXCJkZXNjcmlwdGlvblwiKSxcblx0Y3JlYXRvckRpc2NvcmRJZDogdGV4dChcImNyZWF0b3JfZGlzY29yZF9pZFwiKS5ub3ROdWxsKCksXG5cdHN0YXJ0VGltZTogaW50ZWdlcihcInN0YXJ0X3RpbWVcIikubm90TnVsbCgpLFxuXHRlbmRUaW1lOiBpbnRlZ2VyKFwiZW5kX3RpbWVcIiksXG5cdHN0YXR1czogdGV4dChcInN0YXR1c1wiLCB7IGVudW06IFtcblx0XHRcImNvbmZpZ3VyaW5nXCIsXG5cdFx0XCJhY3RpdmVcIixcblx0XHRcImVuZGVkXCIsXG5cdFx0XCJnZW5lcmF0aW5nX3JlcG9ydFwiLFxuXHRcdFwiY29tcGxldGVkXCIsXG5cdFx0XCJmYWlsZWRcIlxuXHRdIH0pLm5vdE51bGwoKS5kZWZhdWx0KFwiY29uZmlndXJpbmdcIiksXG5cdHRheFJhdGU6IHJlYWwoXCJ0YXhfcmF0ZVwiKS5ub3ROdWxsKCkuZGVmYXVsdCgwKSxcblx0cHVibGljTWVzc2FnZUlkOiB0ZXh0KFwicHVibGljX21lc3NhZ2VfaWRcIikudW5pcXVlKCksXG5cdHB1YmxpY0NoYW5uZWxJZDogdGV4dChcInB1YmxpY19jaGFubmVsX2lkXCIpLFxuXHRyZXBvcnREYXRhOiB0ZXh0KFwicmVwb3J0X2RhdGFcIiksXG5cdGNyZWF0b3JFcGhlbWVyYWxNZXNzYWdlSWQ6IHRleHQoXCJjcmVhdG9yX2VwaGVtZXJhbF9tZXNzYWdlX2lkXCIpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW1xuXHRpbmRleChcImlkeF9mbGVldF9jcmVhdG9yX2Rpc2NvcmRfaWRcIikub24odGFibGUuY3JlYXRvckRpc2NvcmRJZCksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3N0YXR1c1wiKS5vbih0YWJsZS5zdGF0dXMpLFxuXHRpbmRleChcImlkeF9mbGVldF9wdWJsaWNfbWVzc2FnZV9pZFwiKS5vbih0YWJsZS5wdWJsaWNNZXNzYWdlSWQpXG5dKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRfcGFydGljaXBhbnRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZmxlZXRJZDogaW50ZWdlcihcImZsZWV0X2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IG1pbmluZ0ZsZWV0cy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGNoYXJhY3RlcklkOiBpbnRlZ2VyKFwiY2hhcmFjdGVyX2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNoYXJhY3RlcnMuaWQsIHsgb25EZWxldGU6IFwiY2FzY2FkZVwiIH0pLFxuXHRkaXNjb3JkSWQ6IHRleHQoXCJkaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0cm9sZTogdGV4dChcInJvbGVcIiwgeyBlbnVtOiBbXG5cdFx0XCJtaW5lclwiLFxuXHRcdFwic2VjdXJpdHlcIixcblx0XHRcImhhdWxlclwiXG5cdF0gfSkubm90TnVsbCgpLFxuXHRqb2luVGltZTogaW50ZWdlcihcImpvaW5fdGltZVwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2ZsZWV0X2lkXCIpLm9uKHRhYmxlLmZsZWV0SWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9jaGFyYWN0ZXJfaWRcIikub24odGFibGUuY2hhcmFjdGVySWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0cywgKHsgbWFueSB9KSA9PiAoeyBwYXJ0aWNpcGFudHM6IG1hbnkobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMpIH0pKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCAoeyBvbmUgfSkgPT4gKHtcblx0ZmxlZXQ6IG9uZShtaW5pbmdGbGVldHMsIHtcblx0XHRmaWVsZHM6IFttaW5pbmdGbGVldFBhcnRpY2lwYW50cy5mbGVldElkXSxcblx0XHRyZWZlcmVuY2VzOiBbbWluaW5nRmxlZXRzLmlkXVxuXHR9KSxcblx0Y2hhcmFjdGVyOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmNoYXJhY3RlcklkXSxcblx0XHRyZWZlcmVuY2VzOiBbY2hhcmFjdGVycy5pZF1cblx0fSlcbn0pKTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH07IiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCB1c2VycyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxLCBzcWwgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvdXNlci5tb2RlbC50c1xudmFyIFVzZXJIZWxwZXIgPSBjbGFzcyB7XG5cdHN0YXRpYyBmaW5kKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIGlkKSkubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeURpc2NvcmRJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmRpc2NvcmRJRCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5Q2hhcmFjdGVySWQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBpZCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJOYW1lKG5hbWUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLm5hbWUsIG5hbWUpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkgcmV0dXJuIHF1ZXJ5Lm1hcCgodXNlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUodXNlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHVzZXIudXBkYXRlZEF0KSxcblx0XHRcdFx0Y2hhcmFjdGVySURzOiB1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UodXNlci5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlci5tYWluQ2hhcmFjdGVySURcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4ge1xuXHRcdFx0aWQ6IHF1ZXJ5LmlkLFxuXHRcdFx0ZGlzY29yZElEOiBxdWVyeS5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LmNyZWF0ZWRBdCksXG5cdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LnVwZGF0ZWRBdCksXG5cdFx0XHRjaGFyYWN0ZXJJRHM6IHF1ZXJ5LmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UocXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8/IFwiW11cIikubWFwKChzKSA9PiBOdW1iZXIocykpLnNvcnQoKSA6IFtdLFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiBxdWVyeS5tYWluQ2hhcmFjdGVySURcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUoZGlzY29yZElEKSB7XG5cdFx0dGhpcy5zYXZlKHtcblx0XHRcdGRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG5cdFx0XHR1cGRhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG5cdH1cblx0c3RhdGljIHNhdmUodXNlcikge1xuXHRcdGRiLmluc2VydCh1c2VycykudmFsdWVzKHtcblx0XHRcdGlkOiB1c2VyLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2VyLmNyZWF0ZWRBdC5nZXRUaW1lKCksXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IHVzZXJzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB1c2VyO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUodXNlcikge1xuXHRcdGRiLmRlbGV0ZSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIHVzZXIuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgZ2V0Q2hhcmFjdGVyKHVzZXIsIGluZGV4KSB7XG5cdFx0aWYgKCF1c2VyLmNoYXJhY3RlcklEcykgcmV0dXJuIHZvaWQgMDtcblx0XHRpZiAoaW5kZXggPj0gdXNlci5jaGFyYWN0ZXJJRHMubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZCh1c2VyLmNoYXJhY3RlcklEc1tpbmRleF0pO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFVzZXJIZWxwZXIgfTsiLAogICAgImltcG9ydCB7IHJlc3VtZUNvbW1hbmRzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL3Jlc3VtZS1jb21tYW5kLm1vZGVsLnRzXG52YXIgUmVzdW1lQ29tbWFuZCA9IGNsYXNzIFJlc3VtZUNvbW1hbmQge1xuXHRpZDtcblx0Y29tbWFuZDtcblx0cGFyYW1zO1xuXHRjb250ZXh0O1xuXHRjcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuY3JlYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHR9XG5cdHN0YXRpYyBmaW5kKG1lc3NhZ2VJZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20ocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKG1lc3NhZ2VJZCwgY29tbWFuZCwgcGFyYW1zID0ge30sIGNvbnRleHQgPSB7fSkge1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gbWVzc2FnZUlkO1xuXHRcdHJlc3VtZS5jb21tYW5kID0gY29tbWFuZDtcblx0XHRyZXN1bWUucGFyYW1zID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcblx0XHRyZXN1bWUuY29udGV4dCA9IEpTT04uc3RyaW5naWZ5KGNvbnRleHQpO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUZyb21RdWVyeShxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBudWxsO1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gcXVlcnkuaWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBxdWVyeS5jb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBxdWVyeS5wYXJhbXM7XG5cdFx0cmVzdW1lLmNvbnRleHQgPSBxdWVyeS5jb250ZXh0O1xuXHRcdHJlc3VtZS5jcmVhdGVkID0gcXVlcnkuY3JlYXRlZDtcblx0XHRyZXR1cm4gcmVzdW1lO1xuXHR9XG5cdHNhdmUoKSB7XG5cdFx0ZGIuaW5zZXJ0KHJlc3VtZUNvbW1hbmRzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0Y29udGV4dDogdGhpcy5jb250ZXh0LFxuXHRcdFx0Y3JlYXRlZEF0OiB0aGlzLmNyZWF0ZWQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogcmVzdW1lQ29tbWFuZHMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0Y29tbWFuZDogdGhpcy5jb21tYW5kLFxuXHRcdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHRcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRkZWxldGUoKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgdGhpcy5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUobWVzc2FnZUlkKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgbWVzc2FnZUlkKSkucnVuKCk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUmVzdW1lQ29tbWFuZCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL3Jlc3VtZS1jb21tYW5kLm1vZGVsLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL2luZGV4LnRzXG52YXIgbW9kZWxzX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG1vZGVsc19leHBvcnRzLCB7XG5cdENoYXJhY3RlckhlbHBlcjogKCkgPT4gQ2hhcmFjdGVySGVscGVyLFxuXHRSZXN1bWVDb21tYW5kOiAoKSA9PiBSZXN1bWVDb21tYW5kLFxuXHRVc2VySGVscGVyOiAoKSA9PiBVc2VySGVscGVyXG59KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBtb2RlbHNfZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERlZmF1bHRMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kYi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgaXNDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUJ1blNlc3Npb24gfSBmcm9tIFwiLi9zZXNzaW9uLmpzXCI7XG5jbGFzcyBCdW5TUUxpdGVEYXRhYmFzZSBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJ1blNRTGl0ZURhdGFiYXNlXCI7XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3QoY2xpZW50LCBjb25maWcgPSB7fSkge1xuICBjb25zdCBkaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHsgY2FzaW5nOiBjb25maWcuY2FzaW5nIH0pO1xuICBsZXQgbG9nZ2VyO1xuICBpZiAoY29uZmlnLmxvZ2dlciA9PT0gdHJ1ZSkge1xuICAgIGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIgPSBjb25maWcubG9nZ2VyO1xuICB9XG4gIGxldCBzY2hlbWE7XG4gIGlmIChjb25maWcuc2NoZW1hKSB7XG4gICAgY29uc3QgdGFibGVzQ29uZmlnID0gZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcoXG4gICAgICBjb25maWcuc2NoZW1hLFxuICAgICAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzXG4gICAgKTtcbiAgICBzY2hlbWEgPSB7XG4gICAgICBmdWxsU2NoZW1hOiBjb25maWcuc2NoZW1hLFxuICAgICAgc2NoZW1hOiB0YWJsZXNDb25maWcudGFibGVzLFxuICAgICAgdGFibGVOYW1lc01hcDogdGFibGVzQ29uZmlnLnRhYmxlTmFtZXNNYXBcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlc3Npb24gPSBuZXcgU1FMaXRlQnVuU2Vzc2lvbihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgeyBsb2dnZXIgfSk7XG4gIGNvbnN0IGRiID0gbmV3IEJ1blNRTGl0ZURhdGFiYXNlKFwic3luY1wiLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpO1xuICBkYi4kY2xpZW50ID0gY2xpZW50O1xuICByZXR1cm4gZGI7XG59XG5mdW5jdGlvbiBkcml6emxlKC4uLnBhcmFtcykge1xuICBpZiAocGFyYW1zWzBdID09PSB2b2lkIDAgfHwgdHlwZW9mIHBhcmFtc1swXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGluc3RhbmNlID0gcGFyYW1zWzBdID09PSB2b2lkIDAgPyBuZXcgRGF0YWJhc2UoKSA6IG5ldyBEYXRhYmFzZShwYXJhbXNbMF0pO1xuICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UsIHBhcmFtc1sxXSk7XG4gIH1cbiAgaWYgKGlzQ29uZmlnKHBhcmFtc1swXSkpIHtcbiAgICBjb25zdCB7IGNvbm5lY3Rpb24sIGNsaWVudCwgLi4uZHJpenpsZUNvbmZpZyB9ID0gcGFyYW1zWzBdO1xuICAgIGlmIChjbGllbnQpIHJldHVybiBjb25zdHJ1Y3QoY2xpZW50LCBkcml6emxlQ29uZmlnKTtcbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHsgc291cmNlLCAuLi5vcHRzIH0gPSBjb25uZWN0aW9uO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC52YWx1ZXMob3B0cykuZmlsdGVyKCh2KSA9PiB2ICE9PSB2b2lkIDApLmxlbmd0aCA/IG9wdHMgOiB2b2lkIDA7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSBuZXcgRGF0YWJhc2Uoc291cmNlLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UyLCBkcml6emxlQ29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0YWJhc2UoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgZHJpenpsZUNvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdChwYXJhbXNbMF0sIHBhcmFtc1sxXSk7XG59XG4oKGRyaXp6bGUyKSA9PiB7XG4gIGZ1bmN0aW9uIG1vY2soY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdCh7fSwgY29uZmlnKTtcbiAgfVxuICBkcml6emxlMi5tb2NrID0gbW9jaztcbn0pKGRyaXp6bGUgfHwgKGRyaXp6bGUgPSB7fSkpO1xuZXhwb3J0IHtcbiAgQnVuU1FMaXRlRGF0YWJhc2UsXG4gIGRyaXp6bGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcml2ZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgTm9vcExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7IGZpbGxQbGFjZWhvbGRlcnMsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUHJlcGFyZWRRdWVyeSBhcyBQcmVwYXJlZFF1ZXJ5QmFzZSwgU1FMaXRlU2Vzc2lvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9zZXNzaW9uLmpzXCI7XG5pbXBvcnQgeyBtYXBSZXN1bHRSb3cgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmNsYXNzIFNRTGl0ZUJ1blNlc3Npb24gZXh0ZW5kcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCBkaWFsZWN0LCBzY2hlbWEsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGRpYWxlY3QpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbmV3IE5vb3BMb2dnZXIoKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5TZXNzaW9uXCI7XG4gIGxvZ2dlcjtcbiAgZXhlYyhxdWVyeSkge1xuICAgIHRoaXMuY2xpZW50LmV4ZWMocXVlcnkpO1xuICB9XG4gIHByZXBhcmVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmNsaWVudC5wcmVwYXJlKHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIG5ldyBQcmVwYXJlZFF1ZXJ5KFxuICAgICAgc3RtdCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgICBmaWVsZHMsXG4gICAgICBleGVjdXRlTWV0aG9kLFxuICAgICAgaXNSZXNwb25zZUluQXJyYXlNb2RlLFxuICAgICAgY3VzdG9tUmVzdWx0TWFwcGVyXG4gICAgKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnID0ge30pIHtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLCB0aGlzLnNjaGVtYSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBuYXRpdmVUeCA9IHRoaXMuY2xpZW50LnRyYW5zYWN0aW9uKCgpID0+IHtcbiAgICAgIHJlc3VsdCA9IHRyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcbiAgICBuYXRpdmVUeFtjb25maWcuYmVoYXZpb3IgPz8gXCJkZWZlcnJlZFwiXSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJ1blRyYW5zYWN0aW9uIGV4dGVuZHMgU1FMaXRlVHJhbnNhY3Rpb24ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5UcmFuc2FjdGlvblwiO1xuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIGNvbnN0IHNhdmVwb2ludE5hbWUgPSBgc3Ake3RoaXMubmVzdGVkSW5kZXh9YDtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuc2NoZW1hLCB0aGlzLm5lc3RlZEluZGV4ICsgMSk7XG4gICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByZWxlYXNlIHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgcm9sbGJhY2sgdG8gc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQcmVwYXJlZFF1ZXJ5IGV4dGVuZHMgUHJlcGFyZWRRdWVyeUJhc2Uge1xuICBjb25zdHJ1Y3RvcihzdG10LCBxdWVyeSwgbG9nZ2VyLCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIF9pc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIHN1cGVyKFwic3luY1wiLCBleGVjdXRlTWV0aG9kLCBxdWVyeSk7XG4gICAgdGhpcy5zdG10ID0gc3RtdDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGUgPSBfaXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICAgIHRoaXMuY3VzdG9tUmVzdWx0TWFwcGVyID0gY3VzdG9tUmVzdWx0TWFwcGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blByZXBhcmVkUXVlcnlcIjtcbiAgcnVuKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnN0bXQucnVuKC4uLnBhcmFtcyk7XG4gIH1cbiAgYWxsKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgeyBmaWVsZHMsIHF1ZXJ5LCBsb2dnZXIsIGpvaW5zTm90TnVsbGFibGVNYXAsIHN0bXQsIGN1c3RvbVJlc3VsdE1hcHBlciB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcyAmJiAhY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgICAgbG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICAgIHJldHVybiBzdG10LmFsbCguLi5wYXJhbXMpO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gdGhpcy52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIocm93cyk7XG4gICAgfVxuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApKTtcbiAgfVxuICBnZXQocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpWzBdO1xuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkcywgam9pbnNOb3ROdWxsYWJsZU1hcCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiByb3c7XG4gICAgfVxuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIoW3Jvd10pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Um93KGZpZWxkcywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKTtcbiAgfVxuICB2YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC52YWx1ZXMoLi4ucGFyYW1zKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICB9XG59XG5leHBvcnQge1xuICBQcmVwYXJlZFF1ZXJ5LFxuICBTUUxpdGVCdW5TZXNzaW9uLFxuICBTUUxpdGVCdW5UcmFuc2FjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH0gZnJvbSBcIi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vbW9kZWxzL3VzZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFJlc3VtZUNvbW1hbmQgfSBmcm9tIFwiLi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcbmltcG9ydCB7IG1vZGVsc19leHBvcnRzIH0gZnJvbSBcIi4vbW9kZWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkcml6emxlIH0gZnJvbSBcImRyaXp6bGUtb3JtL2J1bi1zcWxpdGVcIjtcbmltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvaW5kZXgudHNcbmNvbnN0IERCX1BBVEggPSBwcm9jZXNzLmVudi5BVVRIX0RCX1BBVEggfHwgam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL2RiL2tpdHRlbi5kYlwiKTtcbmNvbnNvbGUubG9nKFwiVXNpbmcgREJfUEFUSDpcIiwgREJfUEFUSCk7XG5jb25zdCBzcWxpdGUgPSBuZXcgRGF0YWJhc2UoREJfUEFUSCk7XG5jb25zdCBkYiA9IGRyaXp6bGUoc3FsaXRlLCB7IHNjaGVtYToge1xuXHR1c2Vycyxcblx0Y2hhcmFjdGVycyxcblx0cmVzdW1lQ29tbWFuZHMsXG5cdG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNcbn0gfSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgQ2hhcmFjdGVySGVscGVyLCBEQl9QQVRILCBSZXN1bWVDb21tYW5kLCBVc2VySGVscGVyLCBkYiwgbW9kZWxzX2V4cG9ydHMgYXMgbW9kZWxzLCBzY2hlbWFfZXhwb3J0cyBhcyBzY2hlbWEgfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyByZWZyZXNoLCB2YWxpZGF0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2VzaS9hdXRoLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLnRzXG52YXIgQ2hhcmFjdGVySGVscGVyID0gY2xhc3MgQ2hhcmFjdGVySGVscGVyIHtcblx0c3RhdGljIGhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpIDwgY2hhcmFjdGVyLmV4cGlyZXNBdDtcblx0fVxuXHRzdGF0aWMgZ2V0U2NvcGVzKGNoYXJhY3Rlcikge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoY2hhcmFjdGVyLmFjY2Vzc1Rva2VuKTtcblx0XHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xuXHR9XG5cdHN0YXRpYyBoYXNPbmx5UHVibGljU2NvcGUoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikubGVuZ3RoID09PSAxICYmIHRoaXMuaGFzU2NvcGUoY2hhcmFjdGVyLCBcInB1YmxpY0RhdGFcIik7XG5cdH1cblx0c3RhdGljIGdldFRva2VucyhjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWNjZXNzX3Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRyZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0ZXhwaXJlc19pbjogKGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxZTNcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBoYXNTY29wZShjaGFyYWN0ZXIsIHNjb3BlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikuaW5jbHVkZXMoc2NvcGUpO1xuXHR9XG5cdHN0YXRpYyBoYXNBbGxTY29wZXMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCBoYXMgPSB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBzY29wZXMuZXZlcnkoKHNjb3BlKSA9PiBoYXMuaW5jbHVkZXMoc2NvcGUpKTtcblx0fVxuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyKHVzZXIpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VyLmlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyQW5kRXZlSUQodXNlcklELCBldmVJRCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpLCBlcShjaGFyYWN0ZXJzLmV2ZUlELCBldmVJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlOYW1lKHVzZXJJRCwgbmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSksIGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGV2ZUlELCBuYW1lLCB1c2VyLCB0b2tlbnMpIHtcblx0XHRyZXR1cm4gdGhpcy5zYXZlKHtcblx0XHRcdGV2ZUlELFxuXHRcdFx0dXNlcklEOiB1c2VyLmlkLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NfdG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSh0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoX3Rva2VuLFxuXHRcdFx0bmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlQ2hhcmFjdGVycyhxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKGNoYXJhY3RlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5leHBpcmVzQXQpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci51cGRhdGVkQXQpXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIFt7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRldmVJRDogcXVlcnkuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHF1ZXJ5LnVzZXJJRCxcblx0XHRcdGFjY2Vzc1Rva2VuOiBxdWVyeS5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUocXVlcnkuZXhwaXJlc0F0KSxcblx0XHRcdHJlZnJlc2hUb2tlbjogcXVlcnkucmVmcmVzaFRva2VuLFxuXHRcdFx0bmFtZTogcXVlcnkubmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KVxuXHRcdH1dO1xuXHR9XG5cdHN0YXRpYyBzYXZlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmluc2VydChjaGFyYWN0ZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0Y3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogY2hhcmFjdGVycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZEJ5VXNlckFuZEV2ZUlEKGNoYXJhY3Rlci51c2VySUQsIGNoYXJhY3Rlci5ldmVJRCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5kZWxldGUoY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgY2hhcmFjdGVyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHsgcmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbiB9LCBzY29wZXMpO1xuXHRcdGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2YWxpZGF0ZVRva2VuKHRva2Vucy5hY2Nlc3NfdG9rZW4pO1xuXHRcdGlmICghZGVjb2RlZCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIHRva2VuIGZvciBjaGFyYWN0ZXIgJHtjaGFyYWN0ZXIuZXZlSUR9YCk7XG5cdFx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHRcdH1cblx0XHRjaGFyYWN0ZXIuYWNjZXNzVG9rZW4gPSB0b2tlbnMuYWNjZXNzX3Rva2VuO1xuXHRcdGNoYXJhY3Rlci5leHBpcmVzQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpO1xuXHRcdGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gPSB0b2tlbnMucmVmcmVzaF90b2tlbjtcblx0XHR0aGlzLnNhdmUoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVTSV9MQVRFU1RfVVJMIH0gZnJvbSBcIi4vc2NvcGVzLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2ZldGNoLnRzXG5jb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuXHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYWNoZSkgaWYgKHZhbHVlLmV4cGlyZXMgPCBub3cpIGNhY2hlLmRlbGV0ZShrZXkpO1xufVxuc2V0SW50ZXJ2YWwoY2xlYW5DYWNoZSwgMWUzICogNjAgKiAxNSk7XG5jb25zdCBkZWZhdWx0Q2FjaGVEdXJhdGlvbiA9IDFlMyAqIDYwICogMzA7XG5hc3luYyBmdW5jdGlvbiBlc2lGZXRjaChwYXRoLCBjaGFyYWN0ZXIsIHsgbWV0aG9kID0gXCJHRVRcIiwgYm9keSwgbm9DYWNoZSA9IGZhbHNlLCBjYWNoZUR1cmF0aW9uID0gZGVmYXVsdENhY2hlRHVyYXRpb24gfSA9IHt9KSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgaGVhZGVycyA9IHtcblx0XHRcdFwiVXNlci1BZ2VudFwiOiBvcHRpb25zLnVzZXJfYWdlbnQsXG5cdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdH07XG5cdFx0aWYgKGNoYXJhY3Rlcikge1xuXHRcdFx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRcdGF3YWl0IENoYXJhY3RlckhlbHBlci5yZWZyZXNoVG9rZW5zKGNoYXJhY3Rlcik7XG5cdFx0XHRcdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbiBmb3IgY2hhcmFjdGVyOiAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdH1cblx0XHRcdGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2NoYXJhY3Rlci5hY2Nlc3NUb2tlbn1gO1xuXHRcdH1cblx0XHRjb25zdCBpbml0ID0ge1xuXHRcdFx0aGVhZGVycyxcblx0XHRcdG1ldGhvZDogbWV0aG9kIHx8IFwiR0VUXCIsXG5cdFx0XHRib2R5OiBib2R5IHx8IHZvaWQgMFxuXHRcdH07XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChgJHtFU0lfTEFURVNUX1VSTH0ke3BhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRofWApO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZGF0YXNvdXJjZVwiLCBcInRyYW5xdWlsaXR5XCIpO1xuXHRcdGlmICghbm9DYWNoZSAmJiBpbml0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuXHRcdFx0Y29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KHVybC5ocmVmKTtcblx0XHRcdGlmIChjYWNoZWQgJiYgY2FjaGVkPy5leHBpcmVzID4gRGF0ZS5ub3coKSkgcmV0dXJuIGNhY2hlZC5kYXRhO1xuXHRcdH1cblx0XHRjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGluaXQpO1xuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXHRcdGlmICghcmVzLm9rKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBFU0kgcmVxdWVzdCBmYWlsdXJlIGF0ICR7cGF0aH0gfCAke3Jlcy5zdGF0dXN9OiR7cmVzLnN0YXR1c1RleHR9ID0+ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKGluaXQubWV0aG9kID09PSBcIkdFVFwiKSBjYWNoZS5zZXQodXJsLmhyZWYsIHtcblx0XHRcdGV4cGlyZXM6IE1hdGgubWF4KHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgJiYgbmV3IERhdGUoTnVtYmVyKHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgfHwgXCJcIikpLmdldFRpbWUoKSB8fCAwLCBEYXRlLm5vdygpICsgY2FjaGVEdXJhdGlvbiksXG5cdFx0XHRkYXRhXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVTSSByZXF1ZXN0IGZhaWx1cmUgYXQgJHtwYXRofSB8ICR7SlNPTi5zdHJpbmdpZnkoZXJyKX1gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgZXNpRmV0Y2ggfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9zY29wZXMuanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvY2hhcmFjdGVyLnRzXG52YXIgY2hhcmFjdGVyX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoYXJhY3Rlcl9leHBvcnRzLCB7XG5cdGdldENoYXJhY3RlckFmZmlsaWF0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoOiAoKSA9PiBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLFxuXHRnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMsXG5cdGdldENoYXJhY3RlckFzc2V0TmFtZXM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0TmFtZXMsXG5cdGdldENoYXJhY3RlckFzc2V0czogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRzLFxuXHRnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLFxuXHRnZXRDaGFyYWN0ZXJDbG9uZXM6ICgpID0+IGdldENoYXJhY3RlckNsb25lcyxcblx0Z2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3Rvcnk6ICgpID0+IGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeSxcblx0Z2V0Q2hhcmFjdGVyQ3VycmVudFNoaXA6ICgpID0+IGdldENoYXJhY3RlckN1cnJlbnRTaGlwLFxuXHRnZXRDaGFyYWN0ZXJJbXBsYW50czogKCkgPT4gZ2V0Q2hhcmFjdGVySW1wbGFudHMsXG5cdGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlOiAoKSA9PiBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZSxcblx0Z2V0Q2hhcmFjdGVyTG9jYXRpb246ICgpID0+IGdldENoYXJhY3RlckxvY2F0aW9uLFxuXHRnZXRDaGFyYWN0ZXJNZWRhbHM6ICgpID0+IGdldENoYXJhY3Rlck1lZGFscyxcblx0Z2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyT25saW5lOiAoKSA9PiBnZXRDaGFyYWN0ZXJPbmxpbmUsXG5cdGdldENoYXJhY3RlclBvcnRyYWl0czogKCkgPT4gZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLFxuXHRnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhOiAoKSA9PiBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLFxuXHRnZXRDaGFyYWN0ZXJSb2xlczogKCkgPT4gZ2V0Q2hhcmFjdGVyUm9sZXMsXG5cdGdldENoYXJhY3RlclN0YW5kaW5nczogKCkgPT4gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLFxuXHRnZXRDaGFyYWN0ZXJUaXRsZXM6ICgpID0+IGdldENoYXJhY3RlclRpdGxlcyxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0OiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXQsXG5cdGdldENoYXJhY3RlcldhbGxldEpvdXJuYWw6ICgpID0+IGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwsXG5cdGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLFxuXHRnZXRQb3J0cmFpdFVSTDogKCkgPT4gZ2V0UG9ydHJhaXRVUkxcbn0pO1xuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUHVibGljRGF0YShpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zKGlkcykge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzL2FmZmlsaWF0aW9uL2AsIHZvaWQgMCwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KVswXTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclBvcnRyYWl0cyhpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5KGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vY29ycG9yYXRpb25oaXN0b3J5L2ApO1xufVxuZnVuY3Rpb24gZ2V0UG9ydHJhaXRVUkwoaWQpIHtcblx0cmV0dXJuIGBodHRwczovL2ltYWdlcy5ldmV0ZWNoLm5ldC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0YDtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclJvbGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3JvbGVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJUaXRsZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX3RpdGxlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3RpdGxlcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9zdGFuZGluZ3MvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ub3RpZmljYXRpb25zL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L25vdGlmaWNhdGlvbnMvY29udGFjdHNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTWVkYWxzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9tZWRhbHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vZmF0aWd1ZS9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2JsdWVwcmludHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFnZW50UmVzZWFyY2goY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2FnZW50c19yZXNlYXJjaC9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xvbmVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNsb25lcy5yZWFkX2Nsb25lcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Nsb25lcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVySW1wbGFudHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9pbXBsYW50cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbG9jYXRpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0TmFtZXMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbmFtZXMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0KGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucyhjaGFyYWN0ZXIsIGZyb21JZCkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvdHJhbnNhY3Rpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoZnJvbUlkKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwoY2hhcmFjdGVyLCBwYWdlID0gMSkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvam91cm5hbC8/cGFnZT0ke3BhZ2V9YCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckxvY2F0aW9uKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9sb2NhdGlvbi9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyT25saW5lKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vb25saW5lL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX3NoaXBfdHlwZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NoaXAvYCwgY2hhcmFjdGVyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJfZXhwb3J0cywgZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLCBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLCBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucywgZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcywgZ2V0Q2hhcmFjdGVyQXNzZXRzLCBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLCBnZXRDaGFyYWN0ZXJDbG9uZXMsIGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLCBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnksIGdldENoYXJhY3RlckN1cnJlbnRTaGlwLCBnZXRDaGFyYWN0ZXJJbXBsYW50cywgZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUsIGdldENoYXJhY3RlckxvY2F0aW9uLCBnZXRDaGFyYWN0ZXJNZWRhbHMsIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMsIGdldENoYXJhY3Rlck9ubGluZSwgZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLCBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLCBnZXRDaGFyYWN0ZXJSb2xlcywgZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLCBnZXRDaGFyYWN0ZXJUaXRsZXMsIGdldENoYXJhY3RlcldhbGxldCwgZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbCwgZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLCBnZXRQb3J0cmFpdFVSTCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2NvcnBvcmF0aW9uLnRzXG52YXIgY29ycG9yYXRpb25fZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoY29ycG9yYXRpb25fZXhwb3J0cywge1xuXHRnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeTogKCkgPT4gZ2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3RvcnksXG5cdGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnMsXG5cdGdldENvcnBvcmF0aW9uQXNzZXROYW1lczogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzLFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0czogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldHMsXG5cdGdldENvcnBvcmF0aW9uRGF0YTogKCkgPT4gZ2V0Q29ycG9yYXRpb25EYXRhLFxuXHRnZXRDb3Jwb3JhdGlvbkljb25zOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkljb25zXG59KTtcbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uRGF0YShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYWxsaWFuY2VoaXN0b3J5L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25JY29ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vaWNvbnMvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0cyhpZCwgY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9ucyhpZCwgY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL2xvY2F0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXMoaWQsIGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9uYW1lcy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY29ycG9yYXRpb25fZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hbGxpYW5jZS50c1xudmFyIGFsbGlhbmNlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGFsbGlhbmNlX2V4cG9ydHMsIHtcblx0Z2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnM6ICgpID0+IGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLFxuXHRnZXRBbGxpYW5jZURhdGE6ICgpID0+IGdldEFsbGlhbmNlRGF0YSxcblx0Z2V0QWxsaWFuY2VJY29uczogKCkgPT4gZ2V0QWxsaWFuY2VJY29uc1xufSk7XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZURhdGEoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2NvcnBvcmF0aW9ucy9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlSWNvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ljb25zL2ApO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGFsbGlhbmNlX2V4cG9ydHMsIGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLCBnZXRBbGxpYW5jZURhdGEsIGdldEFsbGlhbmNlSWNvbnMgfTsiLAogICAgImltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2tpbGxzLnRzXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2F0dHJpYnV0ZXNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2tpbGxRdWV1ZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxxdWV1ZWAsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTa2lsbHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRyYWluaW5nUGVyY2VudGFnZShxdWV1ZWRTa2lsbCkge1xuXHRjb25zdCB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gPSAocXVldWVkU2tpbGwudHJhaW5pbmdfc3RhcnRfc3AgLSBxdWV1ZWRTa2lsbC5sZXZlbF9zdGFydF9zcCkgLyBxdWV1ZWRTa2lsbC5sZXZlbF9lbmRfc3A7XG5cdGNvbnN0IHRpbWVQb3NpdGlvbiA9ICgoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSkgLyAobmV3IERhdGUocXVldWVkU2tpbGwuZmluaXNoX2RhdGUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSk7XG5cdHJldHVybiB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gKyAoMSAtIHRyYWluaW5nU3RhcnRQb3NpdGlvbikgKiB0aW1lUG9zaXRpb247XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlLCBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzLCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlLCBnZXRDaGFyYWN0ZXJTa2lsbHMgfTsiLAogICAgIlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZXMoaGVhZGVyczogSGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llSGVhZGVyID0gaGVhZGVycy5nZXQoXCJDb29raWVcIik7XG4gIGNvbnN0IGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBpZiAoY29va2llSGVhZGVyID09PSBudWxsKSByZXR1cm4ge307XG5cbiAgZm9yIChjb25zdCBrdiBvZiBjb29raWVIZWFkZXIuc3BsaXQoXCI7XCIpKSB7XG4gICAgY29uc3QgW2Nvb2tpZUtleSwgLi4uY29va2llVmFsXSA9IGt2LnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBrZXkgPSBjb29raWVLZXkudHJpbSgpO1xuICAgIGNvb2tpZXNba2V5XSA9IGNvb2tpZVZhbC5qb2luKFwiPVwiKTtcbiAgfVxuXG4gIHJldHVybiBjb29raWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1heEFnZT86IG51bWJlcikge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09JHt2YWx1ZX0ke21heEFnZSA/ICc7IFBhdGg9LzsgTWF4LUFnZT0nICsgbWF4QWdlIDogJyd9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZykge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09XCJcIjsgUGF0aD0vOyBNYXgtQWdlPS0xO2ApO1xufSIsCiAgICAiY29uc3QgaGV4QWxwaGFiZXQgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbmNvbnN0IGhleERlY29kZU1hcCA9IG5ldyBNYXAoW1xuICAgIFtcIjBcIiwgMF0sXG4gICAgW1wiMVwiLCAxXSxcbiAgICBbXCIyXCIsIDJdLFxuICAgIFtcIjNcIiwgM10sXG4gICAgW1wiNFwiLCA0XSxcbiAgICBbXCI1XCIsIDVdLFxuICAgIFtcIjZcIiwgNl0sXG4gICAgW1wiN1wiLCA3XSxcbiAgICBbXCI4XCIsIDhdLFxuICAgIFtcIjlcIiwgOV0sXG4gICAgW1wiQVwiLCAxMF0sXG4gICAgW1wiQlwiLCAxMV0sXG4gICAgW1wiQ1wiLCAxMl0sXG4gICAgW1wiRFwiLCAxM10sXG4gICAgW1wiRVwiLCAxNF0sXG4gICAgW1wiRlwiLCAxNV0sXG4gICAgW1wiYVwiLCAxMF0sXG4gICAgW1wiYlwiLCAxMV0sXG4gICAgW1wiY1wiLCAxMl0sXG4gICAgW1wiZFwiLCAxM10sXG4gICAgW1wiZVwiLCAxNF0sXG4gICAgW1wiZlwiLCAxNV1cbl0pO1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUhleChkYXRhKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleTEgPSBieXRlc1tpXSA+PiA0O1xuICAgICAgICByZXN1bHQgKz0gaGV4QWxwaGFiZXRba2V5MV07XG4gICAgICAgIGNvbnN0IGtleTIgPSBieXRlc1tpXSAmIDB4MGY7XG4gICAgICAgIHJlc3VsdCArPSBoZXhBbHBoYWJldFtrZXkyXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVIZXgoZGF0YSkge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyAyKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShjaHVua0NvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgYnVmZmVyID0gMDtcbiAgICAgICAgY29uc3QgZW5jb2RlZDEgPSBkYXRhW2kgKiAyXTtcbiAgICAgICAgY29uc3QgdmFsdWUxID0gaGV4RGVjb2RlTWFwLmdldChlbmNvZGVkMSkgPz8gbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcjogJHtlbmNvZGVkMX1gKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgKz0gdmFsdWUxIDw8IDQ7XG4gICAgICAgIGNvbnN0IGVuY29kZWQyID0gZGF0YVtpICogMiArIDFdO1xuICAgICAgICBpZiAoZW5jb2RlZDIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlMiA9IGhleERlY29kZU1hcC5nZXQoZW5jb2RlZDIpID8/IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZTIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXI6ICR7ZW5jb2RlZDF9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyICs9IHZhbHVlMjtcbiAgICAgICAgcmVzdWx0W2ldID0gYnVmZmVyO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICJleHBvcnQgY2xhc3MgQmFzZTMyRW5jb2Rpbmcge1xuICAgIGFscGhhYmV0O1xuICAgIHBhZGRpbmc7XG4gICAgZGVjb2RlTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0cnVjdG9yKGFscGhhYmV0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChhbHBoYWJldC5sZW5ndGggIT09IDMyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFscGhhYmV0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxwaGFiZXQgPSBhbHBoYWJldDtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0aW9ucz8ucGFkZGluZyA/PyBcIj1cIjtcbiAgICAgICAgaWYgKHRoaXMuYWxwaGFiZXQuaW5jbHVkZXModGhpcy5wYWRkaW5nKSB8fCB0aGlzLnBhZGRpbmcubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVNYXAuc2V0KGFscGhhYmV0W2ldLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmNvZGUoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDA7XG4gICAgICAgIGxldCBzaGlmdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA4KSB8IGRhdGFbaV07XG4gICAgICAgICAgICBzaGlmdCArPSA4O1xuICAgICAgICAgICAgd2hpbGUgKHNoaWZ0ID49IDUpIHtcbiAgICAgICAgICAgICAgICBzaGlmdCAtPSA1O1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmFscGhhYmV0WyhidWZmZXIgPj4gc2hpZnQpICYgMHgxZl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuYWxwaGFiZXRbKGJ1ZmZlciA8PCAoNSAtIHNoaWZ0KSkgJiAweDFmXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmNsdWRlUGFkZGluZyA9IG9wdGlvbnM/LmluY2x1ZGVQYWRkaW5nID8/IHRydWU7XG4gICAgICAgIGlmIChpbmNsdWRlUGFkZGluZykge1xuICAgICAgICAgICAgY29uc3QgcGFkQ291bnQgPSAoOCAtIChyZXN1bHQubGVuZ3RoICUgOCkpICUgODtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzdHJpY3QgPSBvcHRpb25zPy5zdHJpY3QgPz8gdHJ1ZTtcbiAgICAgICAgY29uc3QgY2h1bmtDb3VudCA9IE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIDgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWRDb3VudCA9IDA7XG4gICAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGRhdGFbaSAqIDggKyBqXTtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZCA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxICE9PSBjaHVua0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2VuY29kZWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFkQ291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhZENvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVjb2RlTWFwLmdldChlbmNvZGVkKSA/PyBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2VuY29kZWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRDb3VudCA9PT0gOCB8fCBwYWRDb3VudCA9PT0gNyB8fCBwYWRDb3VudCA9PT0gNSB8fCBwYWRDb3VudCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ5dGUxID0gKGNodW5rc1swXSA8PCAzKSArIChjaHVua3NbMV0gPj4gMik7XG4gICAgICAgICAgICByZXN1bHQucHVzaChieXRlMSk7XG4gICAgICAgICAgICBpZiAocGFkQ291bnQgPCA2KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZTIgPSAoKGNodW5rc1sxXSAmIDB4MDMpIDw8IDYpICsgKGNodW5rc1syXSA8PCAxKSArIChjaHVua3NbM10gPj4gNCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYnl0ZTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZENvdW50IDwgNCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGUzID0gKChjaHVua3NbM10gJiAweGZmKSA8PCA0KSArIChjaHVua3NbNF0gPj4gMSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYnl0ZTMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZENvdW50IDwgMykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGU0ID0gKChjaHVua3NbNF0gJiAweDAxKSA8PCA3KSArIChjaHVua3NbNV0gPDwgMikgKyAoY2h1bmtzWzZdID4+IDMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJ5dGU0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRDb3VudCA8IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlNSA9ICgoY2h1bmtzWzZdICYgMHgwNykgPDwgNSkgKyBjaHVua3NbN107XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYnl0ZTUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgYmFzZTMyID0gbmV3IEJhc2UzMkVuY29kaW5nKFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjdcIik7XG5leHBvcnQgY29uc3QgYmFzZTMyaGV4ID0gbmV3IEJhc2UzMkVuY29kaW5nKFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZcIik7XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGBiYXNlMzIuZW5jb2RlKClgIGluc3RlYWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzIoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBiYXNlMzIuZW5jb2RlKG5ldyBVaW50OEFycmF5KGRhdGEpLCB7XG4gICAgICAgIGluY2x1ZGVQYWRkaW5nOiBvcHRpb25zPy5wYWRkaW5nID8/IHRydWVcbiAgICB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYGJhc2UzMi5kZWNvZGUoKWAgaW5zdGVhZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMihkYXRhKSB7XG4gICAgcmV0dXJuIGJhc2UzMi5kZWNvZGUoZGF0YSwge1xuICAgICAgICBzdHJpY3Q6IGZhbHNlXG4gICAgfSk7XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBCYXNlNjRFbmNvZGluZyB7XG4gICAgYWxwaGFiZXQ7XG4gICAgcGFkZGluZztcbiAgICBkZWNvZGVNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoYWxwaGFiZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGFscGhhYmV0Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYWxwaGFiZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbHBoYWJldCA9IGFscGhhYmV0O1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRpb25zPy5wYWRkaW5nID8/IFwiPVwiO1xuICAgICAgICBpZiAodGhpcy5hbHBoYWJldC5pbmNsdWRlcyh0aGlzLnBhZGRpbmcpIHx8IHRoaXMucGFkZGluZy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRlY29kZU1hcC5zZXQoYWxwaGFiZXRbaV0sIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBsZXQgYnVmZmVyID0gMDtcbiAgICAgICAgbGV0IHNoaWZ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgZGF0YVtpXTtcbiAgICAgICAgICAgIHNoaWZ0ICs9IDg7XG4gICAgICAgICAgICB3aGlsZSAoc2hpZnQgPj0gNikge1xuICAgICAgICAgICAgICAgIHNoaWZ0ICs9IC02O1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmFscGhhYmV0WyhidWZmZXIgPj4gc2hpZnQpICYgMHgzZl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuYWxwaGFiZXRbKGJ1ZmZlciA8PCAoNiAtIHNoaWZ0KSkgJiAweDNmXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmNsdWRlUGFkZGluZyA9IG9wdGlvbnM/LmluY2x1ZGVQYWRkaW5nID8/IHRydWU7XG4gICAgICAgIGlmIChpbmNsdWRlUGFkZGluZykge1xuICAgICAgICAgICAgY29uc3QgcGFkQ291bnQgPSAoNCAtIChyZXN1bHQubGVuZ3RoICUgNCkpICUgNDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzdHJpY3QgPSBvcHRpb25zPy5zdHJpY3QgPz8gdHJ1ZTtcbiAgICAgICAgY29uc3QgY2h1bmtDb3VudCA9IE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIDQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWRDb3VudCA9IDA7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGRhdGFbaSAqIDQgKyBqXTtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZCA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxICE9PSBjaHVua0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2VuY29kZWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFkQ291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhZENvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVjb2RlTWFwLmdldChlbmNvZGVkKSA/PyBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2VuY29kZWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSB2YWx1ZSA8PCAoNiAqICgzIC0gaikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGJ1ZmZlciA+PiAxNikgJiAweGZmKTtcbiAgICAgICAgICAgIGlmIChwYWRDb3VudCA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgoYnVmZmVyID4+IDgpICYgMHhmZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkQ291bnQgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYnVmZmVyICYgMHhmZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXN1bHQpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBiYXNlNjQgPSBuZXcgQmFzZTY0RW5jb2RpbmcoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIpO1xuZXhwb3J0IGNvbnN0IGJhc2U2NHVybCA9IG5ldyBCYXNlNjRFbmNvZGluZyhcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9cIik7XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGBiYXNlNjQuZW5jb2RlKClgIGluc3RlYWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKG5ldyBVaW50OEFycmF5KGRhdGEpLCB7XG4gICAgICAgIGluY2x1ZGVQYWRkaW5nOiBvcHRpb25zPy5wYWRkaW5nID8/IHRydWVcbiAgICB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYGJhc2U2NC5kZWNvZGUoKWAgaW5zdGVhZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NChkYXRhKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5kZWNvZGUoZGF0YSwge1xuICAgICAgICBzdHJpY3Q6IGZhbHNlXG4gICAgfSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGBiYXNlNjR1cmwuZW5jb2RlKClgIGluc3RlYWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmwoZGF0YSkge1xuICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKG5ldyBVaW50OEFycmF5KGRhdGEpLCB7XG4gICAgICAgIGluY2x1ZGVQYWRkaW5nOiBmYWxzZVxuICAgIH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIFVzZSBgYmFzZTY0dXJsLmRlY29kZSgpYCBpbnN0ZWFkICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsKGRhdGEpIHtcbiAgICByZXR1cm4gYmFzZTY0dXJsLmRlY29kZShkYXRhLCB7XG4gICAgICAgIHN0cmljdDogZmFsc2VcbiAgICB9KTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYmFzZTY0LCBiYXNlNjR1cmwgfSBmcm9tIFwiLi4vZW5jb2RpbmcvaW5kZXguanNcIjtcbmV4cG9ydCBjbGFzcyBPQXV0aDJDbGllbnQge1xuICAgIGNsaWVudElkO1xuICAgIGF1dGhvcml6ZUVuZHBvaW50O1xuICAgIHRva2VuRW5kcG9pbnQ7XG4gICAgcmVkaXJlY3RVUkk7XG4gICAgY29uc3RydWN0b3IoY2xpZW50SWQsIGF1dGhvcml6ZUVuZHBvaW50LCB0b2tlbkVuZHBvaW50LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICAgICAgdGhpcy5hdXRob3JpemVFbmRwb2ludCA9IGF1dGhvcml6ZUVuZHBvaW50O1xuICAgICAgICB0aGlzLnRva2VuRW5kcG9pbnQgPSB0b2tlbkVuZHBvaW50O1xuICAgICAgICB0aGlzLnJlZGlyZWN0VVJJID0gb3B0aW9ucz8ucmVkaXJlY3RVUkkgPz8gbnVsbDtcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlQXV0aG9yaXphdGlvblVSTChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IEFycmF5LmZyb20obmV3IFNldChvcHRpb25zPy5zY29wZXMgPz8gW10pKTsgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvblVybCA9IG5ldyBVUkwodGhpcy5hdXRob3JpemVFbmRwb2ludCk7XG4gICAgICAgIGF1dGhvcml6YXRpb25Vcmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuICAgICAgICBhdXRob3JpemF0aW9uVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnRfaWRcIiwgdGhpcy5jbGllbnRJZCk7XG4gICAgICAgIGlmIChvcHRpb25zPy5zdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGF0ZVwiLCBvcHRpb25zLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Vcmwuc2VhcmNoUGFyYW1zLnNldChcInNjb3BlXCIsIHNjb3Blcy5qb2luKFwiIFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RVUkkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Vcmwuc2VhcmNoUGFyYW1zLnNldChcInJlZGlyZWN0X3VyaVwiLCB0aGlzLnJlZGlyZWN0VVJJKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uY29kZVZlcmlmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBvcHRpb25zPy5jb2RlQ2hhbGxlbmdlTWV0aG9kID8/IFwiUzI1NlwiO1xuICAgICAgICAgICAgaWYgKGNvZGVDaGFsbGVuZ2VNZXRob2QgPT09IFwiUzI1NlwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZUNoYWxsZW5nZUJ1ZmZlciA9IGF3YWl0IHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUob3B0aW9ucy5jb2RlVmVyaWZpZXIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYmFzZTY0dXJsLmVuY29kZShuZXcgVWludDhBcnJheShjb2RlQ2hhbGxlbmdlQnVmZmVyKSwge1xuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFkZGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjb2RlX2NoYWxsZW5nZVwiLCBjb2RlQ2hhbGxlbmdlKTtcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjb2RlX2NoYWxsZW5nZV9tZXRob2RcIiwgXCJTMjU2XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29kZUNoYWxsZW5nZU1ldGhvZCA9PT0gXCJwbGFpblwiKSB7XG4gICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvblVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY29kZV9jaGFsbGVuZ2VcIiwgb3B0aW9ucy5jb2RlVmVyaWZpZXIpO1xuICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb25Vcmwuc2VhcmNoUGFyYW1zLnNldChcImNvZGVfY2hhbGxlbmdlX21ldGhvZFwiLCBcInBsYWluXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgJ2NvZGVDaGFsbGVuZ2VNZXRob2QnOiAke2NvZGVDaGFsbGVuZ2VNZXRob2R9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGhvcml6YXRpb25Vcmw7XG4gICAgfVxuICAgIGFzeW5jIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUoYXV0aG9yaXphdGlvbkNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgYm9keS5zZXQoXCJjb2RlXCIsIGF1dGhvcml6YXRpb25Db2RlKTtcbiAgICAgICAgYm9keS5zZXQoXCJjbGllbnRfaWRcIiwgdGhpcy5jbGllbnRJZCk7XG4gICAgICAgIGJvZHkuc2V0KFwiZ3JhbnRfdHlwZVwiLCBcImF1dGhvcml6YXRpb25fY29kZVwiKTtcbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RVUkkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGJvZHkuc2V0KFwicmVkaXJlY3RfdXJpXCIsIHRoaXMucmVkaXJlY3RVUkkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5jb2RlVmVyaWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm9keS5zZXQoXCJjb2RlX3ZlcmlmaWVyXCIsIG9wdGlvbnMuY29kZVZlcmlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kVG9rZW5SZXF1ZXN0KGJvZHksIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIGJvZHkuc2V0KFwicmVmcmVzaF90b2tlblwiLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICBib2R5LnNldChcImNsaWVudF9pZFwiLCB0aGlzLmNsaWVudElkKTtcbiAgICAgICAgYm9keS5zZXQoXCJncmFudF90eXBlXCIsIFwicmVmcmVzaF90b2tlblwiKTtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KG9wdGlvbnM/LnNjb3BlcyA/PyBbXSkpOyAvLyByZW1vdmUgZHVwbGljYXRlc1xuICAgICAgICBpZiAoc2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJvZHkuc2V0KFwic2NvcGVcIiwgc2NvcGVzLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kVG9rZW5SZXF1ZXN0KGJvZHksIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBzZW5kVG9rZW5SZXF1ZXN0KGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIGhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgICAgICBoZWFkZXJzLnNldChcIkFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIGhlYWRlcnMuc2V0KFwiVXNlci1BZ2VudFwiLCBcIm9zbG9cIik7XG4gICAgICAgIGlmIChvcHRpb25zPy5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoZW50aWNhdGVXaXRoID0gb3B0aW9ucz8uYXV0aGVudGljYXRlV2l0aCA/PyBcImh0dHBfYmFzaWNfYXV0aFwiO1xuICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZVdpdGggPT09IFwiaHR0cF9iYXNpY19hdXRoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVkQ3JlZGVudGlhbHMgPSBiYXNlNjQuZW5jb2RlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShgJHt0aGlzLmNsaWVudElkfToke29wdGlvbnMuY3JlZGVudGlhbHN9YCkpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmFzaWMgJHtlbmNvZGVkQ3JlZGVudGlhbHN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVXaXRoID09PSBcInJlcXVlc3RfYm9keVwiKSB7XG4gICAgICAgICAgICAgICAgYm9keS5zZXQoXCJjbGllbnRfc2VjcmV0XCIsIG9wdGlvbnMuY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgJ2F1dGhlbnRpY2F0ZVdpdGgnOiAke2F1dGhlbnRpY2F0ZVdpdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHRoaXMudG9rZW5FbmRwb2ludCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIHByb3ZpZGVycyBhcmUgYWxsb3dlZCB0byByZXR1cm4gbm9uLTQwMCBzdGF0dXMgY29kZSBmb3IgZXJyb3JzXG4gICAgICAgIGlmICghKFwiYWNjZXNzX3Rva2VuXCIgaW4gcmVzdWx0KSAmJiBcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT0F1dGgyUmVxdWVzdEVycm9yKHJlcXVlc3QsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT0F1dGgyUmVxdWVzdEVycm9yKHJlcXVlc3QsIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvZGVWZXJpZmllcigpIHtcbiAgICBjb25zdCByYW5kb21WYWx1ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21WYWx1ZXMpO1xuICAgIHJldHVybiBiYXNlNjR1cmwuZW5jb2RlKHJhbmRvbVZhbHVlcywge1xuICAgICAgICBpbmNsdWRlUGFkZGluZzogZmFsc2VcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YXRlKCkge1xuICAgIGNvbnN0IHJhbmRvbVZhbHVlcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbVZhbHVlcyk7XG4gICAgcmV0dXJuIGJhc2U2NHVybC5lbmNvZGUocmFuZG9tVmFsdWVzLCB7XG4gICAgICAgIGluY2x1ZGVQYWRkaW5nOiBmYWxzZVxuICAgIH0pO1xufVxuZXhwb3J0IGNsYXNzIE9BdXRoMlJlcXVlc3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICByZXF1ZXN0O1xuICAgIGRlc2NyaXB0aW9uO1xuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3QsIGJvZHkpIHtcbiAgICAgICAgc3VwZXIoYm9keS5lcnJvciA/PyBcIlwiKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGJvZHkuZXJyb3JfZGVzY3JpcHRpb24gPz8gbnVsbDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5pbXBvcnQge1xuICBjcmVhdGVBdXRob3JpemF0aW9uVVJMIGFzIGV2ZUF1dGhVUkwsXG4gIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsXG4gIHZhbGlkYXRlVG9rZW4sXG4gIHR5cGUgRXZlVG9rZW5zLFxufSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2VzaSc7XG5pbXBvcnQgeyBnZXRDb29raWVzLCByZW1vdmVDb29raWUsIHNldENvb2tpZSB9IGZyb20gJ0AvdXRpbHMvY29va2llcyc7XG5pbXBvcnQgeyBPQXV0aDJSZXF1ZXN0RXJyb3IgfSBmcm9tICdvc2xvL29hdXRoMic7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnQHN0YXIta2l0dGVuL2V2ZS9lc2knO1xuXG5leHBvcnQgdHlwZSBFVkVBdXRoID0ge1xuICB2YWxpZGF0ZVRva2VuOiB0eXBlb2YgdmFsaWRhdGVUb2tlbjtcbiAgdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZTogKGNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTxFdmVUb2tlbnM+O1xuICB2YWxpZGF0ZTogKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4gUHJvbWlzZTxFdmVUb2tlbnM+O1xuICByZWRpcmVjdDogKHNjb3Blcz86IHN0cmluZykgPT4gUHJvbWlzZTxSZXNwb25zZT47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG1pZGRsZXdhcmUocmVxOiBSZXF1ZXN0Q29udGV4dCkge1xuXG4gIHJlcS5zdG9yZS5zZXQoJ29wdGlvbnMnLCBvcHRpb25zKTtcblxuICBjb25zdCByZWRpcmVjdCA9IGFzeW5jIChzY29wZXM/OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgeyB1cmwsIHN0YXRlIH0gPSBhd2FpdCBldmVBdXRoVVJMKHNjb3Blcyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoJycsIHsgc3RhdHVzOiAzMDIgfSk7XG4gICAgc2V0Q29va2llKHJlc3BvbnNlLCAnc3RhdGUnLCBzdGF0ZSwgNjAgKiAxMCAvKiAxMCBtaW4gKi8pO1xuICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KCdsb2NhdGlvbicsIHVybC5ocmVmKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBldmVhdXRoOiBFVkVBdXRoID0ge1xuICAgIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGU6IChjb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlKGNvZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9BdXRoMlJlcXVlc3RFcnJvcihyZXEsIHtcbiAgICAgICAgICBlcnJvcjogYEZhaWxlZCB0byBhdXRoZW50aWNhdGUgd2l0aCBFVkUgT25saW5lICR7ZXJyb3J9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0ZVRva2VuLFxuXG4gICAgdmFsaWRhdGU6IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTChyZXEudXJsKS5zZWFyY2hQYXJhbXM7XG4gICAgICBjb25zdCBjb2RlID0gcXVlcnkuZ2V0KCdjb2RlJyk7XG4gICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGNvZGUgbWlzc2luZyBmcm9tIHF1ZXJ5IHBhcmFtZXRlcnMsIHRoZXJlIG1heSBiZSBhbiBlcnJvciB3aXRoIHRoZSBPQXV0aCBwcm92aWRlcmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb29raWVzID0gZ2V0Q29va2llcyhyZXEuaGVhZGVycyk7XG5cbiAgICAgIGlmIChjb29raWVzWydzdGF0ZSddICE9PSBxdWVyeS5nZXQoJ3N0YXRlJykpIHRocm93IEVycm9yKCdpbnZhbGlkIHN0YXRlJyk7XG4gICAgICByZW1vdmVDb29raWUocmVzcG9uc2UsICdzdGF0ZScpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlKGNvZGUpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gYXdhaXQgdmFsaWRhdGVUb2tlbih0b2tlbnMuYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgaWYgKCFkZWNvZGVkKSB0aHJvdyAnSW52YWxpZCBUb2tlbic7XG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgT0F1dGgyUmVxdWVzdEVycm9yKHJlcSwge1xuICAgICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIEVWRSBPbmxpbmUgJHtlcnJvcn1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVkaXJlY3QsXG4gIH1cblxuICByZXEuc3RvcmUuc2V0KCdldmVhdXRoJywgZXZlYXV0aCk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSb3V0ZSBBdXRob3JpemF0aW9uXG5cbn0iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLElBQUk7QUFBQSxFQUNKLElBQUksVUFBUyxPQUFPO0FBQUEsRUFHcEIsU0FBUyxTQUFVLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDNUIsU0FBUyxPQUFPLEtBQUs7QUFBQSxNQUNuQixJQUFJLE9BQU8sSUFBSTtBQUFBLElBQ2pCO0FBQUE7QUFBQSxFQUVGLElBQUksUUFBTyxRQUFRLFFBQU8sU0FBUyxRQUFPLGVBQWUsUUFBTyxpQkFBaUI7QUFBQSxJQUMvRSxPQUFPLFVBQVU7QUFBQSxFQUNuQixFQUFPO0FBQUEsSUFFTCxVQUFVLFFBQVEsT0FBTztBQUFBLElBQ3pCLFFBQVEsU0FBUztBQUFBO0FBQUEsRUFHbkIsU0FBUyxVQUFXLENBQUMsS0FBSyxrQkFBa0IsUUFBUTtBQUFBLElBQ2xELE9BQU8sUUFBTyxLQUFLLGtCQUFrQixNQUFNO0FBQUE7QUFBQSxFQUc3QyxXQUFXLFlBQVksT0FBTyxPQUFPLFFBQU8sU0FBUztBQUFBLEVBR3JELFVBQVUsU0FBUSxVQUFVO0FBQUEsRUFFNUIsV0FBVyxPQUFPLFFBQVMsQ0FBQyxLQUFLLGtCQUFrQixRQUFRO0FBQUEsSUFDekQsSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNCLE1BQU0sSUFBSSxVQUFVLCtCQUErQjtBQUFBLElBQ3JEO0FBQUEsSUFDQSxPQUFPLFFBQU8sS0FBSyxrQkFBa0IsTUFBTTtBQUFBO0FBQUEsRUFHN0MsV0FBVyxRQUFRLFFBQVMsQ0FBQyxNQUFNLE1BQU0sVUFBVTtBQUFBLElBQ2pELElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxNQUM1QixNQUFNLElBQUksVUFBVSwyQkFBMkI7QUFBQSxJQUNqRDtBQUFBLElBQ0EsSUFBSSxNQUFNLFFBQU8sSUFBSTtBQUFBLElBQ3JCLElBQUksU0FBUyxXQUFXO0FBQUEsTUFDdEIsSUFBSSxPQUFPLGFBQWEsVUFBVTtBQUFBLFFBQ2hDLElBQUksS0FBSyxNQUFNLFFBQVE7QUFBQSxNQUN6QixFQUFPO0FBQUEsUUFDTCxJQUFJLEtBQUssSUFBSTtBQUFBO0FBQUEsSUFFakIsRUFBTztBQUFBLE1BQ0wsSUFBSSxLQUFLLENBQUM7QUFBQTtBQUFBLElBRVosT0FBTztBQUFBO0FBQUEsRUFHVCxXQUFXLGNBQWMsUUFBUyxDQUFDLE1BQU07QUFBQSxJQUN2QyxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsTUFBTSxJQUFJLFVBQVUsMkJBQTJCO0FBQUEsSUFDakQ7QUFBQSxJQUNBLE9BQU8sUUFBTyxJQUFJO0FBQUE7QUFBQSxFQUdwQixXQUFXLGtCQUFrQixRQUFTLENBQUMsTUFBTTtBQUFBLElBQzNDLElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxNQUM1QixNQUFNLElBQUksVUFBVSwyQkFBMkI7QUFBQSxJQUNqRDtBQUFBLElBQ0EsT0FBTyxPQUFPLFdBQVcsSUFBSTtBQUFBO0FBQUE7Ozs7RUM5RC9CLElBQUksZ0NBQWdDO0FBQUEsRUFDcEMsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBRUosU0FBUyxVQUFVLENBQUMsTUFBTTtBQUFBLElBQ3hCLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxXQUFXO0FBQUEsSUFHaEIsS0FBSyxNQUFNO0FBQUEsTUFDVCxLQUFLLFNBQVMsUUFBTyxNQUFNLENBQUM7QUFBQSxNQUM1QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBR0EsSUFBSSxPQUFPLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDbkMsS0FBSyxTQUFTLFFBQU8sTUFBTSxDQUFDO0FBQUEsTUFDNUIsS0FBSyxLQUFLLElBQUk7QUFBQSxNQUNkLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFJQSxJQUFJLEtBQUssVUFBVSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzNDLEtBQUssU0FBUztBQUFBLE1BQ2QsS0FBSyxXQUFXO0FBQUEsTUFDaEIsUUFBUSxTQUFTLFFBQVMsR0FBRztBQUFBLFFBQzNCLEtBQUssS0FBSyxPQUFPLElBQUk7QUFBQSxRQUNyQixLQUFLLFdBQVc7QUFBQSxRQUNoQixLQUFLLEtBQUssT0FBTztBQUFBLFFBQ2pCLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsTUFBTSxJQUFJLFVBQVUsMkJBQTBCLE9BQU8sT0FBTyxHQUFHO0FBQUE7QUFBQSxFQUVqRSxLQUFLLFNBQVMsWUFBWSxNQUFNO0FBQUEsRUFFaEMsV0FBVyxVQUFVLFFBQVEsU0FBUyxLQUFLLENBQUMsTUFBTTtBQUFBLElBQ2hELEtBQUssU0FBUyxRQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsUUFBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUEsSUFDNUQsS0FBSyxLQUFLLFFBQVEsSUFBSTtBQUFBO0FBQUEsRUFHeEIsV0FBVyxVQUFVLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTTtBQUFBLElBQzVDLElBQUk7QUFBQSxNQUNGLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDakIsS0FBSyxLQUFLLE9BQU8sSUFBSTtBQUFBLElBQ3JCLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDakIsS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxXQUFXO0FBQUE7QUFBQSxFQUdsQixPQUFPLFVBQVU7QUFBQTs7OztFQ3BEakIsU0FBUyxZQUFZLENBQUMsU0FBUztBQUFBLElBQzlCLElBQUksVUFBVyxVQUFVLElBQUssTUFBTSxVQUFVLE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDNUQsT0FBTztBQUFBO0FBQUEsRUFHUixJQUFJLG1CQUFtQjtBQUFBLElBQ3RCLE9BQU8sYUFBYSxHQUFHO0FBQUEsSUFDdkIsT0FBTyxhQUFhLEdBQUc7QUFBQSxJQUN2QixPQUFPLGFBQWEsR0FBRztBQUFBLEVBQ3hCO0FBQUEsRUFFQSxTQUFTLG1CQUFtQixDQUFDLEtBQUs7QUFBQSxJQUNqQyxJQUFJLGFBQWEsaUJBQWlCO0FBQUEsSUFDbEMsSUFBSSxZQUFZO0FBQUEsTUFDZixPQUFPO0FBQUEsSUFDUjtBQUFBLElBRUEsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFHbEQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNwQmpCLElBQUksZ0NBQWdDO0FBQUEsRUFFcEMsSUFBSTtBQUFBLEVBRUosSUFBSSxZQUFZO0FBQUEsRUFBaEIsSUFDQyxrQkFBa0I7QUFBQSxFQURuQixJQUVDLGdCQUFnQjtBQUFBLEVBRmpCLElBR0MsVUFBVTtBQUFBLEVBSFgsSUFJQyxVQUFVO0FBQUEsRUFKWCxJQUtDLGtCQUFtQixVQUFVLGdCQUFrQixtQkFBbUI7QUFBQSxFQUxuRSxJQU1DLGtCQUFrQixVQUFXLG1CQUFtQjtBQUFBLEVBRWpELFNBQVMsU0FBUyxDQUFDLFFBQVE7QUFBQSxJQUMxQixPQUFPLE9BQ0wsUUFBUSxNQUFNLEVBQUUsRUFDaEIsUUFBUSxPQUFPLEdBQUcsRUFDbEIsUUFBUSxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR3JCLFNBQVMsaUJBQWlCLENBQUMsV0FBVztBQUFBLElBQ3JDLElBQUksUUFBTyxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNSLEVBQU8sU0FBaUIsT0FBTyxjQUFwQixVQUErQjtBQUFBLE1BQ3pDLE9BQU8sUUFBTyxLQUFLLFdBQVcsUUFBUTtBQUFBLElBQ3ZDO0FBQUEsSUFFQSxNQUFNLElBQUksVUFBVSxxREFBcUQ7QUFBQTtBQUFBLEVBRzFFLFNBQVMsU0FBUyxDQUFDLFdBQVcsS0FBSztBQUFBLElBQ2xDLFlBQVksa0JBQWtCLFNBQVM7QUFBQSxJQUN2QyxJQUFJLGFBQWEsb0JBQW9CLEdBQUc7QUFBQSxJQUl4QyxJQUFJLHdCQUF3QixhQUFhO0FBQUEsSUFFekMsSUFBSSxjQUFjLFVBQVU7QUFBQSxJQUU1QixJQUFJLFNBQVM7QUFBQSxJQUNiLElBQUksVUFBVSxjQUFjLGlCQUFpQjtBQUFBLE1BQzVDLE1BQU0sSUFBSSxNQUFNLCtCQUErQjtBQUFBLElBQ2hEO0FBQUEsSUFFQSxJQUFJLFlBQVksVUFBVTtBQUFBLElBQzFCLElBQUksZUFBZSxZQUFZLElBQUk7QUFBQSxNQUNsQyxZQUFZLFVBQVU7QUFBQSxJQUN2QjtBQUFBLElBRUEsSUFBSSxjQUFjLFNBQVMsV0FBVztBQUFBLE1BQ3JDLE1BQU0sSUFBSSxNQUFNLGdDQUFnQyxZQUFZLGVBQWUsY0FBYyxVQUFVLGFBQWE7QUFBQSxJQUNqSDtBQUFBLElBRUEsSUFBSSxVQUFVLGNBQWMsaUJBQWlCO0FBQUEsTUFDNUMsTUFBTSxJQUFJLE1BQU0sdUNBQXVDO0FBQUEsSUFDeEQ7QUFBQSxJQUVBLElBQUksVUFBVSxVQUFVO0FBQUEsSUFFeEIsSUFBSSxjQUFjLFNBQVMsSUFBSSxTQUFTO0FBQUEsTUFDdkMsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFVBQVUsZUFBZSxjQUFjLFNBQVMsS0FBSyxhQUFhO0FBQUEsSUFDakg7QUFBQSxJQUVBLElBQUksd0JBQXdCLFNBQVM7QUFBQSxNQUNwQyxNQUFNLElBQUksTUFBTSw4QkFBOEIsVUFBVSxnQkFBZ0Isd0JBQXdCLGlCQUFpQjtBQUFBLElBQ2xIO0FBQUEsSUFFQSxJQUFJLFVBQVU7QUFBQSxJQUNkLFVBQVU7QUFBQSxJQUVWLElBQUksVUFBVSxjQUFjLGlCQUFpQjtBQUFBLE1BQzVDLE1BQU0sSUFBSSxNQUFNLHVDQUF1QztBQUFBLElBQ3hEO0FBQUEsSUFFQSxJQUFJLFVBQVUsVUFBVTtBQUFBLElBRXhCLElBQUksY0FBYyxXQUFXLFNBQVM7QUFBQSxNQUNyQyxNQUFNLElBQUksTUFBTSw4QkFBOEIsVUFBVSxtQkFBbUIsY0FBYyxVQUFVLEdBQUc7QUFBQSxJQUN2RztBQUFBLElBRUEsSUFBSSx3QkFBd0IsU0FBUztBQUFBLE1BQ3BDLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixVQUFVLGdCQUFnQix3QkFBd0IsaUJBQWlCO0FBQUEsSUFDbEg7QUFBQSxJQUVBLElBQUksVUFBVTtBQUFBLElBQ2QsVUFBVTtBQUFBLElBRVYsSUFBSSxXQUFXLGFBQWE7QUFBQSxNQUMzQixNQUFNLElBQUksTUFBTSw4Q0FBOEMsY0FBYyxVQUFVLGdCQUFnQjtBQUFBLElBQ3ZHO0FBQUEsSUFFQSxJQUFJLFdBQVcsYUFBYSxTQUMzQixXQUFXLGFBQWE7QUFBQSxJQUV6QixJQUFJLE1BQU0sUUFBTyxZQUFZLFdBQVcsVUFBVSxXQUFXLE9BQU87QUFBQSxJQUVwRSxLQUFLLFNBQVMsRUFBRyxTQUFTLFlBQVksUUFBUTtBQUFBLE1BQzdDLElBQUksVUFBVTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVUsS0FBSyxLQUFLLFFBQVEsVUFBVSxLQUFLLEtBQUssVUFBVSxDQUFDLEdBQUcsVUFBVSxPQUFPO0FBQUEsSUFFL0UsU0FBUztBQUFBLElBRVQsU0FBUyxJQUFJLE9BQVEsU0FBUyxJQUFJLFlBQVksUUFBUTtBQUFBLE1BQ3JELElBQUksVUFBVTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVUsS0FBSyxLQUFLLFFBQVEsVUFBVSxLQUFLLEtBQUssVUFBVSxDQUFDLEdBQUcsVUFBVSxPQUFPO0FBQUEsSUFFL0UsTUFBTSxJQUFJLFNBQVMsUUFBUTtBQUFBLElBQzNCLE1BQU0sVUFBVSxHQUFHO0FBQUEsSUFFbkIsT0FBTztBQUFBO0FBQUEsRUFHUixTQUFTLFlBQVksQ0FBQyxLQUFLLE9BQU8sTUFBTTtBQUFBLElBQ3ZDLElBQUksVUFBVTtBQUFBLElBQ2QsT0FBTyxRQUFRLFVBQVUsUUFBUSxJQUFJLFFBQVEsYUFBYSxHQUFHO0FBQUEsUUFDMUQ7QUFBQSxJQUNIO0FBQUEsSUFFQSxJQUFJLFlBQVksSUFBSSxRQUFRLFlBQVk7QUFBQSxJQUN4QyxJQUFJLFdBQVc7QUFBQSxRQUNaO0FBQUEsSUFDSDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHUixTQUFTLFNBQVMsQ0FBQyxXQUFXLEtBQUs7QUFBQSxJQUNsQyxZQUFZLGtCQUFrQixTQUFTO0FBQUEsSUFDdkMsSUFBSSxhQUFhLG9CQUFvQixHQUFHO0FBQUEsSUFFeEMsSUFBSSxpQkFBaUIsVUFBVTtBQUFBLElBQy9CLElBQUksbUJBQW1CLGFBQWEsR0FBRztBQUFBLE1BQ3RDLE1BQU0sSUFBSSxVQUFVLE1BQU0sTUFBTSwyQkFBMkIsYUFBYSxJQUFJLG1CQUFtQixpQkFBaUIsR0FBRztBQUFBLElBQ3BIO0FBQUEsSUFFQSxJQUFJLFdBQVcsYUFBYSxXQUFXLEdBQUcsVUFBVTtBQUFBLElBQ3BELElBQUksV0FBVyxhQUFhLFdBQVcsWUFBWSxVQUFVLE1BQU07QUFBQSxJQUNuRSxJQUFJLFVBQVUsYUFBYTtBQUFBLElBQzNCLElBQUksVUFBVSxhQUFhO0FBQUEsSUFFM0IsSUFBSSxVQUFVLElBQUksSUFBSSxVQUFVLElBQUksSUFBSTtBQUFBLElBRXhDLElBQUksY0FBYyxVQUFVO0FBQUEsSUFFNUIsSUFBSSxNQUFNLFFBQU8sYUFBYSxjQUFjLElBQUksS0FBSyxPQUFPO0FBQUEsSUFFNUQsSUFBSSxTQUFTO0FBQUEsSUFDYixJQUFJLFlBQVk7QUFBQSxJQUNoQixJQUFJLGFBQWE7QUFBQSxNQUdoQixJQUFJLFlBQVk7QUFBQSxJQUNqQixFQUFPO0FBQUEsTUFHTixJQUFJLFlBQVksWUFBWTtBQUFBLE1BRTVCLElBQUksWUFBWSxVQUFVO0FBQUE7QUFBQSxJQUUzQixJQUFJLFlBQVk7QUFBQSxJQUNoQixJQUFJLFlBQVk7QUFBQSxJQUNoQixJQUFJLFdBQVcsR0FBRztBQUFBLE1BQ2pCLElBQUksWUFBWTtBQUFBLE1BQ2hCLFVBQVUsVUFBVSxLQUFLLEtBQUssUUFBUSxHQUFHLFVBQVU7QUFBQSxJQUNwRCxFQUFPO0FBQUEsTUFDTixVQUFVLFVBQVUsS0FBSyxLQUFLLFFBQVEsVUFBVSxVQUFVO0FBQUE7QUFBQSxJQUUzRCxJQUFJLFlBQVk7QUFBQSxJQUNoQixJQUFJLFlBQVk7QUFBQSxJQUNoQixJQUFJLFdBQVcsR0FBRztBQUFBLE1BQ2pCLElBQUksWUFBWTtBQUFBLE1BQ2hCLFVBQVUsS0FBSyxLQUFLLFFBQVEsVUFBVTtBQUFBLElBQ3ZDLEVBQU87QUFBQSxNQUNOLFVBQVUsS0FBSyxLQUFLLFFBQVEsYUFBYSxRQUFRO0FBQUE7QUFBQSxJQUdsRCxPQUFPO0FBQUE7QUFBQSxFQUdSLE9BQU8sVUFBVTtBQUFBLElBQ2hCO0FBQUEsSUFDQTtBQUFBLEVBQ0Q7QUFBQTs7OztFQ3hMQSxJQUFJLDhCQUEyQjtBQUFBLEVBQy9CLElBQUksaUNBQStCO0FBQUEsRUFFbkMsT0FBTyxVQUFVO0FBQUEsRUFFakIsU0FBUyxRQUFRLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFHdEIsS0FBSyxRQUFPLFNBQVMsQ0FBQyxNQUFNLFFBQU8sU0FBUyxDQUFDLEdBQUc7QUFBQSxNQUM5QyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBS0EsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRO0FBQUEsTUFDekIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksSUFBSTtBQUFBLElBQ1IsU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLE1BRWpDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFBQSxJQUNoQjtBQUFBLElBQ0EsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUdmLFNBQVMsVUFBVSxRQUFRLEdBQUc7QUFBQSxJQUM1QixRQUFPLFVBQVUsUUFBUSxXQUFXLFVBQVUsUUFBUSxTQUFTLEtBQUssQ0FBQyxNQUFNO0FBQUEsTUFDekUsT0FBTyxTQUFTLE1BQU0sSUFBSTtBQUFBO0FBQUE7QUFBQSxFQUk5QixJQUFJLGVBQWUsUUFBTyxVQUFVO0FBQUEsRUFDcEMsSUFBSSxtQkFBbUIsV0FBVyxVQUFVO0FBQUEsRUFDNUMsU0FBUyxVQUFVLFFBQVEsR0FBRztBQUFBLElBQzVCLFFBQU8sVUFBVSxRQUFRO0FBQUEsSUFDekIsV0FBVyxVQUFVLFFBQVE7QUFBQTtBQUFBOzs7O0VDdkMvQixJQUFJLGdDQUFnQztBQUFBLEVBQ3BDLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLElBQUksd0JBQXdCO0FBQUE7QUFBQTtBQUFBLEVBQzVCLElBQUkscUJBQXFCO0FBQUEsRUFDekIsSUFBSSwyQkFBMkI7QUFBQSxFQUMvQixJQUFJLHlCQUF5QjtBQUFBLEVBRTdCLElBQUkscUJBQXFCLE9BQU8sUUFBTyxvQkFBb0I7QUFBQSxFQUMzRCxJQUFJLG9CQUFvQjtBQUFBLElBQ3RCLDRCQUE0QjtBQUFBLElBQzVCLHNCQUFzQjtBQUFBLEVBQ3hCO0FBQUEsRUFFQSxTQUFTLGdCQUFnQixDQUFDLEtBQUs7QUFBQSxJQUM3QixJQUFJLFFBQU8sU0FBUyxHQUFHLEdBQUc7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQSxJQUVBLEtBQUssb0JBQW9CO0FBQUEsTUFDdkIsTUFBTSxVQUFVLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsTUFBTSxVQUFVLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsSUFFQSxJQUFJLE9BQU8sSUFBSSxTQUFTLFVBQVU7QUFBQSxNQUNoQyxNQUFNLFVBQVUsd0JBQXdCO0FBQUEsSUFDMUM7QUFBQSxJQUVBLElBQUksT0FBTyxJQUFJLHNCQUFzQixVQUFVO0FBQUEsTUFDN0MsTUFBTSxVQUFVLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsSUFFQSxJQUFJLE9BQU8sSUFBSSxXQUFXLFlBQVk7QUFBQSxNQUNwQyxNQUFNLFVBQVUsd0JBQXdCO0FBQUEsSUFDMUM7QUFBQTtBQUFBLEVBR0YsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0FBQUEsSUFDOUIsSUFBSSxRQUFPLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0I7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0I7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLFVBQVUsc0JBQXNCO0FBQUE7QUFBQSxFQUd4QyxTQUFTLGdCQUFnQixDQUFDLEtBQUs7QUFBQSxJQUM3QixJQUFJLFFBQU8sU0FBUyxHQUFHLEdBQUc7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsS0FBSyxvQkFBb0I7QUFBQSxNQUN2QixNQUFNLFVBQVUsa0JBQWtCO0FBQUEsSUFDcEM7QUFBQSxJQUVBLElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQixNQUFNLFVBQVUsa0JBQWtCO0FBQUEsSUFDcEM7QUFBQSxJQUVBLElBQUksSUFBSSxTQUFTLFVBQVU7QUFBQSxNQUN6QixNQUFNLFVBQVUsa0JBQWtCO0FBQUEsSUFDcEM7QUFBQSxJQUVBLElBQUksT0FBTyxJQUFJLFdBQVcsWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxrQkFBa0I7QUFBQSxJQUNwQztBQUFBO0FBQUEsRUFHRixTQUFTLFVBQVUsQ0FBQyxRQUFRO0FBQUEsSUFDMUIsT0FBTyxPQUNKLFFBQVEsTUFBTSxFQUFFLEVBQ2hCLFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsT0FBTyxHQUFHO0FBQUE7QUFBQSxFQUd2QixTQUFTLFFBQVEsQ0FBQyxXQUFXO0FBQUEsSUFDM0IsWUFBWSxVQUFVLFNBQVM7QUFBQSxJQUUvQixJQUFJLFVBQVUsSUFBSSxVQUFVLFNBQVM7QUFBQSxJQUNyQyxJQUFJLFlBQVksR0FBRztBQUFBLE1BQ2pCLFNBQVMsSUFBSSxFQUFHLElBQUksV0FBVyxHQUFHO0FBQUEsUUFDaEMsYUFBYTtBQUFBLE1BQ2Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLFVBQ0osUUFBUSxPQUFPLEdBQUcsRUFDbEIsUUFBUSxNQUFNLEdBQUc7QUFBQTtBQUFBLEVBR3RCLFNBQVMsU0FBUyxDQUFDLFVBQVU7QUFBQSxJQUMzQixJQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFBQSxJQUNyQyxJQUFJLFNBQVMsS0FBSyxPQUFPLEtBQUssTUFBTSxRQUFRLEVBQUUsTUFBTSxNQUFNLElBQUk7QUFBQSxJQUM5RCxPQUFPLElBQUksVUFBVSxNQUFNO0FBQUE7QUFBQSxFQUc3QixTQUFTLGNBQWMsQ0FBQyxLQUFLO0FBQUEsSUFDM0IsT0FBTyxRQUFPLFNBQVMsR0FBRyxLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsRUFHaEQsU0FBUyxjQUFjLENBQUMsT0FBTztBQUFBLElBQzdCLEtBQUssZUFBZSxLQUFLO0FBQUEsTUFDdkIsUUFBUSxLQUFLLFVBQVUsS0FBSztBQUFBLElBQzlCLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0FBQUEsSUFDOUIsT0FBTyxTQUFTLElBQUksQ0FBQyxPQUFPLFFBQVE7QUFBQSxNQUNsQyxpQkFBaUIsTUFBTTtBQUFBLE1BQ3ZCLFFBQVEsZUFBZSxLQUFLO0FBQUEsTUFDNUIsSUFBSSxPQUFPLFFBQU8sV0FBVyxRQUFRLE1BQU0sTUFBTTtBQUFBLE1BQ2pELElBQUksT0FBTyxLQUFLLE9BQU8sS0FBSyxHQUFHLEtBQUssT0FBTyxRQUFRO0FBQUEsTUFDbkQsT0FBTyxXQUFXLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFJekIsSUFBSTtBQUFBLEVBQ0osSUFBSSxrQkFBa0IscUJBQXFCLFVBQVMsU0FBUyxlQUFlLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFDakYsSUFBSSxFQUFFLGVBQWUsRUFBRSxZQUFZO0FBQUEsTUFDakMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQU8sUUFBTyxnQkFBZ0IsR0FBRyxDQUFDO0FBQUEsTUFDaEMsU0FBUyxlQUFlLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFDakMsS0FBSyxhQUFhO0FBQUEsTUFDaEI7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLFlBQVksR0FBRyxDQUFDO0FBQUE7QUFBQSxFQUd6QixTQUFTLGtCQUFrQixDQUFDLE1BQU07QUFBQSxJQUNoQyxPQUFPLFNBQVMsTUFBTSxDQUFDLE9BQU8sV0FBVyxRQUFRO0FBQUEsTUFDL0MsSUFBSSxjQUFjLGlCQUFpQixJQUFJLEVBQUUsT0FBTyxNQUFNO0FBQUEsTUFDdEQsT0FBTyxnQkFBZ0IsUUFBTyxLQUFLLFNBQVMsR0FBRyxRQUFPLEtBQUssV0FBVyxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBSTNFLFNBQVMsZUFBZSxDQUFDLE1BQU07QUFBQSxJQUM5QixPQUFPLFNBQVMsSUFBSSxDQUFDLE9BQU8sWUFBWTtBQUFBLE1BQ3JDLGtCQUFrQixVQUFVO0FBQUEsTUFDNUIsUUFBUSxlQUFlLEtBQUs7QUFBQSxNQUc1QixJQUFJLFNBQVMsUUFBTyxXQUFXLFlBQVksSUFBSTtBQUFBLE1BQy9DLElBQUksT0FBTyxPQUFPLE9BQU8sS0FBSyxHQUFHLE9BQU8sS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUNqRSxPQUFPLFdBQVcsR0FBRztBQUFBO0FBQUE7QUFBQSxFQUl6QixTQUFTLGlCQUFpQixDQUFDLE1BQU07QUFBQSxJQUMvQixPQUFPLFNBQVMsTUFBTSxDQUFDLE9BQU8sV0FBVyxXQUFXO0FBQUEsTUFDbEQsaUJBQWlCLFNBQVM7QUFBQSxNQUMxQixRQUFRLGVBQWUsS0FBSztBQUFBLE1BQzVCLFlBQVksU0FBUyxTQUFTO0FBQUEsTUFDOUIsSUFBSSxXQUFXLFFBQU8sYUFBYSxZQUFZLElBQUk7QUFBQSxNQUNuRCxTQUFTLE9BQU8sS0FBSztBQUFBLE1BQ3JCLE9BQU8sU0FBUyxPQUFPLFdBQVcsV0FBVyxRQUFRO0FBQUE7QUFBQTtBQUFBLEVBSXpELFNBQVMsa0JBQWtCLENBQUMsTUFBTTtBQUFBLElBQ2hDLE9BQU8sU0FBUyxJQUFJLENBQUMsT0FBTyxZQUFZO0FBQUEsTUFDdEMsa0JBQWtCLFVBQVU7QUFBQSxNQUM1QixRQUFRLGVBQWUsS0FBSztBQUFBLE1BQzVCLElBQUksU0FBUyxRQUFPLFdBQVcsWUFBWSxJQUFJO0FBQUEsTUFDL0MsSUFBSSxPQUFPLE9BQU8sT0FBTyxLQUFLLEdBQUcsT0FBTyxLQUFLO0FBQUEsUUFDM0MsS0FBSztBQUFBLFFBQ0wsU0FBUyxRQUFPLFVBQVU7QUFBQSxRQUMxQixZQUFZLFFBQU8sVUFBVTtBQUFBLE1BQy9CLEdBQUcsUUFBUTtBQUFBLE1BQ1gsT0FBTyxXQUFXLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFJekIsU0FBUyxvQkFBb0IsQ0FBQyxNQUFNO0FBQUEsSUFDbEMsT0FBTyxTQUFTLE1BQU0sQ0FBQyxPQUFPLFdBQVcsV0FBVztBQUFBLE1BQ2xELGlCQUFpQixTQUFTO0FBQUEsTUFDMUIsUUFBUSxlQUFlLEtBQUs7QUFBQSxNQUM1QixZQUFZLFNBQVMsU0FBUztBQUFBLE1BQzlCLElBQUksV0FBVyxRQUFPLGFBQWEsWUFBWSxJQUFJO0FBQUEsTUFDbkQsU0FBUyxPQUFPLEtBQUs7QUFBQSxNQUNyQixPQUFPLFNBQVMsT0FBTztBQUFBLFFBQ3JCLEtBQUs7QUFBQSxRQUNMLFNBQVMsUUFBTyxVQUFVO0FBQUEsUUFDMUIsWUFBWSxRQUFPLFVBQVU7QUFBQSxNQUMvQixHQUFHLFdBQVcsUUFBUTtBQUFBO0FBQUE7QUFBQSxFQUkxQixTQUFTLGlCQUFpQixDQUFDLE1BQU07QUFBQSxJQUMvQixJQUFJLFFBQVEsZ0JBQWdCLElBQUk7QUFBQSxJQUNoQyxPQUFPLFNBQVMsSUFBSSxHQUFHO0FBQUEsTUFDckIsSUFBSSxZQUFZLE1BQU0sTUFBTSxNQUFNLFNBQVM7QUFBQSxNQUMzQyxZQUFZLFlBQVksVUFBVSxXQUFXLE9BQU8sSUFBSTtBQUFBLE1BQ3hELE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJWCxTQUFTLGtCQUFrQixDQUFDLE1BQU07QUFBQSxJQUNoQyxJQUFJLFFBQVEsa0JBQWtCLElBQUk7QUFBQSxJQUNsQyxPQUFPLFNBQVMsTUFBTSxDQUFDLE9BQU8sV0FBVyxXQUFXO0FBQUEsTUFDbEQsWUFBWSxZQUFZLFVBQVUsV0FBVyxPQUFPLElBQUksRUFBRSxTQUFTLFFBQVE7QUFBQSxNQUMzRSxJQUFJLFNBQVMsTUFBTSxPQUFPLFdBQVcsU0FBUztBQUFBLE1BQzlDLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJWCxTQUFTLGdCQUFnQixHQUFHO0FBQUEsSUFDMUIsT0FBTyxTQUFTLElBQUksR0FBRztBQUFBLE1BQ3JCLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJWCxTQUFTLGtCQUFrQixHQUFHO0FBQUEsSUFDNUIsT0FBTyxTQUFTLE1BQU0sQ0FBQyxPQUFPLFdBQVc7QUFBQSxNQUN2QyxPQUFPLGNBQWM7QUFBQTtBQUFBO0FBQUEsRUFJekIsT0FBTyxVQUFVLFNBQVMsR0FBRyxDQUFDLFdBQVc7QUFBQSxJQUN2QyxJQUFJLGtCQUFrQjtBQUFBLE1BQ3BCLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQSxJQUFJLG9CQUFvQjtBQUFBLE1BQ3RCLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQSxJQUFJLFFBQVEsVUFBVSxNQUFNLHdDQUF3QztBQUFBLElBQ3BFLEtBQUs7QUFBQSxNQUNILE1BQU0sVUFBVSx1QkFBdUIsU0FBUztBQUFBLElBQ2xELElBQUksUUFBUSxNQUFNLE1BQU0sTUFBTSxJQUFJLFlBQVk7QUFBQSxJQUM5QyxJQUFJLE9BQU8sTUFBTTtBQUFBLElBRWpCLE9BQU87QUFBQSxNQUNMLE1BQU0sZ0JBQWdCLE1BQU0sSUFBSTtBQUFBLE1BQ2hDLFFBQVEsa0JBQWtCLE1BQU0sSUFBSTtBQUFBLElBQ3RDO0FBQUE7QUFBQTs7OztFQ3ZRRixJQUFJLDhCQUEyQjtBQUFBLEVBRS9CLE9BQU8sVUFBVSxTQUFTLFFBQVEsQ0FBQyxLQUFLO0FBQUEsSUFDdEMsSUFBSSxPQUFPLFFBQVE7QUFBQSxNQUNqQixPQUFPO0FBQUEsSUFDVCxJQUFJLE9BQU8sUUFBUSxZQUFZLFFBQU8sU0FBUyxHQUFHO0FBQUEsTUFDaEQsT0FBTyxJQUFJLFNBQVM7QUFBQSxJQUN0QixPQUFPLEtBQUssVUFBVSxHQUFHO0FBQUE7QUFBQTs7OztFQ1AzQixJQUFJLGdDQUFnQztBQUFBLEVBQ3BDLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsU0FBUyxDQUFDLFFBQVEsVUFBVTtBQUFBLElBQ25DLE9BQU8sUUFDSixLQUFLLFFBQVEsUUFBUSxFQUNyQixTQUFTLFFBQVEsRUFDakIsUUFBUSxNQUFNLEVBQUUsRUFDaEIsUUFBUSxPQUFPLEdBQUcsRUFDbEIsUUFBUSxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR3ZCLFNBQVMsZUFBZSxDQUFDLFFBQVEsU0FBUyxVQUFVO0FBQUEsSUFDbEQsV0FBVyxZQUFZO0FBQUEsSUFDdkIsSUFBSSxnQkFBZ0IsVUFBVSxTQUFTLE1BQU0sR0FBRyxRQUFRO0FBQUEsSUFDeEQsSUFBSSxpQkFBaUIsVUFBVSxTQUFTLE9BQU8sR0FBRyxRQUFRO0FBQUEsSUFDMUQsT0FBTyxLQUFLLE9BQU8sU0FBUyxlQUFlLGNBQWM7QUFBQTtBQUFBLEVBRzNELFNBQVMsT0FBTyxDQUFDLE1BQU07QUFBQSxJQUNyQixJQUFJLFNBQVMsS0FBSztBQUFBLElBQ2xCLElBQUksVUFBVSxLQUFLO0FBQUEsSUFDbkIsSUFBSSxjQUFjLEtBQUssVUFBVSxLQUFLO0FBQUEsSUFDdEMsSUFBSSxXQUFXLEtBQUs7QUFBQSxJQUNwQixJQUFJLE9BQU8sSUFBSSxPQUFPLEdBQUc7QUFBQSxJQUN6QixJQUFJLGVBQWUsZ0JBQWdCLFFBQVEsU0FBUyxRQUFRO0FBQUEsSUFDNUQsSUFBSSxZQUFZLEtBQUssS0FBSyxjQUFjLFdBQVc7QUFBQSxJQUNuRCxPQUFPLEtBQUssT0FBTyxTQUFTLGNBQWMsU0FBUztBQUFBO0FBQUEsRUFHckQsU0FBUyxVQUFVLENBQUMsTUFBTTtBQUFBLElBQ3hCLElBQUksU0FBUyxLQUFLLFVBQVEsS0FBSyxjQUFZLEtBQUs7QUFBQSxJQUNoRCxJQUFJLGVBQWUsSUFBSSxXQUFXLE1BQU07QUFBQSxJQUN4QyxLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLFNBQVMsS0FBSztBQUFBLElBQ25CLEtBQUssV0FBVyxLQUFLO0FBQUEsSUFDckIsS0FBSyxTQUFTLEtBQUssYUFBYSxLQUFLLE1BQU07QUFBQSxJQUMzQyxLQUFLLFVBQVUsSUFBSSxXQUFXLEtBQUssT0FBTztBQUFBLElBQzFDLEtBQUssT0FBTyxLQUFLLFNBQVMsUUFBUyxHQUFHO0FBQUEsTUFDcEMsS0FBSyxLQUFLLFFBQVEsWUFBWSxLQUFLO0FBQUEsUUFDakMsS0FBSyxLQUFLO0FBQUEsTUFDWixLQUFLLElBQUksQ0FBQztBQUFBLElBRVosS0FBSyxRQUFRLEtBQUssU0FBUyxRQUFTLEdBQUc7QUFBQSxNQUNyQyxLQUFLLEtBQUssT0FBTyxZQUFZLEtBQUs7QUFBQSxRQUNoQyxLQUFLLEtBQUs7QUFBQSxNQUNaLEtBQUssSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUVkLEtBQUssU0FBUyxZQUFZLE1BQU07QUFBQSxFQUVoQyxXQUFXLFVBQVUsT0FBTyxTQUFTLElBQUksR0FBRztBQUFBLElBQzFDLElBQUk7QUFBQSxNQUNGLElBQUksWUFBWSxRQUFRO0FBQUEsUUFDdEIsUUFBUSxLQUFLO0FBQUEsUUFDYixTQUFTLEtBQUssUUFBUTtBQUFBLFFBQ3RCLFFBQVEsS0FBSyxPQUFPO0FBQUEsUUFDcEIsVUFBVSxLQUFLO0FBQUEsTUFDakIsQ0FBQztBQUFBLE1BQ0QsS0FBSyxLQUFLLFFBQVEsU0FBUztBQUFBLE1BQzNCLEtBQUssS0FBSyxRQUFRLFNBQVM7QUFBQSxNQUMzQixLQUFLLEtBQUssS0FBSztBQUFBLE1BQ2YsS0FBSyxXQUFXO0FBQUEsTUFDaEIsT0FBTztBQUFBLE1BQ1AsT0FBTyxHQUFHO0FBQUEsTUFDVixLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDcEIsS0FBSyxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJckIsV0FBVyxPQUFPO0FBQUEsRUFFbEIsT0FBTyxVQUFVO0FBQUE7Ozs7RUM1RWpCLElBQUksZ0NBQWdDO0FBQUEsRUFDcEMsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSxZQUFZO0FBQUEsRUFFaEIsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLE9BQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQTtBQUFBLEVBR25ELFNBQVMsYUFBYSxDQUFDLE9BQU87QUFBQSxJQUM1QixJQUFJLFNBQVMsS0FBSztBQUFBLE1BQ2hCLE9BQU87QUFBQSxJQUNULElBQUk7QUFBQSxNQUFFLE9BQU8sS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUM3QixPQUFPLEdBQUc7QUFBQSxNQUFFO0FBQUE7QUFBQTtBQUFBLEVBR2QsU0FBUyxhQUFhLENBQUMsUUFBUTtBQUFBLElBQzdCLElBQUksZ0JBQWdCLE9BQU8sTUFBTSxLQUFLLENBQUMsRUFBRTtBQUFBLElBQ3pDLE9BQU8sY0FBYyxRQUFPLEtBQUssZUFBZSxRQUFRLEVBQUUsU0FBUyxRQUFRLENBQUM7QUFBQTtBQUFBLEVBRzlFLFNBQVMsbUJBQW1CLENBQUMsUUFBUTtBQUFBLElBQ25DLE9BQU8sT0FBTyxNQUFNLEtBQUssQ0FBQyxFQUFFLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHdEMsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFRO0FBQUEsSUFDaEMsT0FBTyxPQUFPLE1BQU0sR0FBRyxFQUFFO0FBQUE7QUFBQSxFQUczQixTQUFTLGNBQWMsQ0FBQyxRQUFRLFVBQVU7QUFBQSxJQUN4QyxXQUFXLFlBQVk7QUFBQSxJQUN2QixJQUFJLFVBQVUsT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBLElBQ2hDLE9BQU8sUUFBTyxLQUFLLFNBQVMsUUFBUSxFQUFFLFNBQVMsUUFBUTtBQUFBO0FBQUEsRUFHekQsU0FBUyxVQUFVLENBQUMsUUFBUTtBQUFBLElBQzFCLE9BQU8sVUFBVSxLQUFLLE1BQU0sT0FBTyxjQUFjLE1BQU07QUFBQTtBQUFBLEVBR3pELFNBQVMsU0FBUyxDQUFDLFFBQVEsV0FBVyxhQUFhO0FBQUEsSUFDakQsS0FBSyxXQUFXO0FBQUEsTUFDZCxJQUFJLE1BQU0sSUFBSSxNQUFNLDRDQUE0QztBQUFBLE1BQ2hFLElBQUksT0FBTztBQUFBLE1BQ1gsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFDeEIsSUFBSSxZQUFZLGlCQUFpQixNQUFNO0FBQUEsSUFDdkMsSUFBSSxlQUFlLG9CQUFvQixNQUFNO0FBQUEsSUFDN0MsSUFBSSxPQUFPLElBQUksU0FBUztBQUFBLElBQ3hCLE9BQU8sS0FBSyxPQUFPLGNBQWMsV0FBVyxXQUFXO0FBQUE7QUFBQSxFQUd6RCxTQUFTLFNBQVMsQ0FBQyxRQUFRLE1BQU07QUFBQSxJQUMvQixPQUFPLFFBQVEsQ0FBQztBQUFBLElBQ2hCLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFFeEIsS0FBSyxXQUFXLE1BQU07QUFBQSxNQUNwQixPQUFPO0FBQUEsSUFFVCxJQUFJLFNBQVMsY0FBYyxNQUFNO0FBQUEsSUFFakMsS0FBSztBQUFBLE1BQ0gsT0FBTztBQUFBLElBRVQsSUFBSSxVQUFVLGVBQWUsTUFBTTtBQUFBLElBQ25DLElBQUksT0FBTyxRQUFRLFNBQVMsS0FBSztBQUFBLE1BQy9CLFVBQVUsS0FBSyxNQUFNLFNBQVMsS0FBSyxRQUFRO0FBQUEsSUFFN0MsT0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsTUFDQSxXQUFXLGlCQUFpQixNQUFNO0FBQUEsSUFDcEM7QUFBQTtBQUFBLEVBR0YsU0FBUyxZQUFZLENBQUMsTUFBTTtBQUFBLElBQzFCLE9BQU8sUUFBUSxDQUFDO0FBQUEsSUFDaEIsSUFBSSxjQUFjLEtBQUssVUFBUSxLQUFLLGFBQVcsS0FBSztBQUFBLElBQ3BELElBQUksZUFBZSxJQUFJLFdBQVcsV0FBVztBQUFBLElBQzdDLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDdEIsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUNyQixLQUFLLFNBQVMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzFDLEtBQUssWUFBWSxJQUFJLFdBQVcsS0FBSyxTQUFTO0FBQUEsSUFDOUMsS0FBSyxPQUFPLEtBQUssU0FBUyxRQUFTLEdBQUc7QUFBQSxNQUNwQyxLQUFLLEtBQUssVUFBVSxZQUFZLEtBQUs7QUFBQSxRQUNuQyxLQUFLLE9BQU87QUFBQSxNQUNkLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFFWixLQUFLLFVBQVUsS0FBSyxTQUFTLFFBQVMsR0FBRztBQUFBLE1BQ3ZDLEtBQUssS0FBSyxPQUFPLFlBQVksS0FBSztBQUFBLFFBQ2hDLEtBQUssT0FBTztBQUFBLE1BQ2QsS0FBSyxJQUFJLENBQUM7QUFBQTtBQUFBLEVBRWQsS0FBSyxTQUFTLGNBQWMsTUFBTTtBQUFBLEVBQ2xDLGFBQWEsVUFBVSxTQUFTLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEQsSUFBSTtBQUFBLE1BQ0YsSUFBSSxRQUFRLFVBQVUsS0FBSyxVQUFVLFFBQVEsS0FBSyxXQUFXLEtBQUssSUFBSSxNQUFNO0FBQUEsTUFDNUUsSUFBSSxNQUFNLFVBQVUsS0FBSyxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQUEsTUFDeEQsS0FBSyxLQUFLLFFBQVEsT0FBTyxHQUFHO0FBQUEsTUFDNUIsS0FBSyxLQUFLLFFBQVEsS0FBSztBQUFBLE1BQ3ZCLEtBQUssS0FBSyxLQUFLO0FBQUEsTUFDZixLQUFLLFdBQVc7QUFBQSxNQUNoQixPQUFPO0FBQUEsTUFDUCxPQUFPLEdBQUc7QUFBQSxNQUNWLEtBQUssV0FBVztBQUFBLE1BQ2hCLEtBQUssS0FBSyxTQUFTLENBQUM7QUFBQSxNQUNwQixLQUFLLEtBQUssT0FBTztBQUFBO0FBQUE7QUFBQSxFQUlyQixhQUFhLFNBQVM7QUFBQSxFQUN0QixhQUFhLFVBQVU7QUFBQSxFQUN2QixhQUFhLFNBQVM7QUFBQSxFQUV0QixPQUFPLFVBQVU7QUFBQTs7OztFQ3RIakIsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBRUosSUFBSSxhQUFhO0FBQUEsSUFDZjtBQUFBLElBQVM7QUFBQSxJQUFTO0FBQUEsSUFDbEI7QUFBQSxJQUFTO0FBQUEsSUFBUztBQUFBLElBQ2xCO0FBQUEsSUFBUztBQUFBLElBQVM7QUFBQSxJQUNsQjtBQUFBLElBQVM7QUFBQSxJQUFTO0FBQUEsRUFDcEI7QUFBQSxFQUVRLHFCQUFhO0FBQUEsRUFDYixlQUFPLFdBQVc7QUFBQSxFQUNsQixpQkFBUyxhQUFhO0FBQUEsRUFDdEIsaUJBQVMsYUFBYTtBQUFBLEVBQ3RCLGtCQUFVLGFBQWE7QUFBQSxFQUN2QixxQkFBYSxTQUFTLFVBQVUsQ0FBQyxNQUFNO0FBQUEsSUFDN0MsT0FBTyxJQUFJLFdBQVcsSUFBSTtBQUFBO0FBQUEsRUFFcEIsdUJBQWUsU0FBUyxZQUFZLENBQUMsTUFBTTtBQUFBLElBQ2pELE9BQU8sSUFBSSxhQUFhLElBQUk7QUFBQTtBQUFBOzs7O0VDcEI5QixJQUFJO0FBQUEsRUFFSixPQUFPLFVBQVUsUUFBUyxDQUFDLEtBQUssVUFBUztBQUFBLElBQ3ZDLFdBQVUsWUFBVyxDQUFDO0FBQUEsSUFDdEIsSUFBSSxVQUFVLElBQUksT0FBTyxLQUFLLFFBQU87QUFBQSxJQUNyQyxLQUFLLFNBQVM7QUFBQSxNQUFFLE9BQU87QUFBQSxJQUFNO0FBQUEsSUFDN0IsSUFBSSxVQUFVLFFBQVE7QUFBQSxJQUd0QixJQUFHLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDOUIsSUFBSTtBQUFBLFFBQ0YsSUFBSSxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsUUFDNUIsSUFBRyxRQUFRLFFBQVEsT0FBTyxRQUFRLFVBQVU7QUFBQSxVQUMxQyxVQUFVO0FBQUEsUUFDWjtBQUFBLFFBQ0EsT0FBTyxHQUFHO0FBQUEsSUFDZDtBQUFBLElBS0EsSUFBSSxTQUFRLGFBQWEsTUFBTTtBQUFBLE1BQzdCLE9BQU87QUFBQSxRQUNMLFFBQVEsUUFBUTtBQUFBLFFBQ2hCO0FBQUEsUUFDQSxXQUFXLFFBQVE7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBOzs7O0VDNUJULElBQUksb0JBQW9CLFFBQVMsQ0FBQyxTQUFTLE9BQU87QUFBQSxJQUNoRCxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsSUFDeEIsSUFBRyxNQUFNLG1CQUFtQjtBQUFBLE1BQzFCLE1BQU0sa0JBQWtCLE1BQU0sS0FBSyxXQUFXO0FBQUEsSUFDaEQ7QUFBQSxJQUNBLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxVQUFVO0FBQUEsSUFDZixJQUFJO0FBQUEsTUFBTyxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBRzFCLGtCQUFrQixZQUFZLE9BQU8sT0FBTyxNQUFNLFNBQVM7QUFBQSxFQUMzRCxrQkFBa0IsVUFBVSxjQUFjO0FBQUEsRUFFMUMsT0FBTyxVQUFVO0FBQUE7Ozs7RUNiakIsSUFBSTtBQUFBLEVBRUosSUFBSSxpQkFBaUIsUUFBUyxDQUFDLFNBQVMsTUFBTTtBQUFBLElBQzVDLGtCQUFrQixLQUFLLE1BQU0sT0FBTztBQUFBLElBQ3BDLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUdkLGVBQWUsWUFBWSxPQUFPLE9BQU8sa0JBQWtCLFNBQVM7QUFBQSxFQUVwRSxlQUFlLFVBQVUsY0FBYztBQUFBLEVBRXZDLE9BQU8sVUFBVTtBQUFBOzs7O0VDWmpCLElBQUk7QUFBQSxFQUVKLElBQUksb0JBQW9CLFFBQVMsQ0FBQyxTQUFTLFdBQVc7QUFBQSxJQUNwRCxrQkFBa0IsS0FBSyxNQUFNLE9BQU87QUFBQSxJQUNwQyxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssWUFBWTtBQUFBO0FBQUEsRUFHbkIsa0JBQWtCLFlBQVksT0FBTyxPQUFPLGtCQUFrQixTQUFTO0FBQUEsRUFFdkUsa0JBQWtCLFVBQVUsY0FBYztBQUFBLEVBRTFDLE9BQU8sVUFBVTtBQUFBOzs7O0VDUmpCLElBQUksSUFBSTtBQUFBLEVBQ1IsSUFBSSxJQUFJLElBQUk7QUFBQSxFQUNaLElBQUksSUFBSSxJQUFJO0FBQUEsRUFDWixJQUFJLElBQUksSUFBSTtBQUFBLEVBQ1osSUFBSSxJQUFJLElBQUk7QUFBQSxFQUNaLElBQUksSUFBSSxJQUFJO0FBQUEsRUFnQlosT0FBTyxVQUFVLFFBQVMsQ0FBQyxLQUFLLFVBQVM7QUFBQSxJQUN2QyxXQUFVLFlBQVcsQ0FBQztBQUFBLElBQ3RCLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDbEIsSUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUN2QyxPQUFPLE1BQU0sR0FBRztBQUFBLElBQ2xCLEVBQU8sU0FBSSxTQUFTLFlBQVksU0FBUyxHQUFHLEdBQUc7QUFBQSxNQUM3QyxPQUFPLFNBQVEsT0FBTyxRQUFRLEdBQUcsSUFBSSxTQUFTLEdBQUc7QUFBQSxJQUNuRDtBQUFBLElBQ0EsTUFBTSxJQUFJLE1BQ1IsMERBQ0UsS0FBSyxVQUFVLEdBQUcsQ0FDdEI7QUFBQTtBQUFBLEVBV0YsU0FBUyxLQUFLLENBQUMsS0FBSztBQUFBLElBQ2xCLE1BQU0sT0FBTyxHQUFHO0FBQUEsSUFDaEIsSUFBSSxJQUFJLFNBQVMsS0FBSztBQUFBLE1BQ3BCO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxRQUFRLG1JQUFtSSxLQUM3SSxHQUNGO0FBQUEsSUFDQSxLQUFLLE9BQU87QUFBQSxNQUNWO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxJQUFJLFdBQVcsTUFBTSxFQUFFO0FBQUEsSUFDM0IsSUFBSSxRQUFRLE1BQU0sTUFBTSxNQUFNLFlBQVk7QUFBQSxJQUMxQyxRQUFRO0FBQUEsV0FDRDtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sSUFBSTtBQUFBLFdBQ1I7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxJQUFJO0FBQUEsV0FDUjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLElBQUk7QUFBQSxXQUNSO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxJQUFJO0FBQUEsV0FDUjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sSUFBSTtBQUFBLFdBQ1I7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLElBQUk7QUFBQSxXQUNSO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTztBQUFBO0FBQUEsUUFFUDtBQUFBO0FBQUE7QUFBQSxFQVlOLFNBQVMsUUFBUSxDQUFDLElBQUk7QUFBQSxJQUNwQixJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFBQSxJQUN2QixJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUk7QUFBQSxJQUM5QjtBQUFBLElBQ0EsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sS0FBSyxNQUFNLEtBQUssQ0FBQyxJQUFJO0FBQUEsSUFDOUI7QUFBQSxJQUNBLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDZCxPQUFPLEtBQUssTUFBTSxLQUFLLENBQUMsSUFBSTtBQUFBLElBQzlCO0FBQUEsSUFDQSxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUk7QUFBQSxJQUM5QjtBQUFBLElBQ0EsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQVdkLFNBQVMsT0FBTyxDQUFDLElBQUk7QUFBQSxJQUNuQixJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFBQSxJQUN2QixJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxPQUFPLElBQUksT0FBTyxHQUFHLEtBQUs7QUFBQSxJQUNuQztBQUFBLElBQ0EsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sT0FBTyxJQUFJLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFDcEM7QUFBQSxJQUNBLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDZCxPQUFPLE9BQU8sSUFBSSxPQUFPLEdBQUcsUUFBUTtBQUFBLElBQ3RDO0FBQUEsSUFDQSxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxPQUFPLElBQUksT0FBTyxHQUFHLFFBQVE7QUFBQSxJQUN0QztBQUFBLElBQ0EsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQU9kLFNBQVMsTUFBTSxDQUFDLElBQUksT0FBTyxHQUFHLE1BQU07QUFBQSxJQUNsQyxJQUFJLFdBQVcsU0FBUyxJQUFJO0FBQUEsSUFDNUIsT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUFBO0FBQUE7Ozs7RUNoSzdELElBQUk7QUFBQSxFQUVKLE9BQU8sVUFBVSxRQUFTLENBQUMsTUFBTSxLQUFLO0FBQUEsSUFDcEMsSUFBSSxZQUFZLE9BQU8sS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUk7QUFBQSxJQUVuRCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsSUFBSSxlQUFlLEdBQUcsSUFBSTtBQUFBLE1BQzFCLElBQUksT0FBTyxpQkFBaUIsYUFBYTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTyxLQUFLLE1BQU0sWUFBWSxlQUFlLElBQUk7QUFBQSxJQUNuRCxFQUFPLFNBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxNQUNuQyxPQUFPLFlBQVk7QUFBQSxJQUNyQixFQUFPO0FBQUEsTUFDTDtBQUFBO0FBQUE7QUFBQTs7OztFQ1ZKLElBQU0sc0JBQXNCO0FBQUEsRUFFNUIsSUFBTSxhQUFhO0FBQUEsRUFDbkIsSUFBTSxtQkFBbUIsT0FBTyxvQkFDTDtBQUFBLEVBRzNCLElBQU0sNEJBQTRCO0FBQUEsRUFJbEMsSUFBTSx3QkFBd0IsYUFBYTtBQUFBLEVBRTNDLElBQU0sZ0JBQWdCO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLFlBQVk7QUFBQSxFQUNkO0FBQUE7Ozs7RUNsQ0EsSUFBTSxRQUNKLE9BQU8sWUFBWSxZQUNuQixRQUFRLE9BQ1IsUUFBUSxJQUFJLGNBQ1osY0FBYyxLQUFLLFFBQVEsSUFBSSxVQUFVLElBQ3ZDLElBQUksU0FBUyxRQUFRLE1BQU0sVUFBVSxHQUFHLElBQUksSUFDNUMsTUFBTTtBQUFBLEVBRVYsT0FBTyxVQUFVO0FBQUE7Ozs7RUNSakI7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBRUYsSUFBTTtBQUFBLEVBQ04sVUFBVSxPQUFPLFVBQVUsQ0FBQztBQUFBLEVBRzVCLElBQU0sS0FBSyxRQUFRLEtBQUssQ0FBQztBQUFBLEVBQ3pCLElBQU0sU0FBUyxRQUFRLFNBQVMsQ0FBQztBQUFBLEVBQ2pDLElBQU0sTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUFBLEVBQzNCLElBQU0sVUFBVSxRQUFRLFVBQVUsQ0FBQztBQUFBLEVBQ25DLElBQU0sSUFBSSxRQUFRLElBQUksQ0FBQztBQUFBLEVBQ3ZCLElBQUksSUFBSTtBQUFBLEVBRVIsSUFBTSxtQkFBbUI7QUFBQSxFQVF6QixJQUFNLHdCQUF3QjtBQUFBLElBQzVCLENBQUMsT0FBTyxDQUFDO0FBQUEsSUFDVCxDQUFDLE9BQU8sVUFBVTtBQUFBLElBQ2xCLENBQUMsa0JBQWtCLHFCQUFxQjtBQUFBLEVBQzFDO0FBQUEsRUFFQSxJQUFNLGdCQUFnQixDQUFDLFVBQVU7QUFBQSxJQUMvQixZQUFZLE9BQU8sUUFBUSx1QkFBdUI7QUFBQSxNQUNoRCxRQUFRLE1BQ0wsTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEdBQUcsV0FBVyxNQUFNLEVBQzVDLE1BQU0sR0FBRyxRQUFRLEVBQUUsS0FBSyxHQUFHLFdBQVcsTUFBTTtBQUFBLElBQ2pEO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdULElBQU0sY0FBYyxDQUFDLE1BQU0sT0FBTyxhQUFhO0FBQUEsSUFDN0MsTUFBTSxPQUFPLGNBQWMsS0FBSztBQUFBLElBQ2hDLE1BQU0sUUFBUTtBQUFBLElBQ2QsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQ3hCLEVBQUUsUUFBUTtBQUFBLElBQ1YsSUFBSSxTQUFTO0FBQUEsSUFDYixRQUFRLFNBQVM7QUFBQSxJQUNqQixHQUFHLFNBQVMsSUFBSSxPQUFPLE9BQU8sV0FBVyxNQUFNLFNBQVM7QUFBQSxJQUN4RCxPQUFPLFNBQVMsSUFBSSxPQUFPLE1BQU0sV0FBVyxNQUFNLFNBQVM7QUFBQTtBQUFBLEVBUzdELFlBQVkscUJBQXFCLGFBQWE7QUFBQSxFQUM5QyxZQUFZLDBCQUEwQixNQUFNO0FBQUEsRUFNNUMsWUFBWSx3QkFBd0IsZ0JBQWdCLG1CQUFtQjtBQUFBLEVBS3ZFLFlBQVksZUFBZSxJQUFJLElBQUksRUFBRSwyQkFDbEIsSUFBSSxJQUFJLEVBQUUsMkJBQ1YsSUFBSSxJQUFJLEVBQUUscUJBQXFCO0FBQUEsRUFFbEQsWUFBWSxvQkFBb0IsSUFBSSxJQUFJLEVBQUUsZ0NBQ2xCLElBQUksSUFBSSxFQUFFLGdDQUNWLElBQUksSUFBSSxFQUFFLDBCQUEwQjtBQUFBLEVBTzVELFlBQVksd0JBQXdCLE1BQU0sSUFBSSxFQUFFLHlCQUM1QyxJQUFJLEVBQUUscUJBQXFCO0FBQUEsRUFFL0IsWUFBWSw2QkFBNkIsTUFBTSxJQUFJLEVBQUUseUJBQ2pELElBQUksRUFBRSwwQkFBMEI7QUFBQSxFQU1wQyxZQUFZLGNBQWMsUUFBUSxJQUFJLEVBQUUsOEJBQy9CLElBQUksRUFBRSwyQkFBMkI7QUFBQSxFQUUxQyxZQUFZLG1CQUFtQixTQUFTLElBQUksRUFBRSxtQ0FDckMsSUFBSSxFQUFFLGdDQUFnQztBQUFBLEVBSy9DLFlBQVksbUJBQW1CLEdBQUcsbUJBQW1CO0FBQUEsRUFNckQsWUFBWSxTQUFTLFVBQVUsSUFBSSxFQUFFLHlCQUM1QixJQUFJLEVBQUUsc0JBQXNCO0FBQUEsRUFXckMsWUFBWSxhQUFhLEtBQUssSUFBSSxFQUFFLGVBQ2pDLElBQUksRUFBRSxlQUNQLElBQUksRUFBRSxTQUFTO0FBQUEsRUFFakIsWUFBWSxRQUFRLElBQUksSUFBSSxFQUFFLGFBQWE7QUFBQSxFQUszQyxZQUFZLGNBQWMsV0FBVyxJQUFJLEVBQUUsb0JBQ3hDLElBQUksRUFBRSxvQkFDUCxJQUFJLEVBQUUsU0FBUztBQUFBLEVBRWpCLFlBQVksU0FBUyxJQUFJLElBQUksRUFBRSxjQUFjO0FBQUEsRUFFN0MsWUFBWSxRQUFRLGNBQWM7QUFBQSxFQUtsQyxZQUFZLHlCQUF5QixHQUFHLElBQUksRUFBRSxpQ0FBaUM7QUFBQSxFQUMvRSxZQUFZLG9CQUFvQixHQUFHLElBQUksRUFBRSw0QkFBNEI7QUFBQSxFQUVyRSxZQUFZLGVBQWUsWUFBWSxJQUFJLEVBQUUsdUJBQzFCLFVBQVUsSUFBSSxFQUFFLHVCQUNoQixVQUFVLElBQUksRUFBRSx1QkFDaEIsTUFBTSxJQUFJLEVBQUUsZ0JBQ1YsSUFBSSxFQUFFLFlBQ1IsTUFBTTtBQUFBLEVBRXpCLFlBQVksb0JBQW9CLFlBQVksSUFBSSxFQUFFLDRCQUMxQixVQUFVLElBQUksRUFBRSw0QkFDaEIsVUFBVSxJQUFJLEVBQUUsNEJBQ2hCLE1BQU0sSUFBSSxFQUFFLHFCQUNWLElBQUksRUFBRSxZQUNSLE1BQU07QUFBQSxFQUU5QixZQUFZLFVBQVUsSUFBSSxJQUFJLEVBQUUsWUFBWSxJQUFJLEVBQUUsZUFBZTtBQUFBLEVBQ2pFLFlBQVksZUFBZSxJQUFJLElBQUksRUFBRSxZQUFZLElBQUksRUFBRSxvQkFBb0I7QUFBQSxFQUkzRSxZQUFZLGVBQWUsR0FBRyxlQUNoQixZQUFZLGdDQUNaLGdCQUFnQixrQ0FDaEIsZ0JBQWdCLCtCQUErQjtBQUFBLEVBQzdELFlBQVksVUFBVSxHQUFHLElBQUksRUFBRSwwQkFBMEI7QUFBQSxFQUN6RCxZQUFZLGNBQWMsSUFBSSxFQUFFLGVBQ2xCLE1BQU0sSUFBSSxFQUFFLGtCQUNaLE1BQU0sSUFBSSxFQUFFLGFBQ1osY0FBYztBQUFBLEVBQzVCLFlBQVksYUFBYSxJQUFJLEVBQUUsU0FBUyxJQUFJO0FBQUEsRUFDNUMsWUFBWSxpQkFBaUIsSUFBSSxFQUFFLGFBQWEsSUFBSTtBQUFBLEVBSXBELFlBQVksYUFBYSxTQUFTO0FBQUEsRUFFbEMsWUFBWSxhQUFhLFNBQVMsSUFBSSxFQUFFLGtCQUFrQixJQUFJO0FBQUEsRUFDOUQsUUFBUSxtQkFBbUI7QUFBQSxFQUUzQixZQUFZLFNBQVMsSUFBSSxJQUFJLEVBQUUsYUFBYSxJQUFJLEVBQUUsZUFBZTtBQUFBLEVBQ2pFLFlBQVksY0FBYyxJQUFJLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxvQkFBb0I7QUFBQSxFQUkzRSxZQUFZLGFBQWEsU0FBUztBQUFBLEVBRWxDLFlBQVksYUFBYSxTQUFTLElBQUksRUFBRSxrQkFBa0IsSUFBSTtBQUFBLEVBQzlELFFBQVEsbUJBQW1CO0FBQUEsRUFFM0IsWUFBWSxTQUFTLElBQUksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLGVBQWU7QUFBQSxFQUNqRSxZQUFZLGNBQWMsSUFBSSxJQUFJLEVBQUUsYUFBYSxJQUFJLEVBQUUsb0JBQW9CO0FBQUEsRUFHM0UsWUFBWSxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsYUFBYSxJQUFJLEVBQUUsa0JBQWtCO0FBQUEsRUFDOUUsWUFBWSxjQUFjLElBQUksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLGlCQUFpQjtBQUFBLEVBSXhFLFlBQVksa0JBQWtCLFNBQVMsSUFBSSxFQUFFLGFBQ3JDLElBQUksRUFBRSxlQUFlLElBQUksRUFBRSxpQkFBaUIsSUFBSTtBQUFBLEVBQ3hELFFBQVEsd0JBQXdCO0FBQUEsRUFNaEMsWUFBWSxlQUFlLFNBQVMsSUFBSSxFQUFFLGtCQUN2QixjQUNBLElBQUksSUFBSSxFQUFFLGtCQUNWLE9BQU87QUFBQSxFQUUxQixZQUFZLG9CQUFvQixTQUFTLElBQUksRUFBRSx1QkFDdkIsY0FDQSxJQUFJLElBQUksRUFBRSx1QkFDVixPQUFPO0FBQUEsRUFHL0IsWUFBWSxRQUFRLGlCQUFpQjtBQUFBLEVBRXJDLFlBQVksUUFBUSwyQkFBMkI7QUFBQSxFQUMvQyxZQUFZLFdBQVcsNkJBQTZCO0FBQUE7Ozs7RUMzTnBELElBQU0sY0FBYyxPQUFPLE9BQU8sRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLEVBQ2pELElBQU0sWUFBWSxPQUFPLE9BQU8sQ0FBRSxDQUFDO0FBQUEsRUFDbkMsSUFBTSxlQUFlLGNBQVc7QUFBQSxJQUM5QixLQUFLLFVBQVM7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLE9BQU8sYUFBWSxVQUFVO0FBQUEsTUFDL0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNkakIsSUFBTSxVQUFVO0FBQUEsRUFDaEIsSUFBTSxxQkFBcUIsQ0FBQyxHQUFHLE1BQU07QUFBQSxJQUNuQyxNQUFNLE9BQU8sUUFBUSxLQUFLLENBQUM7QUFBQSxJQUMzQixNQUFNLE9BQU8sUUFBUSxLQUFLLENBQUM7QUFBQSxJQUUzQixJQUFJLFFBQVEsTUFBTTtBQUFBLE1BQ2hCLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFFQSxPQUFPLE1BQU0sSUFBSSxJQUNaLFNBQVMsT0FBUSxLQUNqQixTQUFTLE9BQVEsSUFDbEIsSUFBSSxJQUFJLEtBQ1I7QUFBQTtBQUFBLEVBR04sSUFBTSxzQkFBc0IsQ0FBQyxHQUFHLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQztBQUFBLEVBRTdELE9BQU8sVUFBVTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBOzs7O0VDdEJBLElBQU07QUFBQSxFQUNOLE1BQVEsWUFBWTtBQUFBLEVBQ3BCLE1BQVEsUUFBUSxJQUFJO0FBQUEsRUFFcEIsSUFBTTtBQUFBLEVBQ04sTUFBUTtBQUFBO0FBQUEsRUFDUixNQUFNLE9BQU87QUFBQSxJQUNYLFdBQVksQ0FBQyxTQUFTLFVBQVM7QUFBQSxNQUM3QixXQUFVLGFBQWEsUUFBTztBQUFBLE1BRTlCLElBQUksbUJBQW1CLFFBQVE7QUFBQSxRQUM3QixJQUFJLFFBQVEsWUFBWSxTQUFRLFNBQzlCLFFBQVEsd0JBQXdCLFNBQVEsbUJBQW1CO0FBQUEsVUFDM0QsT0FBTztBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsVUFBVSxRQUFRO0FBQUE7QUFBQSxNQUV0QixFQUFPLFNBQUksT0FBTyxZQUFZLFVBQVU7QUFBQSxRQUN0QyxNQUFNLElBQUksVUFBVSxnREFBZ0QsT0FBTyxXQUFXO0FBQUEsTUFDeEY7QUFBQSxNQUVBLElBQUksUUFBUSxTQUFTLFlBQVk7QUFBQSxRQUMvQixNQUFNLElBQUksVUFDUiwwQkFBMEIsdUJBQzVCO0FBQUEsTUFDRjtBQUFBLE1BRUEsTUFBTSxVQUFVLFNBQVMsUUFBTztBQUFBLE1BQ2hDLEtBQUssVUFBVTtBQUFBLE1BQ2YsS0FBSyxVQUFVLFNBQVE7QUFBQSxNQUd2QixLQUFLLHNCQUFzQixTQUFRO0FBQUEsTUFFbkMsTUFBTSxJQUFJLFFBQVEsS0FBSyxFQUFFLE1BQU0sU0FBUSxRQUFRLEdBQUcsRUFBRSxTQUFTLEdBQUcsRUFBRSxLQUFLO0FBQUEsTUFFdkUsS0FBSyxHQUFHO0FBQUEsUUFDTixNQUFNLElBQUksVUFBVSxvQkFBb0IsU0FBUztBQUFBLE1BQ25EO0FBQUEsTUFFQSxLQUFLLE1BQU07QUFBQSxNQUdYLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDaEIsS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUNoQixLQUFLLFNBQVMsRUFBRTtBQUFBLE1BRWhCLElBQUksS0FBSyxRQUFRLG9CQUFvQixLQUFLLFFBQVEsR0FBRztBQUFBLFFBQ25ELE1BQU0sSUFBSSxVQUFVLHVCQUF1QjtBQUFBLE1BQzdDO0FBQUEsTUFFQSxJQUFJLEtBQUssUUFBUSxvQkFBb0IsS0FBSyxRQUFRLEdBQUc7QUFBQSxRQUNuRCxNQUFNLElBQUksVUFBVSx1QkFBdUI7QUFBQSxNQUM3QztBQUFBLE1BRUEsSUFBSSxLQUFLLFFBQVEsb0JBQW9CLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDbkQsTUFBTSxJQUFJLFVBQVUsdUJBQXVCO0FBQUEsTUFDN0M7QUFBQSxNQUdBLEtBQUssRUFBRSxJQUFJO0FBQUEsUUFDVCxLQUFLLGFBQWEsQ0FBQztBQUFBLE1BQ3JCLEVBQU87QUFBQSxRQUNMLEtBQUssYUFBYSxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87QUFBQSxVQUM1QyxJQUFJLFdBQVcsS0FBSyxFQUFFLEdBQUc7QUFBQSxZQUN2QixNQUFNLE9BQU87QUFBQSxZQUNiLElBQUksT0FBTyxLQUFLLE1BQU0sa0JBQWtCO0FBQUEsY0FDdEMsT0FBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsU0FDUjtBQUFBO0FBQUEsTUFHSCxLQUFLLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQUEsTUFDdkMsS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUdkLE1BQU8sR0FBRztBQUFBLE1BQ1IsS0FBSyxVQUFVLEdBQUcsS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDbkQsSUFBSSxLQUFLLFdBQVcsUUFBUTtBQUFBLFFBQzFCLEtBQUssV0FBVyxJQUFJLEtBQUssV0FBVyxLQUFLLEdBQUc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLFFBQVMsR0FBRztBQUFBLE1BQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLE9BQVEsQ0FBQyxPQUFPO0FBQUEsTUFDZCxNQUFNLGtCQUFrQixLQUFLLFNBQVMsS0FBSyxTQUFTLEtBQUs7QUFBQSxNQUN6RCxNQUFNLGlCQUFpQixTQUFTO0FBQUEsUUFDOUIsSUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLEtBQUssU0FBUztBQUFBLFVBQ3ZELE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ3hDO0FBQUEsTUFFQSxJQUFJLE1BQU0sWUFBWSxLQUFLLFNBQVM7QUFBQSxRQUNsQyxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsT0FBTyxLQUFLLFlBQVksS0FBSyxLQUFLLEtBQUssV0FBVyxLQUFLO0FBQUE7QUFBQSxJQUd6RCxXQUFZLENBQUMsT0FBTztBQUFBLE1BQ2xCLE1BQU0saUJBQWlCLFNBQVM7QUFBQSxRQUM5QixRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUNFLG1CQUFtQixLQUFLLE9BQU8sTUFBTSxLQUFLLEtBQzFDLG1CQUFtQixLQUFLLE9BQU8sTUFBTSxLQUFLLEtBQzFDLG1CQUFtQixLQUFLLE9BQU8sTUFBTSxLQUFLO0FBQUE7QUFBQSxJQUk5QyxVQUFXLENBQUMsT0FBTztBQUFBLE1BQ2pCLE1BQU0saUJBQWlCLFNBQVM7QUFBQSxRQUM5QixRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ3hDO0FBQUEsTUFHQSxJQUFJLEtBQUssV0FBVyxXQUFXLE1BQU0sV0FBVyxRQUFRO0FBQUEsUUFDdEQsT0FBTztBQUFBLE1BQ1QsRUFBTyxVQUFLLEtBQUssV0FBVyxVQUFVLE1BQU0sV0FBVyxRQUFRO0FBQUEsUUFDN0QsT0FBTztBQUFBLE1BQ1QsRUFBTyxVQUFLLEtBQUssV0FBVyxXQUFXLE1BQU0sV0FBVyxRQUFRO0FBQUEsUUFDOUQsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksSUFBSTtBQUFBLE1BQ1IsR0FBRztBQUFBLFFBQ0QsTUFBTSxJQUFJLEtBQUssV0FBVztBQUFBLFFBQzFCLE1BQU0sSUFBSSxNQUFNLFdBQVc7QUFBQSxRQUMzQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUFBLFFBQ25DLElBQUksTUFBTSxhQUFhLE1BQU0sV0FBVztBQUFBLFVBQ3RDLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxNQUFNLFdBQVc7QUFBQSxVQUMxQixPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksTUFBTSxXQUFXO0FBQUEsVUFDMUIsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLE1BQU0sR0FBRztBQUFBLFVBQ2xCO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxPQUFPLG1CQUFtQixHQUFHLENBQUM7QUFBQTtBQUFBLE1BRWxDLFdBQVc7QUFBQTtBQUFBLElBR2IsWUFBYSxDQUFDLE9BQU87QUFBQSxNQUNuQixNQUFNLGlCQUFpQixTQUFTO0FBQUEsUUFDOUIsUUFBUSxJQUFJLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUN4QztBQUFBLE1BRUEsSUFBSSxJQUFJO0FBQUEsTUFDUixHQUFHO0FBQUEsUUFDRCxNQUFNLElBQUksS0FBSyxNQUFNO0FBQUEsUUFDckIsTUFBTSxJQUFJLE1BQU0sTUFBTTtBQUFBLFFBQ3RCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBQUEsUUFDOUIsSUFBSSxNQUFNLGFBQWEsTUFBTSxXQUFXO0FBQUEsVUFDdEMsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLE1BQU0sV0FBVztBQUFBLFVBQzFCLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxNQUFNLFdBQVc7QUFBQSxVQUMxQixPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksTUFBTSxHQUFHO0FBQUEsVUFDbEI7QUFBQSxRQUNGLEVBQU87QUFBQSxVQUNMLE9BQU8sbUJBQW1CLEdBQUcsQ0FBQztBQUFBO0FBQUEsTUFFbEMsV0FBVztBQUFBO0FBQUEsSUFLYixHQUFJLENBQUMsU0FBUyxZQUFZLGdCQUFnQjtBQUFBLE1BQ3hDLElBQUksUUFBUSxXQUFXLEtBQUssR0FBRztBQUFBLFFBQzdCLEtBQUssY0FBYyxtQkFBbUIsT0FBTztBQUFBLFVBQzNDLE1BQU0sSUFBSSxNQUFNLGlEQUFpRDtBQUFBLFFBQ25FO0FBQUEsUUFFQSxJQUFJLFlBQVk7QUFBQSxVQUNkLE1BQU0sUUFBUSxJQUFJLGFBQWEsTUFBTSxLQUFLLFFBQVEsUUFBUSxHQUFHLEVBQUUsbUJBQW1CLEdBQUcsRUFBRSxXQUFXO0FBQUEsVUFDbEcsS0FBSyxTQUFTLE1BQU0sT0FBTyxZQUFZO0FBQUEsWUFDckMsTUFBTSxJQUFJLE1BQU0sdUJBQXVCLFlBQVk7QUFBQSxVQUNyRDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFFQSxRQUFRO0FBQUEsYUFDRDtBQUFBLFVBQ0gsS0FBSyxXQUFXLFNBQVM7QUFBQSxVQUN6QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsS0FBSyxJQUFJLE9BQU8sWUFBWSxjQUFjO0FBQUEsVUFDMUM7QUFBQSxhQUNHO0FBQUEsVUFDSCxLQUFLLFdBQVcsU0FBUztBQUFBLFVBQ3pCLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsS0FBSyxJQUFJLE9BQU8sWUFBWSxjQUFjO0FBQUEsVUFDMUM7QUFBQSxhQUNHO0FBQUEsVUFJSCxLQUFLLFdBQVcsU0FBUztBQUFBLFVBQ3pCLEtBQUssSUFBSSxTQUFTLFlBQVksY0FBYztBQUFBLFVBQzVDLEtBQUssSUFBSSxPQUFPLFlBQVksY0FBYztBQUFBLFVBQzFDO0FBQUEsYUFHRztBQUFBLFVBQ0gsSUFBSSxLQUFLLFdBQVcsV0FBVyxHQUFHO0FBQUEsWUFDaEMsS0FBSyxJQUFJLFNBQVMsWUFBWSxjQUFjO0FBQUEsVUFDOUM7QUFBQSxVQUNBLEtBQUssSUFBSSxPQUFPLFlBQVksY0FBYztBQUFBLFVBQzFDO0FBQUEsYUFDRztBQUFBLFVBQ0gsSUFBSSxLQUFLLFdBQVcsV0FBVyxHQUFHO0FBQUEsWUFDaEMsTUFBTSxJQUFJLE1BQU0sV0FBVyxLQUFLLHlCQUF5QjtBQUFBLFVBQzNEO0FBQUEsVUFDQSxLQUFLLFdBQVcsU0FBUztBQUFBLFVBQ3pCO0FBQUEsYUFFRztBQUFBLFVBS0gsSUFDRSxLQUFLLFVBQVUsS0FDZixLQUFLLFVBQVUsS0FDZixLQUFLLFdBQVcsV0FBVyxHQUMzQjtBQUFBLFlBQ0EsS0FBSztBQUFBLFVBQ1A7QUFBQSxVQUNBLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLGFBQWEsQ0FBQztBQUFBLFVBQ25CO0FBQUEsYUFDRztBQUFBLFVBS0gsSUFBSSxLQUFLLFVBQVUsS0FBSyxLQUFLLFdBQVcsV0FBVyxHQUFHO0FBQUEsWUFDcEQsS0FBSztBQUFBLFVBQ1A7QUFBQSxVQUNBLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxhQUFhLENBQUM7QUFBQSxVQUNuQjtBQUFBLGFBQ0c7QUFBQSxVQUtILElBQUksS0FBSyxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ2hDLEtBQUs7QUFBQSxVQUNQO0FBQUEsVUFDQSxLQUFLLGFBQWEsQ0FBQztBQUFBLFVBQ25CO0FBQUEsYUFHRyxPQUFPO0FBQUEsVUFDVixNQUFNLE9BQU8sT0FBTyxjQUFjLElBQUksSUFBSTtBQUFBLFVBRTFDLElBQUksS0FBSyxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ2hDLEtBQUssYUFBYSxDQUFDLElBQUk7QUFBQSxVQUN6QixFQUFPO0FBQUEsWUFDTCxJQUFJLElBQUksS0FBSyxXQUFXO0FBQUEsWUFDeEIsU0FBUyxLQUFLLEdBQUc7QUFBQSxjQUNmLElBQUksT0FBTyxLQUFLLFdBQVcsT0FBTyxVQUFVO0FBQUEsZ0JBQzFDLEtBQUssV0FBVztBQUFBLGdCQUNoQixJQUFJO0FBQUEsY0FDTjtBQUFBLFlBQ0Y7QUFBQSxZQUNBLElBQUksTUFBTSxJQUFJO0FBQUEsY0FFWixJQUFJLGVBQWUsS0FBSyxXQUFXLEtBQUssR0FBRyxLQUFLLG1CQUFtQixPQUFPO0FBQUEsZ0JBQ3hFLE1BQU0sSUFBSSxNQUFNLHVEQUF1RDtBQUFBLGNBQ3pFO0FBQUEsY0FDQSxLQUFLLFdBQVcsS0FBSyxJQUFJO0FBQUEsWUFDM0I7QUFBQTtBQUFBLFVBRUYsSUFBSSxZQUFZO0FBQUEsWUFHZCxJQUFJLGFBQWEsQ0FBQyxZQUFZLElBQUk7QUFBQSxZQUNsQyxJQUFJLG1CQUFtQixPQUFPO0FBQUEsY0FDNUIsYUFBYSxDQUFDLFVBQVU7QUFBQSxZQUMxQjtBQUFBLFlBQ0EsSUFBSSxtQkFBbUIsS0FBSyxXQUFXLElBQUksVUFBVSxNQUFNLEdBQUc7QUFBQSxjQUM1RCxJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUUsR0FBRztBQUFBLGdCQUM3QixLQUFLLGFBQWE7QUFBQSxjQUNwQjtBQUFBLFlBQ0YsRUFBTztBQUFBLGNBQ0wsS0FBSyxhQUFhO0FBQUE7QUFBQSxVQUV0QjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUE7QUFBQSxVQUVFLE1BQU0sSUFBSSxNQUFNLCtCQUErQixTQUFTO0FBQUE7QUFBQSxNQUU1RCxLQUFLLE1BQU0sS0FBSyxPQUFPO0FBQUEsTUFDdkIsSUFBSSxLQUFLLE1BQU0sUUFBUTtBQUFBLFFBQ3JCLEtBQUssT0FBTyxJQUFJLEtBQUssTUFBTSxLQUFLLEdBQUc7QUFBQSxNQUNyQztBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTyxVQUFVO0FBQUE7Ozs7RUM1VGpCLElBQU07QUFBQSxFQUNOLElBQU0sUUFBUSxDQUFDLFNBQVMsVUFBUyxjQUFjLFVBQVU7QUFBQSxJQUN2RCxJQUFJLG1CQUFtQixRQUFRO0FBQUEsTUFDN0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUk7QUFBQSxNQUNGLE9BQU8sSUFBSSxPQUFPLFNBQVMsUUFBTztBQUFBLE1BQ2xDLE9BQU8sSUFBSTtBQUFBLE1BQ1gsS0FBSyxhQUFhO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE1BQU07QUFBQTtBQUFBO0FBQUEsRUFJVixPQUFPLFVBQVU7QUFBQTs7OztFQ2ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLFFBQVEsQ0FBQyxTQUFTLGFBQVk7QUFBQSxJQUNsQyxNQUFNLElBQUksTUFBTSxTQUFTLFFBQU87QUFBQSxJQUNoQyxPQUFPLElBQUksRUFBRSxVQUFVO0FBQUE7QUFBQSxFQUV6QixPQUFPLFVBQVU7QUFBQTs7OztFQ0xqQixJQUFNO0FBQUEsRUFDTixJQUFNLFFBQVEsQ0FBQyxTQUFTLGFBQVk7QUFBQSxJQUNsQyxNQUFNLElBQUksTUFBTSxRQUFRLEtBQUssRUFBRSxRQUFRLFVBQVUsRUFBRSxHQUFHLFFBQU87QUFBQSxJQUM3RCxPQUFPLElBQUksRUFBRSxVQUFVO0FBQUE7QUFBQSxFQUV6QixPQUFPLFVBQVU7QUFBQTs7OztFQ0xqQixJQUFNO0FBQUEsRUFFTixJQUFNLE1BQU0sQ0FBQyxTQUFTLFNBQVMsVUFBUyxZQUFZLG1CQUFtQjtBQUFBLElBQ3JFLElBQUksT0FBUSxhQUFhLFVBQVU7QUFBQSxNQUNqQyxpQkFBaUI7QUFBQSxNQUNqQixhQUFhO0FBQUEsTUFDYixXQUFVO0FBQUEsSUFDWjtBQUFBLElBRUEsSUFBSTtBQUFBLE1BQ0YsT0FBTyxJQUFJLE9BQ1QsbUJBQW1CLFNBQVMsUUFBUSxVQUFVLFNBQzlDLFFBQ0YsRUFBRSxJQUFJLFNBQVMsWUFBWSxjQUFjLEVBQUU7QUFBQSxNQUMzQyxPQUFPLElBQUk7QUFBQSxNQUNYLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFHWCxPQUFPLFVBQVU7QUFBQTs7OztFQ2xCakIsSUFBTTtBQUFBLEVBRU4sSUFBTSxPQUFPLENBQUMsVUFBVSxhQUFhO0FBQUEsSUFDbkMsTUFBTSxLQUFLLE1BQU0sVUFBVSxNQUFNLElBQUk7QUFBQSxJQUNyQyxNQUFNLEtBQUssTUFBTSxVQUFVLE1BQU0sSUFBSTtBQUFBLElBQ3JDLE1BQU0sYUFBYSxHQUFHLFFBQVEsRUFBRTtBQUFBLElBRWhDLElBQUksZUFBZSxHQUFHO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE1BQU0sV0FBVyxhQUFhO0FBQUEsSUFDOUIsTUFBTSxjQUFjLFdBQVcsS0FBSztBQUFBLElBQ3BDLE1BQU0sYUFBYSxXQUFXLEtBQUs7QUFBQSxJQUNuQyxNQUFNLGVBQWUsWUFBWSxXQUFXO0FBQUEsSUFDNUMsTUFBTSxjQUFjLFdBQVcsV0FBVztBQUFBLElBRTFDLElBQUksY0FBYyxZQUFZO0FBQUEsTUFRNUIsS0FBSyxXQUFXLFVBQVUsV0FBVyxPQUFPO0FBQUEsUUFDMUMsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUdBLElBQUksV0FBVyxZQUFZLFdBQVcsTUFBTSxHQUFHO0FBQUEsUUFDN0MsSUFBSSxXQUFXLFVBQVUsV0FBVyxPQUFPO0FBQUEsVUFDekMsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBR0EsTUFBTSxTQUFTLGFBQWEsUUFBUTtBQUFBLElBRXBDLElBQUksR0FBRyxVQUFVLEdBQUcsT0FBTztBQUFBLE1BQ3pCLE9BQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsSUFFQSxJQUFJLEdBQUcsVUFBVSxHQUFHLE9BQU87QUFBQSxNQUN6QixPQUFPLFNBQVM7QUFBQSxJQUNsQjtBQUFBLElBRUEsSUFBSSxHQUFHLFVBQVUsR0FBRyxPQUFPO0FBQUEsTUFDekIsT0FBTyxTQUFTO0FBQUEsSUFDbEI7QUFBQSxJQUdBLE9BQU87QUFBQTtBQUFBLEVBR1QsT0FBTyxVQUFVO0FBQUE7Ozs7RUN6RGpCLElBQU07QUFBQSxFQUNOLElBQU0sUUFBUSxDQUFDLEdBQUcsVUFBVSxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxFQUNqRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLFFBQVEsQ0FBQyxHQUFHLFVBQVUsSUFBSSxPQUFPLEdBQUcsS0FBSyxFQUFFO0FBQUEsRUFDakQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLENBQUMsR0FBRyxVQUFVLElBQUksT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLEVBQ2pELE9BQU8sVUFBVTtBQUFBOzs7O0VDRmpCLElBQU07QUFBQSxFQUNOLElBQU0sYUFBYSxDQUFDLFNBQVMsYUFBWTtBQUFBLElBQ3ZDLE1BQU0sU0FBUyxNQUFNLFNBQVMsUUFBTztBQUFBLElBQ3JDLE9BQVEsVUFBVSxPQUFPLFdBQVcsU0FBVSxPQUFPLGFBQWE7QUFBQTtBQUFBLEVBRXBFLE9BQU8sVUFBVTtBQUFBOzs7O0VDTGpCLElBQU07QUFBQSxFQUNOLElBQU0sVUFBVSxDQUFDLEdBQUcsR0FBRyxVQUNyQixJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFBQSxFQUVuRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0pqQixJQUFNO0FBQUEsRUFDTixJQUFNLFdBQVcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLO0FBQUEsRUFDckQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxlQUFlLENBQUMsR0FBRyxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUk7QUFBQSxFQUNqRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLGVBQWUsQ0FBQyxHQUFHLEdBQUcsVUFBVTtBQUFBLElBQ3BDLE1BQU0sV0FBVyxJQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsSUFDcEMsTUFBTSxXQUFXLElBQUksT0FBTyxHQUFHLEtBQUs7QUFBQSxJQUNwQyxPQUFPLFNBQVMsUUFBUSxRQUFRLEtBQUssU0FBUyxhQUFhLFFBQVE7QUFBQTtBQUFBLEVBRXJFLE9BQU8sVUFBVTtBQUFBOzs7O0VDTmpCLElBQU07QUFBQSxFQUNOLElBQU0sT0FBTyxDQUFDLE1BQU0sVUFBVSxLQUFLLEtBQUssQ0FBQyxHQUFHLE1BQU0sYUFBYSxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDM0UsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLENBQUMsTUFBTSxVQUFVLEtBQUssS0FBSyxDQUFDLEdBQUcsTUFBTSxhQUFhLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUM1RSxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLElBQUk7QUFBQSxFQUNuRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLElBQUk7QUFBQSxFQUNuRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLE1BQU07QUFBQSxFQUNyRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLE1BQU07QUFBQSxFQUN0RCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLEtBQUs7QUFBQSxFQUNyRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxRQUFRLEdBQUcsR0FBRyxLQUFLLEtBQUs7QUFBQSxFQUNyRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixJQUFNLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxVQUFVO0FBQUEsSUFDL0IsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxRQUNILElBQUksT0FBTyxNQUFNLFVBQVU7QUFBQSxVQUN6QixJQUFJLEVBQUU7QUFBQSxRQUNSO0FBQUEsUUFDQSxJQUFJLE9BQU8sTUFBTSxVQUFVO0FBQUEsVUFDekIsSUFBSSxFQUFFO0FBQUEsUUFDUjtBQUFBLFFBQ0EsT0FBTyxNQUFNO0FBQUEsV0FFVjtBQUFBLFFBQ0gsSUFBSSxPQUFPLE1BQU0sVUFBVTtBQUFBLFVBQ3pCLElBQUksRUFBRTtBQUFBLFFBQ1I7QUFBQSxRQUNBLElBQUksT0FBTyxNQUFNLFVBQVU7QUFBQSxVQUN6QixJQUFJLEVBQUU7QUFBQSxRQUNSO0FBQUEsUUFDQSxPQUFPLE1BQU07QUFBQSxXQUVWO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sR0FBRyxHQUFHLEdBQUcsS0FBSztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLElBQUksR0FBRyxHQUFHLEtBQUs7QUFBQSxXQUVuQjtBQUFBLFFBQ0gsT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsV0FFbEI7QUFBQSxRQUNILE9BQU8sSUFBSSxHQUFHLEdBQUcsS0FBSztBQUFBLFdBRW5CO0FBQUEsUUFDSCxPQUFPLEdBQUcsR0FBRyxHQUFHLEtBQUs7QUFBQSxXQUVsQjtBQUFBLFFBQ0gsT0FBTyxJQUFJLEdBQUcsR0FBRyxLQUFLO0FBQUE7QUFBQSxRQUd0QixNQUFNLElBQUksVUFBVSxxQkFBcUIsSUFBSTtBQUFBO0FBQUE7QUFBQSxFQUduRCxPQUFPLFVBQVU7QUFBQTs7OztFQ25EakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sTUFBUSxRQUFRLElBQUk7QUFBQSxFQUVwQixJQUFNLFNBQVMsQ0FBQyxTQUFTLGFBQVk7QUFBQSxJQUNuQyxJQUFJLG1CQUFtQixRQUFRO0FBQUEsTUFDN0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksT0FBTyxZQUFZLFVBQVU7QUFBQSxNQUMvQixVQUFVLE9BQU8sT0FBTztBQUFBLElBQzFCO0FBQUEsSUFFQSxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDL0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLFdBQVUsWUFBVyxDQUFDO0FBQUEsSUFFdEIsSUFBSSxRQUFRO0FBQUEsSUFDWixLQUFLLFNBQVEsS0FBSztBQUFBLE1BQ2hCLFFBQVEsUUFBUSxNQUFNLFNBQVEsb0JBQW9CLEdBQUcsRUFBRSxjQUFjLEdBQUcsRUFBRSxPQUFPO0FBQUEsSUFDbkYsRUFBTztBQUFBLE1BVUwsTUFBTSxpQkFBaUIsU0FBUSxvQkFBb0IsR0FBRyxFQUFFLGlCQUFpQixHQUFHLEVBQUU7QUFBQSxNQUM5RSxJQUFJO0FBQUEsTUFDSixRQUFRLE9BQU8sZUFBZSxLQUFLLE9BQU8sUUFDcEMsU0FBUyxNQUFNLFFBQVEsTUFBTSxHQUFHLFdBQVcsUUFBUSxTQUN2RDtBQUFBLFFBQ0EsS0FBSyxTQUNDLEtBQUssUUFBUSxLQUFLLEdBQUcsV0FBVyxNQUFNLFFBQVEsTUFBTSxHQUFHLFFBQVE7QUFBQSxVQUNuRSxRQUFRO0FBQUEsUUFDVjtBQUFBLFFBQ0EsZUFBZSxZQUFZLEtBQUssUUFBUSxLQUFLLEdBQUcsU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUNuRTtBQUFBLE1BRUEsZUFBZSxZQUFZO0FBQUE7QUFBQSxJQUc3QixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxNQUFNLFFBQVEsTUFBTTtBQUFBLElBQ3BCLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxJQUMxQixNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQUEsSUFDMUIsTUFBTSxhQUFhLFNBQVEscUJBQXFCLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQzVFLE1BQU0sUUFBUSxTQUFRLHFCQUFxQixNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUV2RSxPQUFPLE1BQU0sR0FBRyxTQUFTLFNBQVMsUUFBUSxhQUFhLFNBQVMsUUFBTztBQUFBO0FBQUEsRUFFekUsT0FBTyxVQUFVO0FBQUE7Ozs7RUMzRGpCLE1BQU0sU0FBUztBQUFBLElBQ2IsV0FBWSxHQUFHO0FBQUEsTUFDYixLQUFLLE1BQU07QUFBQSxNQUNYLEtBQUssTUFBTSxJQUFJO0FBQUE7QUFBQSxJQUdqQixHQUFJLENBQUMsS0FBSztBQUFBLE1BQ1IsTUFBTSxRQUFRLEtBQUssSUFBSSxJQUFJLEdBQUc7QUFBQSxNQUM5QixJQUFJLFVBQVUsV0FBVztBQUFBLFFBQ3ZCO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFFTCxLQUFLLElBQUksT0FBTyxHQUFHO0FBQUEsUUFDbkIsS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLO0FBQUEsUUFDdkIsT0FBTztBQUFBO0FBQUE7QUFBQSxJQUlYLE1BQU8sQ0FBQyxLQUFLO0FBQUEsTUFDWCxPQUFPLEtBQUssSUFBSSxPQUFPLEdBQUc7QUFBQTtBQUFBLElBRzVCLEdBQUksQ0FBQyxLQUFLLE9BQU87QUFBQSxNQUNmLE1BQU0sVUFBVSxLQUFLLE9BQU8sR0FBRztBQUFBLE1BRS9CLEtBQUssV0FBVyxVQUFVLFdBQVc7QUFBQSxRQUVuQyxJQUFJLEtBQUssSUFBSSxRQUFRLEtBQUssS0FBSztBQUFBLFVBQzdCLE1BQU0sV0FBVyxLQUFLLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRTtBQUFBLFVBQ3hDLEtBQUssT0FBTyxRQUFRO0FBQUEsUUFDdEI7QUFBQSxRQUVBLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSztBQUFBLE1BQ3pCO0FBQUEsTUFFQSxPQUFPO0FBQUE7QUFBQSxFQUVYO0FBQUEsRUFFQSxPQUFPLFVBQVU7QUFBQTs7OztFQ3ZDakIsSUFBTSxtQkFBbUI7QUFBQTtBQUFBLEVBR3pCLE1BQU0sTUFBTTtBQUFBLElBQ1YsV0FBWSxDQUFDLE9BQU8sVUFBUztBQUFBLE1BQzNCLFdBQVUsYUFBYSxRQUFPO0FBQUEsTUFFOUIsSUFBSSxpQkFBaUIsT0FBTztBQUFBLFFBQzFCLElBQ0UsTUFBTSxZQUFZLFNBQVEsU0FDMUIsTUFBTSx3QkFBd0IsU0FBUSxtQkFDdEM7QUFBQSxVQUNBLE9BQU87QUFBQSxRQUNULEVBQU87QUFBQSxVQUNMLE9BQU8sSUFBSSxNQUFNLE1BQU0sS0FBSyxRQUFPO0FBQUE7QUFBQSxNQUV2QztBQUFBLE1BRUEsSUFBSSxpQkFBaUIsWUFBWTtBQUFBLFFBRS9CLEtBQUssTUFBTSxNQUFNO0FBQUEsUUFDakIsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFBQSxRQUNuQixLQUFLLFlBQVk7QUFBQSxRQUNqQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsS0FBSyxVQUFVO0FBQUEsTUFDZixLQUFLLFVBQVUsU0FBUTtBQUFBLE1BQ3ZCLEtBQUssc0JBQXNCLFNBQVE7QUFBQSxNQUtuQyxLQUFLLE1BQU0sTUFBTSxLQUFLLEVBQUUsUUFBUSxrQkFBa0IsR0FBRztBQUFBLE1BR3JELEtBQUssTUFBTSxLQUFLLElBQ2IsTUFBTSxJQUFJLEVBRVYsSUFBSSxPQUFLLEtBQUssV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBSWxDLE9BQU8sT0FBSyxFQUFFLE1BQU07QUFBQSxNQUV2QixLQUFLLEtBQUssSUFBSSxRQUFRO0FBQUEsUUFDcEIsTUFBTSxJQUFJLFVBQVUseUJBQXlCLEtBQUssS0FBSztBQUFBLE1BQ3pEO0FBQUEsTUFHQSxJQUFJLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFBQSxRQUV2QixNQUFNLFFBQVEsS0FBSyxJQUFJO0FBQUEsUUFDdkIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLFFBQU0sVUFBVSxFQUFFLEVBQUUsQ0FBQztBQUFBLFFBQ2hELElBQUksS0FBSyxJQUFJLFdBQVcsR0FBRztBQUFBLFVBQ3pCLEtBQUssTUFBTSxDQUFDLEtBQUs7QUFBQSxRQUNuQixFQUFPLFNBQUksS0FBSyxJQUFJLFNBQVMsR0FBRztBQUFBLFVBRTlCLFdBQVcsS0FBSyxLQUFLLEtBQUs7QUFBQSxZQUN4QixJQUFJLEVBQUUsV0FBVyxLQUFLLE1BQU0sRUFBRSxFQUFFLEdBQUc7QUFBQSxjQUNqQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsY0FDYjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLEtBQUssWUFBWTtBQUFBO0FBQUEsUUFHZixLQUFNLEdBQUc7QUFBQSxNQUNYLElBQUksS0FBSyxjQUFjLFdBQVc7QUFBQSxRQUNoQyxLQUFLLFlBQVk7QUFBQSxRQUNqQixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxVQUN4QyxJQUFJLElBQUksR0FBRztBQUFBLFlBQ1QsS0FBSyxhQUFhO0FBQUEsVUFDcEI7QUFBQSxVQUNBLE1BQU0sUUFBUSxLQUFLLElBQUk7QUFBQSxVQUN2QixTQUFTLElBQUksRUFBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQUEsWUFDckMsSUFBSSxJQUFJLEdBQUc7QUFBQSxjQUNULEtBQUssYUFBYTtBQUFBLFlBQ3BCO0FBQUEsWUFDQSxLQUFLLGFBQWEsTUFBTSxHQUFHLFNBQVMsRUFBRSxLQUFLO0FBQUEsVUFDN0M7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLE1BQU8sR0FBRztBQUFBLE1BQ1IsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLFFBQVMsR0FBRztBQUFBLE1BQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLFVBQVcsQ0FBQyxPQUFPO0FBQUEsTUFHakIsTUFBTSxZQUNILEtBQUssUUFBUSxxQkFBcUIsNEJBQ2xDLEtBQUssUUFBUSxTQUFTO0FBQUEsTUFDekIsTUFBTSxVQUFVLFdBQVcsTUFBTTtBQUFBLE1BQ2pDLE1BQU0sU0FBUyxNQUFNLElBQUksT0FBTztBQUFBLE1BQ2hDLElBQUksUUFBUTtBQUFBLFFBQ1YsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLE1BQU0sUUFBUSxLQUFLLFFBQVE7QUFBQSxNQUUzQixNQUFNLEtBQUssUUFBUSxHQUFHLEVBQUUsb0JBQW9CLEdBQUcsRUFBRTtBQUFBLE1BQ2pELFFBQVEsTUFBTSxRQUFRLElBQUksY0FBYyxLQUFLLFFBQVEsaUJBQWlCLENBQUM7QUFBQSxNQUN2RSxNQUFNLGtCQUFrQixLQUFLO0FBQUEsTUFHN0IsUUFBUSxNQUFNLFFBQVEsR0FBRyxFQUFFLGlCQUFpQixxQkFBcUI7QUFBQSxNQUNqRSxNQUFNLG1CQUFtQixLQUFLO0FBQUEsTUFHOUIsUUFBUSxNQUFNLFFBQVEsR0FBRyxFQUFFLFlBQVksZ0JBQWdCO0FBQUEsTUFDdkQsTUFBTSxjQUFjLEtBQUs7QUFBQSxNQUd6QixRQUFRLE1BQU0sUUFBUSxHQUFHLEVBQUUsWUFBWSxnQkFBZ0I7QUFBQSxNQUN2RCxNQUFNLGNBQWMsS0FBSztBQUFBLE1BS3pCLElBQUksWUFBWSxNQUNiLE1BQU0sR0FBRyxFQUNULElBQUksVUFBUSxnQkFBZ0IsTUFBTSxLQUFLLE9BQU8sQ0FBQyxFQUMvQyxLQUFLLEdBQUcsRUFDUixNQUFNLEtBQUssRUFFWCxJQUFJLFVBQVEsWUFBWSxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUEsTUFFOUMsSUFBSSxPQUFPO0FBQUEsUUFFVCxZQUFZLFVBQVUsT0FBTyxVQUFRO0FBQUEsVUFDbkMsTUFBTSx3QkFBd0IsTUFBTSxLQUFLLE9BQU87QUFBQSxVQUNoRCxTQUFTLEtBQUssTUFBTSxHQUFHLEVBQUUsZ0JBQWdCO0FBQUEsU0FDMUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxNQUFNLGNBQWMsU0FBUztBQUFBLE1BSzdCLE1BQU0sV0FBVyxJQUFJO0FBQUEsTUFDckIsTUFBTSxjQUFjLFVBQVUsSUFBSSxVQUFRLElBQUksV0FBVyxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUEsTUFDNUUsV0FBVyxRQUFRLGFBQWE7QUFBQSxRQUM5QixJQUFJLFVBQVUsSUFBSSxHQUFHO0FBQUEsVUFDbkIsT0FBTyxDQUFDLElBQUk7QUFBQSxRQUNkO0FBQUEsUUFDQSxTQUFTLElBQUksS0FBSyxPQUFPLElBQUk7QUFBQSxNQUMvQjtBQUFBLE1BQ0EsSUFBSSxTQUFTLE9BQU8sS0FBSyxTQUFTLElBQUksRUFBRSxHQUFHO0FBQUEsUUFDekMsU0FBUyxPQUFPLEVBQUU7QUFBQSxNQUNwQjtBQUFBLE1BRUEsTUFBTSxTQUFTLENBQUMsR0FBRyxTQUFTLE9BQU8sQ0FBQztBQUFBLE1BQ3BDLE1BQU0sSUFBSSxTQUFTLE1BQU07QUFBQSxNQUN6QixPQUFPO0FBQUE7QUFBQSxJQUdULFVBQVcsQ0FBQyxPQUFPLFVBQVM7QUFBQSxNQUMxQixNQUFNLGlCQUFpQixRQUFRO0FBQUEsUUFDN0IsTUFBTSxJQUFJLFVBQVUscUJBQXFCO0FBQUEsTUFDM0M7QUFBQSxNQUVBLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxvQkFBb0I7QUFBQSxRQUN4QyxPQUNFLGNBQWMsaUJBQWlCLFFBQU8sS0FDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUI7QUFBQSxVQUNuQyxPQUNFLGNBQWMsa0JBQWtCLFFBQU8sS0FDdkMsZ0JBQWdCLE1BQU0sQ0FBQyxtQkFBbUI7QUFBQSxZQUN4QyxPQUFPLGlCQUFpQixNQUFNLENBQUMsb0JBQW9CO0FBQUEsY0FDakQsT0FBTyxlQUFlLFdBQVcsaUJBQWlCLFFBQU87QUFBQSxhQUMxRDtBQUFBLFdBQ0Y7QUFBQSxTQUVKO0FBQUEsT0FFSjtBQUFBO0FBQUEsSUFJSCxJQUFLLENBQUMsU0FBUztBQUFBLE1BQ2IsS0FBSyxTQUFTO0FBQUEsUUFDWixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLFFBQy9CLElBQUk7QUFBQSxVQUNGLFVBQVUsSUFBSSxPQUFPLFNBQVMsS0FBSyxPQUFPO0FBQUEsVUFDMUMsT0FBTyxJQUFJO0FBQUEsVUFDWCxPQUFPO0FBQUE7QUFBQSxNQUVYO0FBQUEsTUFFQSxTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxRQUN4QyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLE9BQU8sR0FBRztBQUFBLFVBQy9DLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTyxVQUFVO0FBQUEsRUFFakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLElBQUk7QUFBQSxFQUVsQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTjtBQUFBLElBQ0UsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQTtBQUFBLEVBRUYsTUFBUSx5QkFBeUI7QUFBQSxFQUVqQyxJQUFNLFlBQVksT0FBSyxFQUFFLFVBQVU7QUFBQSxFQUNuQyxJQUFNLFFBQVEsT0FBSyxFQUFFLFVBQVU7QUFBQSxFQUkvQixJQUFNLGdCQUFnQixDQUFDLGFBQWEsYUFBWTtBQUFBLElBQzlDLElBQUksU0FBUztBQUFBLElBQ2IsTUFBTSx1QkFBdUIsWUFBWSxNQUFNO0FBQUEsSUFDL0MsSUFBSSxpQkFBaUIscUJBQXFCLElBQUk7QUFBQSxJQUU5QyxPQUFPLFVBQVUscUJBQXFCLFFBQVE7QUFBQSxNQUM1QyxTQUFTLHFCQUFxQixNQUFNLENBQUMsb0JBQW9CO0FBQUEsUUFDdkQsT0FBTyxlQUFlLFdBQVcsaUJBQWlCLFFBQU87QUFBQSxPQUMxRDtBQUFBLE1BRUQsaUJBQWlCLHFCQUFxQixJQUFJO0FBQUEsSUFDNUM7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBTVQsSUFBTSxrQkFBa0IsQ0FBQyxNQUFNLGFBQVk7QUFBQSxJQUN6QyxNQUFNLFFBQVEsTUFBTSxRQUFPO0FBQUEsSUFDM0IsT0FBTyxjQUFjLE1BQU0sUUFBTztBQUFBLElBQ2xDLE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsT0FBTyxjQUFjLE1BQU0sUUFBTztBQUFBLElBQ2xDLE1BQU0sVUFBVSxJQUFJO0FBQUEsSUFDcEIsT0FBTyxlQUFlLE1BQU0sUUFBTztBQUFBLElBQ25DLE1BQU0sVUFBVSxJQUFJO0FBQUEsSUFDcEIsT0FBTyxhQUFhLE1BQU0sUUFBTztBQUFBLElBQ2pDLE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDbkIsT0FBTztBQUFBO0FBQUEsRUFHVCxJQUFNLE1BQU0sU0FBTyxNQUFNLEdBQUcsWUFBWSxNQUFNLE9BQU8sT0FBTztBQUFBLEVBUzVELElBQU0sZ0JBQWdCLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdkMsT0FBTyxLQUNKLEtBQUssRUFDTCxNQUFNLEtBQUssRUFDWCxJQUFJLENBQUMsTUFBTSxhQUFhLEdBQUcsUUFBTyxDQUFDLEVBQ25DLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHYixJQUFNLGVBQWUsQ0FBQyxNQUFNLGFBQVk7QUFBQSxJQUN0QyxNQUFNLElBQUksU0FBUSxRQUFRLEdBQUcsRUFBRSxjQUFjLEdBQUcsRUFBRTtBQUFBLElBQ2xELE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU87QUFBQSxNQUN6QyxNQUFNLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFBQSxNQUNuQyxJQUFJO0FBQUEsTUFFSixJQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDVixNQUFNO0FBQUEsTUFDUixFQUFPLFNBQUksSUFBSSxDQUFDLEdBQUc7QUFBQSxRQUNqQixNQUFNLEtBQUssV0FBVyxJQUFJO0FBQUEsTUFDNUIsRUFBTyxTQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFFakIsTUFBTSxLQUFLLEtBQUssUUFBUSxNQUFNLElBQUk7QUFBQSxNQUNwQyxFQUFPLFNBQUksSUFBSTtBQUFBLFFBQ2IsTUFBTSxtQkFBbUIsRUFBRTtBQUFBLFFBQzNCLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxPQUNyQixNQUFNLElBQUk7QUFBQSxNQUNqQixFQUFPO0FBQUEsUUFFTCxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQ2hCLE1BQU0sSUFBSTtBQUFBO0FBQUEsTUFHakIsTUFBTSxnQkFBZ0IsR0FBRztBQUFBLE1BQ3pCLE9BQU87QUFBQSxLQUNSO0FBQUE7QUFBQSxFQVdILElBQU0sZ0JBQWdCLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdkMsT0FBTyxLQUNKLEtBQUssRUFDTCxNQUFNLEtBQUssRUFDWCxJQUFJLENBQUMsTUFBTSxhQUFhLEdBQUcsUUFBTyxDQUFDLEVBQ25DLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHYixJQUFNLGVBQWUsQ0FBQyxNQUFNLGFBQVk7QUFBQSxJQUN0QyxNQUFNLFNBQVMsTUFBTSxRQUFPO0FBQUEsSUFDNUIsTUFBTSxJQUFJLFNBQVEsUUFBUSxHQUFHLEVBQUUsY0FBYyxHQUFHLEVBQUU7QUFBQSxJQUNsRCxNQUFNLElBQUksU0FBUSxvQkFBb0IsT0FBTztBQUFBLElBQzdDLE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU87QUFBQSxNQUN6QyxNQUFNLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFBQSxNQUNuQyxJQUFJO0FBQUEsTUFFSixJQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDVixNQUFNO0FBQUEsTUFDUixFQUFPLFNBQUksSUFBSSxDQUFDLEdBQUc7QUFBQSxRQUNqQixNQUFNLEtBQUssUUFBUSxPQUFPLElBQUk7QUFBQSxNQUNoQyxFQUFPLFNBQUksSUFBSSxDQUFDLEdBQUc7QUFBQSxRQUNqQixJQUFJLE1BQU0sS0FBSztBQUFBLFVBQ2IsTUFBTSxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLFFBQ3hDLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxLQUFLLE1BQU0sT0FBTyxJQUFJO0FBQUE7QUFBQSxNQUVyQyxFQUFPLFNBQUksSUFBSTtBQUFBLFFBQ2IsTUFBTSxtQkFBbUIsRUFBRTtBQUFBLFFBQzNCLElBQUksTUFBTSxLQUFLO0FBQUEsVUFDYixJQUFJLE1BQU0sS0FBSztBQUFBLFlBQ2IsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLE9BQ3JCLEtBQUssTUFBTSxJQUFJO0FBQUEsVUFDdEIsRUFBTztBQUFBLFlBQ0wsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLE9BQ3JCLE1BQU0sSUFBSTtBQUFBO0FBQUEsUUFFbkIsRUFBTztBQUFBLFVBQ0wsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLFFBQ3BCLElBQUk7QUFBQTtBQUFBLE1BRWQsRUFBTztBQUFBLFFBQ0wsTUFBTSxPQUFPO0FBQUEsUUFDYixJQUFJLE1BQU0sS0FBSztBQUFBLFVBQ2IsSUFBSSxNQUFNLEtBQUs7QUFBQSxZQUNiLE1BQU0sS0FBSyxLQUFLLEtBQUssSUFDbEIsTUFBTSxLQUFLLE1BQU0sSUFBSTtBQUFBLFVBQzFCLEVBQU87QUFBQSxZQUNMLE1BQU0sS0FBSyxLQUFLLEtBQUssSUFDbEIsTUFBTSxNQUFNLElBQUk7QUFBQTtBQUFBLFFBRXZCLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxLQUFLLEtBQUssT0FDZixJQUFJO0FBQUE7QUFBQTtBQUFBLE1BSWQsTUFBTSxnQkFBZ0IsR0FBRztBQUFBLE1BQ3pCLE9BQU87QUFBQSxLQUNSO0FBQUE7QUFBQSxFQUdILElBQU0saUJBQWlCLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDeEMsTUFBTSxrQkFBa0IsTUFBTSxRQUFPO0FBQUEsSUFDckMsT0FBTyxLQUNKLE1BQU0sS0FBSyxFQUNYLElBQUksQ0FBQyxNQUFNLGNBQWMsR0FBRyxRQUFPLENBQUMsRUFDcEMsS0FBSyxHQUFHO0FBQUE7QUFBQSxFQUdiLElBQU0sZ0JBQWdCLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdkMsT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUNqQixNQUFNLElBQUksU0FBUSxRQUFRLEdBQUcsRUFBRSxlQUFlLEdBQUcsRUFBRTtBQUFBLElBQ25ELE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTztBQUFBLE1BQ2pELE1BQU0sVUFBVSxNQUFNLEtBQUssTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQUEsTUFDNUMsTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQ2hCLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLE1BQ3RCLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLE1BQ3RCLE1BQU0sT0FBTztBQUFBLE1BRWIsSUFBSSxTQUFTLE9BQU8sTUFBTTtBQUFBLFFBQ3hCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFJQSxLQUFLLFNBQVEsb0JBQW9CLE9BQU87QUFBQSxNQUV4QyxJQUFJLElBQUk7QUFBQSxRQUNOLElBQUksU0FBUyxPQUFPLFNBQVMsS0FBSztBQUFBLFVBRWhDLE1BQU07QUFBQSxRQUNSLEVBQU87QUFBQSxVQUVMLE1BQU07QUFBQTtBQUFBLE1BRVYsRUFBTyxTQUFJLFFBQVEsTUFBTTtBQUFBLFFBR3ZCLElBQUksSUFBSTtBQUFBLFVBQ04sSUFBSTtBQUFBLFFBQ047QUFBQSxRQUNBLElBQUk7QUFBQSxRQUVKLElBQUksU0FBUyxLQUFLO0FBQUEsVUFHaEIsT0FBTztBQUFBLFVBQ1AsSUFBSSxJQUFJO0FBQUEsWUFDTixLQUFLLElBQUk7QUFBQSxZQUNULElBQUk7QUFBQSxZQUNKLElBQUk7QUFBQSxVQUNOLEVBQU87QUFBQSxZQUNMLEtBQUssSUFBSTtBQUFBLFlBQ1QsSUFBSTtBQUFBO0FBQUEsUUFFUixFQUFPLFNBQUksU0FBUyxNQUFNO0FBQUEsVUFHeEIsT0FBTztBQUFBLFVBQ1AsSUFBSSxJQUFJO0FBQUEsWUFDTixLQUFLLElBQUk7QUFBQSxVQUNYLEVBQU87QUFBQSxZQUNMLEtBQUssSUFBSTtBQUFBO0FBQUEsUUFFYjtBQUFBLFFBRUEsSUFBSSxTQUFTLEtBQUs7QUFBQSxVQUNoQixLQUFLO0FBQUEsUUFDUDtBQUFBLFFBRUEsTUFBTSxHQUFHLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxNQUNoQyxFQUFPLFNBQUksSUFBSTtBQUFBLFFBQ2IsTUFBTSxLQUFLLFFBQVEsUUFBUSxJQUFJO0FBQUEsTUFDakMsRUFBTyxTQUFJLElBQUk7QUFBQSxRQUNiLE1BQU0sS0FBSyxLQUFLLE1BQU0sT0FDakIsTUFBTSxJQUFJO0FBQUEsTUFDakI7QUFBQSxNQUVBLE1BQU0saUJBQWlCLEdBQUc7QUFBQSxNQUUxQixPQUFPO0FBQUEsS0FDUjtBQUFBO0FBQUEsRUFLSCxJQUFNLGVBQWUsQ0FBQyxNQUFNLGFBQVk7QUFBQSxJQUN0QyxNQUFNLGdCQUFnQixNQUFNLFFBQU87QUFBQSxJQUVuQyxPQUFPLEtBQ0osS0FBSyxFQUNMLFFBQVEsR0FBRyxFQUFFLE9BQU8sRUFBRTtBQUFBO0FBQUEsRUFHM0IsSUFBTSxjQUFjLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDckMsTUFBTSxlQUFlLE1BQU0sUUFBTztBQUFBLElBQ2xDLE9BQU8sS0FDSixLQUFLLEVBQ0wsUUFBUSxHQUFHLFNBQVEsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtBQUFBO0FBQUEsRUFTbkUsSUFBTSxnQkFBZ0IsV0FBUyxDQUFDLElBQzlCLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUN2QixJQUFJLElBQUksSUFBSSxJQUFJLFFBQVE7QUFBQSxJQUN4QixJQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDWCxPQUFPO0FBQUEsSUFDVCxFQUFPLFNBQUksSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUNsQixPQUFPLEtBQUssU0FBUyxRQUFRLE9BQU87QUFBQSxJQUN0QyxFQUFPLFNBQUksSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUNsQixPQUFPLEtBQUssTUFBTSxPQUFPLFFBQVEsT0FBTztBQUFBLElBQzFDLEVBQU8sU0FBSSxLQUFLO0FBQUEsTUFDZCxPQUFPLEtBQUs7QUFBQSxJQUNkLEVBQU87QUFBQSxNQUNMLE9BQU8sS0FBSyxPQUFPLFFBQVEsT0FBTztBQUFBO0FBQUEsSUFHcEMsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUFBLE1BQ1gsS0FBSztBQUFBLElBQ1AsRUFBTyxTQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDbEIsS0FBSyxLQUFLLEtBQUs7QUFBQSxJQUNqQixFQUFPLFNBQUksSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUNsQixLQUFLLElBQUksT0FBTyxLQUFLO0FBQUEsSUFDdkIsRUFBTyxTQUFJLEtBQUs7QUFBQSxNQUNkLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTTtBQUFBLElBQzlCLEVBQU8sU0FBSSxPQUFPO0FBQUEsTUFDaEIsS0FBSyxJQUFJLE1BQU0sT0FBTyxLQUFLO0FBQUEsSUFDN0IsRUFBTztBQUFBLE1BQ0wsS0FBSyxLQUFLO0FBQUE7QUFBQSxJQUdaLE9BQU8sR0FBRyxRQUFRLEtBQUssS0FBSztBQUFBO0FBQUEsRUFHOUIsSUFBTSxVQUFVLENBQUMsS0FBSyxTQUFTLGFBQVk7QUFBQSxJQUN6QyxTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDbkMsS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPLEdBQUc7QUFBQSxRQUN6QixPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksUUFBUSxXQUFXLFdBQVcsU0FBUSxtQkFBbUI7QUFBQSxNQU0zRCxTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDbkMsTUFBTSxJQUFJLEdBQUcsTUFBTTtBQUFBLFFBQ25CLElBQUksSUFBSSxHQUFHLFdBQVcsV0FBVyxLQUFLO0FBQUEsVUFDcEM7QUFBQSxRQUNGO0FBQUEsUUFFQSxJQUFJLElBQUksR0FBRyxPQUFPLFdBQVcsU0FBUyxHQUFHO0FBQUEsVUFDdkMsTUFBTSxVQUFVLElBQUksR0FBRztBQUFBLFVBQ3ZCLElBQUksUUFBUSxVQUFVLFFBQVEsU0FDMUIsUUFBUSxVQUFVLFFBQVEsU0FDMUIsUUFBUSxVQUFVLFFBQVEsT0FBTztBQUFBLFlBQ25DLE9BQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUdBLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQTs7OztFQ3hpQlQsSUFBTSxNQUFNLE9BQU8sWUFBWTtBQUFBO0FBQUEsRUFFL0IsTUFBTSxXQUFXO0FBQUEsZUFDSixHQUFJLEdBQUc7QUFBQSxNQUNoQixPQUFPO0FBQUE7QUFBQSxJQUdULFdBQVksQ0FBQyxNQUFNLFVBQVM7QUFBQSxNQUMxQixXQUFVLGFBQWEsUUFBTztBQUFBLE1BRTlCLElBQUksZ0JBQWdCLFlBQVk7QUFBQSxRQUM5QixJQUFJLEtBQUssWUFBWSxTQUFRLE9BQU87QUFBQSxVQUNsQyxPQUFPO0FBQUEsUUFDVCxFQUFPO0FBQUEsVUFDTCxPQUFPLEtBQUs7QUFBQTtBQUFBLE1BRWhCO0FBQUEsTUFFQSxPQUFPLEtBQUssS0FBSyxFQUFFLE1BQU0sS0FBSyxFQUFFLEtBQUssR0FBRztBQUFBLE1BQ3hDLE1BQU0sY0FBYyxNQUFNLFFBQU87QUFBQSxNQUNqQyxLQUFLLFVBQVU7QUFBQSxNQUNmLEtBQUssVUFBVSxTQUFRO0FBQUEsTUFDdkIsS0FBSyxNQUFNLElBQUk7QUFBQSxNQUVmLElBQUksS0FBSyxXQUFXLEtBQUs7QUFBQSxRQUN2QixLQUFLLFFBQVE7QUFBQSxNQUNmLEVBQU87QUFBQSxRQUNMLEtBQUssUUFBUSxLQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUE7QUFBQSxNQUczQyxNQUFNLFFBQVEsSUFBSTtBQUFBO0FBQUEsSUFHcEIsS0FBTSxDQUFDLE1BQU07QUFBQSxNQUNYLE1BQU0sSUFBSSxLQUFLLFFBQVEsUUFBUSxHQUFHLEVBQUUsbUJBQW1CLEdBQUcsRUFBRTtBQUFBLE1BQzVELE1BQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLE1BRXRCLEtBQUssR0FBRztBQUFBLFFBQ04sTUFBTSxJQUFJLFVBQVUsdUJBQXVCLE1BQU07QUFBQSxNQUNuRDtBQUFBLE1BRUEsS0FBSyxXQUFXLEVBQUUsT0FBTyxZQUFZLEVBQUUsS0FBSztBQUFBLE1BQzVDLElBQUksS0FBSyxhQUFhLEtBQUs7QUFBQSxRQUN6QixLQUFLLFdBQVc7QUFBQSxNQUNsQjtBQUFBLE1BR0EsS0FBSyxFQUFFLElBQUk7QUFBQSxRQUNULEtBQUssU0FBUztBQUFBLE1BQ2hCLEVBQU87QUFBQSxRQUNMLEtBQUssU0FBUyxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUE7QUFBQTtBQUFBLElBSXJELFFBQVMsR0FBRztBQUFBLE1BQ1YsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUdkLElBQUssQ0FBQyxTQUFTO0FBQUEsTUFDYixNQUFNLG1CQUFtQixTQUFTLEtBQUssUUFBUSxLQUFLO0FBQUEsTUFFcEQsSUFBSSxLQUFLLFdBQVcsT0FBTyxZQUFZLEtBQUs7QUFBQSxRQUMxQyxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLFFBQy9CLElBQUk7QUFBQSxVQUNGLFVBQVUsSUFBSSxPQUFPLFNBQVMsS0FBSyxPQUFPO0FBQUEsVUFDMUMsT0FBTyxJQUFJO0FBQUEsVUFDWCxPQUFPO0FBQUE7QUFBQSxNQUVYO0FBQUEsTUFFQSxPQUFPLElBQUksU0FBUyxLQUFLLFVBQVUsS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBO0FBQUEsSUFHOUQsVUFBVyxDQUFDLE1BQU0sVUFBUztBQUFBLE1BQ3pCLE1BQU0sZ0JBQWdCLGFBQWE7QUFBQSxRQUNqQyxNQUFNLElBQUksVUFBVSwwQkFBMEI7QUFBQSxNQUNoRDtBQUFBLE1BRUEsSUFBSSxLQUFLLGFBQWEsSUFBSTtBQUFBLFFBQ3hCLElBQUksS0FBSyxVQUFVLElBQUk7QUFBQSxVQUNyQixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJLE1BQU0sS0FBSyxPQUFPLFFBQU8sRUFBRSxLQUFLLEtBQUssS0FBSztBQUFBLE1BQ3ZELEVBQU8sU0FBSSxLQUFLLGFBQWEsSUFBSTtBQUFBLFFBQy9CLElBQUksS0FBSyxVQUFVLElBQUk7QUFBQSxVQUNyQixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJLE1BQU0sS0FBSyxPQUFPLFFBQU8sRUFBRSxLQUFLLEtBQUssTUFBTTtBQUFBLE1BQ3hEO0FBQUEsTUFFQSxXQUFVLGFBQWEsUUFBTztBQUFBLE1BRzlCLElBQUksU0FBUSxzQkFDVCxLQUFLLFVBQVUsY0FBYyxLQUFLLFVBQVUsYUFBYTtBQUFBLFFBQzFELE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxLQUFLLFNBQVEsc0JBQ1YsS0FBSyxNQUFNLFdBQVcsUUFBUSxLQUFLLEtBQUssTUFBTSxXQUFXLFFBQVEsSUFBSTtBQUFBLFFBQ3RFLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFHQSxJQUFJLEtBQUssU0FBUyxXQUFXLEdBQUcsS0FBSyxLQUFLLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFBQSxRQUNsRSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxLQUFLLFNBQVMsV0FBVyxHQUFHLEtBQUssS0FBSyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQUEsUUFDbEUsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQ0csS0FBSyxPQUFPLFlBQVksS0FBSyxPQUFPLFdBQ3JDLEtBQUssU0FBUyxTQUFTLEdBQUcsS0FBSyxLQUFLLFNBQVMsU0FBUyxHQUFHLEdBQUc7QUFBQSxRQUM1RCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxJQUFJLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxRQUFPLEtBQzVDLEtBQUssU0FBUyxXQUFXLEdBQUcsS0FBSyxLQUFLLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFBQSxRQUNoRSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxJQUFJLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxRQUFPLEtBQzVDLEtBQUssU0FBUyxXQUFXLEdBQUcsS0FBSyxLQUFLLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFBQSxRQUNoRSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTyxVQUFVO0FBQUEsRUFFakIsSUFBTTtBQUFBLEVBQ04sTUFBUSxRQUFRLElBQUk7QUFBQSxFQUNwQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUE7Ozs7RUM1SU4sSUFBTTtBQUFBLEVBQ04sSUFBTSxZQUFZLENBQUMsU0FBUyxPQUFPLGFBQVk7QUFBQSxJQUM3QyxJQUFJO0FBQUEsTUFDRixRQUFRLElBQUksTUFBTSxPQUFPLFFBQU87QUFBQSxNQUNoQyxPQUFPLElBQUk7QUFBQSxNQUNYLE9BQU87QUFBQTtBQUFBLElBRVQsT0FBTyxNQUFNLEtBQUssT0FBTztBQUFBO0FBQUEsRUFFM0IsT0FBTyxVQUFVO0FBQUE7Ozs7RUNUakIsSUFBTTtBQUFBLEVBR04sSUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLGFBQzVCLElBQUksTUFBTSxPQUFPLFFBQU8sRUFBRSxJQUN2QixJQUFJLFVBQVEsS0FBSyxJQUFJLE9BQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFFbkUsT0FBTyxVQUFVO0FBQUE7Ozs7RUNQakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBRU4sSUFBTSxnQkFBZ0IsQ0FBQyxVQUFVLE9BQU8sYUFBWTtBQUFBLElBQ2xELElBQUksTUFBTTtBQUFBLElBQ1YsSUFBSSxRQUFRO0FBQUEsSUFDWixJQUFJLFdBQVc7QUFBQSxJQUNmLElBQUk7QUFBQSxNQUNGLFdBQVcsSUFBSSxNQUFNLE9BQU8sUUFBTztBQUFBLE1BQ25DLE9BQU8sSUFBSTtBQUFBLE1BQ1gsT0FBTztBQUFBO0FBQUEsSUFFVCxTQUFTLFFBQVEsQ0FBQyxNQUFNO0FBQUEsTUFDdEIsSUFBSSxTQUFTLEtBQUssQ0FBQyxHQUFHO0FBQUEsUUFFcEIsS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDLE1BQU0sSUFBSTtBQUFBLFVBRW5DLE1BQU07QUFBQSxVQUNOLFFBQVEsSUFBSSxPQUFPLEtBQUssUUFBTztBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUFBLEtBQ0Q7QUFBQSxJQUNELE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxVQUFVO0FBQUE7Ozs7RUN4QmpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU0sZ0JBQWdCLENBQUMsVUFBVSxPQUFPLGFBQVk7QUFBQSxJQUNsRCxJQUFJLE1BQU07QUFBQSxJQUNWLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxXQUFXO0FBQUEsSUFDZixJQUFJO0FBQUEsTUFDRixXQUFXLElBQUksTUFBTSxPQUFPLFFBQU87QUFBQSxNQUNuQyxPQUFPLElBQUk7QUFBQSxNQUNYLE9BQU87QUFBQTtBQUFBLElBRVQsU0FBUyxRQUFRLENBQUMsTUFBTTtBQUFBLE1BQ3RCLElBQUksU0FBUyxLQUFLLENBQUMsR0FBRztBQUFBLFFBRXBCLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQyxNQUFNLEdBQUc7QUFBQSxVQUVsQyxNQUFNO0FBQUEsVUFDTixRQUFRLElBQUksT0FBTyxLQUFLLFFBQU87QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxLQUNEO0FBQUEsSUFDRCxPQUFPO0FBQUE7QUFBQSxFQUVULE9BQU8sVUFBVTtBQUFBOzs7O0VDdkJqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixJQUFNLGFBQWEsQ0FBQyxPQUFPLFVBQVU7QUFBQSxJQUNuQyxRQUFRLElBQUksTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUU5QixJQUFJLFNBQVMsSUFBSSxPQUFPLE9BQU87QUFBQSxJQUMvQixJQUFJLE1BQU0sS0FBSyxNQUFNLEdBQUc7QUFBQSxNQUN0QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsU0FBUyxJQUFJLE9BQU8sU0FBUztBQUFBLElBQzdCLElBQUksTUFBTSxLQUFLLE1BQU0sR0FBRztBQUFBLE1BQ3RCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxTQUFTO0FBQUEsSUFDVCxTQUFTLElBQUksRUFBRyxJQUFJLE1BQU0sSUFBSSxVQUFVLEdBQUc7QUFBQSxNQUN6QyxNQUFNLGNBQWMsTUFBTSxJQUFJO0FBQUEsTUFFOUIsSUFBSSxTQUFTO0FBQUEsTUFDYixZQUFZLFFBQVEsQ0FBQyxlQUFlO0FBQUEsUUFFbEMsTUFBTSxVQUFVLElBQUksT0FBTyxXQUFXLE9BQU8sT0FBTztBQUFBLFFBQ3BELFFBQVEsV0FBVztBQUFBLGVBQ1o7QUFBQSxZQUNILElBQUksUUFBUSxXQUFXLFdBQVcsR0FBRztBQUFBLGNBQ25DLFFBQVE7QUFBQSxZQUNWLEVBQU87QUFBQSxjQUNMLFFBQVEsV0FBVyxLQUFLLENBQUM7QUFBQTtBQUFBLFlBRTNCLFFBQVEsTUFBTSxRQUFRLE9BQU87QUFBQSxlQUUxQjtBQUFBLGVBQ0E7QUFBQSxZQUNILEtBQUssVUFBVSxHQUFHLFNBQVMsTUFBTSxHQUFHO0FBQUEsY0FDbEMsU0FBUztBQUFBLFlBQ1g7QUFBQSxZQUNBO0FBQUEsZUFDRztBQUFBLGVBQ0E7QUFBQSxZQUVIO0FBQUE7QUFBQSxZQUdBLE1BQU0sSUFBSSxNQUFNLHlCQUF5QixXQUFXLFVBQVU7QUFBQTtBQUFBLE9BRW5FO0FBQUEsTUFDRCxJQUFJLFlBQVksVUFBVSxHQUFHLFFBQVEsTUFBTSxJQUFJO0FBQUEsUUFDN0MsU0FBUztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLFVBQVUsTUFBTSxLQUFLLE1BQU0sR0FBRztBQUFBLE1BQ2hDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUVULE9BQU8sVUFBVTtBQUFBOzs7O0VDNURqQixJQUFNO0FBQUEsRUFDTixJQUFNLGFBQWEsQ0FBQyxPQUFPLGFBQVk7QUFBQSxJQUNyQyxJQUFJO0FBQUEsTUFHRixPQUFPLElBQUksTUFBTSxPQUFPLFFBQU8sRUFBRSxTQUFTO0FBQUEsTUFDMUMsT0FBTyxJQUFJO0FBQUEsTUFDWCxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBR1gsT0FBTyxVQUFVO0FBQUE7Ozs7RUNWakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sTUFBUSxRQUFRO0FBQUEsRUFDaEIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBRU4sSUFBTSxVQUFVLENBQUMsU0FBUyxPQUFPLE1BQU0sYUFBWTtBQUFBLElBQ2pELFVBQVUsSUFBSSxPQUFPLFNBQVMsUUFBTztBQUFBLElBQ3JDLFFBQVEsSUFBSSxNQUFNLE9BQU8sUUFBTztBQUFBLElBRWhDLElBQUksTUFBTSxPQUFPLE1BQU0sTUFBTTtBQUFBLElBQzdCLFFBQVE7QUFBQSxXQUNEO0FBQUEsUUFDSCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUjtBQUFBLFdBQ0c7QUFBQSxRQUNILE9BQU87QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSO0FBQUE7QUFBQSxRQUVBLE1BQU0sSUFBSSxVQUFVLHVDQUF1QztBQUFBO0FBQUEsSUFJL0QsSUFBSSxVQUFVLFNBQVMsT0FBTyxRQUFPLEdBQUc7QUFBQSxNQUN0QyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBS0EsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLElBQUksVUFBVSxHQUFHO0FBQUEsTUFDekMsTUFBTSxjQUFjLE1BQU0sSUFBSTtBQUFBLE1BRTlCLElBQUksT0FBTztBQUFBLE1BQ1gsSUFBSSxNQUFNO0FBQUEsTUFFVixZQUFZLFFBQVEsQ0FBQyxlQUFlO0FBQUEsUUFDbEMsSUFBSSxXQUFXLFdBQVcsS0FBSztBQUFBLFVBQzdCLGFBQWEsSUFBSSxXQUFXLFNBQVM7QUFBQSxRQUN2QztBQUFBLFFBQ0EsT0FBTyxRQUFRO0FBQUEsUUFDZixNQUFNLE9BQU87QUFBQSxRQUNiLElBQUksS0FBSyxXQUFXLFFBQVEsS0FBSyxRQUFRLFFBQU8sR0FBRztBQUFBLFVBQ2pELE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxLQUFLLFdBQVcsUUFBUSxJQUFJLFFBQVEsUUFBTyxHQUFHO0FBQUEsVUFDdkQsTUFBTTtBQUFBLFFBQ1I7QUFBQSxPQUNEO0FBQUEsTUFJRCxJQUFJLEtBQUssYUFBYSxRQUFRLEtBQUssYUFBYSxPQUFPO0FBQUEsUUFDckQsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUlBLE1BQU0sSUFBSSxZQUFZLElBQUksYUFBYSxTQUNuQyxNQUFNLFNBQVMsSUFBSSxNQUFNLEdBQUc7QUFBQSxRQUM5QixPQUFPO0FBQUEsTUFDVCxFQUFPLFNBQUksSUFBSSxhQUFhLFNBQVMsS0FBSyxTQUFTLElBQUksTUFBTSxHQUFHO0FBQUEsUUFDOUQsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdULE9BQU8sVUFBVTtBQUFBOzs7O0VDOUVqQixJQUFNO0FBQUEsRUFDTixJQUFNLE1BQU0sQ0FBQyxTQUFTLE9BQU8sYUFBWSxRQUFRLFNBQVMsT0FBTyxLQUFLLFFBQU87QUFBQSxFQUM3RSxPQUFPLFVBQVU7QUFBQTs7OztFQ0hqQixJQUFNO0FBQUEsRUFFTixJQUFNLE1BQU0sQ0FBQyxTQUFTLE9BQU8sYUFBWSxRQUFRLFNBQVMsT0FBTyxLQUFLLFFBQU87QUFBQSxFQUM3RSxPQUFPLFVBQVU7QUFBQTs7OztFQ0hqQixJQUFNO0FBQUEsRUFDTixJQUFNLGFBQWEsQ0FBQyxJQUFJLElBQUksYUFBWTtBQUFBLElBQ3RDLEtBQUssSUFBSSxNQUFNLElBQUksUUFBTztBQUFBLElBQzFCLEtBQUssSUFBSSxNQUFNLElBQUksUUFBTztBQUFBLElBQzFCLE9BQU8sR0FBRyxXQUFXLElBQUksUUFBTztBQUFBO0FBQUEsRUFFbEMsT0FBTyxVQUFVO0FBQUE7Ozs7RUNIakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sT0FBTyxVQUFVLENBQUMsVUFBVSxPQUFPLGFBQVk7QUFBQSxJQUM3QyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQ2IsSUFBSSxRQUFRO0FBQUEsSUFDWixJQUFJLE9BQU87QUFBQSxJQUNYLE1BQU0sSUFBSSxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sUUFBUSxHQUFHLEdBQUcsUUFBTyxDQUFDO0FBQUEsSUFDeEQsV0FBVyxXQUFXLEdBQUc7QUFBQSxNQUN2QixNQUFNLFdBQVcsVUFBVSxTQUFTLE9BQU8sUUFBTztBQUFBLE1BQ2xELElBQUksVUFBVTtBQUFBLFFBQ1osT0FBTztBQUFBLFFBQ1AsS0FBSyxPQUFPO0FBQUEsVUFDVixRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsSUFBSSxNQUFNO0FBQUEsVUFDUixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQztBQUFBLFFBQ3hCO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUE7QUFBQSxJQUVaO0FBQUEsSUFDQSxJQUFJLE9BQU87QUFBQSxNQUNULElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDeEI7QUFBQSxJQUVBLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDaEIsWUFBWSxLQUFLLFFBQVEsS0FBSztBQUFBLE1BQzVCLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDZixPQUFPLEtBQUssR0FBRztBQUFBLE1BQ2pCLEVBQU8sVUFBSyxPQUFPLFFBQVEsRUFBRSxJQUFJO0FBQUEsUUFDL0IsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNqQixFQUFPLFVBQUssS0FBSztBQUFBLFFBQ2YsT0FBTyxLQUFLLEtBQUssS0FBSztBQUFBLE1BQ3hCLEVBQU8sU0FBSSxRQUFRLEVBQUUsSUFBSTtBQUFBLFFBQ3ZCLE9BQU8sS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUN4QixFQUFPO0FBQUEsUUFDTCxPQUFPLEtBQUssR0FBRyxTQUFTLEtBQUs7QUFBQTtBQUFBLElBRWpDO0FBQUEsSUFDQSxNQUFNLGFBQWEsT0FBTyxLQUFLLE1BQU07QUFBQSxJQUNyQyxNQUFNLFdBQVcsT0FBTyxNQUFNLFFBQVEsV0FBVyxNQUFNLE1BQU0sT0FBTyxLQUFLO0FBQUEsSUFDekUsT0FBTyxXQUFXLFNBQVMsU0FBUyxTQUFTLGFBQWE7QUFBQTtBQUFBOzs7O0VDN0M1RCxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixNQUFRLFFBQVE7QUFBQSxFQUNoQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFzQ04sSUFBTSxTQUFTLENBQUMsS0FBSyxLQUFLLFdBQVUsQ0FBQyxNQUFNO0FBQUEsSUFDekMsSUFBSSxRQUFRLEtBQUs7QUFBQSxNQUNmLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxNQUFNLElBQUksTUFBTSxLQUFLLFFBQU87QUFBQSxJQUM1QixNQUFNLElBQUksTUFBTSxLQUFLLFFBQU87QUFBQSxJQUM1QixJQUFJLGFBQWE7QUFBQSxJQUVqQjtBQUFBLE1BQU8sV0FBVyxhQUFhLElBQUksS0FBSztBQUFBLFFBQ3RDLFdBQVcsYUFBYSxJQUFJLEtBQUs7QUFBQSxVQUMvQixNQUFNLFFBQVEsYUFBYSxXQUFXLFdBQVcsUUFBTztBQUFBLFVBQ3hELGFBQWEsY0FBYyxVQUFVO0FBQUEsVUFDckMsSUFBSSxPQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsUUFLQSxJQUFJLFlBQVk7QUFBQSxVQUNkLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxJQUFNLCtCQUErQixDQUFDLElBQUksV0FBVyxXQUFXLENBQUM7QUFBQSxFQUNqRSxJQUFNLGlCQUFpQixDQUFDLElBQUksV0FBVyxTQUFTLENBQUM7QUFBQSxFQUVqRCxJQUFNLGVBQWUsQ0FBQyxLQUFLLEtBQUssYUFBWTtBQUFBLElBQzFDLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDZixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLO0FBQUEsTUFDN0MsSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLO0FBQUEsUUFDN0MsT0FBTztBQUFBLE1BQ1QsRUFBTyxTQUFJLFNBQVEsbUJBQW1CO0FBQUEsUUFDcEMsTUFBTTtBQUFBLE1BQ1IsRUFBTztBQUFBLFFBQ0wsTUFBTTtBQUFBO0FBQUEsSUFFVjtBQUFBLElBRUEsSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLO0FBQUEsTUFDN0MsSUFBSSxTQUFRLG1CQUFtQjtBQUFBLFFBQzdCLE9BQU87QUFBQSxNQUNULEVBQU87QUFBQSxRQUNMLE1BQU07QUFBQTtBQUFBLElBRVY7QUFBQSxJQUVBLE1BQU0sUUFBUSxJQUFJO0FBQUEsSUFDbEIsSUFBSSxJQUFJO0FBQUEsSUFDUixXQUFXLEtBQUssS0FBSztBQUFBLE1BQ25CLElBQUksRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE1BQU07QUFBQSxRQUM3QyxLQUFLLFNBQVMsSUFBSSxHQUFHLFFBQU87QUFBQSxNQUM5QixFQUFPLFNBQUksRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE1BQU07QUFBQSxRQUNwRCxLQUFLLFFBQVEsSUFBSSxHQUFHLFFBQU87QUFBQSxNQUM3QixFQUFPO0FBQUEsUUFDTCxNQUFNLElBQUksRUFBRSxNQUFNO0FBQUE7QUFBQSxJQUV0QjtBQUFBLElBRUEsSUFBSSxNQUFNLE9BQU8sR0FBRztBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJO0FBQUEsSUFDSixJQUFJLE1BQU0sSUFBSTtBQUFBLE1BQ1osV0FBVyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsUUFBTztBQUFBLE1BQ2hELElBQUksV0FBVyxHQUFHO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1QsRUFBTyxTQUFJLGFBQWEsTUFBTSxHQUFHLGFBQWEsUUFBUSxHQUFHLGFBQWEsT0FBTztBQUFBLFFBQzNFLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBR0EsV0FBVyxNQUFNLE9BQU87QUFBQSxNQUN0QixJQUFJLE9BQU8sVUFBVSxJQUFJLE9BQU8sRUFBRSxHQUFHLFFBQU8sR0FBRztBQUFBLFFBQzdDLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxJQUFJLE9BQU8sVUFBVSxJQUFJLE9BQU8sRUFBRSxHQUFHLFFBQU8sR0FBRztBQUFBLFFBQzdDLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxXQUFXLEtBQUssS0FBSztBQUFBLFFBQ25CLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLFFBQU8sR0FBRztBQUFBLFVBQ3RDLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BRUEsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxVQUFVO0FBQUEsSUFHZCxJQUFJLGVBQWUsT0FDaEIsU0FBUSxxQkFDVCxHQUFHLE9BQU8sV0FBVyxTQUFTLEdBQUcsU0FBUztBQUFBLElBQzVDLElBQUksZUFBZSxPQUNoQixTQUFRLHFCQUNULEdBQUcsT0FBTyxXQUFXLFNBQVMsR0FBRyxTQUFTO0FBQUEsSUFFNUMsSUFBSSxnQkFBZ0IsYUFBYSxXQUFXLFdBQVcsS0FDbkQsR0FBRyxhQUFhLE9BQU8sYUFBYSxXQUFXLE9BQU8sR0FBRztBQUFBLE1BQzNELGVBQWU7QUFBQSxJQUNqQjtBQUFBLElBRUEsV0FBVyxLQUFLLEtBQUs7QUFBQSxNQUNuQixXQUFXLFlBQVksRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhO0FBQUEsTUFDNUQsV0FBVyxZQUFZLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYTtBQUFBLE1BQzVELElBQUksSUFBSTtBQUFBLFFBQ04sSUFBSSxjQUFjO0FBQUEsVUFDaEIsSUFBSSxFQUFFLE9BQU8sY0FBYyxFQUFFLE9BQU8sV0FBVyxVQUMzQyxFQUFFLE9BQU8sVUFBVSxhQUFhLFNBQ2hDLEVBQUUsT0FBTyxVQUFVLGFBQWEsU0FDaEMsRUFBRSxPQUFPLFVBQVUsYUFBYSxPQUFPO0FBQUEsWUFDekMsZUFBZTtBQUFBLFVBQ2pCO0FBQUEsUUFDRjtBQUFBLFFBQ0EsSUFBSSxFQUFFLGFBQWEsT0FBTyxFQUFFLGFBQWEsTUFBTTtBQUFBLFVBQzdDLFNBQVMsU0FBUyxJQUFJLEdBQUcsUUFBTztBQUFBLFVBQ2hDLElBQUksV0FBVyxLQUFLLFdBQVcsSUFBSTtBQUFBLFlBQ2pDLE9BQU87QUFBQSxVQUNUO0FBQUEsUUFDRixFQUFPLFNBQUksR0FBRyxhQUFhLFNBQVMsVUFBVSxHQUFHLFFBQVEsT0FBTyxDQUFDLEdBQUcsUUFBTyxHQUFHO0FBQUEsVUFDNUUsT0FBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLElBQUk7QUFBQSxRQUNOLElBQUksY0FBYztBQUFBLFVBQ2hCLElBQUksRUFBRSxPQUFPLGNBQWMsRUFBRSxPQUFPLFdBQVcsVUFDM0MsRUFBRSxPQUFPLFVBQVUsYUFBYSxTQUNoQyxFQUFFLE9BQU8sVUFBVSxhQUFhLFNBQ2hDLEVBQUUsT0FBTyxVQUFVLGFBQWEsT0FBTztBQUFBLFlBQ3pDLGVBQWU7QUFBQSxVQUNqQjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLElBQUksRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE1BQU07QUFBQSxVQUM3QyxRQUFRLFFBQVEsSUFBSSxHQUFHLFFBQU87QUFBQSxVQUM5QixJQUFJLFVBQVUsS0FBSyxVQUFVLElBQUk7QUFBQSxZQUMvQixPQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0YsRUFBTyxTQUFJLEdBQUcsYUFBYSxTQUFTLFVBQVUsR0FBRyxRQUFRLE9BQU8sQ0FBQyxHQUFHLFFBQU8sR0FBRztBQUFBLFVBQzVFLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxFQUFFLGFBQWEsTUFBTSxPQUFPLGFBQWEsR0FBRztBQUFBLFFBQy9DLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBS0EsSUFBSSxNQUFNLGFBQWEsTUFBTSxhQUFhLEdBQUc7QUFBQSxNQUMzQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxNQUFNLGFBQWEsTUFBTSxhQUFhLEdBQUc7QUFBQSxNQUMzQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBS0EsSUFBSSxnQkFBZ0IsY0FBYztBQUFBLE1BQ2hDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUlULElBQU0sV0FBVyxDQUFDLEdBQUcsR0FBRyxhQUFZO0FBQUEsSUFDbEMsS0FBSyxHQUFHO0FBQUEsTUFDTixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsTUFBTSxPQUFPLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxRQUFPO0FBQUEsSUFDaEQsT0FBTyxPQUFPLElBQUksSUFDZCxPQUFPLElBQUksSUFDWCxFQUFFLGFBQWEsT0FBTyxFQUFFLGFBQWEsT0FBTyxJQUM1QztBQUFBO0FBQUEsRUFJTixJQUFNLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBWTtBQUFBLElBQ2pDLEtBQUssR0FBRztBQUFBLE1BQ04sT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sT0FBTyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsUUFBTztBQUFBLElBQ2hELE9BQU8sT0FBTyxJQUFJLElBQ2QsT0FBTyxJQUFJLElBQ1gsRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE9BQU8sSUFDNUM7QUFBQTtBQUFBLEVBR04sT0FBTyxVQUFVO0FBQUE7Ozs7RUNyUGpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLE9BQU8sVUFBVTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxJQUFJLFdBQVc7QUFBQSxJQUNmLEtBQUssV0FBVztBQUFBLElBQ2hCLFFBQVEsV0FBVztBQUFBLElBQ25CLHFCQUFxQixVQUFVO0FBQUEsSUFDL0IsZUFBZSxVQUFVO0FBQUEsSUFDekIsb0JBQW9CLFlBQVk7QUFBQSxJQUNoQyxxQkFBcUIsWUFBWTtBQUFBLEVBQ25DO0FBQUE7Ozs7RUMxRkEsSUFBTTtBQUFBLEVBRU4sT0FBTyxVQUFVLE9BQU8sVUFBVSxRQUFRLFNBQVMsVUFBVTtBQUFBOzs7O0VDRjdELElBQU07QUFBQSxFQUVOLE9BQU8sVUFBVSxPQUFPLFVBQVUsUUFBUSxTQUFTLFVBQVU7QUFBQTs7OztFQ0Y3RCxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFFTixJQUFNLDJCQUEyQjtBQUFBLElBQy9CLElBQU0sQ0FBQyxTQUFTLFNBQVMsT0FBTztBQUFBLElBQ2hDLEtBQU8sQ0FBQyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsT0FBTztBQUFBLElBQzVELFdBQVcsQ0FBQyxTQUFTLFNBQVMsT0FBTztBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxJQUFNLGdCQUFnQjtBQUFBLElBQ3BCLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPLFVBQVUsUUFBUSxDQUFDLFdBQVcsS0FBSztBQUFBLElBQ3hDLEtBQUssY0FBYztBQUFBLE1BQUs7QUFBQSxJQUV4QixNQUFNLFVBQVUsSUFBSTtBQUFBLElBQ3BCLEtBQUs7QUFBQSxNQUFTO0FBQUEsSUFFZCxNQUFNLG9CQUFvQix5QkFBeUI7QUFBQSxJQUVuRCxLQUFLLG1CQUFtQjtBQUFBLE1BQ3RCLE1BQU0sSUFBSSxNQUFNLHFCQUFxQixXQUFXO0FBQUEsSUFDbEQ7QUFBQSxJQUVBLEtBQUssa0JBQWtCLFNBQVMsU0FBUyxHQUFHO0FBQUEsTUFDMUMsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLHFDQUFxQyxrQkFBa0IsS0FBSyxJQUFJLElBQUk7QUFBQSxJQUM5RztBQUFBLElBU0EsSUFBSSxrQ0FBa0M7QUFBQSxNQUNwQyxRQUFRO0FBQUEsYUFDSDtBQUFBLFVBQ0gsTUFBTSxXQUFXLElBQUkscUJBQXFCO0FBQUEsVUFDMUMsTUFBTSxlQUFlLGNBQWM7QUFBQSxVQUVuQyxJQUFJLGFBQWEsY0FBYztBQUFBLFlBQzdCLE1BQU0sSUFBSSxNQUFNLG9CQUFvQiw4QkFBOEIsZ0JBQWdCO0FBQUEsVUFDcEY7QUFBQSxVQUNBO0FBQUEsYUFFRztBQUFBLFVBQ0gsSUFBSSwrQkFBK0I7QUFBQSxZQUNqQyxNQUFNLFNBQVMsU0FBUyxVQUFVLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFBQSxZQUMvQyxRQUFRLGVBQWUsbUJBQW1CLGVBQWUsSUFBSTtBQUFBLFlBRTdELElBQUksa0JBQWtCLE1BQU0sWUFBWSxzQkFBc0IsZUFBZTtBQUFBLGNBQzNFLE1BQU0sSUFBSSxNQUFNLGdHQUFnRyxZQUFZO0FBQUEsWUFDOUg7QUFBQSxZQUVBLElBQUksZUFBZSxhQUFhLGFBQWEsVUFBVSxHQUFHO0FBQUEsY0FDeEQsTUFBTSxJQUFJLE1BQU0sNEdBQTRHLFlBQVk7QUFBQSxZQUMxSTtBQUFBLFVBQ0Y7QUFBQSxVQUNBO0FBQUE7QUFBQSxJQUVKO0FBQUE7QUFBQTs7OztFQ2hFRixJQUFJO0FBQUEsRUFFSixPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsU0FBUyxvQkFBb0I7QUFBQTs7OztFQ0Z2RSxJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixNQUFPLFdBQVcsaUJBQWlCO0FBQUEsRUFFbkMsSUFBTSxlQUFlLENBQUMsU0FBUyxTQUFTLE9BQU87QUFBQSxFQUMvQyxJQUFNLGNBQWMsQ0FBQyxTQUFTLFNBQVMsT0FBTztBQUFBLEVBQzlDLElBQU0sZUFBZSxDQUFDLFNBQVMsU0FBUyxPQUFPO0FBQUEsRUFDL0MsSUFBTSxVQUFVLENBQUMsU0FBUyxTQUFTLE9BQU87QUFBQSxFQUUxQyxJQUFJLGNBQWM7QUFBQSxJQUNoQixhQUFhLE9BQU8sYUFBYSxRQUFRLEdBQUcsU0FBUyxTQUFTLE9BQU87QUFBQSxJQUNyRSxhQUFhLE9BQU8sYUFBYSxRQUFRLEdBQUcsU0FBUyxTQUFTLE9BQU87QUFBQSxFQUN2RTtBQUFBLEVBRUEsT0FBTyxVQUFVLFFBQVMsQ0FBQyxXQUFXLG1CQUFtQixVQUFTLFVBQVU7QUFBQSxJQUMxRSxJQUFLLE9BQU8sYUFBWSxlQUFnQixVQUFVO0FBQUEsTUFDaEQsV0FBVztBQUFBLE1BQ1gsV0FBVSxDQUFDO0FBQUEsSUFDYjtBQUFBLElBRUEsS0FBSyxVQUFTO0FBQUEsTUFDWixXQUFVLENBQUM7QUFBQSxJQUNiO0FBQUEsSUFHQSxXQUFVLE9BQU8sT0FBTyxDQUFDLEdBQUcsUUFBTztBQUFBLElBRW5DLElBQUk7QUFBQSxJQUVKLElBQUksVUFBVTtBQUFBLE1BQ1osT0FBTztBQUFBLElBQ1QsRUFBTztBQUFBLE1BQ0wsT0FBTyxRQUFRLENBQUMsS0FBSyxNQUFNO0FBQUEsUUFDekIsSUFBSTtBQUFBLFVBQUssTUFBTTtBQUFBLFFBQ2YsT0FBTztBQUFBO0FBQUE7QUFBQSxJQUlYLElBQUksU0FBUSxrQkFBa0IsT0FBTyxTQUFRLG1CQUFtQixVQUFVO0FBQUEsTUFDeEUsT0FBTyxLQUFLLElBQUksa0JBQWtCLGlDQUFpQyxDQUFDO0FBQUEsSUFDdEU7QUFBQSxJQUVBLElBQUksU0FBUSxVQUFVLGNBQWMsT0FBTyxTQUFRLFVBQVUsWUFBWSxTQUFRLE1BQU0sS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUNyRyxPQUFPLEtBQUssSUFBSSxrQkFBa0Isa0NBQWtDLENBQUM7QUFBQSxJQUN2RTtBQUFBLElBRUEsSUFBSSxTQUFRLG1DQUFtQyxhQUFhLE9BQU8sU0FBUSxtQ0FBbUMsV0FBVztBQUFBLE1BQ3ZILE9BQU8sS0FBSyxJQUFJLGtCQUFrQixrREFBa0QsQ0FBQztBQUFBLElBQ3ZGO0FBQUEsSUFFQSxNQUFNLGlCQUFpQixTQUFRLGtCQUFrQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSTtBQUFBLElBRTdFLEtBQUssV0FBVTtBQUFBLE1BQ2IsT0FBTyxLQUFLLElBQUksa0JBQWtCLHNCQUFzQixDQUFDO0FBQUEsSUFDM0Q7QUFBQSxJQUVBLElBQUksT0FBTyxjQUFjLFVBQVU7QUFBQSxNQUNqQyxPQUFPLEtBQUssSUFBSSxrQkFBa0Isc0JBQXNCLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBRUEsTUFBTSxRQUFRLFVBQVUsTUFBTSxHQUFHO0FBQUEsSUFFakMsSUFBSSxNQUFNLFdBQVcsR0FBRTtBQUFBLE1BQ3JCLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixlQUFlLENBQUM7QUFBQSxJQUNwRDtBQUFBLElBRUEsSUFBSTtBQUFBLElBRUosSUFBSTtBQUFBLE1BQ0YsZUFBZSxPQUFPLFdBQVcsRUFBRSxVQUFVLEtBQUssQ0FBQztBQUFBLE1BQ25ELE9BQU0sS0FBSztBQUFBLE1BQ1gsT0FBTyxLQUFLLEdBQUc7QUFBQTtBQUFBLElBR2pCLEtBQUssY0FBYztBQUFBLE1BQ2pCLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixlQUFlLENBQUM7QUFBQSxJQUNwRDtBQUFBLElBRUEsTUFBTSxTQUFTLGFBQWE7QUFBQSxJQUM1QixJQUFJO0FBQUEsSUFFSixJQUFHLE9BQU8sc0JBQXNCLFlBQVk7QUFBQSxNQUMxQyxLQUFJLFVBQVU7QUFBQSxRQUNaLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixzRkFBc0YsQ0FBQztBQUFBLE1BQzNIO0FBQUEsTUFFQSxZQUFZO0FBQUEsSUFDZCxFQUNLO0FBQUEsTUFDSCxZQUFZLFFBQVEsQ0FBQyxTQUFRLGdCQUFnQjtBQUFBLFFBQzNDLE9BQU8sZUFBZSxNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQSxJQUlqRCxPQUFPLFVBQVUsUUFBUSxRQUFRLENBQUMsS0FBSyxvQkFBbUI7QUFBQSxNQUN4RCxJQUFHLEtBQUs7QUFBQSxRQUNOLE9BQU8sS0FBSyxJQUFJLGtCQUFrQiw2Q0FBNkMsSUFBSSxPQUFPLENBQUM7QUFBQSxNQUM3RjtBQUFBLE1BRUEsTUFBTSxlQUFlLE1BQU0sR0FBRyxLQUFLLE1BQU07QUFBQSxNQUV6QyxLQUFLLGdCQUFnQixvQkFBa0I7QUFBQSxRQUNyQyxPQUFPLEtBQUssSUFBSSxrQkFBa0IsMkJBQTJCLENBQUM7QUFBQSxNQUNoRTtBQUFBLE1BRUEsSUFBSSxpQkFBaUIsb0JBQW1CO0FBQUEsUUFDdEMsT0FBTyxLQUFLLElBQUksa0JBQWtCLHVDQUF1QyxDQUFDO0FBQUEsTUFDNUU7QUFBQSxNQUVBLEtBQUssaUJBQWlCLFNBQVEsWUFBWTtBQUFBLFFBQ3hDLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixpRUFBaUUsQ0FBQztBQUFBLE1BQ3RHO0FBQUEsTUFFQSxJQUFJLHNCQUFxQixVQUFVLDhCQUE2QixZQUFZO0FBQUEsUUFDMUUsSUFBSTtBQUFBLFVBQ0YscUJBQW9CLGdCQUFnQixrQkFBaUI7QUFBQSxVQUNyRCxPQUFPLEdBQUc7QUFBQSxVQUNWLElBQUk7QUFBQSxZQUNGLHFCQUFvQixnQkFBZ0IsT0FBTyx1QkFBc0IsV0FBVyxPQUFPLEtBQUssa0JBQWlCLElBQUksa0JBQWlCO0FBQUEsWUFDOUgsT0FBTyxJQUFHO0FBQUEsWUFDVixPQUFPLEtBQUssSUFBSSxrQkFBa0IsNkNBQTZDLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHdEY7QUFBQSxNQUVBLEtBQUssU0FBUSxZQUFZO0FBQUEsUUFDdkIsSUFBSSxtQkFBa0IsU0FBUyxVQUFVO0FBQUEsVUFDdkMsU0FBUSxhQUFhO0FBQUEsUUFDdkIsRUFBTyxTQUFJLENBQUMsT0FBTyxTQUFTLEVBQUUsU0FBUyxtQkFBa0IsaUJBQWlCLEdBQUc7QUFBQSxVQUMzRSxTQUFRLGFBQWE7QUFBQSxRQUN2QixFQUFPLFNBQUksbUJBQWtCLHNCQUFzQixNQUFNO0FBQUEsVUFDdkQsU0FBUSxhQUFhO0FBQUEsUUFDdkIsRUFBTztBQUFBLFVBQ0wsU0FBUSxhQUFhO0FBQUE7QUFBQSxNQUV6QjtBQUFBLE1BRUEsSUFBSSxTQUFRLFdBQVcsUUFBUSxhQUFhLE9BQU8sR0FBRyxNQUFNLElBQUk7QUFBQSxRQUM5RCxPQUFPLEtBQUssSUFBSSxrQkFBa0IsbUJBQW1CLENBQUM7QUFBQSxNQUN4RDtBQUFBLE1BRUEsSUFBSSxPQUFPLElBQUksV0FBVyxJQUFJLEtBQUssbUJBQWtCLFNBQVMsVUFBVTtBQUFBLFFBQ3RFLE9BQU8sS0FBSyxJQUFJLGtCQUFtQix3REFBd0QsT0FBTyxLQUFNLENBQUM7QUFBQSxNQUMzRyxFQUFPLFNBQUksZ0JBQWdCLEtBQUssT0FBTyxHQUFHLEtBQUssbUJBQWtCLFNBQVMsVUFBVTtBQUFBLFFBQ2xGLE9BQU8sS0FBSyxJQUFJLGtCQUFtQiwwREFBMEQsT0FBTyxLQUFNLENBQUM7QUFBQSxNQUM3RztBQUFBLE1BRUEsS0FBSyxTQUFRLGdDQUFnQztBQUFBLFFBQzNDLElBQUk7QUFBQSxVQUNGLHNCQUFzQixPQUFPLEtBQUssa0JBQWlCO0FBQUEsVUFDbkQsT0FBTyxHQUFHO0FBQUEsVUFDVixPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsTUFFakI7QUFBQSxNQUVBLElBQUk7QUFBQSxNQUVKLElBQUk7QUFBQSxRQUNGLFFBQVEsSUFBSSxPQUFPLFdBQVcsYUFBYSxPQUFPLEtBQUssa0JBQWlCO0FBQUEsUUFDeEUsT0FBTyxHQUFHO0FBQUEsUUFDVixPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsTUFHZixLQUFLLE9BQU87QUFBQSxRQUNWLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixtQkFBbUIsQ0FBQztBQUFBLE1BQ3hEO0FBQUEsTUFFQSxNQUFNLFVBQVUsYUFBYTtBQUFBLE1BRTdCLElBQUksT0FBTyxRQUFRLFFBQVEsZ0JBQWdCLFNBQVEsaUJBQWlCO0FBQUEsUUFDbEUsSUFBSSxPQUFPLFFBQVEsUUFBUSxVQUFVO0FBQUEsVUFDbkMsT0FBTyxLQUFLLElBQUksa0JBQWtCLG1CQUFtQixDQUFDO0FBQUEsUUFDeEQ7QUFBQSxRQUNBLElBQUksUUFBUSxNQUFNLGtCQUFrQixTQUFRLGtCQUFrQixJQUFJO0FBQUEsVUFDaEUsT0FBTyxLQUFLLElBQUksZUFBZSxrQkFBa0IsSUFBSSxLQUFLLFFBQVEsTUFBTSxJQUFJLENBQUMsQ0FBQztBQUFBLFFBQ2hGO0FBQUEsTUFDRjtBQUFBLE1BRUEsSUFBSSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0IsU0FBUSxrQkFBa0I7QUFBQSxRQUNuRSxJQUFJLE9BQU8sUUFBUSxRQUFRLFVBQVU7QUFBQSxVQUNuQyxPQUFPLEtBQUssSUFBSSxrQkFBa0IsbUJBQW1CLENBQUM7QUFBQSxRQUN4RDtBQUFBLFFBQ0EsSUFBSSxrQkFBa0IsUUFBUSxPQUFPLFNBQVEsa0JBQWtCLElBQUk7QUFBQSxVQUNqRSxPQUFPLEtBQUssSUFBSSxrQkFBa0IsZUFBZSxJQUFJLEtBQUssUUFBUSxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQUEsUUFDaEY7QUFBQSxNQUNGO0FBQUEsTUFFQSxJQUFJLFNBQVEsVUFBVTtBQUFBLFFBQ3BCLE1BQU0sWUFBWSxNQUFNLFFBQVEsU0FBUSxRQUFRLElBQUksU0FBUSxXQUFXLENBQUMsU0FBUSxRQUFRO0FBQUEsUUFDeEYsTUFBTSxTQUFTLE1BQU0sUUFBUSxRQUFRLEdBQUcsSUFBSSxRQUFRLE1BQU0sQ0FBQyxRQUFRLEdBQUc7QUFBQSxRQUV0RSxNQUFNLFFBQVEsT0FBTyxLQUFLLFFBQVMsQ0FBQyxnQkFBZ0I7QUFBQSxVQUNsRCxPQUFPLFVBQVUsS0FBSyxRQUFTLENBQUMsVUFBVTtBQUFBLFlBQ3hDLE9BQU8sb0JBQW9CLFNBQVMsU0FBUyxLQUFLLGNBQWMsSUFBSSxhQUFhO0FBQUEsV0FDbEY7QUFBQSxTQUNGO0FBQUEsUUFFRCxLQUFLLE9BQU87QUFBQSxVQUNWLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixxQ0FBcUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsUUFDaEc7QUFBQSxNQUNGO0FBQUEsTUFFQSxJQUFJLFNBQVEsUUFBUTtBQUFBLFFBQ2xCLE1BQU0saUJBQ0csT0FBTyxTQUFRLFdBQVcsWUFBWSxRQUFRLFFBQVEsU0FBUSxVQUM5RCxNQUFNLFFBQVEsU0FBUSxNQUFNLEtBQUssU0FBUSxPQUFPLFFBQVEsUUFBUSxHQUFHLE1BQU07QUFBQSxRQUVsRixJQUFJLGdCQUFnQjtBQUFBLFVBQ2xCLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixtQ0FBbUMsU0FBUSxNQUFNLENBQUM7QUFBQSxRQUN0RjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLElBQUksU0FBUSxTQUFTO0FBQUEsUUFDbkIsSUFBSSxRQUFRLFFBQVEsU0FBUSxTQUFTO0FBQUEsVUFDbkMsT0FBTyxLQUFLLElBQUksa0JBQWtCLG9DQUFvQyxTQUFRLE9BQU8sQ0FBQztBQUFBLFFBQ3hGO0FBQUEsTUFDRjtBQUFBLE1BRUEsSUFBSSxTQUFRLE9BQU87QUFBQSxRQUNqQixJQUFJLFFBQVEsUUFBUSxTQUFRLE9BQU87QUFBQSxVQUNqQyxPQUFPLEtBQUssSUFBSSxrQkFBa0Isa0NBQWtDLFNBQVEsS0FBSyxDQUFDO0FBQUEsUUFDcEY7QUFBQSxNQUNGO0FBQUEsTUFFQSxJQUFJLFNBQVEsT0FBTztBQUFBLFFBQ2pCLElBQUksUUFBUSxVQUFVLFNBQVEsT0FBTztBQUFBLFVBQ25DLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixrQ0FBa0MsU0FBUSxLQUFLLENBQUM7QUFBQSxRQUNwRjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLElBQUksU0FBUSxRQUFRO0FBQUEsUUFDbEIsSUFBSSxPQUFPLFFBQVEsUUFBUSxVQUFVO0FBQUEsVUFDbkMsT0FBTyxLQUFLLElBQUksa0JBQWtCLHVDQUF1QyxDQUFDO0FBQUEsUUFDNUU7QUFBQSxRQUVBLE1BQU0sa0JBQWtCLFNBQVMsU0FBUSxRQUFRLFFBQVEsR0FBRztBQUFBLFFBQzVELElBQUksT0FBTyxvQkFBb0IsYUFBYTtBQUFBLFVBQzFDLE9BQU8sS0FBSyxJQUFJLGtCQUFrQiw4RkFBOEYsQ0FBQztBQUFBLFFBQ25JO0FBQUEsUUFDQSxJQUFJLGtCQUFrQixtQkFBbUIsU0FBUSxrQkFBa0IsSUFBSTtBQUFBLFVBQ3JFLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixtQkFBbUIsSUFBSSxLQUFLLGtCQUFrQixJQUFJLENBQUMsQ0FBQztBQUFBLFFBQ3hGO0FBQUEsTUFDRjtBQUFBLE1BRUEsSUFBSSxTQUFRLGFBQWEsTUFBTTtBQUFBLFFBQzdCLE1BQU0sWUFBWSxhQUFhO0FBQUEsUUFFL0IsT0FBTyxLQUFLLE1BQU07QUFBQSxVQUNoQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLE1BRUEsT0FBTyxLQUFLLE1BQU0sT0FBTztBQUFBLEtBQzFCO0FBQUE7QUFBQTs7OztFQzNQSCxJQUFJLFdBQVcsSUFBSTtBQUFBLEVBQW5CLElBQ0ksbUJBQW1CO0FBQUEsRUFEdkIsSUFFSSxjQUFjO0FBQUEsRUFGbEIsSUFHSSxNQUFNLElBQUk7QUFBQSxFQUdkLElBQUksVUFBVTtBQUFBLEVBQWQsSUFDSSxVQUFVO0FBQUEsRUFEZCxJQUVJLFNBQVM7QUFBQSxFQUZiLElBR0ksWUFBWTtBQUFBLEVBSGhCLElBSUksWUFBWTtBQUFBLEVBR2hCLElBQUksU0FBUztBQUFBLEVBR2IsSUFBSSxhQUFhO0FBQUEsRUFHakIsSUFBSSxhQUFhO0FBQUEsRUFHakIsSUFBSSxZQUFZO0FBQUEsRUFHaEIsSUFBSSxXQUFXO0FBQUEsRUFHZixJQUFJLGVBQWU7QUFBQSxFQVduQixTQUFTLFFBQVEsQ0FBQyxPQUFPLFVBQVU7QUFBQSxJQUNqQyxJQUFJLFFBQVEsSUFDUixTQUFTLFFBQVEsTUFBTSxTQUFTLEdBQ2hDLFNBQVMsTUFBTSxNQUFNO0FBQUEsSUFFekIsU0FBUyxRQUFRLFFBQVE7QUFBQSxNQUN2QixPQUFPLFNBQVMsU0FBUyxNQUFNLFFBQVEsT0FBTyxLQUFLO0FBQUEsSUFDckQ7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBY1QsU0FBUyxhQUFhLENBQUMsT0FBTyxXQUFXLFdBQVcsV0FBVztBQUFBLElBQzdELElBQUksU0FBUyxNQUFNLFFBQ2YsUUFBUSxhQUFhLFlBQVksSUFBSTtBQUFBLElBRXpDLE9BQVEsWUFBWSxZQUFZLFFBQVEsUUFBUztBQUFBLE1BQy9DLElBQUksVUFBVSxNQUFNLFFBQVEsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUN6QyxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBWVQsU0FBUyxXQUFXLENBQUMsT0FBTyxPQUFPLFdBQVc7QUFBQSxJQUM1QyxJQUFJLFVBQVUsT0FBTztBQUFBLE1BQ25CLE9BQU8sY0FBYyxPQUFPLFdBQVcsU0FBUztBQUFBLElBQ2xEO0FBQUEsSUFDQSxJQUFJLFFBQVEsWUFBWSxHQUNwQixTQUFTLE1BQU07QUFBQSxJQUVuQixTQUFTLFFBQVEsUUFBUTtBQUFBLE1BQ3ZCLElBQUksTUFBTSxXQUFXLE9BQU87QUFBQSxRQUMxQixPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBVVQsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sVUFBVTtBQUFBO0FBQUEsRUFZbkIsU0FBUyxTQUFTLENBQUMsR0FBRyxVQUFVO0FBQUEsSUFDOUIsSUFBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLENBQUM7QUFBQSxJQUVwQixTQUFTLFFBQVEsR0FBRztBQUFBLE1BQ2xCLE9BQU8sU0FBUyxTQUFTLEtBQUs7QUFBQSxJQUNoQztBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFhVCxTQUFTLFVBQVUsQ0FBQyxRQUFRLE9BQU87QUFBQSxJQUNqQyxPQUFPLFNBQVMsT0FBTyxRQUFRLENBQUMsS0FBSztBQUFBLE1BQ25DLE9BQU8sT0FBTztBQUFBLEtBQ2Y7QUFBQTtBQUFBLEVBV0gsU0FBUyxPQUFPLENBQUMsTUFBTSxXQUFXO0FBQUEsSUFDaEMsT0FBTyxRQUFRLENBQUMsS0FBSztBQUFBLE1BQ25CLE9BQU8sS0FBSyxVQUFVLEdBQUcsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUs5QixJQUFJLGNBQWMsT0FBTztBQUFBLEVBR3pCLElBQUksaUJBQWlCLFlBQVk7QUFBQSxFQU9qQyxJQUFJLGlCQUFpQixZQUFZO0FBQUEsRUFHakMsSUFBSSx1QkFBdUIsWUFBWTtBQUFBLEVBR3ZDLElBQUksYUFBYSxRQUFRLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBNUMsSUFDSSxZQUFZLEtBQUs7QUFBQSxFQVVyQixTQUFTLGFBQWEsQ0FBQyxPQUFPLFdBQVc7QUFBQSxJQUd2QyxJQUFJLFNBQVUsUUFBUSxLQUFLLEtBQUssWUFBWSxLQUFLLElBQzdDLFVBQVUsTUFBTSxRQUFRLE1BQU0sSUFDOUIsQ0FBQztBQUFBLElBRUwsSUFBSSxTQUFTLE9BQU8sUUFDaEIsZ0JBQWdCO0FBQUEsSUFFcEIsU0FBUyxPQUFPLE9BQU87QUFBQSxNQUNyQixLQUFLLGFBQWEsZUFBZSxLQUFLLE9BQU8sR0FBRyxRQUMxQyxnQkFBZ0IsT0FBTyxZQUFZLFFBQVEsS0FBSyxNQUFNLEtBQUs7QUFBQSxRQUMvRCxPQUFPLEtBQUssR0FBRztBQUFBLE1BQ2pCO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFVVCxTQUFTLFFBQVEsQ0FBQyxRQUFRO0FBQUEsSUFDeEIsS0FBSyxZQUFZLE1BQU0sR0FBRztBQUFBLE1BQ3hCLE9BQU8sV0FBVyxNQUFNO0FBQUEsSUFDMUI7QUFBQSxJQUNBLElBQUksU0FBUyxDQUFDO0FBQUEsSUFDZCxTQUFTLE9BQU8sT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUM5QixJQUFJLGVBQWUsS0FBSyxRQUFRLEdBQUcsS0FBSyxPQUFPLGVBQWU7QUFBQSxRQUM1RCxPQUFPLEtBQUssR0FBRztBQUFBLE1BQ2pCO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFXVCxTQUFTLE9BQU8sQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUM5QixTQUFTLFVBQVUsT0FBTyxtQkFBbUI7QUFBQSxJQUM3QyxTQUFTLFdBQ04sT0FBTyxTQUFTLFlBQVksU0FBUyxLQUFLLEtBQUssT0FDL0MsUUFBUSxNQUFNLFFBQVEsS0FBSyxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBVTdDLFNBQVMsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUMxQixJQUFJLE9BQU8sU0FBUyxNQUFNLGFBQ3RCLFFBQVMsT0FBTyxRQUFRLGNBQWMsS0FBSyxhQUFjO0FBQUEsSUFFN0QsT0FBTyxVQUFVO0FBQUE7QUFBQSxFQWlDbkIsU0FBUyxRQUFRLENBQUMsWUFBWSxPQUFPLFdBQVcsT0FBTztBQUFBLElBQ3JELGFBQWEsWUFBWSxVQUFVLElBQUksYUFBYSxPQUFPLFVBQVU7QUFBQSxJQUNyRSxZQUFhLGNBQWMsUUFBUyxVQUFVLFNBQVMsSUFBSTtBQUFBLElBRTNELElBQUksU0FBUyxXQUFXO0FBQUEsSUFDeEIsSUFBSSxZQUFZLEdBQUc7QUFBQSxNQUNqQixZQUFZLFVBQVUsU0FBUyxXQUFXLENBQUM7QUFBQSxJQUM3QztBQUFBLElBQ0EsT0FBTyxTQUFTLFVBQVUsSUFDckIsYUFBYSxVQUFVLFdBQVcsUUFBUSxPQUFPLFNBQVMsSUFBSSxPQUM1RCxVQUFVLFlBQVksWUFBWSxPQUFPLFNBQVMsSUFBSTtBQUFBO0FBQUEsRUFxQi9ELFNBQVMsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUUxQixPQUFPLGtCQUFrQixLQUFLLEtBQUssZUFBZSxLQUFLLE9BQU8sUUFBUSxPQUNsRSxxQkFBcUIsS0FBSyxPQUFPLFFBQVEsS0FBSyxlQUFlLEtBQUssS0FBSyxLQUFLO0FBQUE7QUFBQSxFQTBCbEYsSUFBSSxVQUFVLE1BQU07QUFBQSxFQTJCcEIsU0FBUyxXQUFXLENBQUMsT0FBTztBQUFBLElBQzFCLE9BQU8sU0FBUyxRQUFRLFNBQVMsTUFBTSxNQUFNLE1BQU0sV0FBVyxLQUFLO0FBQUE7QUFBQSxFQTRCckUsU0FBUyxpQkFBaUIsQ0FBQyxPQUFPO0FBQUEsSUFDaEMsT0FBTyxhQUFhLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFBQTtBQUFBLEVBb0JqRCxTQUFTLFVBQVUsQ0FBQyxPQUFPO0FBQUEsSUFHekIsSUFBSSxNQUFNLFNBQVMsS0FBSyxJQUFJLGVBQWUsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUN6RCxPQUFPLE9BQU8sV0FBVyxPQUFPO0FBQUE7QUFBQSxFQTZCbEMsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLE9BQU8sT0FBTyxTQUFTLFlBQ3JCLFFBQVEsTUFBTSxRQUFRLEtBQUssS0FBSyxTQUFTO0FBQUE7QUFBQSxFQTRCN0MsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDbEIsU0FBUyxVQUFVLFFBQVEsWUFBWSxRQUFRO0FBQUE7QUFBQSxFQTJCakQsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLFNBQVMsU0FBUyxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBb0JwQyxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsT0FBTyxPQUFPLFNBQVMsYUFDbkIsUUFBUSxLQUFLLEtBQUssYUFBYSxLQUFLLEtBQUssZUFBZSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUFvQjdFLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixPQUFPLE9BQU8sU0FBUyxZQUNwQixhQUFhLEtBQUssS0FBSyxlQUFlLEtBQUssS0FBSyxLQUFLO0FBQUE7QUFBQSxFQTBCMUQsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBLE1BQ1YsT0FBTyxVQUFVLElBQUksUUFBUTtBQUFBLElBQy9CO0FBQUEsSUFDQSxRQUFRLFNBQVMsS0FBSztBQUFBLElBQ3RCLElBQUksVUFBVSxZQUFZLFdBQVcsVUFBVTtBQUFBLE1BQzdDLElBQUksT0FBUSxRQUFRLElBQUksS0FBSztBQUFBLE1BQzdCLE9BQU8sT0FBTztBQUFBLElBQ2hCO0FBQUEsSUFDQSxPQUFPLFVBQVUsUUFBUSxRQUFRO0FBQUE7QUFBQSxFQTZCbkMsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLElBQUksU0FBUyxTQUFTLEtBQUssR0FDdkIsWUFBWSxTQUFTO0FBQUEsSUFFekIsT0FBTyxXQUFXLFNBQVUsWUFBWSxTQUFTLFlBQVksU0FBVTtBQUFBO0FBQUEsRUEwQnpFLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUNuQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxTQUFTLEtBQUssR0FBRztBQUFBLE1BQ25CLElBQUksUUFBUSxPQUFPLE1BQU0sV0FBVyxhQUFhLE1BQU0sUUFBUSxJQUFJO0FBQUEsTUFDbkUsUUFBUSxTQUFTLEtBQUssSUFBSyxRQUFRLEtBQU07QUFBQSxJQUMzQztBQUFBLElBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE9BQU8sVUFBVSxJQUFJLFNBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsUUFBUSxNQUFNLFFBQVEsUUFBUSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxXQUFXLFdBQVcsS0FBSyxLQUFLO0FBQUEsSUFDcEMsT0FBUSxZQUFZLFVBQVUsS0FBSyxLQUFLLElBQ3BDLGFBQWEsTUFBTSxNQUFNLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxJQUM1QyxXQUFXLEtBQUssS0FBSyxJQUFJLE9BQU87QUFBQTtBQUFBLEVBK0J2QyxTQUFTLElBQUksQ0FBQyxRQUFRO0FBQUEsSUFDcEIsT0FBTyxZQUFZLE1BQU0sSUFBSSxjQUFjLE1BQU0sSUFBSSxTQUFTLE1BQU07QUFBQTtBQUFBLEVBNkJ0RSxTQUFTLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDdEIsT0FBTyxTQUFTLFdBQVcsUUFBUSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUFBLEVBR3RELE9BQU8sVUFBVTtBQUFBOzs7O0VDOXRCakIsSUFBSSxVQUFVO0FBQUEsRUFHZCxJQUFJLGNBQWMsT0FBTztBQUFBLEVBTXpCLElBQUksaUJBQWlCLFlBQVk7QUFBQSxFQWtCakMsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sVUFBVSxRQUFRLFVBQVUsU0FDaEMsYUFBYSxLQUFLLEtBQUssZUFBZSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUEwQjFELFNBQVMsWUFBWSxDQUFDLE9BQU87QUFBQSxJQUMzQixTQUFTLFNBQVMsT0FBTyxTQUFTO0FBQUE7QUFBQSxFQUdwQyxPQUFPLFVBQVU7QUFBQTs7OztFQzNEakIsSUFBSSxXQUFXLElBQUk7QUFBQSxFQUFuQixJQUNJLGNBQWM7QUFBQSxFQURsQixJQUVJLE1BQU0sSUFBSTtBQUFBLEVBR2QsSUFBSSxZQUFZO0FBQUEsRUFHaEIsSUFBSSxTQUFTO0FBQUEsRUFHYixJQUFJLGFBQWE7QUFBQSxFQUdqQixJQUFJLGFBQWE7QUFBQSxFQUdqQixJQUFJLFlBQVk7QUFBQSxFQUdoQixJQUFJLGVBQWU7QUFBQSxFQUduQixJQUFJLGNBQWMsT0FBTztBQUFBLEVBT3pCLElBQUksaUJBQWlCLFlBQVk7QUFBQSxFQTRCakMsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxVQUFVLEtBQUs7QUFBQTtBQUFBLEVBNEI3RCxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsSUFBSSxPQUFPLE9BQU87QUFBQSxJQUNsQixTQUFTLFVBQVUsUUFBUSxZQUFZLFFBQVE7QUFBQTtBQUFBLEVBMkJqRCxTQUFTLFlBQVksQ0FBQyxPQUFPO0FBQUEsSUFDM0IsU0FBUyxTQUFTLE9BQU8sU0FBUztBQUFBO0FBQUEsRUFvQnBDLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixPQUFPLE9BQU8sU0FBUyxZQUNwQixhQUFhLEtBQUssS0FBSyxlQUFlLEtBQUssS0FBSyxLQUFLO0FBQUE7QUFBQSxFQTBCMUQsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBLE1BQ1YsT0FBTyxVQUFVLElBQUksUUFBUTtBQUFBLElBQy9CO0FBQUEsSUFDQSxRQUFRLFNBQVMsS0FBSztBQUFBLElBQ3RCLElBQUksVUFBVSxZQUFZLFdBQVcsVUFBVTtBQUFBLE1BQzdDLElBQUksT0FBUSxRQUFRLElBQUksS0FBSztBQUFBLE1BQzdCLE9BQU8sT0FBTztBQUFBLElBQ2hCO0FBQUEsSUFDQSxPQUFPLFVBQVUsUUFBUSxRQUFRO0FBQUE7QUFBQSxFQTZCbkMsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3hCLElBQUksU0FBUyxTQUFTLEtBQUssR0FDdkIsWUFBWSxTQUFTO0FBQUEsSUFFekIsT0FBTyxXQUFXLFNBQVUsWUFBWSxTQUFTLFlBQVksU0FBVTtBQUFBO0FBQUEsRUEwQnpFLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUNuQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxTQUFTLEtBQUssR0FBRztBQUFBLE1BQ25CLElBQUksUUFBUSxPQUFPLE1BQU0sV0FBVyxhQUFhLE1BQU0sUUFBUSxJQUFJO0FBQUEsTUFDbkUsUUFBUSxTQUFTLEtBQUssSUFBSyxRQUFRLEtBQU07QUFBQSxJQUMzQztBQUFBLElBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE9BQU8sVUFBVSxJQUFJLFNBQVM7QUFBQSxJQUNoQztBQUFBLElBQ0EsUUFBUSxNQUFNLFFBQVEsUUFBUSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxXQUFXLFdBQVcsS0FBSyxLQUFLO0FBQUEsSUFDcEMsT0FBUSxZQUFZLFVBQVUsS0FBSyxLQUFLLElBQ3BDLGFBQWEsTUFBTSxNQUFNLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxJQUM1QyxXQUFXLEtBQUssS0FBSyxJQUFJLE9BQU87QUFBQTtBQUFBLEVBR3ZDLE9BQU8sVUFBVTtBQUFBOzs7O0VDOVBqQixJQUFJLFlBQVk7QUFBQSxFQUdoQixJQUFJLGNBQWMsT0FBTztBQUFBLEVBTXpCLElBQUksaUJBQWlCLFlBQVk7QUFBQSxFQXlCakMsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLFNBQVMsU0FBUyxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBNEJwQyxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsT0FBTyxPQUFPLFNBQVMsWUFDcEIsYUFBYSxLQUFLLEtBQUssZUFBZSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUFHMUQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNwRWpCLElBQUksWUFBWTtBQUFBLEVBU2hCLFNBQVMsWUFBWSxDQUFDLE9BQU87QUFBQSxJQUczQixJQUFJLFNBQVM7QUFBQSxJQUNiLElBQUksU0FBUyxRQUFRLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFBQSxNQUN4RCxJQUFJO0FBQUEsUUFDRixZQUFZLFFBQVE7QUFBQSxRQUNwQixPQUFPLEdBQUc7QUFBQSxJQUNkO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQVdULFNBQVMsT0FBTyxDQUFDLE1BQU0sV0FBVztBQUFBLElBQ2hDLE9BQU8sUUFBUSxDQUFDLEtBQUs7QUFBQSxNQUNuQixPQUFPLEtBQUssVUFBVSxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFLOUIsSUFBSSxZQUFZLFNBQVM7QUFBQSxFQUF6QixJQUNJLGNBQWMsT0FBTztBQUFBLEVBR3pCLElBQUksZUFBZSxVQUFVO0FBQUEsRUFHN0IsSUFBSSxpQkFBaUIsWUFBWTtBQUFBLEVBR2pDLElBQUksbUJBQW1CLGFBQWEsS0FBSyxNQUFNO0FBQUEsRUFPL0MsSUFBSSxpQkFBaUIsWUFBWTtBQUFBLEVBR2pDLElBQUksZUFBZSxRQUFRLE9BQU8sZ0JBQWdCLE1BQU07QUFBQSxFQTBCeEQsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLFNBQVMsU0FBUyxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBK0JwQyxTQUFTLGFBQWEsQ0FBQyxPQUFPO0FBQUEsSUFDNUIsS0FBSyxhQUFhLEtBQUssS0FDbkIsZUFBZSxLQUFLLEtBQUssS0FBSyxhQUFhLGFBQWEsS0FBSyxHQUFHO0FBQUEsTUFDbEUsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksUUFBUSxhQUFhLEtBQUs7QUFBQSxJQUM5QixJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sZUFBZSxLQUFLLE9BQU8sYUFBYSxLQUFLLE1BQU07QUFBQSxJQUM5RCxPQUFRLE9BQU8sUUFBUSxjQUNyQixnQkFBZ0IsUUFBUSxhQUFhLEtBQUssSUFBSSxLQUFLO0FBQUE7QUFBQSxFQUd2RCxPQUFPLFVBQVU7QUFBQTs7OztFQ2hJakIsSUFBSSxZQUFZO0FBQUEsRUFHaEIsSUFBSSxjQUFjLE9BQU87QUFBQSxFQU16QixJQUFJLGlCQUFpQixZQUFZO0FBQUEsRUF5QmpDLElBQUksVUFBVSxNQUFNO0FBQUEsRUF5QnBCLFNBQVMsWUFBWSxDQUFDLE9BQU87QUFBQSxJQUMzQixTQUFTLFNBQVMsT0FBTyxTQUFTO0FBQUE7QUFBQSxFQW1CcEMsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLE9BQU8sT0FBTyxTQUFTLGFBQ25CLFFBQVEsS0FBSyxLQUFLLGFBQWEsS0FBSyxLQUFLLGVBQWUsS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBRzdFLE9BQU8sVUFBVTtBQUFBOzs7O0VDcEZqQixJQUFJLGtCQUFrQjtBQUFBLEVBR3RCLElBQUksV0FBVyxJQUFJO0FBQUEsRUFBbkIsSUFDSSxjQUFjO0FBQUEsRUFEbEIsSUFFSSxNQUFNLElBQUk7QUFBQSxFQUdkLElBQUksWUFBWTtBQUFBLEVBR2hCLElBQUksU0FBUztBQUFBLEVBR2IsSUFBSSxhQUFhO0FBQUEsRUFHakIsSUFBSSxhQUFhO0FBQUEsRUFHakIsSUFBSSxZQUFZO0FBQUEsRUFHaEIsSUFBSSxlQUFlO0FBQUEsRUFHbkIsSUFBSSxjQUFjLE9BQU87QUFBQSxFQU96QixJQUFJLGlCQUFpQixZQUFZO0FBQUEsRUFtQmpDLFNBQVMsTUFBTSxDQUFDLEdBQUcsTUFBTTtBQUFBLElBQ3ZCLElBQUk7QUFBQSxJQUNKLElBQUksT0FBTyxRQUFRLFlBQVk7QUFBQSxNQUM3QixNQUFNLElBQUksVUFBVSxlQUFlO0FBQUEsSUFDckM7QUFBQSxJQUNBLElBQUksVUFBVSxDQUFDO0FBQUEsSUFDZixPQUFPLFFBQVEsR0FBRztBQUFBLE1BQ2hCLE1BQU0sSUFBSSxHQUFHO0FBQUEsUUFDWCxTQUFTLEtBQUssTUFBTSxNQUFNLFNBQVM7QUFBQSxNQUNyQztBQUFBLE1BQ0EsSUFBSSxLQUFLLEdBQUc7QUFBQSxRQUNWLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBc0JYLFNBQVMsSUFBSSxDQUFDLE1BQU07QUFBQSxJQUNsQixPQUFPLE9BQU8sR0FBRyxJQUFJO0FBQUE7QUFBQSxFQTRCdkIsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLElBQ3ZCLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDbEIsU0FBUyxVQUFVLFFBQVEsWUFBWSxRQUFRO0FBQUE7QUFBQSxFQTJCakQsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLFNBQVMsU0FBUyxPQUFPLFNBQVM7QUFBQTtBQUFBLEVBb0JwQyxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsT0FBTyxPQUFPLFNBQVMsWUFDcEIsYUFBYSxLQUFLLEtBQUssZUFBZSxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsRUEwQjFELFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixLQUFLLE9BQU87QUFBQSxNQUNWLE9BQU8sVUFBVSxJQUFJLFFBQVE7QUFBQSxJQUMvQjtBQUFBLElBQ0EsUUFBUSxTQUFTLEtBQUs7QUFBQSxJQUN0QixJQUFJLFVBQVUsWUFBWSxXQUFXLFVBQVU7QUFBQSxNQUM3QyxJQUFJLE9BQVEsUUFBUSxJQUFJLEtBQUs7QUFBQSxNQUM3QixPQUFPLE9BQU87QUFBQSxJQUNoQjtBQUFBLElBQ0EsT0FBTyxVQUFVLFFBQVEsUUFBUTtBQUFBO0FBQUEsRUE2Qm5DLFNBQVMsU0FBUyxDQUFDLE9BQU87QUFBQSxJQUN4QixJQUFJLFNBQVMsU0FBUyxLQUFLLEdBQ3ZCLFlBQVksU0FBUztBQUFBLElBRXpCLE9BQU8sV0FBVyxTQUFVLFlBQVksU0FBUyxZQUFZLFNBQVU7QUFBQTtBQUFBLEVBMEJ6RSxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDdkIsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLFNBQVMsS0FBSyxHQUFHO0FBQUEsTUFDbkIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUNuQixJQUFJLFFBQVEsT0FBTyxNQUFNLFdBQVcsYUFBYSxNQUFNLFFBQVEsSUFBSTtBQUFBLE1BQ25FLFFBQVEsU0FBUyxLQUFLLElBQUssUUFBUSxLQUFNO0FBQUEsSUFDM0M7QUFBQSxJQUNBLElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxNQUM1QixPQUFPLFVBQVUsSUFBSSxTQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFFBQVEsTUFBTSxRQUFRLFFBQVEsRUFBRTtBQUFBLElBQ2hDLElBQUksV0FBVyxXQUFXLEtBQUssS0FBSztBQUFBLElBQ3BDLE9BQVEsWUFBWSxVQUFVLEtBQUssS0FBSyxJQUNwQyxhQUFhLE1BQU0sTUFBTSxDQUFDLEdBQUcsV0FBVyxJQUFJLENBQUMsSUFDNUMsV0FBVyxLQUFLLEtBQUssSUFBSSxPQUFPO0FBQUE7QUFBQSxFQUd2QyxPQUFPLFVBQVU7QUFBQTs7OztFQ3JTakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sTUFBUSxXQUFXLGlCQUFpQjtBQUFBLEVBRXBDLElBQU0saUJBQWlCLENBQUMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLEVBQy9HLElBQUksY0FBYztBQUFBLElBQ2hCLGVBQWUsT0FBTyxHQUFHLEdBQUcsU0FBUyxTQUFTLE9BQU87QUFBQSxFQUN2RDtBQUFBLEVBRUEsSUFBTSxzQkFBc0I7QUFBQSxJQUMxQixXQUFXLEVBQUUsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLE1BQUUsT0FBTyxVQUFVLEtBQUssS0FBTSxTQUFTLEtBQUssS0FBSztBQUFBLE9BQVcsU0FBUyw4RUFBOEU7QUFBQSxJQUN6TCxXQUFXLEVBQUUsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLE1BQUUsT0FBTyxVQUFVLEtBQUssS0FBTSxTQUFTLEtBQUssS0FBSztBQUFBLE9BQVcsU0FBUyw4RUFBOEU7QUFBQSxJQUN6TCxVQUFVLEVBQUUsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLE1BQUUsT0FBTyxTQUFTLEtBQUssS0FBSyxNQUFNLFFBQVEsS0FBSztBQUFBLE9BQU0sU0FBUyx1Q0FBdUM7QUFBQSxJQUMxSSxXQUFXLEVBQUUsU0FBUyxTQUFTLEtBQUssTUFBTSxjQUFjLEdBQUcsU0FBUyxnREFBZ0Q7QUFBQSxJQUNwSCxRQUFRLEVBQUUsU0FBUyxlQUFlLFNBQVMsNkJBQTZCO0FBQUEsSUFDeEUsVUFBVSxFQUFFLFNBQVMsVUFBVSxTQUFTLDhCQUE4QjtBQUFBLElBQ3RFLFFBQVEsRUFBRSxTQUFTLFVBQVUsU0FBUyw0QkFBNEI7QUFBQSxJQUNsRSxTQUFTLEVBQUUsU0FBUyxVQUFVLFNBQVMsNkJBQTZCO0FBQUEsSUFDcEUsT0FBTyxFQUFFLFNBQVMsVUFBVSxTQUFTLDJCQUEyQjtBQUFBLElBQ2hFLGFBQWEsRUFBRSxTQUFTLFdBQVcsU0FBUyxrQ0FBa0M7QUFBQSxJQUM5RSxPQUFPLEVBQUUsU0FBUyxVQUFVLFNBQVMsMkJBQTJCO0FBQUEsSUFDaEUsZUFBZSxFQUFFLFNBQVMsV0FBVyxTQUFTLG9DQUFvQztBQUFBLElBQ2xGLHVCQUF1QixFQUFFLFNBQVMsV0FBVyxTQUFTLDRDQUEyQztBQUFBLElBQ2pHLGdDQUFnQyxFQUFFLFNBQVMsV0FBVyxTQUFTLHFEQUFvRDtBQUFBLEVBQ3JIO0FBQUEsRUFFQSxJQUFNLDJCQUEyQjtBQUFBLElBQy9CLEtBQUssRUFBRSxTQUFTLFVBQVUsU0FBUyxzQ0FBc0M7QUFBQSxJQUN6RSxLQUFLLEVBQUUsU0FBUyxVQUFVLFNBQVMsc0NBQXNDO0FBQUEsSUFDekUsS0FBSyxFQUFFLFNBQVMsVUFBVSxTQUFTLHNDQUFzQztBQUFBLEVBQzNFO0FBQUEsRUFFQSxTQUFTLFFBQVEsQ0FBQyxRQUFRLGNBQWMsUUFBUSxlQUFlO0FBQUEsSUFDN0QsS0FBSyxjQUFjLE1BQU0sR0FBRztBQUFBLE1BQzFCLE1BQU0sSUFBSSxNQUFNLGVBQWUsZ0JBQWdCLHlCQUF5QjtBQUFBLElBQzFFO0FBQUEsSUFDQSxPQUFPLEtBQUssTUFBTSxFQUNmLFFBQVEsUUFBUSxDQUFDLEtBQUs7QUFBQSxNQUNyQixNQUFNLFlBQVksT0FBTztBQUFBLE1BQ3pCLEtBQUssV0FBVztBQUFBLFFBQ2QsS0FBSyxjQUFjO0FBQUEsVUFDakIsTUFBTSxJQUFJLE1BQU0sTUFBTSxNQUFNLDBCQUEwQixnQkFBZ0IsR0FBRztBQUFBLFFBQzNFO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUssVUFBVSxRQUFRLE9BQU8sSUFBSSxHQUFHO0FBQUEsUUFDbkMsTUFBTSxJQUFJLE1BQU0sVUFBVSxPQUFPO0FBQUEsTUFDbkM7QUFBQSxLQUNEO0FBQUE7QUFBQSxFQUdMLFNBQVMsZUFBZSxDQUFDLFVBQVM7QUFBQSxJQUNoQyxPQUFPLFNBQVMscUJBQXFCLE9BQU8sVUFBUyxTQUFTO0FBQUE7QUFBQSxFQUdoRSxTQUFTLGVBQWUsQ0FBQyxTQUFTO0FBQUEsSUFDaEMsT0FBTyxTQUFTLDBCQUEwQixNQUFNLFNBQVMsU0FBUztBQUFBO0FBQUEsRUFHcEUsSUFBTSxxQkFBcUI7QUFBQSxJQUN6QixVQUFZO0FBQUEsSUFDWixRQUFVO0FBQUEsSUFDVixTQUFXO0FBQUEsSUFDWCxPQUFTO0FBQUEsRUFDWDtBQUFBLEVBRUEsSUFBTSxzQkFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU8sVUFBVSxRQUFTLENBQUMsU0FBUyxvQkFBb0IsVUFBUyxVQUFVO0FBQUEsSUFDekUsSUFBSSxPQUFPLGFBQVksWUFBWTtBQUFBLE1BQ2pDLFdBQVc7QUFBQSxNQUNYLFdBQVUsQ0FBQztBQUFBLElBQ2IsRUFBTztBQUFBLE1BQ0wsV0FBVSxZQUFXLENBQUM7QUFBQTtBQUFBLElBR3hCLE1BQU0sa0JBQWtCLE9BQU8sWUFBWSxhQUNwQixPQUFPLFNBQVMsT0FBTztBQUFBLElBRTlDLE1BQU0sU0FBUyxPQUFPLE9BQU87QUFBQSxNQUMzQixLQUFLLFNBQVEsYUFBYTtBQUFBLE1BQzFCLEtBQUssa0JBQWtCLFFBQVE7QUFBQSxNQUMvQixLQUFLLFNBQVE7QUFBQSxJQUNmLEdBQUcsU0FBUSxNQUFNO0FBQUEsSUFFakIsU0FBUyxPQUFPLENBQUMsS0FBSztBQUFBLE1BQ3BCLElBQUksVUFBVTtBQUFBLFFBQ1osT0FBTyxTQUFTLEdBQUc7QUFBQSxNQUNyQjtBQUFBLE1BQ0EsTUFBTTtBQUFBO0FBQUEsSUFHUixLQUFLLHNCQUFzQixTQUFRLGNBQWMsUUFBUTtBQUFBLE1BQ3ZELE9BQU8sUUFBUSxJQUFJLE1BQU0sc0NBQXNDLENBQUM7QUFBQSxJQUNsRTtBQUFBLElBRUEsSUFBSSxzQkFBc0IsVUFBVSw4QkFBOEIsWUFBWTtBQUFBLE1BQzVFLElBQUk7QUFBQSxRQUNGLHFCQUFxQixpQkFBaUIsa0JBQWtCO0FBQUEsUUFDeEQsT0FBTyxHQUFHO0FBQUEsUUFDVixJQUFJO0FBQUEsVUFDRixxQkFBcUIsZ0JBQWdCLE9BQU8sdUJBQXVCLFdBQVcsT0FBTyxLQUFLLGtCQUFrQixJQUFJLGtCQUFrQjtBQUFBLFVBQ2xJLE9BQU8sSUFBRztBQUFBLFVBQ1YsT0FBTyxRQUFRLElBQUksTUFBTSw4Q0FBOEMsQ0FBQztBQUFBO0FBQUE7QUFBQSxJQUc5RTtBQUFBLElBRUEsSUFBSSxPQUFPLElBQUksV0FBVyxJQUFJLEtBQUssbUJBQW1CLFNBQVMsVUFBVTtBQUFBLE1BQ3ZFLE9BQU8sUUFBUSxJQUFJLE1BQU8seURBQXlELE9BQU8sS0FBTSxDQUFDO0FBQUEsSUFDbkcsRUFBTyxTQUFJLGdCQUFnQixLQUFLLE9BQU8sR0FBRyxHQUFHO0FBQUEsTUFDM0MsSUFBSSxtQkFBbUIsU0FBUyxXQUFXO0FBQUEsUUFDekMsT0FBTyxRQUFRLElBQUksTUFBTywyREFBMkQsT0FBTyxLQUFNLENBQUM7QUFBQSxNQUNyRztBQUFBLE1BQ0EsS0FBSyxTQUFRLDBCQUNWLE9BQU8sSUFBSSxXQUFXLElBQUksS0FDM0IsbUJBQW1CLHlCQUF5QixhQUM1QyxtQkFBbUIscUJBQXFCLGdCQUFnQixNQUFNO0FBQUEsUUFDOUQsT0FBTyxRQUFRLElBQUksTUFBTSw4REFBOEQsT0FBTyxLQUFLLENBQUM7QUFBQSxNQUN0RztBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksT0FBTyxZQUFZLGFBQWE7QUFBQSxNQUNsQyxPQUFPLFFBQVEsSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQUEsSUFDakQsRUFBTyxTQUFJLGlCQUFpQjtBQUFBLE1BQzFCLElBQUk7QUFBQSxRQUNGLGdCQUFnQixPQUFPO0FBQUEsUUFFekIsT0FBTyxPQUFPO0FBQUEsUUFDWixPQUFPLFFBQVEsS0FBSztBQUFBO0FBQUEsTUFFdEIsS0FBSyxTQUFRLGVBQWU7QUFBQSxRQUMxQixVQUFVLE9BQU8sT0FBTyxDQUFDLEdBQUUsT0FBTztBQUFBLE1BQ3BDO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFDTCxNQUFNLGtCQUFrQixvQkFBb0IsT0FBTyxRQUFTLENBQUMsS0FBSztBQUFBLFFBQ2hFLE9BQU8sT0FBTyxTQUFRLFNBQVM7QUFBQSxPQUNoQztBQUFBLE1BRUQsSUFBSSxnQkFBZ0IsU0FBUyxHQUFHO0FBQUEsUUFDOUIsT0FBTyxRQUFRLElBQUksTUFBTSxhQUFhLGdCQUFnQixLQUFLLEdBQUcsSUFBSSxpQkFBa0IsT0FBTyxVQUFZLFVBQVUsQ0FBQztBQUFBLE1BQ3BIO0FBQUE7QUFBQSxJQUdGLElBQUksT0FBTyxRQUFRLFFBQVEsZUFBZSxPQUFPLFNBQVEsY0FBYyxhQUFhO0FBQUEsTUFDbEYsT0FBTyxRQUFRLElBQUksTUFBTSwyRUFBMkUsQ0FBQztBQUFBLElBQ3ZHO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxRQUFRLGVBQWUsT0FBTyxTQUFRLGNBQWMsYUFBYTtBQUFBLE1BQ2xGLE9BQU8sUUFBUSxJQUFJLE1BQU0sMkVBQTJFLENBQUM7QUFBQSxJQUN2RztBQUFBLElBRUEsSUFBSTtBQUFBLE1BQ0YsZ0JBQWdCLFFBQU87QUFBQSxNQUV6QixPQUFPLE9BQU87QUFBQSxNQUNaLE9BQU8sUUFBUSxLQUFLO0FBQUE7QUFBQSxJQUd0QixLQUFLLFNBQVEsZ0NBQWdDO0FBQUEsTUFDM0MsSUFBSTtBQUFBLFFBQ0Ysc0JBQXNCLE9BQU8sS0FBSyxrQkFBa0I7QUFBQSxRQUNwRCxPQUFPLE9BQU87QUFBQSxRQUNkLE9BQU8sUUFBUSxLQUFLO0FBQUE7QUFBQSxJQUV4QjtBQUFBLElBRUEsTUFBTSxZQUFZLFFBQVEsT0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSTtBQUFBLElBRTdELElBQUksU0FBUSxhQUFhO0FBQUEsTUFDdkIsT0FBTyxRQUFRO0FBQUEsSUFDakIsRUFBTyxTQUFJLGlCQUFpQjtBQUFBLE1BQzFCLFFBQVEsTUFBTTtBQUFBLElBQ2hCO0FBQUEsSUFFQSxJQUFJLE9BQU8sU0FBUSxjQUFjLGFBQWE7QUFBQSxNQUM1QyxJQUFJO0FBQUEsUUFDRixRQUFRLE1BQU0sU0FBUyxTQUFRLFdBQVcsU0FBUztBQUFBLFFBRXJELE9BQU8sS0FBSztBQUFBLFFBQ1YsT0FBTyxRQUFRLEdBQUc7QUFBQTtBQUFBLE1BRXBCLElBQUksT0FBTyxRQUFRLFFBQVEsYUFBYTtBQUFBLFFBQ3RDLE9BQU8sUUFBUSxJQUFJLE1BQU0saUdBQWlHLENBQUM7QUFBQSxNQUM3SDtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksT0FBTyxTQUFRLGNBQWMsZUFBZSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQzNFLElBQUk7QUFBQSxRQUNGLFFBQVEsTUFBTSxTQUFTLFNBQVEsV0FBVyxTQUFTO0FBQUEsUUFFckQsT0FBTyxLQUFLO0FBQUEsUUFDVixPQUFPLFFBQVEsR0FBRztBQUFBO0FBQUEsTUFFcEIsSUFBSSxPQUFPLFFBQVEsUUFBUSxhQUFhO0FBQUEsUUFDdEMsT0FBTyxRQUFRLElBQUksTUFBTSxpR0FBaUcsQ0FBQztBQUFBLE1BQzdIO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTyxLQUFLLGtCQUFrQixFQUFFLFFBQVEsUUFBUyxDQUFDLEtBQUs7QUFBQSxNQUNyRCxNQUFNLFFBQVEsbUJBQW1CO0FBQUEsTUFDakMsSUFBSSxPQUFPLFNBQVEsU0FBUyxhQUFhO0FBQUEsUUFDdkMsSUFBSSxPQUFPLFFBQVEsV0FBVyxhQUFhO0FBQUEsVUFDekMsT0FBTyxRQUFRLElBQUksTUFBTSxrQkFBa0IsTUFBTSwyQ0FBMkMsUUFBUSxhQUFhLENBQUM7QUFBQSxRQUNwSDtBQUFBLFFBQ0EsUUFBUSxTQUFTLFNBQVE7QUFBQSxNQUMzQjtBQUFBLEtBQ0Q7QUFBQSxJQUVELE1BQU0sV0FBVyxTQUFRLFlBQVk7QUFBQSxJQUVyQyxJQUFJLE9BQU8sYUFBYSxZQUFZO0FBQUEsTUFDbEMsV0FBVyxZQUFZLEtBQUssUUFBUTtBQUFBLE1BRXBDLElBQUksV0FBVztBQUFBLFFBQ2I7QUFBQSxRQUNBLFlBQVk7QUFBQSxRQUNaO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQyxFQUFFLEtBQUssU0FBUyxRQUFRLEVBQ3RCLEtBQUssUUFBUSxRQUFTLENBQUMsV0FBVztBQUFBLFFBRWpDLEtBQUksU0FBUSx5QkFBeUIsYUFBYSxLQUFLLE9BQU8sR0FBRyxLQUFLLFVBQVUsU0FBUyxLQUFLO0FBQUEsVUFDNUYsT0FBTyxTQUFTLElBQUksTUFBTSw4REFBOEQsT0FBTyxLQUFLLENBQUM7QUFBQSxRQUN2RztBQUFBLFFBQ0EsU0FBUyxNQUFNLFNBQVM7QUFBQSxPQUN6QjtBQUFBLElBQ0wsRUFBTztBQUFBLE1BQ0wsSUFBSSxZQUFZLElBQUksS0FBSyxFQUFDLFFBQWdCLFNBQWtCLFFBQVEsb0JBQW9CLFNBQWtCLENBQUM7QUFBQSxNQUUzRyxLQUFJLFNBQVEseUJBQXlCLGFBQWEsS0FBSyxPQUFPLEdBQUcsS0FBSyxVQUFVLFNBQVMsS0FBSztBQUFBLFFBQzVGLE1BQU0sSUFBSSxNQUFNLDhEQUE4RCxPQUFPLEtBQUs7QUFBQSxNQUM1RjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUE7QUFBQTs7OztFQzFQWCxPQUFPLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUE7Ozs7R0NQQyxRQUFTLENBQUMsU0FBUSxVQUFTO0FBQUEsSUFJMUIsU0FBUyxNQUFPLENBQUMsS0FBSyxLQUFLO0FBQUEsTUFDekIsS0FBSztBQUFBLFFBQUssTUFBTSxJQUFJLE1BQU0sT0FBTyxrQkFBa0I7QUFBQTtBQUFBLElBS3JELFNBQVMsUUFBUyxDQUFDLE1BQU0sV0FBVztBQUFBLE1BQ2xDLEtBQUssU0FBUztBQUFBLE1BQ2QsSUFBSSxXQUFXLFFBQVMsR0FBRztBQUFBLE1BQzNCLFNBQVMsWUFBWSxVQUFVO0FBQUEsTUFDL0IsS0FBSyxZQUFZLElBQUk7QUFBQSxNQUNyQixLQUFLLFVBQVUsY0FBYztBQUFBO0FBQUEsSUFLL0IsU0FBUyxFQUFHLENBQUMsUUFBUSxNQUFNLFFBQVE7QUFBQSxNQUNqQyxJQUFJLEdBQUcsS0FBSyxNQUFNLEdBQUc7QUFBQSxRQUNuQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxRQUFRO0FBQUEsTUFDYixLQUFLLFNBQVM7QUFBQSxNQUdkLEtBQUssTUFBTTtBQUFBLE1BRVgsSUFBSSxXQUFXLE1BQU07QUFBQSxRQUNuQixJQUFJLFNBQVMsUUFBUSxTQUFTLE1BQU07QUFBQSxVQUNsQyxTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBRUEsS0FBSyxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksVUFBVSxJQUFJO0FBQUEsTUFDcEQ7QUFBQTtBQUFBLElBRUYsSUFBSSxPQUFPLFlBQVcsVUFBVTtBQUFBLE1BQzlCLFFBQU8sVUFBVTtBQUFBLElBQ25CLEVBQU87QUFBQSxNQUNMLFNBQVEsS0FBSztBQUFBO0FBQUEsSUFHZixHQUFHLEtBQUs7QUFBQSxJQUNSLEdBQUcsV0FBVztBQUFBLElBRWQsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLE1BQ0YsSUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLE9BQU8sV0FBVyxhQUFhO0FBQUEsUUFDekUsVUFBUyxPQUFPO0FBQUEsTUFDbEIsRUFBTztBQUFBLFFBQ0wsOEJBQTJCO0FBQUE7QUFBQSxNQUU3QixPQUFPLEdBQUc7QUFBQSxJQUdaLEdBQUcsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDNUIsSUFBSSxlQUFlLElBQUk7QUFBQSxRQUNyQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsT0FBTyxRQUFRLFFBQVEsT0FBTyxRQUFRLFlBQ3BDLElBQUksWUFBWSxhQUFhLEdBQUcsWUFBWSxNQUFNLFFBQVEsSUFBSSxLQUFLO0FBQUE7QUFBQSxJQUd2RSxHQUFHLE1BQU0sU0FBUyxHQUFJLENBQUMsTUFBTSxPQUFPO0FBQUEsTUFDbEMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFDaEMsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLE1BQU0sU0FBUyxHQUFJLENBQUMsTUFBTSxPQUFPO0FBQUEsTUFDbEMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFDaEMsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLFVBQVUsUUFBUSxTQUFTLElBQUssQ0FBQyxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQ3hELElBQUksT0FBTyxXQUFXLFVBQVU7QUFBQSxRQUM5QixPQUFPLEtBQUssWUFBWSxRQUFRLE1BQU0sTUFBTTtBQUFBLE1BQzlDO0FBQUEsTUFFQSxJQUFJLE9BQU8sV0FBVyxVQUFVO0FBQUEsUUFDOUIsT0FBTyxLQUFLLFdBQVcsUUFBUSxNQUFNLE1BQU07QUFBQSxNQUM3QztBQUFBLE1BRUEsSUFBSSxTQUFTLE9BQU87QUFBQSxRQUNsQixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsT0FBTyxVQUFVLE9BQU8sTUFBTSxRQUFRLEtBQUssUUFBUSxFQUFFO0FBQUEsTUFFckQsU0FBUyxPQUFPLFNBQVMsRUFBRSxRQUFRLFFBQVEsRUFBRTtBQUFBLE1BQzdDLElBQUksUUFBUTtBQUFBLE1BQ1osSUFBSSxPQUFPLE9BQU8sS0FBSztBQUFBLFFBQ3JCO0FBQUEsUUFDQSxLQUFLLFdBQVc7QUFBQSxNQUNsQjtBQUFBLE1BRUEsSUFBSSxRQUFRLE9BQU8sUUFBUTtBQUFBLFFBQ3pCLElBQUksU0FBUyxJQUFJO0FBQUEsVUFDZixLQUFLLFVBQVUsUUFBUSxPQUFPLE1BQU07QUFBQSxRQUN0QyxFQUFPO0FBQUEsVUFDTCxLQUFLLFdBQVcsUUFBUSxNQUFNLEtBQUs7QUFBQSxVQUNuQyxJQUFJLFdBQVcsTUFBTTtBQUFBLFlBQ25CLEtBQUssV0FBVyxLQUFLLFFBQVEsR0FBRyxNQUFNLE1BQU07QUFBQSxVQUM5QztBQUFBO0FBQUEsTUFFSjtBQUFBO0FBQUEsSUFHRixHQUFHLFVBQVUsY0FBYyxTQUFTLFdBQVksQ0FBQyxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQ3JFLElBQUksU0FBUyxHQUFHO0FBQUEsUUFDZCxLQUFLLFdBQVc7QUFBQSxRQUNoQixVQUFVO0FBQUEsTUFDWjtBQUFBLE1BQ0EsSUFBSSxTQUFTLFVBQVc7QUFBQSxRQUN0QixLQUFLLFFBQVEsQ0FBRSxTQUFTLFFBQVU7QUFBQSxRQUNsQyxLQUFLLFNBQVM7QUFBQSxNQUNoQixFQUFPLFNBQUksU0FBUyxrQkFBa0I7QUFBQSxRQUNwQyxLQUFLLFFBQVE7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNSLFNBQVMsV0FBYTtBQUFBLFFBQ3pCO0FBQUEsUUFDQSxLQUFLLFNBQVM7QUFBQSxNQUNoQixFQUFPO0FBQUEsUUFDTCxPQUFPLFNBQVMsZ0JBQWdCO0FBQUEsUUFDaEMsS0FBSyxRQUFRO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDUixTQUFTLFdBQWE7QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssU0FBUztBQUFBO0FBQUEsTUFHaEIsSUFBSSxXQUFXO0FBQUEsUUFBTTtBQUFBLE1BR3JCLEtBQUssV0FBVyxLQUFLLFFBQVEsR0FBRyxNQUFNLE1BQU07QUFBQTtBQUFBLElBRzlDLEdBQUcsVUFBVSxhQUFhLFNBQVMsVUFBVyxDQUFDLFFBQVEsTUFBTSxRQUFRO0FBQUEsTUFFbkUsT0FBTyxPQUFPLE9BQU8sV0FBVyxRQUFRO0FBQUEsTUFDeEMsSUFBSSxPQUFPLFVBQVUsR0FBRztBQUFBLFFBQ3RCLEtBQUssUUFBUSxDQUFFLENBQUU7QUFBQSxRQUNqQixLQUFLLFNBQVM7QUFBQSxRQUNkLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxLQUFLLFNBQVMsS0FBSyxLQUFLLE9BQU8sU0FBUyxDQUFDO0FBQUEsTUFDekMsS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLE1BQU07QUFBQSxNQUNsQyxTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsUUFDcEMsS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUNsQjtBQUFBLE1BRUEsSUFBSSxHQUFHO0FBQUEsTUFDUCxJQUFJLE1BQU07QUFBQSxNQUNWLElBQUksV0FBVyxNQUFNO0FBQUEsUUFDbkIsS0FBSyxJQUFJLE9BQU8sU0FBUyxHQUFHLElBQUksRUFBRyxLQUFLLEdBQUcsS0FBSyxHQUFHO0FBQUEsVUFDakQsSUFBSSxPQUFPLEtBQU0sT0FBTyxJQUFJLE1BQU0sSUFBTSxPQUFPLElBQUksTUFBTTtBQUFBLFVBQ3pELEtBQUssTUFBTSxNQUFPLEtBQUssTUFBTztBQUFBLFVBQzlCLEtBQUssTUFBTSxJQUFJLEtBQU0sTUFBTyxLQUFLLE1BQVE7QUFBQSxVQUN6QyxPQUFPO0FBQUEsVUFDUCxJQUFJLE9BQU8sSUFBSTtBQUFBLFlBQ2IsT0FBTztBQUFBLFlBQ1A7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsRUFBTyxTQUFJLFdBQVcsTUFBTTtBQUFBLFFBQzFCLEtBQUssSUFBSSxHQUFHLElBQUksRUFBRyxJQUFJLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFBQSxVQUM1QyxJQUFJLE9BQU8sS0FBTSxPQUFPLElBQUksTUFBTSxJQUFNLE9BQU8sSUFBSSxNQUFNO0FBQUEsVUFDekQsS0FBSyxNQUFNLE1BQU8sS0FBSyxNQUFPO0FBQUEsVUFDOUIsS0FBSyxNQUFNLElBQUksS0FBTSxNQUFPLEtBQUssTUFBUTtBQUFBLFVBQ3pDLE9BQU87QUFBQSxVQUNQLElBQUksT0FBTyxJQUFJO0FBQUEsWUFDYixPQUFPO0FBQUEsWUFDUDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLFNBQVMsYUFBYyxDQUFDLFFBQVEsT0FBTztBQUFBLE1BQ3JDLElBQUksSUFBSSxPQUFPLFdBQVcsS0FBSztBQUFBLE1BRS9CLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQ3RCLE9BQU8sSUFBSTtBQUFBLE1BRWIsRUFBTyxTQUFJLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUM5QixPQUFPLElBQUk7QUFBQSxNQUViLEVBQU87QUFBQSxRQUNMLE9BQVEsSUFBSSxLQUFNO0FBQUE7QUFBQTtBQUFBLElBSXRCLFNBQVMsWUFBYSxDQUFDLFFBQVEsWUFBWSxPQUFPO0FBQUEsTUFDaEQsSUFBSSxJQUFJLGNBQWMsUUFBUSxLQUFLO0FBQUEsTUFDbkMsSUFBSSxRQUFRLEtBQUssWUFBWTtBQUFBLFFBQzNCLEtBQUssY0FBYyxRQUFRLFFBQVEsQ0FBQyxLQUFLO0FBQUEsTUFDM0M7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsR0FBRyxVQUFVLFlBQVksU0FBUyxTQUFVLENBQUMsUUFBUSxPQUFPLFFBQVE7QUFBQSxNQUVsRSxLQUFLLFNBQVMsS0FBSyxNQUFNLE9BQU8sU0FBUyxTQUFTLENBQUM7QUFBQSxNQUNuRCxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQ2xDLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxRQUNwQyxLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ2xCO0FBQUEsTUFHQSxJQUFJLE1BQU07QUFBQSxNQUNWLElBQUksSUFBSTtBQUFBLE1BRVIsSUFBSTtBQUFBLE1BQ0osSUFBSSxXQUFXLE1BQU07QUFBQSxRQUNuQixLQUFLLElBQUksT0FBTyxTQUFTLEVBQUcsS0FBSyxPQUFPLEtBQUssR0FBRztBQUFBLFVBQzlDLElBQUksYUFBYSxRQUFRLE9BQU8sQ0FBQyxLQUFLO0FBQUEsVUFDdEMsS0FBSyxNQUFNLE1BQU0sSUFBSTtBQUFBLFVBQ3JCLElBQUksT0FBTyxJQUFJO0FBQUEsWUFDYixPQUFPO0FBQUEsWUFDUCxLQUFLO0FBQUEsWUFDTCxLQUFLLE1BQU0sTUFBTSxNQUFNO0FBQUEsVUFDekIsRUFBTztBQUFBLFlBQ0wsT0FBTztBQUFBO0FBQUEsUUFFWDtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsSUFBSSxjQUFjLE9BQU8sU0FBUztBQUFBLFFBQ2xDLEtBQUssSUFBSSxjQUFjLE1BQU0sSUFBSSxRQUFRLElBQUksTUFBTyxJQUFJLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFBQSxVQUM3RSxJQUFJLGFBQWEsUUFBUSxPQUFPLENBQUMsS0FBSztBQUFBLFVBQ3RDLEtBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxVQUNyQixJQUFJLE9BQU8sSUFBSTtBQUFBLFlBQ2IsT0FBTztBQUFBLFlBQ1AsS0FBSztBQUFBLFlBQ0wsS0FBSyxNQUFNLE1BQU0sTUFBTTtBQUFBLFVBQ3pCLEVBQU87QUFBQSxZQUNMLE9BQU87QUFBQTtBQUFBLFFBRVg7QUFBQTtBQUFBLE1BR0YsS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdiLFNBQVMsU0FBVSxDQUFDLEtBQUssT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUN4QyxJQUFJLElBQUk7QUFBQSxNQUNSLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxRQUFRLEdBQUc7QUFBQSxNQUNsQyxTQUFTLElBQUksTUFBTyxJQUFJLEtBQUssS0FBSztBQUFBLFFBQ2hDLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJO0FBQUEsUUFFNUIsS0FBSztBQUFBLFFBR0wsSUFBSSxLQUFLLElBQUk7QUFBQSxVQUNYLEtBQUssSUFBSSxLQUFLO0FBQUEsUUFHaEIsRUFBTyxTQUFJLEtBQUssSUFBSTtBQUFBLFVBQ2xCLEtBQUssSUFBSSxLQUFLO0FBQUEsUUFHaEIsRUFBTztBQUFBLFVBQ0wsS0FBSztBQUFBO0FBQUEsTUFFVDtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLFVBQVUsYUFBYSxTQUFTLFVBQVcsQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUFBLE1BRWxFLEtBQUssUUFBUSxDQUFFLENBQUU7QUFBQSxNQUNqQixLQUFLLFNBQVM7QUFBQSxNQUdkLFNBQVMsVUFBVSxHQUFHLFVBQVUsRUFBRyxXQUFXLFVBQVcsV0FBVyxNQUFNO0FBQUEsUUFDeEU7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVyxVQUFVLE9BQVE7QUFBQSxNQUU3QixJQUFJLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDNUIsSUFBSSxNQUFNLFFBQVE7QUFBQSxNQUNsQixJQUFJLE1BQU0sS0FBSyxJQUFJLE9BQU8sUUFBUSxHQUFHLElBQUk7QUFBQSxNQUV6QyxJQUFJLE9BQU87QUFBQSxNQUNYLFNBQVMsSUFBSSxNQUFPLElBQUksS0FBSyxLQUFLLFNBQVM7QUFBQSxRQUN6QyxPQUFPLFVBQVUsUUFBUSxHQUFHLElBQUksU0FBUyxJQUFJO0FBQUEsUUFFN0MsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNsQixJQUFJLEtBQUssTUFBTSxLQUFLLE9BQU8sVUFBVztBQUFBLFVBQ3BDLEtBQUssTUFBTSxNQUFNO0FBQUEsUUFDbkIsRUFBTztBQUFBLFVBQ0wsS0FBSyxPQUFPLElBQUk7QUFBQTtBQUFBLE1BRXBCO0FBQUEsTUFFQSxJQUFJLFFBQVEsR0FBRztBQUFBLFFBQ2IsSUFBSSxNQUFNO0FBQUEsUUFDVixPQUFPLFVBQVUsUUFBUSxHQUFHLE9BQU8sUUFBUSxJQUFJO0FBQUEsUUFFL0MsS0FBSyxJQUFJLEVBQUcsSUFBSSxLQUFLLEtBQUs7QUFBQSxVQUN4QixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBRUEsS0FBSyxNQUFNLEdBQUc7QUFBQSxRQUNkLElBQUksS0FBSyxNQUFNLEtBQUssT0FBTyxVQUFXO0FBQUEsVUFDcEMsS0FBSyxNQUFNLE1BQU07QUFBQSxRQUNuQixFQUFPO0FBQUEsVUFDTCxLQUFLLE9BQU8sSUFBSTtBQUFBO0FBQUEsTUFFcEI7QUFBQSxNQUVBLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHYixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxNQUFNO0FBQUEsTUFDdkMsS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLE1BQU07QUFBQSxNQUNsQyxTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsUUFDcEMsS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFDN0I7QUFBQSxNQUNBLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDbkIsS0FBSyxXQUFXLEtBQUs7QUFBQSxNQUNyQixLQUFLLE1BQU0sS0FBSztBQUFBO0FBQUEsSUFHbEIsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLEdBQUc7QUFBQSxNQUNyQyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUk7QUFBQSxNQUNuQixLQUFLLEtBQUssQ0FBQztBQUFBLE1BQ1gsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLFVBQVUsVUFBVSxTQUFTLE9BQVEsQ0FBQyxNQUFNO0FBQUEsTUFDN0MsT0FBTyxLQUFLLFNBQVMsTUFBTTtBQUFBLFFBQ3pCLEtBQUssTUFBTSxLQUFLLFlBQVk7QUFBQSxNQUM5QjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFJVCxHQUFHLFVBQVUsUUFBUSxTQUFTLEtBQU0sR0FBRztBQUFBLE1BQ3JDLE9BQU8sS0FBSyxTQUFTLEtBQUssS0FBSyxNQUFNLEtBQUssU0FBUyxPQUFPLEdBQUc7QUFBQSxRQUMzRCxLQUFLO0FBQUEsTUFDUDtBQUFBLE1BQ0EsT0FBTyxLQUFLLFVBQVU7QUFBQTtBQUFBLElBR3hCLEdBQUcsVUFBVSxZQUFZLFNBQVMsU0FBVSxHQUFHO0FBQUEsTUFFN0MsSUFBSSxLQUFLLFdBQVcsS0FBSyxLQUFLLE1BQU0sT0FBTyxHQUFHO0FBQUEsUUFDNUMsS0FBSyxXQUFXO0FBQUEsTUFDbEI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsR0FBRyxVQUFVLFVBQVUsU0FBUyxPQUFRLEdBQUc7QUFBQSxNQUN6QyxRQUFRLEtBQUssTUFBTSxZQUFZLFdBQVcsS0FBSyxTQUFTLEVBQUUsSUFBSTtBQUFBO0FBQUEsSUFpQ2hFLElBQUksUUFBUTtBQUFBLE1BQ1Y7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxhQUFhO0FBQUEsTUFDZjtBQUFBLE1BQUc7QUFBQSxNQUNIO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFHO0FBQUEsTUFDdkI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxJQUNwQjtBQUFBLElBRUEsSUFBSSxhQUFhO0FBQUEsTUFDZjtBQUFBLE1BQUc7QUFBQSxNQUNIO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFDNUQ7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVM7QUFBQSxNQUMzRDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBUztBQUFBLE1BQzNEO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFTO0FB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LE1BQ0osSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFB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QUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxH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QUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMs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RUFBTyxTQUFJLElBQUksR0FBRztBQUFBLFVBQ2hCLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHNUIsR0FBRyxVQUFVLEtBQUssU0FBUyxFQUFHLENBQUMsS0FBSztBQUFBLE1BQ2xDLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLE9BQU8sS0FBSyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHMUIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHNUIsR0FBRyxVQUFVLEtBQUssU0FBUyxFQUFHLENBQUMsS0FBSztBQUFBLE1BQ2xDLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLE9BQU8sS0FBSyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHMUIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHNUIsR0FBRyxVQUFVLEtBQUssU0FBUyxF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dkIsSUFBSSxLQUFLLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFdkIsSUFBSSxPQUFPLEdBQUcsT0FBTztBQUFBLE1BRXJCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsSUFBSTtBQUFBLE1BQzNELElBQUksRUFBRSxRQUFRLENBQUM7QUFBQSxNQUVmLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFBQSxNQUV0RCxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFFdkMsS0FBSztBQUFBLE1BRUwsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsTUFDN0IsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQzNCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFFekMsS0FBSyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUMzQixFQUFPO0FBQUEsTUFLTCxJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUUxQixJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUUxQixJQUFJLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSztBQUFBLE1BRTlCLElBQUksUUFBUSxLQUFLLEVBQUUsT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxNQUM1RCxRQUFRLE1BQU0sT0FBTyxLQUFLLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFFekMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsTUFDN0IsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQzNCLElBQUksUUFBUSxNQUFNLE9BQU8sS0FBSztBQUFBLE1BQzlCLEtBQUssTUFBTSxPQUFP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TTtBQUFBO0FBQUEsRUFHL0MsTUFBTSxVQUFVLFVBQVUsU0FBUyxPQUFPLEdBQUc7QUFBQSxJQU0zQyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUN0QixJQUFJLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFFZixJQUFJLElBQUksS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBRTFCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFFM0QsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDbkIsT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUE7QUFBQSxFQUd4QyxNQUFNLFVBQVUsV0FBVyxTQUFTLFFBQVEsR0FBRztBQUFBLElBUTdDLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQUEsSUFFckMsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPO0FBQUEsSUFFdEIsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPO0FBQUEsSUFFdEIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSSxLQUFL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Q3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEs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QSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNuRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbkQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQUEsSUFDUDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbkQ7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQ2xEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLElBQUksSUFBSTtBQUFBLElBQ047QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQ3BEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNwRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLEVBQ3ZEO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNwRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElB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O0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILEtBQUs7QUFBQSxNQUNMLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFB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