@coolwallet/sol
Version:
Coolwallet Solana sdk
232 lines (231 loc) • 50.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MessageV0 = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _bs = _interopRequireDefault(require("bs58"));
var BufferLayout = _interopRequireWildcard(require("@solana/buffer-layout"));
var _publickey = require("../utils/publickey");
var shortvec = _interopRequireWildcard(require("../utils/shortvec-encoding"));
var _assert = _interopRequireDefault(require("../utils/assert"));
var _params = require("../config/params");
var _commonLayout = require("../utils/commonLayout");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
/**
* Message constructor arguments
*/
var MessageV0 = exports.MessageV0 = /*#__PURE__*/function () {
function MessageV0(args) {
(0, _classCallCheck2["default"])(this, MessageV0);
this.header = args.header;
this.staticAccountKeys = args.staticAccountKeys;
this.recentBlockhash = args.recentBlockhash;
this.compiledInstructions = args.compiledInstructions;
this.addressTableLookups = args.addressTableLookups;
}
return (0, _createClass2["default"])(MessageV0, [{
key: "version",
get: function get() {
return 0;
}
}, {
key: "numAccountKeysFromLookups",
get: function get() {
var count = 0;
var _iterator = _createForOfIteratorHelper(this.addressTableLookups),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var lookup = _step.value;
count += lookup.readonlyIndexes.length + lookup.writableIndexes.length;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return count;
}
}, {
key: "isAccountSigner",
value: function isAccountSigner(index) {
return index < this.header.numRequiredSignatures;
}
}, {
key: "isAccountWritable",
value: function isAccountWritable(index) {
var numSignedAccounts = this.header.numRequiredSignatures;
var numStaticAccountKeys = this.staticAccountKeys.length;
if (index >= numStaticAccountKeys) {
var lookupAccountKeysIndex = index - numStaticAccountKeys;
var numWritableLookupAccountKeys = this.addressTableLookups.reduce(function (count, lookup) {
return count + lookup.writableIndexes.length;
}, 0);
return lookupAccountKeysIndex < numWritableLookupAccountKeys;
} else if (index >= this.header.numRequiredSignatures) {
var unsignedAccountIndex = index - numSignedAccounts;
var numUnsignedAccounts = numStaticAccountKeys - numSignedAccounts;
var numWritableUnsignedAccounts = numUnsignedAccounts - this.header.numReadonlyUnsignedAccounts;
return unsignedAccountIndex < numWritableUnsignedAccounts;
} else {
var numWritableSignedAccounts = numSignedAccounts - this.header.numReadonlySignedAccounts;
return index < numWritableSignedAccounts;
}
}
}, {
key: "serialize",
value: function serialize() {
var encodedStaticAccountKeysLength = Array();
shortvec.encodeLength(encodedStaticAccountKeysLength, this.staticAccountKeys.length);
var serializedInstructions = this.serializeInstructions();
var encodedInstructionsLength = Array();
shortvec.encodeLength(encodedInstructionsLength, this.compiledInstructions.length);
var serializedAddressTableLookups = this.serializeAddressTableLookups();
var encodedAddressTableLookupsLength = Array();
shortvec.encodeLength(encodedAddressTableLookupsLength, this.addressTableLookups.length);
var messageLayout = BufferLayout.struct([BufferLayout.u8('prefix'), BufferLayout.struct([BufferLayout.u8('numRequiredSignatures'), BufferLayout.u8('numReadonlySignedAccounts'), BufferLayout.u8('numReadonlyUnsignedAccounts')], 'header'), BufferLayout.blob(encodedStaticAccountKeysLength.length, 'staticAccountKeysLength'), BufferLayout.seq((0, _commonLayout.publicKey)(), this.staticAccountKeys.length, 'staticAccountKeys'), (0, _commonLayout.publicKey)('recentBlockhash'), BufferLayout.blob(encodedInstructionsLength.length, 'instructionsLength'), BufferLayout.blob(serializedInstructions.length, 'serializedInstructions'), BufferLayout.blob(encodedAddressTableLookupsLength.length, 'addressTableLookupsLength'), BufferLayout.blob(serializedAddressTableLookups.length, 'serializedAddressTableLookups')]);
var serializedMessage = new Uint8Array(_params.PACKET_DATA_SIZE);
var MESSAGE_VERSION_0_PREFIX = 1 << 7;
var serializedMessageLength = messageLayout.encode({
prefix: MESSAGE_VERSION_0_PREFIX,
header: this.header,
staticAccountKeysLength: new Uint8Array(encodedStaticAccountKeysLength),
staticAccountKeys: this.staticAccountKeys.map(function (key) {
return key.toBytes();
}),
recentBlockhash: _bs["default"].decode(this.recentBlockhash),
instructionsLength: new Uint8Array(encodedInstructionsLength),
serializedInstructions: serializedInstructions,
addressTableLookupsLength: new Uint8Array(encodedAddressTableLookupsLength),
serializedAddressTableLookups: serializedAddressTableLookups
}, serializedMessage);
return serializedMessage.slice(0, serializedMessageLength);
}
}, {
key: "serializeInstructions",
value: function serializeInstructions() {
var serializedLength = 0;
var serializedInstructions = new Uint8Array(_params.PACKET_DATA_SIZE);
var _iterator2 = _createForOfIteratorHelper(this.compiledInstructions),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var instruction = _step2.value;
var encodedAccountKeyIndexesLength = Array();
shortvec.encodeLength(encodedAccountKeyIndexesLength, instruction.accountKeyIndexes.length);
var encodedDataLength = Array();
shortvec.encodeLength(encodedDataLength, instruction.data.length);
var instructionLayout = BufferLayout.struct([BufferLayout.u8('programIdIndex'), BufferLayout.blob(encodedAccountKeyIndexesLength.length, 'encodedAccountKeyIndexesLength'), BufferLayout.seq(BufferLayout.u8(), instruction.accountKeyIndexes.length, 'accountKeyIndexes'), BufferLayout.blob(encodedDataLength.length, 'encodedDataLength'), BufferLayout.blob(instruction.data.length, 'data')]);
serializedLength += instructionLayout.encode({
programIdIndex: instruction.programIdIndex,
encodedAccountKeyIndexesLength: new Uint8Array(encodedAccountKeyIndexesLength),
accountKeyIndexes: instruction.accountKeyIndexes,
encodedDataLength: new Uint8Array(encodedDataLength),
data: instruction.data
}, serializedInstructions, serializedLength);
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return serializedInstructions.slice(0, serializedLength);
}
}, {
key: "serializeAddressTableLookups",
value: function serializeAddressTableLookups() {
var serializedLength = 0;
var serializedAddressTableLookups = new Uint8Array(_params.PACKET_DATA_SIZE);
var _iterator3 = _createForOfIteratorHelper(this.addressTableLookups),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var lookup = _step3.value;
var encodedWritableIndexesLength = Array();
shortvec.encodeLength(encodedWritableIndexesLength, lookup.writableIndexes.length);
var encodedReadonlyIndexesLength = Array();
shortvec.encodeLength(encodedReadonlyIndexesLength, lookup.readonlyIndexes.length);
var addressTableLookupLayout = BufferLayout.struct([(0, _commonLayout.publicKey)('accountKey'), BufferLayout.blob(encodedWritableIndexesLength.length, 'encodedWritableIndexesLength'), BufferLayout.seq(BufferLayout.u8(), lookup.writableIndexes.length, 'writableIndexes'), BufferLayout.blob(encodedReadonlyIndexesLength.length, 'encodedReadonlyIndexesLength'), BufferLayout.seq(BufferLayout.u8(), lookup.readonlyIndexes.length, 'readonlyIndexes')]);
serializedLength += addressTableLookupLayout.encode({
accountKey: lookup.accountKey.toBytes(),
encodedWritableIndexesLength: new Uint8Array(encodedWritableIndexesLength),
writableIndexes: lookup.writableIndexes,
encodedReadonlyIndexesLength: new Uint8Array(encodedReadonlyIndexesLength),
readonlyIndexes: lookup.readonlyIndexes
}, serializedAddressTableLookups, serializedLength);
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return serializedAddressTableLookups.slice(0, serializedLength);
}
}], [{
key: "deserialize",
value: function deserialize(serializedMessage) {
var byteArray = (0, _toConsumableArray2["default"])(serializedMessage);
var prefix = byteArray.shift();
var maskedPrefix = prefix & _params.VERSION_PREFIX_MASK;
(0, _assert["default"])(prefix !== maskedPrefix, "Expected versioned message but received legacy message");
var version = maskedPrefix;
(0, _assert["default"])(version === 0, "Expected versioned message with version 0 but found version ".concat(version));
var header = {
numRequiredSignatures: byteArray.shift(),
numReadonlySignedAccounts: byteArray.shift(),
numReadonlyUnsignedAccounts: byteArray.shift()
};
var staticAccountKeys = [];
var staticAccountKeysLength = shortvec.decodeLength(byteArray);
for (var i = 0; i < staticAccountKeysLength; i++) {
staticAccountKeys.push(new _publickey.PublicKey(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH)));
}
var recentBlockhash = _bs["default"].encode(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH));
var instructionCount = shortvec.decodeLength(byteArray);
var compiledInstructions = [];
for (var _i = 0; _i < instructionCount; _i++) {
var programIdIndex = byteArray.shift();
var accountKeyIndexesLength = shortvec.decodeLength(byteArray);
var accountKeyIndexes = byteArray.splice(0, accountKeyIndexesLength);
var dataLength = shortvec.decodeLength(byteArray);
var data = new Uint8Array(byteArray.splice(0, dataLength));
compiledInstructions.push({
programIdIndex: programIdIndex,
accountKeyIndexes: accountKeyIndexes,
data: data
});
}
var addressTableLookupsCount = shortvec.decodeLength(byteArray);
var addressTableLookups = [];
for (var _i2 = 0; _i2 < addressTableLookupsCount; _i2++) {
var accountKey = new _publickey.PublicKey(byteArray.splice(0, _publickey.PUBLIC_KEY_LENGTH));
var writableIndexesLength = shortvec.decodeLength(byteArray);
var writableIndexes = byteArray.splice(0, writableIndexesLength);
var readonlyIndexesLength = shortvec.decodeLength(byteArray);
var readonlyIndexes = byteArray.splice(0, readonlyIndexesLength);
addressTableLookups.push({
accountKey: accountKey,
writableIndexes: writableIndexes,
readonlyIndexes: readonlyIndexes
});
}
return new MessageV0({
header: header,
staticAccountKeys: staticAccountKeys,
recentBlockhash: recentBlockhash,
compiledInstructions: compiledInstructions,
addressTableLookups: addressTableLookups
});
}
}]);
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIkJ1ZmZlckxheW91dCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3B1YmxpY2tleSIsInNob3J0dmVjIiwiX2Fzc2VydCIsIl9wYXJhbXMiLCJfY29tbW9uTGF5b3V0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIk1lc3NhZ2VWMCIsImV4cG9ydHMiLCJhcmdzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImhlYWRlciIsInN0YXRpY0FjY291bnRLZXlzIiwicmVjZW50QmxvY2toYXNoIiwiY29tcGlsZWRJbnN0cnVjdGlvbnMiLCJhZGRyZXNzVGFibGVMb29rdXBzIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImNvdW50IiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJsb29rdXAiLCJyZWFkb25seUluZGV4ZXMiLCJ3cml0YWJsZUluZGV4ZXMiLCJlcnIiLCJpc0FjY291bnRTaWduZXIiLCJpbmRleCIsIm51bVJlcXVpcmVkU2lnbmF0dXJlcyIsImlzQWNjb3VudFdyaXRhYmxlIiwibnVtU2lnbmVkQWNjb3VudHMiLCJudW1TdGF0aWNBY2NvdW50S2V5cyIsImxvb2t1cEFjY291bnRLZXlzSW5kZXgiLCJudW1Xcml0YWJsZUxvb2t1cEFjY291bnRLZXlzIiwicmVkdWNlIiwidW5zaWduZWRBY2NvdW50SW5kZXgiLCJudW1VbnNpZ25lZEFjY291bnRzIiwibnVtV3JpdGFibGVVbnNpZ25lZEFjY291bnRzIiwibnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzIiwibnVtV3JpdGFibGVTaWduZWRBY2NvdW50cyIsIm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMiLCJzZXJpYWxpemUiLCJlbmNvZGVkU3RhdGljQWNjb3VudEtleXNMZW5ndGgiLCJlbmNvZGVMZW5ndGgiLCJzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zIiwic2VyaWFsaXplSW5zdHJ1Y3Rpb25zIiwiZW5jb2RlZEluc3RydWN0aW9uc0xlbmd0aCIsInNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzIiwic2VyaWFsaXplQWRkcmVzc1RhYmxlTG9va3VwcyIsImVuY29kZWRBZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoIiwibWVzc2FnZUxheW91dCIsInN0cnVjdCIsInU4IiwiYmxvYiIsInNlcSIsInB1YmxpY0tleSIsInNlcmlhbGl6ZWRNZXNzYWdlIiwiVWludDhBcnJheSIsIlBBQ0tFVF9EQVRBX1NJWkUiLCJNRVNTQUdFX1ZFUlNJT05fMF9QUkVGSVgiLCJzZXJpYWxpemVkTWVzc2FnZUxlbmd0aCIsImVuY29kZSIsInByZWZpeCIsInN0YXRpY0FjY291bnRLZXlzTGVuZ3RoIiwibWFwIiwidG9CeXRlcyIsImJzNTgiLCJkZWNvZGUiLCJpbnN0cnVjdGlvbnNMZW5ndGgiLCJhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoIiwic2VyaWFsaXplZExlbmd0aCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJpbnN0cnVjdGlvbiIsImVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aCIsImFjY291bnRLZXlJbmRleGVzIiwiZW5jb2RlZERhdGFMZW5ndGgiLCJkYXRhIiwiaW5zdHJ1Y3Rpb25MYXlvdXQiLCJwcm9ncmFtSWRJbmRleCIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoIiwiZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aCIsImFkZHJlc3NUYWJsZUxvb2t1cExheW91dCIsImFjY291bnRLZXkiLCJkZXNlcmlhbGl6ZSIsImJ5dGVBcnJheSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaGlmdCIsIm1hc2tlZFByZWZpeCIsIlZFUlNJT05fUFJFRklYX01BU0siLCJhc3NlcnQiLCJ2ZXJzaW9uIiwiY29uY2F0IiwiZGVjb2RlTGVuZ3RoIiwicHVzaCIsIlB1YmxpY0tleSIsInNwbGljZSIsIlBVQkxJQ19LRVlfTEVOR1RIIiwiaW5zdHJ1Y3Rpb25Db3VudCIsImFjY291bnRLZXlJbmRleGVzTGVuZ3RoIiwiZGF0YUxlbmd0aCIsImFkZHJlc3NUYWJsZUxvb2t1cHNDb3VudCIsIndyaXRhYmxlSW5kZXhlc0xlbmd0aCIsInJlYWRvbmx5SW5kZXhlc0xlbmd0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXNzYWdlL3YwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0ICogYXMgQnVmZmVyTGF5b3V0IGZyb20gJ0Bzb2xhbmEvYnVmZmVyLWxheW91dCc7XG5cbmltcG9ydCB7IEFjY291bnRLZXlzRnJvbUxvb2t1cHMsIEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQsIEJsb2NraGFzaCwgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQge1xuICBNZXNzYWdlSGVhZGVyLFxuICBNZXNzYWdlQWRkcmVzc1RhYmxlTG9va3VwLFxuICBNZXNzYWdlQ29tcGlsZWRJbnN0cnVjdGlvbixcbn0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBQdWJsaWNLZXksIFBVQkxJQ19LRVlfTEVOR1RIIH0gZnJvbSAnLi4vdXRpbHMvcHVibGlja2V5JztcbmltcG9ydCAqIGFzIHNob3J0dmVjIGZyb20gJy4uL3V0aWxzL3Nob3J0dmVjLWVuY29kaW5nJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi4vdXRpbHMvYXNzZXJ0JztcbmltcG9ydCB7IFBBQ0tFVF9EQVRBX1NJWkUsIFZFUlNJT05fUFJFRklYX01BU0sgfSBmcm9tICcuLi9jb25maWcvcGFyYW1zJztcbmltcG9ydCB7IHB1YmxpY0tleSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbkxheW91dCc7XG5cbi8qKlxuICogTWVzc2FnZSBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZVYwQXJncyA9IHtcbiAgLyoqIFRoZSBtZXNzYWdlIGhlYWRlciwgaWRlbnRpZnlpbmcgc2lnbmVkIGFuZCByZWFkLW9ubHkgYGFjY291bnRLZXlzYCAqL1xuICBoZWFkZXI6IE1lc3NhZ2VIZWFkZXI7XG4gIC8qKiBUaGUgc3RhdGljIGFjY291bnQga2V5cyB1c2VkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi9cbiAgc3RhdGljQWNjb3VudEtleXM6IFB1YmxpY0tleVtdO1xuICAvKiogVGhlIGhhc2ggb2YgYSByZWNlbnQgbGVkZ2VyIGJsb2NrICovXG4gIHJlY2VudEJsb2NraGFzaDogQmxvY2toYXNoO1xuICAvKiogSW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiBzZXF1ZW5jZSBhbmQgY29tbWl0dGVkIGluIG9uZSBhdG9taWMgdHJhbnNhY3Rpb24gaWYgYWxsIHN1Y2NlZWQuICovXG4gIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBNZXNzYWdlQ29tcGlsZWRJbnN0cnVjdGlvbltdO1xuICAvKiogSW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiBzZXF1ZW5jZSBhbmQgY29tbWl0dGVkIGluIG9uZSBhdG9taWMgdHJhbnNhY3Rpb24gaWYgYWxsIHN1Y2NlZWQuICovXG4gIGFkZHJlc3NUYWJsZUxvb2t1cHM6IE1lc3NhZ2VBZGRyZXNzVGFibGVMb29rdXBbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbXBpbGVWMEFyZ3MgPSB7XG4gIHBheWVyS2V5OiBQdWJsaWNLZXk7XG4gIGluc3RydWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj47XG4gIHJlY2VudEJsb2NraGFzaDogQmxvY2toYXNoO1xuICBhZGRyZXNzTG9va3VwVGFibGVBY2NvdW50cz86IEFycmF5PEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQ+O1xufTtcblxuZXhwb3J0IHR5cGUgR2V0QWNjb3VudEtleXNBcmdzID1cbiAgfCB7XG4gICAgYWNjb3VudEtleXNGcm9tTG9va3Vwcz86IEFjY291bnRLZXlzRnJvbUxvb2t1cHMgfCBudWxsO1xuICB9XG4gIHwge1xuICAgIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzPzogQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudFtdIHwgbnVsbDtcbiAgfTtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VWMCB7XG4gIGhlYWRlcjogTWVzc2FnZUhlYWRlcjtcbiAgc3RhdGljQWNjb3VudEtleXM6IEFycmF5PFB1YmxpY0tleT47XG4gIHJlY2VudEJsb2NraGFzaDogQmxvY2toYXNoO1xuICBjb21waWxlZEluc3RydWN0aW9uczogQXJyYXk8TWVzc2FnZUNvbXBpbGVkSW5zdHJ1Y3Rpb24+O1xuICBhZGRyZXNzVGFibGVMb29rdXBzOiBBcnJheTxNZXNzYWdlQWRkcmVzc1RhYmxlTG9va3VwPjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBNZXNzYWdlVjBBcmdzKSB7XG4gICAgdGhpcy5oZWFkZXIgPSBhcmdzLmhlYWRlcjtcbiAgICB0aGlzLnN0YXRpY0FjY291bnRLZXlzID0gYXJncy5zdGF0aWNBY2NvdW50S2V5cztcbiAgICB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGFyZ3MucmVjZW50QmxvY2toYXNoO1xuICAgIHRoaXMuY29tcGlsZWRJbnN0cnVjdGlvbnMgPSBhcmdzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zO1xuICAgIHRoaXMuYWRkcmVzc1RhYmxlTG9va3VwcyA9IGFyZ3MuYWRkcmVzc1RhYmxlTG9va3VwcztcbiAgfVxuXG4gIGdldCB2ZXJzaW9uKCk6IDAge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZ2V0IG51bUFjY291bnRLZXlzRnJvbUxvb2t1cHMoKTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgbG9va3VwIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY291bnQgKz0gbG9va3VwLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGggKyBsb29rdXAud3JpdGFibGVJbmRleGVzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgaXNBY2NvdW50U2lnbmVyKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5kZXggPCB0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gIH1cblxuICBpc0FjY291bnRXcml0YWJsZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtU2lnbmVkQWNjb3VudHMgPSB0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gICAgY29uc3QgbnVtU3RhdGljQWNjb3VudEtleXMgPSB0aGlzLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aDtcbiAgICBpZiAoaW5kZXggPj0gbnVtU3RhdGljQWNjb3VudEtleXMpIHtcbiAgICAgIGNvbnN0IGxvb2t1cEFjY291bnRLZXlzSW5kZXggPSBpbmRleCAtIG51bVN0YXRpY0FjY291bnRLZXlzO1xuICAgICAgY29uc3QgbnVtV3JpdGFibGVMb29rdXBBY2NvdW50S2V5cyA9IHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcy5yZWR1Y2UoXG4gICAgICAgIChjb3VudCwgbG9va3VwKSA9PiBjb3VudCArIGxvb2t1cC53cml0YWJsZUluZGV4ZXMubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBsb29rdXBBY2NvdW50S2V5c0luZGV4IDwgbnVtV3JpdGFibGVMb29rdXBBY2NvdW50S2V5cztcbiAgICB9IGVsc2UgaWYgKGluZGV4ID49IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcykge1xuICAgICAgY29uc3QgdW5zaWduZWRBY2NvdW50SW5kZXggPSBpbmRleCAtIG51bVNpZ25lZEFjY291bnRzO1xuICAgICAgY29uc3QgbnVtVW5zaWduZWRBY2NvdW50cyA9IG51bVN0YXRpY0FjY291bnRLZXlzIC0gbnVtU2lnbmVkQWNjb3VudHM7XG4gICAgICBjb25zdCBudW1Xcml0YWJsZVVuc2lnbmVkQWNjb3VudHMgPVxuICAgICAgICBudW1VbnNpZ25lZEFjY291bnRzIC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzO1xuICAgICAgcmV0dXJuIHVuc2lnbmVkQWNjb3VudEluZGV4IDwgbnVtV3JpdGFibGVVbnNpZ25lZEFjY291bnRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBudW1Xcml0YWJsZVNpZ25lZEFjY291bnRzID1cbiAgICAgICAgbnVtU2lnbmVkQWNjb3VudHMgLSB0aGlzLmhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzO1xuICAgICAgcmV0dXJuIGluZGV4IDwgbnVtV3JpdGFibGVTaWduZWRBY2NvdW50cztcbiAgICB9XG4gIH1cblxuICBzZXJpYWxpemUoKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgZW5jb2RlZFN0YXRpY0FjY291bnRLZXlzTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChcbiAgICAgIGVuY29kZWRTdGF0aWNBY2NvdW50S2V5c0xlbmd0aCxcbiAgICAgIHRoaXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zID0gdGhpcy5zZXJpYWxpemVJbnN0cnVjdGlvbnMoKTtcbiAgICBjb25zdCBlbmNvZGVkSW5zdHJ1Y3Rpb25zTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChcbiAgICAgIGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGgsXG4gICAgICB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMgPSB0aGlzLnNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMoKTtcbiAgICBjb25zdCBlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCA9IEFycmF5PG51bWJlcj4oKTtcbiAgICBzaG9ydHZlYy5lbmNvZGVMZW5ndGgoXG4gICAgICBlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCxcbiAgICAgIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcy5sZW5ndGgsXG4gICAgKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VMYXlvdXQgPSBCdWZmZXJMYXlvdXQuc3RydWN0PHtcbiAgICAgIHByZWZpeDogbnVtYmVyO1xuICAgICAgaGVhZGVyOiBNZXNzYWdlSGVhZGVyO1xuICAgICAgc3RhdGljQWNjb3VudEtleXNMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogQXJyYXk8VWludDhBcnJheT47XG4gICAgICByZWNlbnRCbG9ja2hhc2g6IFVpbnQ4QXJyYXk7XG4gICAgICBpbnN0cnVjdGlvbnNMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICBzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zOiBVaW50OEFycmF5O1xuICAgICAgYWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aDogVWludDhBcnJheTtcbiAgICAgIHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzOiBVaW50OEFycmF5O1xuICAgIH0+KFtcbiAgICAgIEJ1ZmZlckxheW91dC51OCgncHJlZml4JyksXG4gICAgICBCdWZmZXJMYXlvdXQuc3RydWN0PE1lc3NhZ2VIZWFkZXI+KFxuICAgICAgICBbXG4gICAgICAgICAgQnVmZmVyTGF5b3V0LnU4KCdudW1SZXF1aXJlZFNpZ25hdHVyZXMnKSxcbiAgICAgICAgICBCdWZmZXJMYXlvdXQudTgoJ251bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMnKSxcbiAgICAgICAgICBCdWZmZXJMYXlvdXQudTgoJ251bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cycpLFxuICAgICAgICBdLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICksXG4gICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgZW5jb2RlZFN0YXRpY0FjY291bnRLZXlzTGVuZ3RoLmxlbmd0aCxcbiAgICAgICAgJ3N0YXRpY0FjY291bnRLZXlzTGVuZ3RoJyxcbiAgICAgICksXG4gICAgICBCdWZmZXJMYXlvdXQuc2VxKFxuICAgICAgICBwdWJsaWNLZXkoKSxcbiAgICAgICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgsXG4gICAgICAgICdzdGF0aWNBY2NvdW50S2V5cycsXG4gICAgICApLFxuICAgICAgcHVibGljS2V5KCdyZWNlbnRCbG9ja2hhc2gnKSxcbiAgICAgIEJ1ZmZlckxheW91dC5ibG9iKGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGgubGVuZ3RoLCAnaW5zdHJ1Y3Rpb25zTGVuZ3RoJyksXG4gICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgc2VyaWFsaXplZEluc3RydWN0aW9ucy5sZW5ndGgsXG4gICAgICAgICdzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICksXG4gICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgZW5jb2RlZEFkZHJlc3NUYWJsZUxvb2t1cHNMZW5ndGgubGVuZ3RoLFxuICAgICAgICAnYWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCcsXG4gICAgICApLFxuICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoXG4gICAgICAgIHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzLmxlbmd0aCxcbiAgICAgICAgJ3NlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzJyxcbiAgICAgICksXG4gICAgXSk7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGNvbnN0IE1FU1NBR0VfVkVSU0lPTl8wX1BSRUZJWCA9IDEgPDwgNztcbiAgICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZUxlbmd0aCA9IG1lc3NhZ2VMYXlvdXQuZW5jb2RlKFxuICAgICAge1xuICAgICAgICBwcmVmaXg6IE1FU1NBR0VfVkVSU0lPTl8wX1BSRUZJWCxcbiAgICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgICAgc3RhdGljQWNjb3VudEtleXNMZW5ndGg6IG5ldyBVaW50OEFycmF5KGVuY29kZWRTdGF0aWNBY2NvdW50S2V5c0xlbmd0aCksXG4gICAgICAgIHN0YXRpY0FjY291bnRLZXlzOiB0aGlzLnN0YXRpY0FjY291bnRLZXlzLm1hcChrZXkgPT4ga2V5LnRvQnl0ZXMoKSksXG4gICAgICAgIHJlY2VudEJsb2NraGFzaDogYnM1OC5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpLFxuICAgICAgICBpbnN0cnVjdGlvbnNMZW5ndGg6IG5ldyBVaW50OEFycmF5KGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGgpLFxuICAgICAgICBzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zLFxuICAgICAgICBhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoOiBuZXcgVWludDhBcnJheShcbiAgICAgICAgICBlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCxcbiAgICAgICAgKSxcbiAgICAgICAgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMsXG4gICAgICB9LFxuICAgICAgc2VyaWFsaXplZE1lc3NhZ2UsXG4gICAgKTtcbiAgICByZXR1cm4gc2VyaWFsaXplZE1lc3NhZ2Uuc2xpY2UoMCwgc2VyaWFsaXplZE1lc3NhZ2VMZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemVJbnN0cnVjdGlvbnMoKTogVWludDhBcnJheSB7XG4gICAgbGV0IHNlcmlhbGl6ZWRMZW5ndGggPSAwO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMgPSBuZXcgVWludDhBcnJheShQQUNLRVRfREFUQV9TSVpFKTtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuY29tcGlsZWRJbnN0cnVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aCA9IEFycmF5PG51bWJlcj4oKTtcbiAgICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChcbiAgICAgICAgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoLFxuICAgICAgICBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlcy5sZW5ndGgsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlbmNvZGVkRGF0YUxlbmd0aCA9IEFycmF5PG51bWJlcj4oKTtcbiAgICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChlbmNvZGVkRGF0YUxlbmd0aCwgaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbkxheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3Q8e1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogbnVtYmVyO1xuICAgICAgICBlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBudW1iZXJbXTtcbiAgICAgICAgZW5jb2RlZERhdGFMZW5ndGg6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICB9PihbXG4gICAgICAgIEJ1ZmZlckxheW91dC51OCgncHJvZ3JhbUlkSW5kZXgnKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoXG4gICAgICAgICAgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoLmxlbmd0aCxcbiAgICAgICAgICAnZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoJyxcbiAgICAgICAgKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LnNlcShcbiAgICAgICAgICBCdWZmZXJMYXlvdXQudTgoKSxcbiAgICAgICAgICBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlcy5sZW5ndGgsXG4gICAgICAgICAgJ2FjY291bnRLZXlJbmRleGVzJyxcbiAgICAgICAgKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoZW5jb2RlZERhdGFMZW5ndGgubGVuZ3RoLCAnZW5jb2RlZERhdGFMZW5ndGgnKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGgsICdkYXRhJyksXG4gICAgICBdKTtcblxuICAgICAgc2VyaWFsaXplZExlbmd0aCArPSBpbnN0cnVjdGlvbkxheW91dC5lbmNvZGUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgICAgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShcbiAgICAgICAgICAgIGVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlcyxcbiAgICAgICAgICBlbmNvZGVkRGF0YUxlbmd0aDogbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZERhdGFMZW5ndGgpLFxuICAgICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMsXG4gICAgICAgIHNlcmlhbGl6ZWRMZW5ndGgsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkSW5zdHJ1Y3Rpb25zLnNsaWNlKDAsIHNlcmlhbGl6ZWRMZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemVBZGRyZXNzVGFibGVMb29rdXBzKCk6IFVpbnQ4QXJyYXkge1xuICAgIGxldCBzZXJpYWxpemVkTGVuZ3RoID0gMDtcbiAgICBjb25zdCBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3VwcyA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGZvciAoY29uc3QgbG9va3VwIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY29uc3QgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCA9IEFycmF5PG51bWJlcj4oKTtcbiAgICAgIHNob3J0dmVjLmVuY29kZUxlbmd0aChcbiAgICAgICAgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCxcbiAgICAgICAgbG9va3VwLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoID0gQXJyYXk8bnVtYmVyPigpO1xuICAgICAgc2hvcnR2ZWMuZW5jb2RlTGVuZ3RoKFxuICAgICAgICBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoLFxuICAgICAgICBsb29rdXAucmVhZG9ubHlJbmRleGVzLmxlbmd0aCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NUYWJsZUxvb2t1cExheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3Q8e1xuICAgICAgICBhY2NvdW50S2V5OiBVaW50OEFycmF5O1xuICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoOiBVaW50OEFycmF5O1xuICAgICAgICB3cml0YWJsZUluZGV4ZXM6IG51bWJlcltdO1xuICAgICAgICBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoOiBVaW50OEFycmF5O1xuICAgICAgICByZWFkb25seUluZGV4ZXM6IG51bWJlcltdO1xuICAgICAgfT4oW1xuICAgICAgICBwdWJsaWNLZXkoJ2FjY291bnRLZXknKSxcbiAgICAgICAgQnVmZmVyTGF5b3V0LmJsb2IoXG4gICAgICAgICAgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aC5sZW5ndGgsXG4gICAgICAgICAgJ2VuY29kZWRXcml0YWJsZUluZGV4ZXNMZW5ndGgnLFxuICAgICAgICApLFxuICAgICAgICBCdWZmZXJMYXlvdXQuc2VxKFxuICAgICAgICAgIEJ1ZmZlckxheW91dC51OCgpLFxuICAgICAgICAgIGxvb2t1cC53cml0YWJsZUluZGV4ZXMubGVuZ3RoLFxuICAgICAgICAgICd3cml0YWJsZUluZGV4ZXMnLFxuICAgICAgICApLFxuICAgICAgICBCdWZmZXJMYXlvdXQuYmxvYihcbiAgICAgICAgICBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoLmxlbmd0aCxcbiAgICAgICAgICAnZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aCcsXG4gICAgICAgICksXG4gICAgICAgIEJ1ZmZlckxheW91dC5zZXEoXG4gICAgICAgICAgQnVmZmVyTGF5b3V0LnU4KCksXG4gICAgICAgICAgbG9va3VwLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGgsXG4gICAgICAgICAgJ3JlYWRvbmx5SW5kZXhlcycsXG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgc2VyaWFsaXplZExlbmd0aCArPSBhZGRyZXNzVGFibGVMb29rdXBMYXlvdXQuZW5jb2RlKFxuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudEtleTogbG9va3VwLmFjY291bnRLZXkudG9CeXRlcygpLFxuICAgICAgICAgIGVuY29kZWRXcml0YWJsZUluZGV4ZXNMZW5ndGg6IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHdyaXRhYmxlSW5kZXhlczogbG9va3VwLndyaXRhYmxlSW5kZXhlcyxcbiAgICAgICAgICBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShcbiAgICAgICAgICAgIGVuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGgsXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZWFkb25seUluZGV4ZXM6IGxvb2t1cC5yZWFkb25seUluZGV4ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzLFxuICAgICAgICBzZXJpYWxpemVkTGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMuc2xpY2UoMCwgc2VyaWFsaXplZExlbmd0aCk7XG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUoc2VyaWFsaXplZE1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBNZXNzYWdlVjAge1xuICAgIGNvbnN0IGJ5dGVBcnJheSA9IFsuLi5zZXJpYWxpemVkTWVzc2FnZV07XG5cbiAgICBjb25zdCBwcmVmaXggPSBieXRlQXJyYXkuc2hpZnQoKSBhcyBudW1iZXI7XG4gICAgY29uc3QgbWFza2VkUHJlZml4ID0gcHJlZml4ICYgVkVSU0lPTl9QUkVGSVhfTUFTSztcbiAgICBhc3NlcnQoXG4gICAgICBwcmVmaXggIT09IG1hc2tlZFByZWZpeCxcbiAgICAgIGBFeHBlY3RlZCB2ZXJzaW9uZWQgbWVzc2FnZSBidXQgcmVjZWl2ZWQgbGVnYWN5IG1lc3NhZ2VgLFxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gbWFza2VkUHJlZml4O1xuICAgIGFzc2VydChcbiAgICAgIHZlcnNpb24gPT09IDAsXG4gICAgICBgRXhwZWN0ZWQgdmVyc2lvbmVkIG1lc3NhZ2Ugd2l0aCB2ZXJzaW9uIDAgYnV0IGZvdW5kIHZlcnNpb24gJHt2ZXJzaW9ufWAsXG4gICAgKTtcblxuICAgIGNvbnN0IGhlYWRlcjogTWVzc2FnZUhlYWRlciA9IHtcbiAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogYnl0ZUFycmF5LnNoaWZ0KCkgYXMgbnVtYmVyLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogYnl0ZUFycmF5LnNoaWZ0KCkgYXMgbnVtYmVyLFxuICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiBieXRlQXJyYXkuc2hpZnQoKSBhcyBudW1iZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRpY0FjY291bnRLZXlzID0gW107XG4gICAgY29uc3Qgc3RhdGljQWNjb3VudEtleXNMZW5ndGggPSBzaG9ydHZlYy5kZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRpY0FjY291bnRLZXlzTGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzLnB1c2goXG4gICAgICAgIG5ldyBQdWJsaWNLZXkoYnl0ZUFycmF5LnNwbGljZSgwLCBQVUJMSUNfS0VZX0xFTkdUSCkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNlbnRCbG9ja2hhc2ggPSBiczU4LmVuY29kZShieXRlQXJyYXkuc3BsaWNlKDAsIFBVQkxJQ19LRVlfTEVOR1RIKSk7XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbkNvdW50ID0gc2hvcnR2ZWMuZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgY29uc3QgY29tcGlsZWRJbnN0cnVjdGlvbnM6IE1lc3NhZ2VDb21waWxlZEluc3RydWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydWN0aW9uQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcHJvZ3JhbUlkSW5kZXggPSBieXRlQXJyYXkuc2hpZnQoKSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBhY2NvdW50S2V5SW5kZXhlc0xlbmd0aCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgYWNjb3VudEtleUluZGV4ZXMgPSBieXRlQXJyYXkuc3BsaWNlKDAsIGFjY291bnRLZXlJbmRleGVzTGVuZ3RoKTtcbiAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBzaG9ydHZlYy5kZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShieXRlQXJyYXkuc3BsaWNlKDAsIGRhdGFMZW5ndGgpKTtcbiAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICBwcm9ncmFtSWRJbmRleCxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXMsXG4gICAgICAgIGRhdGEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzVGFibGVMb29rdXBzQ291bnQgPSBzaG9ydHZlYy5kZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICBjb25zdCBhZGRyZXNzVGFibGVMb29rdXBzOiBNZXNzYWdlQWRkcmVzc1RhYmxlTG9va3VwW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3NUYWJsZUxvb2t1cHNDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBhY2NvdW50S2V5ID0gbmV3IFB1YmxpY0tleShieXRlQXJyYXkuc3BsaWNlKDAsIFBVQkxJQ19LRVlfTEVOR1RIKSk7XG4gICAgICBjb25zdCB3cml0YWJsZUluZGV4ZXNMZW5ndGggPSBzaG9ydHZlYy5kZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICAgIGNvbnN0IHdyaXRhYmxlSW5kZXhlcyA9IGJ5dGVBcnJheS5zcGxpY2UoMCwgd3JpdGFibGVJbmRleGVzTGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlYWRvbmx5SW5kZXhlc0xlbmd0aCA9IHNob3J0dmVjLmRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgcmVhZG9ubHlJbmRleGVzID0gYnl0ZUFycmF5LnNwbGljZSgwLCByZWFkb25seUluZGV4ZXNMZW5ndGgpO1xuICAgICAgYWRkcmVzc1RhYmxlTG9va3Vwcy5wdXNoKHtcbiAgICAgICAgYWNjb3VudEtleSxcbiAgICAgICAgd3JpdGFibGVJbmRleGVzLFxuICAgICAgICByZWFkb25seUluZGV4ZXMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1lc3NhZ2VWMCh7XG4gICAgICBoZWFkZXIsXG4gICAgICBzdGF0aWNBY2NvdW50S2V5cyxcbiAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zLFxuICAgICAgYWRkcmVzc1RhYmxlTG9va3VwcyxcbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLEdBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQVFBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUYsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGFBQUEsR0FBQVAsT0FBQTtBQUFrRCxTQUFBUSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVAsd0JBQUFPLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEs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