@coolwallet/sol
Version:
Coolwallet Solana sdk
239 lines (230 loc) • 31.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TransactionInstruction = exports.Transaction = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _error = require("@coolwallet/core/lib/error");
var stringUtil = _interopRequireWildcard(require("./stringUtil"));
var _message = require("../message");
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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
/**
* List of TransactionInstruction object fields that may be initialized at construction
*/
/**
* Transaction Instruction class
*/
var TransactionInstruction = exports.TransactionInstruction = /*#__PURE__*/function () {
function TransactionInstruction(opts) {
(0, _classCallCheck2["default"])(this, TransactionInstruction);
/**
* Public keys to include in this transaction
* Boolean represents whether this pubkey needs to sign the transaction
*/
/**
* Program Id to execute
*/
/**
* Program input
*/
(0, _defineProperty2["default"])(this, "data", Buffer.alloc(0));
this.programId = opts.programId;
this.keys = opts.keys;
if (opts.data) {
this.data = opts.data;
}
}
/**
* @internal
*/
return (0, _createClass2["default"])(TransactionInstruction, [{
key: "toJSON",
value: function toJSON() {
return {
keys: this.keys.map(function (_ref) {
var pubkey = _ref.pubkey,
isSigner = _ref.isSigner,
isWritable = _ref.isWritable;
return {
pubkey: stringUtil.toBase58(pubkey),
isSigner: isSigner,
isWritable: isWritable
};
}),
programId: this.programId.toJSON(),
data: (0, _toConsumableArray2["default"])(this.data)
};
}
}]);
}();
var Transaction = exports.Transaction = /*#__PURE__*/function () {
function Transaction(tx) {
(0, _classCallCheck2["default"])(this, Transaction);
this.feePayer = stringUtil.formHex(tx.feePayer);
this.recentBlockhash = stringUtil.formHex(tx.recentBlockhash);
this.instructions = tx.instructions.map(function (instruction) {
return _objectSpread(_objectSpread({}, instruction), {}, {
programId: stringUtil.formHex(instruction.programId),
accounts: instruction.accounts.map(function (account) {
return _objectSpread(_objectSpread({}, account), {}, {
pubkey: stringUtil.formHex(account.pubkey)
});
})
});
});
}
return (0, _createClass2["default"])(Transaction, [{
key: "add",
value: function add(instruction) {
this.instructions.push(instruction);
}
/**
* Compile transaction data
*/
}, {
key: "compileMessage",
value: function compileMessage() {
var recentBlockhash = this.recentBlockhash;
if (!recentBlockhash) {
throw new _error.SDKError(this.compileMessage.name, 'Transaction recentBlockhash required');
}
if (this.instructions.length < 1) {
console.warn('No instructions provided');
}
var feePayer;
if (this.feePayer) {
feePayer = this.feePayer;
} else {
throw new Error('Transaction fee payer required');
}
for (var i = 0; i < this.instructions.length; i++) {
if (this.instructions[i].programId === undefined) {
throw new Error("Transaction instruction index ".concat(i, " has undefined program id"));
}
}
var programIds = [];
var accountMetas = [];
this.instructions.forEach(function (instruction) {
instruction.accounts.forEach(function (accountMeta) {
accountMetas.push(_objectSpread({}, accountMeta));
});
var programId = instruction.programId.toString();
if (!programIds.includes(programId)) {
programIds.push(programId);
}
});
// Append programID account metas
programIds.forEach(function (programId) {
accountMetas.push({
pubkey: programId,
isSigner: false,
isWritable: false
});
});
// Sort. Prioritizing first by signer, then by writable
accountMetas.sort(function (x, y) {
var pubkeySorting = stringUtil.toBase58(x.pubkey).localeCompare(stringUtil.toBase58(y.pubkey));
var checkSigner = x.isSigner === y.isSigner ? 0 : x.isSigner ? -1 : 1;
var checkWritable = x.isWritable === y.isWritable ? pubkeySorting : x.isWritable ? -1 : 1;
return checkSigner || checkWritable;
});
// Cull duplicate account metas
var uniqueMetas = [];
accountMetas.forEach(function (accountMeta) {
var uniqueIndex = uniqueMetas.findIndex(function (x) {
return x.pubkey === accountMeta.pubkey;
});
if (uniqueIndex > -1) {
uniqueMetas[uniqueIndex].isWritable = uniqueMetas[uniqueIndex].isWritable || accountMeta.isWritable;
} else {
uniqueMetas.push(accountMeta);
}
});
// Move fee payer to the front
var feePayerIndex = uniqueMetas.findIndex(function (x) {
return stringUtil.toPublicKey(x.pubkey) === feePayer;
});
if (feePayerIndex > -1) {
var _uniqueMetas$splice = uniqueMetas.splice(feePayerIndex, 1),
_uniqueMetas$splice2 = (0, _slicedToArray2["default"])(_uniqueMetas$splice, 1),
payerMeta = _uniqueMetas$splice2[0];
payerMeta.isSigner = true;
payerMeta.isWritable = true;
uniqueMetas.unshift(payerMeta);
} else {
uniqueMetas.unshift({
pubkey: feePayer,
isSigner: true,
isWritable: true
});
}
var numRequiredSignatures = 0;
var numReadonlySignedAccounts = 0;
var numReadonlyUnsignedAccounts = 0;
// Split out signing from non-signing keys and count header values
var signedKeys = [];
var unsignedKeys = [];
uniqueMetas.forEach(function (_ref2) {
var pubkey = _ref2.pubkey,
isSigner = _ref2.isSigner,
isWritable = _ref2.isWritable;
if (isSigner) {
signedKeys.push(pubkey.toString());
numRequiredSignatures += 1;
if (!isWritable) {
numReadonlySignedAccounts += 1;
}
} else {
unsignedKeys.push(pubkey.toString());
if (!isWritable) {
numReadonlyUnsignedAccounts += 1;
}
}
});
var accountKeys = signedKeys.concat(unsignedKeys);
var instructions = this.instructions.map(function (instruction) {
var data = instruction.data,
programId = instruction.programId;
return {
programIdIndex: accountKeys.indexOf(programId.toString()),
accounts: instruction.accounts.map(function (meta) {
return accountKeys.indexOf(meta.pubkey.toString());
}),
data: stringUtil.formHex(data)
};
});
return new _message.Message({
header: {
numRequiredSignatures: numRequiredSignatures,
numReadonlySignedAccounts: numReadonlySignedAccounts,
numReadonlyUnsignedAccounts: numReadonlyUnsignedAccounts
},
accountKeys: accountKeys,
recentBlockhash: recentBlockhash,
instructions: instructions
});
}
/**
* Return sendable tx string with given signature.
*
* @param signature signature generated by CoolWallet Pro
* @returns
*/
}, {
key: "toTxString",
value: function toTxString(signature) {
this.signature = signature;
return '01' + this.signature + Buffer.from(this.compileMessage().serialize()).toString('hex');
}
}]);
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXJyb3IiLCJyZXF1aXJlIiwic3RyaW5nVXRpbCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX21lc3NhZ2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUcmFuc2FjdGlvbkluc3RydWN0aW9uIiwiZXhwb3J0cyIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiQnVmZmVyIiwiYWxsb2MiLCJwcm9ncmFtSWQiLCJkYXRhIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwidG9KU09OIiwibWFwIiwiX3JlZiIsInB1YmtleSIsImlzU2lnbmVyIiwiaXNXcml0YWJsZSIsInRvQmFzZTU4IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIlRyYW5zYWN0aW9uIiwidHgiLCJmZWVQYXllciIsImZvcm1IZXgiLCJyZWNlbnRCbG9ja2hhc2giLCJpbnN0cnVjdGlvbnMiLCJpbnN0cnVjdGlvbiIsImFjY291bnRzIiwiYWNjb3VudCIsImFkZCIsImNvbXBpbGVNZXNzYWdlIiwiU0RLRXJyb3IiLCJuYW1lIiwiY29uc29sZSIsIndhcm4iLCJFcnJvciIsInVuZGVmaW5lZCIsImNvbmNhdCIsInByb2dyYW1JZHMiLCJhY2NvdW50TWV0YXMiLCJhY2NvdW50TWV0YSIsInRvU3RyaW5nIiwiaW5jbHVkZXMiLCJzb3J0IiwieCIsInkiLCJwdWJrZXlTb3J0aW5nIiwibG9jYWxlQ29tcGFyZSIsImNoZWNrU2lnbmVyIiwiY2hlY2tXcml0YWJsZSIsInVuaXF1ZU1ldGFzIiwidW5pcXVlSW5kZXgiLCJmaW5kSW5kZXgiLCJmZWVQYXllckluZGV4IiwidG9QdWJsaWNLZXkiLCJfdW5pcXVlTWV0YXMkc3BsaWNlIiwic3BsaWNlIiwiX3VuaXF1ZU1ldGFzJHNwbGljZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJwYXllck1ldGEiLCJ1bnNoaWZ0IiwibnVtUmVxdWlyZWRTaWduYXR1cmVzIiwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyIsIm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyIsInNpZ25lZEtleXMiLCJ1bnNpZ25lZEtleXMiLCJfcmVmMiIsImFjY291bnRLZXlzIiwicHJvZ3JhbUlkSW5kZXgiLCJpbmRleE9mIiwibWV0YSIsIk1lc3NhZ2UiLCJoZWFkZXIiLCJ0b1R4U3RyaW5nIiwic2lnbmF0dXJlIiwiZnJvbSIsInNlcmlhbGl6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9UcmFuc2FjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTREtFcnJvciB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUvbGliL2Vycm9yJztcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWwgZnJvbSAnLi9zdHJpbmdVdGlsJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICcuL3B1YmxpY2tleSc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi4vbWVzc2FnZSc7XG5cbi8qKlxuICogTGlzdCBvZiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIG9iamVjdCBmaWVsZHMgdGhhdCBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25DdG9yRmllbGRzID0ge1xuICBrZXlzOiBBcnJheTx0eXBlcy5BY2NvdW50TWV0YT47XG4gIHByb2dyYW1JZDogUHVibGljS2V5O1xuICBkYXRhPzogQnVmZmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkluc3RydWN0aW9uSlNPTiB7XG4gIGtleXM6IHtcbiAgICBwdWJrZXk6IHN0cmluZztcbiAgICBpc1NpZ25lcjogYm9vbGVhbjtcbiAgICBpc1dyaXRhYmxlOiBib29sZWFuO1xuICB9W107XG4gIHByb2dyYW1JZDogc3RyaW5nO1xuICBkYXRhOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBJbnN0cnVjdGlvbiBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIC8qKlxuICAgKiBQdWJsaWMga2V5cyB0byBpbmNsdWRlIGluIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQm9vbGVhbiByZXByZXNlbnRzIHdoZXRoZXIgdGhpcyBwdWJrZXkgbmVlZHMgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGtleXM6IEFycmF5PHR5cGVzLkFjY291bnRNZXRhPjtcblxuICAvKipcbiAgICogUHJvZ3JhbSBJZCB0byBleGVjdXRlXG4gICAqL1xuICBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcblxuICAvKipcbiAgICogUHJvZ3JhbSBpbnB1dFxuICAgKi9cbiAgZGF0YTogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25DdG9yRmllbGRzKSB7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBvcHRzLnByb2dyYW1JZDtcbiAgICB0aGlzLmtleXMgPSBvcHRzLmtleXM7XG4gICAgaWYgKG9wdHMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gb3B0cy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRvSlNPTigpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IHRoaXMua2V5cy5tYXAoKHsgcHVia2V5LCBpc1NpZ25lciwgaXNXcml0YWJsZSB9KSA9PiAoe1xuICAgICAgICBwdWJrZXk6IHN0cmluZ1V0aWwudG9CYXNlNTgocHVia2V5KSxcbiAgICAgICAgaXNTaWduZXIsXG4gICAgICAgIGlzV3JpdGFibGUsXG4gICAgICB9KSksXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLnRvSlNPTigpLFxuICAgICAgZGF0YTogWy4uLnRoaXMuZGF0YV0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICBmZWVQYXllcjogc3RyaW5nO1xuICByZWNlbnRCbG9ja2hhc2g6IHN0cmluZztcbiAgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5UcmFuc2FjdGlvbkluc3RydWN0aW9uW107XG4gIHNpZ25hdHVyZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih0eDogdHlwZXMuVHJhbnNhY3Rpb25BcmdzKSB7XG4gICAgdGhpcy5mZWVQYXllciA9IHN0cmluZ1V0aWwuZm9ybUhleCh0eC5mZWVQYXllcik7XG4gICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSBzdHJpbmdVdGlsLmZvcm1IZXgodHgucmVjZW50QmxvY2toYXNoKTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IHR4Lmluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiAoe1xuICAgICAgLi4uaW5zdHJ1Y3Rpb24sXG4gICAgICBwcm9ncmFtSWQ6IHN0cmluZ1V0aWwuZm9ybUhleChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpLFxuICAgICAgYWNjb3VudHM6IGluc3RydWN0aW9uLmFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gKHtcbiAgICAgICAgLi4uYWNjb3VudCxcbiAgICAgICAgcHVia2V5OiBzdHJpbmdVdGlsLmZvcm1IZXgoYWNjb3VudC5wdWJrZXkpLFxuICAgICAgfSkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFkZChpbnN0cnVjdGlvbjogdHlwZXMuVHJhbnNhY3Rpb25JbnN0cnVjdGlvbikge1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKi9cbiAgY29tcGlsZU1lc3NhZ2UoKTogTWVzc2FnZSB7XG4gICAgY29uc3QgeyByZWNlbnRCbG9ja2hhc2ggfSA9IHRoaXM7XG4gICAgaWYgKCFyZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTREtFcnJvcih0aGlzLmNvbXBpbGVNZXNzYWdlLm5hbWUsICdUcmFuc2FjdGlvbiByZWNlbnRCbG9ja2hhc2ggcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoIDwgMSkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBpbnN0cnVjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgZmVlUGF5ZXI6IHN0cmluZztcbiAgICBpZiAodGhpcy5mZWVQYXllcikge1xuICAgICAgZmVlUGF5ZXIgPSB0aGlzLmZlZVBheWVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGZlZSBwYXllciByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmluc3RydWN0aW9uc1tpXS5wcm9ncmFtSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uIGluc3RydWN0aW9uIGluZGV4ICR7aX0gaGFzIHVuZGVmaW5lZCBwcm9ncmFtIGlkYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbUlkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhY2NvdW50TWV0YXM6IHR5cGVzLkFjY291bnRNZXRhW10gPSBbXTtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgaW5zdHJ1Y3Rpb24uYWNjb3VudHMuZm9yRWFjaCgoYWNjb3VudE1ldGEpID0+IHtcbiAgICAgICAgYWNjb3VudE1ldGFzLnB1c2goeyAuLi5hY2NvdW50TWV0YSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgIGlmICghcHJvZ3JhbUlkcy5pbmNsdWRlcyhwcm9ncmFtSWQpKSB7XG4gICAgICAgIHByb2dyYW1JZHMucHVzaChwcm9ncmFtSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwZW5kIHByb2dyYW1JRCBhY2NvdW50IG1ldGFzXG4gICAgcHJvZ3JhbUlkcy5mb3JFYWNoKChwcm9ncmFtSWQpID0+IHtcbiAgICAgIGFjY291bnRNZXRhcy5wdXNoKHtcbiAgICAgICAgcHVia2V5OiBwcm9ncmFtSWQsXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFNvcnQuIFByaW9yaXRpemluZyBmaXJzdCBieSBzaWduZXIsIHRoZW4gYnkgd3JpdGFibGVcbiAgICBhY2NvdW50TWV0YXMuc29ydChmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgY29uc3QgcHVia2V5U29ydGluZyA9IHN0cmluZ1V0aWwudG9CYXNlNTgoeC5wdWJrZXkpLmxvY2FsZUNvbXBhcmUoc3RyaW5nVXRpbC50b0Jhc2U1OCh5LnB1YmtleSkpO1xuICAgICAgY29uc3QgY2hlY2tTaWduZXIgPSB4LmlzU2lnbmVyID09PSB5LmlzU2lnbmVyID8gMCA6IHguaXNTaWduZXIgPyAtMSA6IDE7XG4gICAgICBjb25zdCBjaGVja1dyaXRhYmxlID0geC5pc1dyaXRhYmxlID09PSB5LmlzV3JpdGFibGUgPyBwdWJrZXlTb3J0aW5nIDogeC5pc1dyaXRhYmxlID8gLTEgOiAxO1xuICAgICAgcmV0dXJuIGNoZWNrU2lnbmVyIHx8IGNoZWNrV3JpdGFibGU7XG4gICAgfSk7XG5cbiAgICAvLyBDdWxsIGR1cGxpY2F0ZSBhY2NvdW50IG1ldGFzXG4gICAgY29uc3QgdW5pcXVlTWV0YXM6IHR5cGVzLkFjY291bnRNZXRhW10gPSBbXTtcbiAgICBhY2NvdW50TWV0YXMuZm9yRWFjaCgoYWNjb3VudE1ldGEpID0+IHtcbiAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4LnB1YmtleSA9PT0gYWNjb3VudE1ldGEucHVia2V5O1xuICAgICAgfSk7XG4gICAgICBpZiAodW5pcXVlSW5kZXggPiAtMSkge1xuICAgICAgICB1bmlxdWVNZXRhc1t1bmlxdWVJbmRleF0uaXNXcml0YWJsZSA9IHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1dyaXRhYmxlIHx8IGFjY291bnRNZXRhLmlzV3JpdGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmlxdWVNZXRhcy5wdXNoKGFjY291bnRNZXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vdmUgZmVlIHBheWVyIHRvIHRoZSBmcm9udFxuICAgIGNvbnN0IGZlZVBheWVySW5kZXggPSB1bmlxdWVNZXRhcy5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgIHJldHVybiBzdHJpbmdVdGlsLnRvUHVibGljS2V5KHgucHVia2V5KSA9PT0gZmVlUGF5ZXI7XG4gICAgfSk7XG4gICAgaWYgKGZlZVBheWVySW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgW3BheWVyTWV0YV0gPSB1bmlxdWVNZXRhcy5zcGxpY2UoZmVlUGF5ZXJJbmRleCwgMSk7XG4gICAgICBwYXllck1ldGEuaXNTaWduZXIgPSB0cnVlO1xuICAgICAgcGF5ZXJNZXRhLmlzV3JpdGFibGUgPSB0cnVlO1xuICAgICAgdW5pcXVlTWV0YXMudW5zaGlmdChwYXllck1ldGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmlxdWVNZXRhcy51bnNoaWZ0KHtcbiAgICAgICAgcHVia2V5OiBmZWVQYXllcixcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgbnVtUmVxdWlyZWRTaWduYXR1cmVzID0gMDtcbiAgICBsZXQgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyA9IDA7XG4gICAgbGV0IG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA9IDA7XG5cbiAgICAvLyBTcGxpdCBvdXQgc2lnbmluZyBmcm9tIG5vbi1zaWduaW5nIGtleXMgYW5kIGNvdW50IGhlYWRlciB2YWx1ZXNcbiAgICBjb25zdCBzaWduZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHVuc2lnbmVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICB1bmlxdWVNZXRhcy5mb3JFYWNoKCh7IHB1YmtleSwgaXNTaWduZXIsIGlzV3JpdGFibGUgfSkgPT4ge1xuICAgICAgaWYgKGlzU2lnbmVyKSB7XG4gICAgICAgIHNpZ25lZEtleXMucHVzaChwdWJrZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyArPSAxO1xuICAgICAgICBpZiAoIWlzV3JpdGFibGUpIHtcbiAgICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuc2lnbmVkS2V5cy5wdXNoKHB1YmtleS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKCFpc1dyaXRhYmxlKSB7XG4gICAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY291bnRLZXlzID0gc2lnbmVkS2V5cy5jb25jYXQodW5zaWduZWRLZXlzKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IHR5cGVzLkNvbXBsaWVkSW5zdHJ1Y3Rpb25bXSA9IHRoaXMuaW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgcHJvZ3JhbUlkIH0gPSBpbnN0cnVjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBhY2NvdW50S2V5cy5pbmRleE9mKHByb2dyYW1JZC50b1N0cmluZygpKSxcbiAgICAgICAgYWNjb3VudHM6IGluc3RydWN0aW9uLmFjY291bnRzLm1hcCgobWV0YSkgPT4gYWNjb3VudEtleXMuaW5kZXhPZihtZXRhLnB1YmtleS50b1N0cmluZygpKSksXG4gICAgICAgIGRhdGE6IHN0cmluZ1V0aWwuZm9ybUhleChkYXRhKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IE1lc3NhZ2Uoe1xuICAgICAgaGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyxcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzLFxuICAgICAgfSxcbiAgICAgIGFjY291bnRLZXlzLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzZW5kYWJsZSB0eCBzdHJpbmcgd2l0aCBnaXZlbiBzaWduYXR1cmUuXG4gICAqXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgc2lnbmF0dXJlIGdlbmVyYXRlZCBieSBDb29sV2FsbGV0IFByb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdG9UeFN0cmluZyhzaWduYXR1cmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgcmV0dXJuICcwMScgKyB0aGlzLnNpZ25hdHVyZSArIEJ1ZmZlci5mcm9tKHRoaXMuY29tcGlsZU1lc3NhZ2UoKS5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFBcUMsU0FBQUkseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFILHdCQUFBRyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdB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