js-ecutils
Version:
JavaScript Library for Elliptic Curve Cryptography: key exchanges (Diffie-Hellman, Massey-Omura), ECDSA signatures, and Koblitz encoding. Suitable for crypto education and secure systems.
320 lines (313 loc) • 53.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DigitalSignature = void 0;
var _registry = require("../curves/registry.js");
var _math = require("../utils/math.js");
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
function _OverloadYield(e, d) { this.v = e, this.k = d; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /**
* Elliptic Curve Digital Signature Algorithm (ECDSA).
*
* ECDSA provides authentication and integrity through digital signatures
* based on elliptic curve cryptography.
*
* Signing (private key d, generator G of order n):
* 1. Choose random k ∈ [1, n-1]
* 2. R = k·G, r = R.x mod n
* 3. s = (hash + r·d) · k⁻¹ mod n
*
* Verification (public key Q = d·G):
* 1. w = s⁻¹ mod n
* 2. u₁ = hash·w mod n, u₂ = r·w mod n
* 3. R' = u₁·G + u₂·Q
* 4. Accept iff R'.x mod n = r
*
* Usage:
*
* const signer = new DigitalSignature(123456n, 'secp256k1')
* const [r, s] = signer.sign(messageHash)
* signer.verify(signer.publicKey, messageHash, r, s) // true
*/
/**
* Get the crypto module (works in both Node.js and browsers).
* Uses globalThis.crypto (Web Crypto API) when available, with
* a dynamic require fallback for Node.js environments.
*/
/* istanbul ignore next -- environment-specific crypto detection */
function getCrypto() {
if (typeof globalThis.crypto !== 'undefined') return globalThis.crypto;
var mod = 'crypto';
return typeof require !== 'undefined' ? require(mod) : null; // eslint-disable-line no-undef
}
/**
* Generate a cryptographically secure random BigInt in [1, max-1].
*
* Uses crypto.getRandomValues() (CSPRNG) instead of Math.random()
* to prevent nonce prediction attacks.
*/
function secureRandBelow(max) {
if (max <= 1n) return 1n;
var byteLen = max.toString(16).length + 1 >> 1;
var bytes = new Uint8Array(byteLen);
var result;
do {
var cryptoMod = getCrypto();
if (cryptoMod && cryptoMod.getRandomValues) {
cryptoMod.getRandomValues(bytes);
} /* istanbul ignore next -- Node.js without Web Crypto */else if (cryptoMod && cryptoMod.randomBytes) {
var buf = cryptoMod.randomBytes(byteLen);
bytes.set(buf);
} else {
/* istanbul ignore next */
throw new Error('No secure random number generator available.');
}
var hex = '';
for (var i = 0; i < bytes.length; i++) {
hex += bytes[i].toString(16).padStart(2, '0');
}
result = BigInt('0x' + hex) % max;
} while (result === 0n);
return result;
}
/**
* ECDSA signature generation and verification.
*/
var DigitalSignature = exports.DigitalSignature = /*#__PURE__*/function () {
/**
* @param {BigInt} privateKey - The private scalar d.
* @param {string} [curveName='secp256k1'] - Name of the curve.
*/
function DigitalSignature(privateKey) {
var curveName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'secp256k1';
_classCallCheck(this, DigitalSignature);
this.privateKey = privateKey;
this.curveName = curveName;
Object.freeze(this);
}
return _createClass(DigitalSignature, [{
key: "_curve",
get: function get() {
return (0, _registry.getCurve)(this.curveName);
}
}, {
key: "_G",
get: function get() {
return (0, _registry.getGenerator)(this.curveName);
}
/**
* Compute the public key: Q = d · G.
*/
}, {
key: "publicKey",
get: function get() {
return this._G.mul(this.privateKey);
}
/**
* Generate an ECDSA signature for a message hash.
*
* Algorithm:
* 1. Choose random k ∈ [1, n-1]
* 2. R = k·G, r = R.x mod n
* 3. s = (m + r·d) · k⁻¹ mod n (d = private key, m = hash)
*
* Warning: the nonce k must NEVER be reused across different messages.
* Reusing k leaks the private key (as demonstrated in the 2010 Sony
* PS3 ECDSA attack).
*
* @param {BigInt} messageHash - Integer hash of the message (e.g. SHA-256).
* @returns {[BigInt, BigInt]} [r, s]
*/
}, {
key: "sign",
value: function sign(messageHash) {
var n = this._curve.n;
var G = this._G;
var r = 0n,
s = 0n;
while (r === 0n || s === 0n) {
var k = secureRandBelow(n);
var R = G.mul(k);
r = (0, _math.modulus)(R.x, n);
s = (0, _math.modulus)((messageHash + r * this.privateKey) * (0, _math.modInverse)(k, n), n);
}
return [r, s];
}
/**
* Verify an ECDSA signature.
*
* Algorithm:
* 1. w = s⁻¹ mod n
* 2. u₁ = m·w mod n, u₂ = r·w mod n
* 3. R' = u₁·G + u₂·Q (Q = public key)
* 4. Accept iff R'.x mod n = r
*
* @param {Point} publicKey - The signer's public key Q.
* @param {BigInt} messageHash - Integer hash of the signed message.
* @param {BigInt} r - First component of the signature.
* @param {BigInt} s - Second component of the signature.
* @returns {boolean}
* @throws {Error} If r or s are outside [1, n-1].
*/
}, {
key: "verify",
value: function verify(publicKey, messageHash, r, s) {
var n = this._curve.n;
if (!(1n <= r && r < n && 1n <= s && s < n)) {
throw new Error('r or s are not in the valid range [1, n-1].');
}
var G = this._G;
var w = (0, _math.modInverse)(s, n);
var u1 = (0, _math.modulus)(messageHash * w, n);
var u2 = (0, _math.modulus)(r * w, n);
var R = G.mul(u1).add(publicKey.mul(u2));
return (0, _math.modulus)(R.x, n) === r;
}
/**
* Hash a message and sign it.
*
* Computes SHA-256(message) and converts the hex digest to an integer
* before signing.
*
* @param {Uint8Array|string} message - The raw message to sign.
* @param {Function} [hashFunc] - Optional async hash function
* returning a hex string. Defaults to SHA-256.
* @returns {Promise<[BigInt, BigInt]>} [r, s]
*/
}, {
key: "signMessage",
value: (function () {
var _signMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(message, hashFunc) {
var messageHash;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return defaultHash(message, hashFunc);
case 2:
messageHash = _context.sent;
return _context.abrupt("return", this.sign(messageHash));
case 4:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function signMessage(_x, _x2) {
return _signMessage.apply(this, arguments);
}
return signMessage;
}()
/**
* Hash a message and verify its ECDSA signature.
*
* @param {Point} publicKey - The signer's public key.
* @param {Uint8Array|string} message - The raw message.
* @param {BigInt} r - First component of the signature.
* @param {BigInt} s - Second component of the signature.
* @param {Function} [hashFunc] - Optional async hash function.
* @returns {Promise<boolean>}
*/
)
}, {
key: "verifyMessage",
value: (function () {
var _verifyMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(publicKey, message, r, s, hashFunc) {
var messageHash;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return defaultHash(message, hashFunc);
case 2:
messageHash = _context2.sent;
return _context2.abrupt("return", this.verify(publicKey, messageHash, r, s));
case 4:
case "end":
return _context2.stop();
}
}, _callee2, this);
}));
function verifyMessage(_x3, _x4, _x5, _x6, _x7) {
return _verifyMessage.apply(this, arguments);
}
return verifyMessage;
}())
}]);
}();
/**
* Default hash: SHA-256 via Web Crypto or Node.js crypto.
* Returns the digest as a BigInt.
*/
function defaultHash(_x8, _x9) {
return _defaultHash.apply(this, arguments);
}
function _defaultHash() {
_defaultHash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(message, hashFunc) {
var hex, bytes, cryptoMod, digest, arr, _hex, i, hash;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
if (!hashFunc) {
_context3.next = 5;
break;
}
_context3.next = 3;
return hashFunc(message);
case 3:
hex = _context3.sent;
return _context3.abrupt("return", BigInt('0x' + hex));
case 5:
if (typeof message === 'string') {
bytes = new TextEncoder().encode(message);
} else {
bytes = message;
}
cryptoMod = getCrypto();
if (!(cryptoMod && cryptoMod.subtle)) {
_context3.next = 15;
break;
}
_context3.next = 10;
return cryptoMod.subtle.digest('SHA-256', bytes);
case 10:
digest = _context3.sent;
arr = new Uint8Array(digest);
_hex = '';
for (i = 0; i < arr.length; i++) {
_hex += arr[i].toString(16).padStart(2, '0');
}
return _context3.abrupt("return", BigInt('0x' + _hex));
case 15:
if (!(cryptoMod && cryptoMod.createHash)) {
_context3.next = 18;
break;
}
hash = cryptoMod.createHash('sha256').update(bytes).digest('hex');
return _context3.abrupt("return", BigInt('0x' + hash));
case 18:
throw new Error('No hash function available.');
case 19:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _defaultHash.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnaXN0cnkiLCJyZXF1aXJlIiwiX21hdGgiLCJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiciIsIl9yZWdlbmVyYXRvciIsImUiLCJtIiwidCIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwibiIsImRpc3BsYXlOYW1lIiwibmFtZSIsImEiLCJzdG9wIiwiX2NhdGNoIiwidiIsImFicnVwdCIsImRlbGVnYXRlWWllbGQiLCJyZXN1bHROYW1lIiwiZCIsIl9yZWdlbmVyYXRvclZhbHVlcyIsImZpbmlzaCIsImYiLCJfdCIsInAiLCJwcmV2IiwibmV4dCIsInNlbnQiLCJjYWxsIiwid3JhcCIsInciLCJyZXZlcnNlIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsIm1hcmsiLCJhd3JhcCIsIl9PdmVybG9hZFlpZWxkIiwiQXN5bmNJdGVyYXRvciIsIl9yZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IiLCJhc3luYyIsInUiLCJfcmVnZW5lcmF0b3JBc3luY0dlbiIsIl9yZWdlbmVyYXRvckFzeW5jIiwia2V5cyIsIl9yZWdlbmVyYXRvcktleXMiLCJ2YWx1ZXMiLCJpc05hTiIsImxlbmd0aCIsInZhbHVlIiwiZG9uZSIsIlR5cGVFcnJvciIsInVuc2hpZnQiLCJwb3AiLCJ0aGVuIiwiUHJvbWlzZSIsImkiLCJjIiwicmVzb2x2ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWciLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJ5IiwiRyIsImJpbmQiLCJsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInNldFByb3RvdHlwZU9mIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiayIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsImdldENyeXB0byIsImdsb2JhbFRoaXMiLCJjcnlwdG8iLCJtb2QiLCJzZWN1cmVSYW5kQmVsb3ciLCJtYXgiLCJieXRlTGVuIiwidG9TdHJpbmciLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJyZXN1bHQiLCJjcnlwdG9Nb2QiLCJnZXRSYW5kb21WYWx1ZXMiLCJyYW5kb21CeXRlcyIsImJ1ZiIsInNldCIsIkVycm9yIiwiaGV4IiwicGFkU3RhcnQiLCJCaWdJbnQiLCJEaWdpdGFsU2lnbmF0dXJlIiwiZXhwb3J0cyIsInByaXZhdGVLZXkiLCJjdXJ2ZU5hbWUiLCJ1bmRlZmluZWQiLCJmcmVlemUiLCJnZXQiLCJnZXRDdXJ2ZSIsImdldEdlbmVyYXRvciIsIl9HIiwibXVsIiwic2lnbiIsIm1lc3NhZ2VIYXNoIiwiX2N1cnZlIiwicyIsIlIiLCJtb2R1bHVzIiwieCIsIm1vZEludmVyc2UiLCJ2ZXJpZnkiLCJwdWJsaWNLZXkiLCJ1MSIsInUyIiwiYWRkIiwiX3NpZ25NZXNzYWdlIiwiX2NhbGxlZSIsIm1lc3NhZ2UiLCJoYXNoRnVuYyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJkZWZhdWx0SGFzaCIsInNpZ25NZXNzYWdlIiwiX3giLCJfeDIiLCJfdmVyaWZ5TWVzc2FnZSIsIl9jYWxsZWUyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwidmVyaWZ5TWVzc2FnZSIsIl94MyIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9kZWZhdWx0SGFzaCIsIl9jYWxsZWUzIiwiZGlnZXN0IiwiYXJyIiwiX2hleCIsImhhc2giLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsInN1YnRsZSIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWxnb3JpdGhtcy9kaWdpdGFsX3NpZ25hdHVyZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsbGlwdGljIEN1cnZlIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSAoRUNEU0EpLlxuICpcbiAqIEVDRFNBIHByb3ZpZGVzIGF1dGhlbnRpY2F0aW9uIGFuZCBpbnRlZ3JpdHkgdGhyb3VnaCBkaWdpdGFsIHNpZ25hdHVyZXNcbiAqIGJhc2VkIG9uIGVsbGlwdGljIGN1cnZlIGNyeXB0b2dyYXBoeS5cbiAqXG4gKiBTaWduaW5nIChwcml2YXRlIGtleSBkLCBnZW5lcmF0b3IgRyBvZiBvcmRlciBuKTpcbiAqICAgICAxLiBDaG9vc2UgcmFuZG9tIGsg4oiIIFsxLCBuLTFdXG4gKiAgICAgMi4gUiA9IGvCt0csICByID0gUi54IG1vZCBuXG4gKiAgICAgMy4gcyA9IChoYXNoICsgcsK3ZCkgwrcga+KBu8K5ICBtb2QgblxuICpcbiAqIFZlcmlmaWNhdGlvbiAocHVibGljIGtleSBRID0gZMK3Ryk6XG4gKiAgICAgMS4gdyAgPSBz4oG7wrkgIG1vZCBuXG4gKiAgICAgMi4gdeKCgSA9IGhhc2jCt3cgbW9kIG4sICB14oKCID0gcsK3dyBtb2QgblxuICogICAgIDMuIFInID0gdeKCgcK3RyArIHXigoLCt1FcbiAqICAgICA0LiBBY2NlcHQgaWZmIFInLnggbW9kIG4gPSByXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAgIGNvbnN0IHNpZ25lciA9IG5ldyBEaWdpdGFsU2lnbmF0dXJlKDEyMzQ1Nm4sICdzZWNwMjU2azEnKVxuICogICAgIGNvbnN0IFtyLCBzXSA9IHNpZ25lci5zaWduKG1lc3NhZ2VIYXNoKVxuICogICAgIHNpZ25lci52ZXJpZnkoc2lnbmVyLnB1YmxpY0tleSwgbWVzc2FnZUhhc2gsIHIsIHMpICAvLyB0cnVlXG4gKi9cblxuaW1wb3J0IHsgZ2V0Q3VydmUsIGdldEdlbmVyYXRvciB9IGZyb20gJy4uL2N1cnZlcy9yZWdpc3RyeS5qcydcbmltcG9ydCB7IG1vZHVsdXMsIG1vZEludmVyc2UgfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vKipcbiAqIEdldCB0aGUgY3J5cHRvIG1vZHVsZSAod29ya3MgaW4gYm90aCBOb2RlLmpzIGFuZCBicm93c2VycykuXG4gKiBVc2VzIGdsb2JhbFRoaXMuY3J5cHRvIChXZWIgQ3J5cHRvIEFQSSkgd2hlbiBhdmFpbGFibGUsIHdpdGhcbiAqIGEgZHluYW1pYyByZXF1aXJlIGZhbGxiYWNrIGZvciBOb2RlLmpzIGVudmlyb25tZW50cy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLS0gZW52aXJvbm1lbnQtc3BlY2lmaWMgY3J5cHRvIGRldGVjdGlvbiAqL1xuZnVuY3Rpb24gZ2V0Q3J5cHRvKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvXG4gIGNvbnN0IG1vZCA9ICdjcnlwdG8nXG4gIHJldHVybiB0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgPyByZXF1aXJlKG1vZCkgOiBudWxsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gQmlnSW50IGluIFsxLCBtYXgtMV0uXG4gKlxuICogVXNlcyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgKENTUFJORykgaW5zdGVhZCBvZiBNYXRoLnJhbmRvbSgpXG4gKiB0byBwcmV2ZW50IG5vbmNlIHByZWRpY3Rpb24gYXR0YWNrcy5cbiAqL1xuZnVuY3Rpb24gc2VjdXJlUmFuZEJlbG93KG1heCkge1xuICBpZiAobWF4IDw9IDFuKSByZXR1cm4gMW5cbiAgY29uc3QgYnl0ZUxlbiA9IChtYXgudG9TdHJpbmcoMTYpLmxlbmd0aCArIDEpID4+IDFcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShieXRlTGVuKVxuICBsZXQgcmVzdWx0XG4gIGRvIHtcbiAgICBjb25zdCBjcnlwdG9Nb2QgPSBnZXRDcnlwdG8oKVxuICAgIGlmIChjcnlwdG9Nb2QgJiYgY3J5cHRvTW9kLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgY3J5cHRvTW9kLmdldFJhbmRvbVZhbHVlcyhieXRlcylcbiAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0tIE5vZGUuanMgd2l0aG91dCBXZWIgQ3J5cHRvICovIGVsc2UgaWYgKFxuICAgICAgY3J5cHRvTW9kICYmXG4gICAgICBjcnlwdG9Nb2QucmFuZG9tQnl0ZXNcbiAgICApIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNyeXB0b01vZC5yYW5kb21CeXRlcyhieXRlTGVuKVxuICAgICAgYnl0ZXMuc2V0KGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGF2YWlsYWJsZS4nKVxuICAgIH1cbiAgICBsZXQgaGV4ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZXggKz0gYnl0ZXNbaV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgICB9XG4gICAgcmVzdWx0ID0gQmlnSW50KCcweCcgKyBoZXgpICUgbWF4XG4gIH0gd2hpbGUgKHJlc3VsdCA9PT0gMG4pXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBFQ0RTQSBzaWduYXR1cmUgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRGlnaXRhbFNpZ25hdHVyZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0JpZ0ludH0gcHJpdmF0ZUtleSAgICAgICAtIFRoZSBwcml2YXRlIHNjYWxhciBkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2N1cnZlTmFtZT0nc2VjcDI1NmsxJ10gLSBOYW1lIG9mIHRoZSBjdXJ2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGVLZXksIGN1cnZlTmFtZSA9ICdzZWNwMjU2azEnKSB7XG4gICAgdGhpcy5wcml2YXRlS2V5ID0gcHJpdmF0ZUtleVxuICAgIHRoaXMuY3VydmVOYW1lID0gY3VydmVOYW1lXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKVxuICB9XG5cbiAgZ2V0IF9jdXJ2ZSgpIHtcbiAgICByZXR1cm4gZ2V0Q3VydmUodGhpcy5jdXJ2ZU5hbWUpXG4gIH1cblxuICBnZXQgX0coKSB7XG4gICAgcmV0dXJuIGdldEdlbmVyYXRvcih0aGlzLmN1cnZlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBwdWJsaWMga2V5OiBRID0gZCDCtyBHLlxuICAgKi9cbiAgZ2V0IHB1YmxpY0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fRy5tdWwodGhpcy5wcml2YXRlS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIEVDRFNBIHNpZ25hdHVyZSBmb3IgYSBtZXNzYWdlIGhhc2guXG4gICAqXG4gICAqIEFsZ29yaXRobTpcbiAgICogICAgIDEuIENob29zZSByYW5kb20gayDiiIggWzEsIG4tMV1cbiAgICogICAgIDIuIFIgPSBrwrdHLCAgciA9IFIueCBtb2QgblxuICAgKiAgICAgMy4gcyA9IChtICsgcsK3ZCkgwrcga+KBu8K5ICBtb2QgbiAgIChkID0gcHJpdmF0ZSBrZXksIG0gPSBoYXNoKVxuICAgKlxuICAgKiBXYXJuaW5nOiB0aGUgbm9uY2UgayBtdXN0IE5FVkVSIGJlIHJldXNlZCBhY3Jvc3MgZGlmZmVyZW50IG1lc3NhZ2VzLlxuICAgKiBSZXVzaW5nIGsgbGVha3MgdGhlIHByaXZhdGUga2V5IChhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIDIwMTAgU29ueVxuICAgKiBQUzMgRUNEU0EgYXR0YWNrKS5cbiAgICpcbiAgICogQHBhcmFtIHtCaWdJbnR9IG1lc3NhZ2VIYXNoIC0gSW50ZWdlciBoYXNoIG9mIHRoZSBtZXNzYWdlIChlLmcuIFNIQS0yNTYpLlxuICAgKiBAcmV0dXJucyB7W0JpZ0ludCwgQmlnSW50XX0gW3IsIHNdXG4gICAqL1xuICBzaWduKG1lc3NhZ2VIYXNoKSB7XG4gICAgY29uc3QgbiA9IHRoaXMuX2N1cnZlLm5cbiAgICBjb25zdCBHID0gdGhpcy5fR1xuICAgIGxldCByID0gMG4sXG4gICAgICBzID0gMG5cbiAgICB3aGlsZSAociA9PT0gMG4gfHwgcyA9PT0gMG4pIHtcbiAgICAgIGNvbnN0IGsgPSBzZWN1cmVSYW5kQmVsb3cobilcbiAgICAgIGNvbnN0IFIgPSBHLm11bChrKVxuICAgICAgciA9IG1vZHVsdXMoUi54LCBuKVxuICAgICAgcyA9IG1vZHVsdXMoKG1lc3NhZ2VIYXNoICsgciAqIHRoaXMucHJpdmF0ZUtleSkgKiBtb2RJbnZlcnNlKGssIG4pLCBuKVxuICAgIH1cbiAgICByZXR1cm4gW3IsIHNdXG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGFuIEVDRFNBIHNpZ25hdHVyZS5cbiAgICpcbiAgICogQWxnb3JpdGhtOlxuICAgKiAgICAgMS4gdyAgPSBz4oG7wrkgbW9kIG5cbiAgICogICAgIDIuIHXigoEgPSBtwrd3IG1vZCBuLCAgdeKCgiA9IHLCt3cgbW9kIG5cbiAgICogICAgIDMuIFInID0gdeKCgcK3RyArIHXigoLCt1EgICAoUSA9IHB1YmxpYyBrZXkpXG4gICAqICAgICA0LiBBY2NlcHQgaWZmIFInLnggbW9kIG4gPSByXG4gICAqXG4gICAqIEBwYXJhbSB7UG9pbnR9IHB1YmxpY0tleSAgIC0gVGhlIHNpZ25lcidzIHB1YmxpYyBrZXkgUS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IG1lc3NhZ2VIYXNoIC0gSW50ZWdlciBoYXNoIG9mIHRoZSBzaWduZWQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHIgICAgICAgICAgLSBGaXJzdCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHMgICAgICAgICAgLSBTZWNvbmQgY29tcG9uZW50IG9mIHRoZSBzaWduYXR1cmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgciBvciBzIGFyZSBvdXRzaWRlIFsxLCBuLTFdLlxuICAgKi9cbiAgdmVyaWZ5KHB1YmxpY0tleSwgbWVzc2FnZUhhc2gsIHIsIHMpIHtcbiAgICBjb25zdCBuID0gdGhpcy5fY3VydmUublxuICAgIGlmICghKDFuIDw9IHIgJiYgciA8IG4gJiYgMW4gPD0gcyAmJiBzIDwgbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignciBvciBzIGFyZSBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIFsxLCBuLTFdLicpXG4gICAgfVxuICAgIGNvbnN0IEcgPSB0aGlzLl9HXG4gICAgY29uc3QgdyA9IG1vZEludmVyc2UocywgbilcbiAgICBjb25zdCB1MSA9IG1vZHVsdXMobWVzc2FnZUhhc2ggKiB3LCBuKVxuICAgIGNvbnN0IHUyID0gbW9kdWx1cyhyICogdywgbilcbiAgICBjb25zdCBSID0gRy5tdWwodTEpLmFkZChwdWJsaWNLZXkubXVsKHUyKSlcbiAgICByZXR1cm4gbW9kdWx1cyhSLngsIG4pID09PSByXG4gIH1cblxuICAvKipcbiAgICogSGFzaCBhIG1lc3NhZ2UgYW5kIHNpZ24gaXQuXG4gICAqXG4gICAqIENvbXB1dGVzIFNIQS0yNTYobWVzc2FnZSkgYW5kIGNvbnZlcnRzIHRoZSBoZXggZGlnZXN0IHRvIGFuIGludGVnZXJcbiAgICogYmVmb3JlIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheXxzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgcmF3IG1lc3NhZ2UgdG8gc2lnbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhc2hGdW5jXSAgICAgICAtIE9wdGlvbmFsIGFzeW5jIGhhc2ggZnVuY3Rpb25cbiAgICogICByZXR1cm5pbmcgYSBoZXggc3RyaW5nLiAgRGVmYXVsdHMgdG8gU0hBLTI1Ni5cbiAgICogQHJldHVybnMge1Byb21pc2U8W0JpZ0ludCwgQmlnSW50XT59IFtyLCBzXVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2UobWVzc2FnZSwgaGFzaEZ1bmMpIHtcbiAgICBjb25zdCBtZXNzYWdlSGFzaCA9IGF3YWl0IGRlZmF1bHRIYXNoKG1lc3NhZ2UsIGhhc2hGdW5jKVxuICAgIHJldHVybiB0aGlzLnNpZ24obWVzc2FnZUhhc2gpXG4gIH1cblxuICAvKipcbiAgICogSGFzaCBhIG1lc3NhZ2UgYW5kIHZlcmlmeSBpdHMgRUNEU0Egc2lnbmF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50fSBwdWJsaWNLZXkgICAgICAgICAgIC0gVGhlIHNpZ25lcidzIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSB7VWludDhBcnJheXxzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgcmF3IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7QmlnSW50fSByICAgICAgICAgICAgICAgICAgLSBGaXJzdCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHMgICAgICAgICAgICAgICAgICAtIFNlY29uZCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhc2hGdW5jXSAgICAgICAtIE9wdGlvbmFsIGFzeW5jIGhhc2ggZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TWVzc2FnZShwdWJsaWNLZXksIG1lc3NhZ2UsIHIsIHMsIGhhc2hGdW5jKSB7XG4gICAgY29uc3QgbWVzc2FnZUhhc2ggPSBhd2FpdCBkZWZhdWx0SGFzaChtZXNzYWdlLCBoYXNoRnVuYylcbiAgICByZXR1cm4gdGhpcy52ZXJpZnkocHVibGljS2V5LCBtZXNzYWdlSGFzaCwgciwgcylcbiAgfVxufVxuXG4vKipcbiAqIERlZmF1bHQgaGFzaDogU0hBLTI1NiB2aWEgV2ViIENyeXB0byBvciBOb2RlLmpzIGNyeXB0by5cbiAqIFJldHVybnMgdGhlIGRpZ2VzdCBhcyBhIEJpZ0ludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdEhhc2gobWVzc2FnZSwgaGFzaEZ1bmMpIHtcbiAgaWYgKGhhc2hGdW5jKSB7XG4gICAgY29uc3QgaGV4ID0gYXdhaXQgaGFzaEZ1bmMobWVzc2FnZSlcbiAgICByZXR1cm4gQmlnSW50KCcweCcgKyBoZXgpXG4gIH1cblxuICBsZXQgYnl0ZXNcbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgYnl0ZXMgPSBtZXNzYWdlXG4gIH1cblxuICBjb25zdCBjcnlwdG9Nb2QgPSBnZXRDcnlwdG8oKVxuICBpZiAoY3J5cHRvTW9kICYmIGNyeXB0b01vZC5zdWJ0bGUpIHtcbiAgICBjb25zdCBkaWdlc3QgPSBhd2FpdCBjcnlwdG9Nb2Quc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKVxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGRpZ2VzdClcbiAgICBsZXQgaGV4ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaGV4ICs9IGFycltpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KCcweCcgKyBoZXgpXG4gIH1cblxuICAvLyBOb2RlLmpzIGZhbGxiYWNrXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0tIE5vZGUuanMgd2l0aG91dCBXZWIgQ3J5cHRvICovXG4gIGlmIChjcnlwdG9Nb2QgJiYgY3J5cHRvTW9kLmNyZWF0ZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvTW9kLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShieXRlcykuZGlnZXN0KCdoZXgnKVxuICAgIHJldHVybiBCaWdJbnQoJzB4JyArIGhhc2gpXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhhc2ggZnVuY3Rpb24gYXZhaWxhYmxlLicpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdCQSxJQUFBQSxTQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFBc0QsU0FBQUUsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxDQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxDQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosQ0FBQSxLQUFBRCxPQUFBLENBQUFDLENBQUE7QUFBQSxTQUFBSyxvQkFBQSxzQkFBQUMsQ0FBQSxHQUFBQyxZQUFBLElBQUFDLENBQUEsR0FBQUYsQ0FBQSxDQUFBRyxDQUFBLENBQUFKLG1CQUFBLEdBQUFLLENBQUEsSUFBQUMsTUFBQSxDQUFBQyxjQUFBLEdBQUFELE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLElBQUFBLENBQUEsQ0FBQUssU0FBQSxFQUFBVixXQUFBLFdBQUFXLEVBQUFSLENBQUEsUUFBQUUsQ0FBQSx3QkFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFILFdBQUEsV0FBQUssQ0FBQSxLQUFBQSxDQUFBLEtBQUFFLENBQUEsNkJBQUFGLENBQUEsQ0FBQU8sV0FBQSxJQUFBUCxDQUFBLENBQUFRLElBQUEsVUFBQWhCLENBQUEsb0VBQUFpQixFQUFBWCxDQUFBLFFBQUFFLENBQUEsRUFBQUUsQ0FBQSxtQkFBQUksQ0FBQSxJQUFBTixDQUFBLEtB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