@coolwallet/sol
Version:
Coolwallet Solana sdk
246 lines (234 loc) • 32.3 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(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
/**
* List of TransactionInstruction object fields that may be initialized at construction
*/
/**
* Transaction Instruction class
*/
var TransactionInstruction = /*#__PURE__*/function () {
/**
* Public keys to include in this transaction
* Boolean represents whether this pubkey needs to sign the transaction
*/
/**
* Program Id to execute
*/
/**
* Program input
*/
function TransactionInstruction(opts) {
(0, _classCallCheck2["default"])(this, TransactionInstruction);
(0, _defineProperty2["default"])(this, "data", Buffer.alloc(0));
this.programId = opts.programId;
this.keys = opts.keys;
if (opts.data) {
this.data = opts.data;
}
}
/**
* @internal
*/
(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)
};
}
}]);
return TransactionInstruction;
}();
exports.TransactionInstruction = TransactionInstruction;
var 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)
});
})
});
});
}
(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');
}
}]);
return Transaction;
}();
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXJyb3IiLCJyZXF1aXJlIiwic3RyaW5nVXRpbCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX21lc3NhZ2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0Iiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiQnVmZmVyIiwiYWxsb2MiLCJwcm9ncmFtSWQiLCJkYXRhIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwidG9KU09OIiwibWFwIiwiX3JlZiIsInB1YmtleSIsImlzU2lnbmVyIiwiaXNXcml0YWJsZSIsInRvQmFzZTU4IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImV4cG9ydHMiLCJUcmFuc2FjdGlvbiIsInR4IiwiZmVlUGF5ZXIiLCJmb3JtSGV4IiwicmVjZW50QmxvY2toYXNoIiwiaW5zdHJ1Y3Rpb25zIiwiaW5zdHJ1Y3Rpb24iLCJhY2NvdW50cyIsImFjY291bnQiLCJhZGQiLCJjb21waWxlTWVzc2FnZSIsIlNES0Vycm9yIiwibmFtZSIsImNvbnNvbGUiLCJ3YXJuIiwiRXJyb3IiLCJ1bmRlZmluZWQiLCJjb25jYXQiLCJwcm9ncmFtSWRzIiwiYWNjb3VudE1ldGFzIiwiYWNjb3VudE1ldGEiLCJ0b1N0cmluZyIsImluY2x1ZGVzIiwic29ydCIsIngiLCJ5IiwicHVia2V5U29ydGluZyIsImxvY2FsZUNvbXBhcmUiLCJjaGVja1NpZ25lciIsImNoZWNrV3JpdGFibGUiLCJ1bmlxdWVNZXRhcyIsInVuaXF1ZUluZGV4IiwiZmluZEluZGV4IiwiZmVlUGF5ZXJJbmRleCIsInRvUHVibGljS2V5IiwiX3VuaXF1ZU1ldGFzJHNwbGljZSIsInNwbGljZSIsIl91bmlxdWVNZXRhcyRzcGxpY2UyIiwiX3NsaWNlZFRvQXJyYXkyIiwicGF5ZXJNZXRhIiwidW5zaGlmdCIsIm51bVJlcXVpcmVkU2lnbmF0dXJlcyIsIm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMiLCJudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMiLCJzaWduZWRLZXlzIiwidW5zaWduZWRLZXlzIiwiX3JlZjIiLCJhY2NvdW50S2V5cyIsInByb2dyYW1JZEluZGV4IiwiaW5kZXhPZiIsIm1ldGEiLCJNZXNzYWdlIiwiaGVhZGVyIiwidG9UeFN0cmluZyIsInNpZ25hdHVyZSIsImZyb20iLCJzZXJpYWxpemUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvVHJhbnNhY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU0RLRXJyb3IgfSBmcm9tICdAY29vbHdhbGxldC9jb3JlL2xpYi9lcnJvcic7XG5pbXBvcnQgKiBhcyBzdHJpbmdVdGlsIGZyb20gJy4vc3RyaW5nVXRpbCc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnLi9wdWJsaWNrZXknO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uL21lc3NhZ2UnO1xuXG4vKipcbiAqIExpc3Qgb2YgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiBvYmplY3QgZmllbGRzIHRoYXQgbWF5IGJlIGluaXRpYWxpemVkIGF0IGNvbnN0cnVjdGlvblxuICovXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcyA9IHtcbiAga2V5czogQXJyYXk8dHlwZXMuQWNjb3VudE1ldGE+O1xuICBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcbiAgZGF0YT86IEJ1ZmZlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbkpTT04ge1xuICBrZXlzOiB7XG4gICAgcHVia2V5OiBzdHJpbmc7XG4gICAgaXNTaWduZXI6IGJvb2xlYW47XG4gICAgaXNXcml0YWJsZTogYm9vbGVhbjtcbiAgfVtdO1xuICBwcm9ncmFtSWQ6IHN0cmluZztcbiAgZGF0YTogbnVtYmVyW107XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICAvKipcbiAgICogUHVibGljIGtleXMgdG8gaW5jbHVkZSBpbiB0aGlzIHRyYW5zYWN0aW9uXG4gICAqIEJvb2xlYW4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgcHVia2V5IG5lZWRzIHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBrZXlzOiBBcnJheTx0eXBlcy5BY2NvdW50TWV0YT47XG5cbiAgLyoqXG4gICAqIFByb2dyYW0gSWQgdG8gZXhlY3V0ZVxuICAgKi9cbiAgcHJvZ3JhbUlkOiBQdWJsaWNLZXk7XG5cbiAgLyoqXG4gICAqIFByb2dyYW0gaW5wdXRcbiAgICovXG4gIGRhdGE6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcykge1xuICAgIHRoaXMucHJvZ3JhbUlkID0gb3B0cy5wcm9ncmFtSWQ7XG4gICAgdGhpcy5rZXlzID0gb3B0cy5rZXlzO1xuICAgIGlmIChvcHRzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG9wdHMuZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB0b0pTT04oKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiB0aGlzLmtleXMubWFwKCh7IHB1YmtleSwgaXNTaWduZXIsIGlzV3JpdGFibGUgfSkgPT4gKHtcbiAgICAgICAgcHVia2V5OiBzdHJpbmdVdGlsLnRvQmFzZTU4KHB1YmtleSksXG4gICAgICAgIGlzU2lnbmVyLFxuICAgICAgICBpc1dyaXRhYmxlLFxuICAgICAgfSkpLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZC50b0pTT04oKSxcbiAgICAgIGRhdGE6IFsuLi50aGlzLmRhdGFdLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgZmVlUGF5ZXI6IHN0cmluZztcbiAgcmVjZW50QmxvY2toYXNoOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uczogdHlwZXMuVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdO1xuICBzaWduYXR1cmU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodHg6IHR5cGVzLlRyYW5zYWN0aW9uQXJncykge1xuICAgIHRoaXMuZmVlUGF5ZXIgPSBzdHJpbmdVdGlsLmZvcm1IZXgodHguZmVlUGF5ZXIpO1xuICAgIHRoaXMucmVjZW50QmxvY2toYXNoID0gc3RyaW5nVXRpbC5mb3JtSGV4KHR4LnJlY2VudEJsb2NraGFzaCk7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMgPSB0eC5pbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gKHtcbiAgICAgIC4uLmluc3RydWN0aW9uLFxuICAgICAgcHJvZ3JhbUlkOiBzdHJpbmdVdGlsLmZvcm1IZXgoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSxcbiAgICAgIGFjY291bnRzOiBpbnN0cnVjdGlvbi5hY2NvdW50cy5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgIC4uLmFjY291bnQsXG4gICAgICAgIHB1YmtleTogc3RyaW5nVXRpbC5mb3JtSGV4KGFjY291bnQucHVia2V5KSxcbiAgICAgIH0pKSxcbiAgICB9KSk7XG4gIH1cblxuICBhZGQoaW5zdHJ1Y3Rpb246IHR5cGVzLlRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5wdXNoKGluc3RydWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGNvbXBpbGVNZXNzYWdlKCk6IE1lc3NhZ2Uge1xuICAgIGNvbnN0IHsgcmVjZW50QmxvY2toYXNoIH0gPSB0aGlzO1xuICAgIGlmICghcmVjZW50QmxvY2toYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgU0RLRXJyb3IodGhpcy5jb21waWxlTWVzc2FnZS5uYW1lLCAnVHJhbnNhY3Rpb24gcmVjZW50QmxvY2toYXNoIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgbGV0IGZlZVBheWVyOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMuZmVlUGF5ZXIpIHtcbiAgICAgIGZlZVBheWVyID0gdGhpcy5mZWVQYXllcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBmZWUgcGF5ZXIgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnNbaV0ucHJvZ3JhbUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiBpbnN0cnVjdGlvbiBpbmRleCAke2l9IGhhcyB1bmRlZmluZWQgcHJvZ3JhbSBpZGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW1JZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWNjb3VudE1ldGFzOiB0eXBlcy5BY2NvdW50TWV0YVtdID0gW107XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIGluc3RydWN0aW9uLmFjY291bnRzLmZvckVhY2goKGFjY291bnRNZXRhKSA9PiB7XG4gICAgICAgIGFjY291bnRNZXRhcy5wdXNoKHsgLi4uYWNjb3VudE1ldGEgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvZ3JhbUlkID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoIXByb2dyYW1JZHMuaW5jbHVkZXMocHJvZ3JhbUlkKSkge1xuICAgICAgICBwcm9ncmFtSWRzLnB1c2gocHJvZ3JhbUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBwcm9ncmFtSUQgYWNjb3VudCBtZXRhc1xuICAgIHByb2dyYW1JZHMuZm9yRWFjaCgocHJvZ3JhbUlkKSA9PiB7XG4gICAgICBhY2NvdW50TWV0YXMucHVzaCh7XG4gICAgICAgIHB1YmtleTogcHJvZ3JhbUlkLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBTb3J0LiBQcmlvcml0aXppbmcgZmlyc3QgYnkgc2lnbmVyLCB0aGVuIGJ5IHdyaXRhYmxlXG4gICAgYWNjb3VudE1ldGFzLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGNvbnN0IHB1YmtleVNvcnRpbmcgPSBzdHJpbmdVdGlsLnRvQmFzZTU4KHgucHVia2V5KS5sb2NhbGVDb21wYXJlKHN0cmluZ1V0aWwudG9CYXNlNTgoeS5wdWJrZXkpKTtcbiAgICAgIGNvbnN0IGNoZWNrU2lnbmVyID0geC5pc1NpZ25lciA9PT0geS5pc1NpZ25lciA/IDAgOiB4LmlzU2lnbmVyID8gLTEgOiAxO1xuICAgICAgY29uc3QgY2hlY2tXcml0YWJsZSA9IHguaXNXcml0YWJsZSA9PT0geS5pc1dyaXRhYmxlID8gcHVia2V5U29ydGluZyA6IHguaXNXcml0YWJsZSA/IC0xIDogMTtcbiAgICAgIHJldHVybiBjaGVja1NpZ25lciB8fCBjaGVja1dyaXRhYmxlO1xuICAgIH0pO1xuXG4gICAgLy8gQ3VsbCBkdXBsaWNhdGUgYWNjb3VudCBtZXRhc1xuICAgIGNvbnN0IHVuaXF1ZU1ldGFzOiB0eXBlcy5BY2NvdW50TWV0YVtdID0gW107XG4gICAgYWNjb3VudE1ldGFzLmZvckVhY2goKGFjY291bnRNZXRhKSA9PiB7XG4gICAgICBjb25zdCB1bmlxdWVJbmRleCA9IHVuaXF1ZU1ldGFzLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geC5wdWJrZXkgPT09IGFjY291bnRNZXRhLnB1YmtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHVuaXF1ZUluZGV4ID4gLTEpIHtcbiAgICAgICAgdW5pcXVlTWV0YXNbdW5pcXVlSW5kZXhdLmlzV3JpdGFibGUgPSB1bmlxdWVNZXRhc1t1bmlxdWVJbmRleF0uaXNXcml0YWJsZSB8fCBhY2NvdW50TWV0YS5pc1dyaXRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5pcXVlTWV0YXMucHVzaChhY2NvdW50TWV0YSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNb3ZlIGZlZSBwYXllciB0byB0aGUgZnJvbnRcbiAgICBjb25zdCBmZWVQYXllckluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICByZXR1cm4gc3RyaW5nVXRpbC50b1B1YmxpY0tleSh4LnB1YmtleSkgPT09IGZlZVBheWVyO1xuICAgIH0pO1xuICAgIGlmIChmZWVQYXllckluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IFtwYXllck1ldGFdID0gdW5pcXVlTWV0YXMuc3BsaWNlKGZlZVBheWVySW5kZXgsIDEpO1xuICAgICAgcGF5ZXJNZXRhLmlzU2lnbmVyID0gdHJ1ZTtcbiAgICAgIHBheWVyTWV0YS5pc1dyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIHVuaXF1ZU1ldGFzLnVuc2hpZnQocGF5ZXJNZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pcXVlTWV0YXMudW5zaGlmdCh7XG4gICAgICAgIHB1YmtleTogZmVlUGF5ZXIsXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IG51bVJlcXVpcmVkU2lnbmF0dXJlcyA9IDA7XG4gICAgbGV0IG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgPSAwO1xuICAgIGxldCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMgPSAwO1xuXG4gICAgLy8gU3BsaXQgb3V0IHNpZ25pbmcgZnJvbSBub24tc2lnbmluZyBrZXlzIGFuZCBjb3VudCBoZWFkZXIgdmFsdWVzXG4gICAgY29uc3Qgc2lnbmVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bnNpZ25lZEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgdW5pcXVlTWV0YXMuZm9yRWFjaCgoeyBwdWJrZXksIGlzU2lnbmVyLCBpc1dyaXRhYmxlIH0pID0+IHtcbiAgICAgIGlmIChpc1NpZ25lcikge1xuICAgICAgICBzaWduZWRLZXlzLnB1c2gocHVia2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMgKz0gMTtcbiAgICAgICAgaWYgKCFpc1dyaXRhYmxlKSB7XG4gICAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnNpZ25lZEtleXMucHVzaChwdWJrZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICghaXNXcml0YWJsZSkge1xuICAgICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2NvdW50S2V5cyA9IHNpZ25lZEtleXMuY29uY2F0KHVuc2lnbmVkS2V5cyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5Db21wbGllZEluc3RydWN0aW9uW10gPSB0aGlzLmluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEsIHByb2dyYW1JZCB9ID0gaW5zdHJ1Y3Rpb247XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogYWNjb3VudEtleXMuaW5kZXhPZihwcm9ncmFtSWQudG9TdHJpbmcoKSksXG4gICAgICAgIGFjY291bnRzOiBpbnN0cnVjdGlvbi5hY2NvdW50cy5tYXAoKG1ldGEpID0+IGFjY291bnRLZXlzLmluZGV4T2YobWV0YS5wdWJrZXkudG9TdHJpbmcoKSkpLFxuICAgICAgICBkYXRhOiBzdHJpbmdVdGlsLmZvcm1IZXgoZGF0YSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKHtcbiAgICAgIGhlYWRlcjoge1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgIH0sXG4gICAgICBhY2NvdW50S2V5cyxcbiAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgIGluc3RydWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc2VuZGFibGUgdHggc3RyaW5nIHdpdGggZ2l2ZW4gc2lnbmF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIHNpZ25hdHVyZSBnZW5lcmF0ZWQgYnkgQ29vbFdhbGxldCBQcm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIHRvVHhTdHJpbmcoc2lnbmF0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgIHJldHVybiAnMDEnICsgdGhpcy5zaWduYXR1cmUgKyBCdWZmZXIuZnJvbSh0aGlzLmNvbXBpbGVNZXNzYWdlKCkuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBR0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBQXFDLFNBQUFJLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBSCx3QkFBQU8sR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLGFBQUFFLE9BQUEsQ0FBQUYsR0FBQSx5QkFBQUEsR0FBQSx1Q0FBQUEsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMs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