@coolwallet/ltc
Version:
Coolwallet LiteCoin sdk
307 lines (251 loc) • 30.9 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getArgument = getArgument;
exports.getScriptSigningActions = getScriptSigningActions;
var _core = require("@coolwallet/core");
var params = _interopRequireWildcard(require("../config/params"));
var cryptoUtil = _interopRequireWildcard(require("./cryptoUtil"));
var txUtil = _interopRequireWildcard(require("./transactionUtil"));
var bufferUtil = _interopRequireWildcard(require("./bufferUtil"));
var types = _interopRequireWildcard(require("../config/types"));
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 asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function getArgument(_x, _x2, _x3, _x4) {
return _getArgument.apply(this, arguments);
}
function _getArgument() {
_getArgument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(scriptType, inputs, output, change) {
var _txUtil$addressToOutS, outputType, outputScript, outputHash, outputScriptType, outputHashBuf, outputAmount, haveChange, changeScriptType, changeAmount, changePath, prevouts, hashPrevouts, sequences, hashSequence, address, Maddress;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_txUtil$addressToOutS = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS.scriptType, outputScript = _txUtil$addressToOutS.outScript, outputHash = _txUtil$addressToOutS.outHash;
if (outputHash) {
_context.next = 3;
break;
}
throw new _core.error.SDKError(getArgument.name, "OutputHash Undefined");
case 3:
if (!(outputType == types.ScriptType.P2PKH)) {
_context.next = 8;
break;
}
outputScriptType = bufferUtil.toUintBuffer(0, 1);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context.next = 19;
break;
case 8:
if (!(outputType == types.ScriptType.P2SH_P2WPKH)) {
_context.next = 13;
break;
}
outputScriptType = bufferUtil.toUintBuffer(1, 1);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context.next = 19;
break;
case 13:
if (!(outputType == types.ScriptType.P2WPKH)) {
_context.next = 18;
break;
}
outputScriptType = bufferUtil.toUintBuffer(2, 1);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context.next = 19;
break;
case 18:
throw new _core.error.SDKError(getArgument.name, "Unsupport ScriptType : ".concat(outputType));
case 19:
outputAmount = bufferUtil.toNonReverseUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context.next = 33;
break;
}
if (change.pubkeyBuf) {
_context.next = 23;
break;
}
throw new _core.error.SDKError(getArgument.name, 'Public Key not exists !!');
case 23:
haveChange = bufferUtil.toUintBuffer(1, 1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toNonReverseUintBuffer(change.value, 8);
_context.t0 = Buffer;
_context.next = 29;
return _core.utils.getPath(params.COIN_TYPE, change.addressIndex);
case 29:
_context.t1 = _context.sent;
changePath = _context.t0.from.call(_context.t0, _context.t1, 'hex');
_context.next = 37;
break;
case 33:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 37:
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.hash256(Buffer.concat(prevouts));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex') //Buffer.from(input.sequence, 'hex').reverse(),
// toUintBuffer(input.preIndex, 4)
]);
});
hashSequence = cryptoUtil.hash256(Buffer.concat(sequences));
address = output.address;
if (address.startsWith('M')) {
Maddress = Buffer.from('01', 'hex');
} else {
Maddress = Buffer.from('00', 'hex');
}
return _context.abrupt("return", Buffer.concat([outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, hashPrevouts, hashSequence, Maddress]).toString('hex'));
case 44:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return _getArgument.apply(this, arguments);
}
;
function getScriptSigningActions(_x5, _x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13) {
return _getScriptSigningActions.apply(this, arguments);
}
function _getScriptSigningActions() {
_getScriptSigningActions = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(transport, scriptType, appId, appPrivateKey, inputs, preparedData, output, change, coinType) {
var script, argument, preActions, sendScript, sendArgument, utxoArguments, actions;
return regeneratorRuntime.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
script = params.TRANSFER.script + params.TRANSFER.signature;
_context6.next = 3;
return getArgument(scriptType, inputs, output, change);
case 3:
_context6.t0 = _context6.sent;
argument = "00" + _context6.t0;
// keylength zero
preActions = [];
sendScript = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return _core.tx.command.sendScript(transport, script);
case 2:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function sendScript() {
return _ref.apply(this, arguments);
};
}();
preActions.push(sendScript);
sendArgument = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return _core.tx.command.executeScript(transport, appId, appPrivateKey, argument);
case 2:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function sendArgument() {
return _ref2.apply(this, arguments);
};
}();
preActions.push(sendArgument);
utxoArguments = preparedData.preparedInputs.map( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(preparedInput) {
var SEPath, outPoint, inputScriptType, inputAmount, inputHash;
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.t0 = Buffer;
_context4.t1 = "15";
_context4.next = 4;
return _core.utils.getPath(params.COIN_TYPE, preparedInput.addressIndex);
case 4:
_context4.t2 = _context4.sent;
_context4.t3 = _context4.t1.concat.call(_context4.t1, _context4.t2);
SEPath = _context4.t0.from.call(_context4.t0, _context4.t3, 'hex');
outPoint = preparedInput.preOutPointBuf; // let inputScriptType;
// if ((scriptType == ScriptType.P2PKH) || (scriptType == ScriptType.P2WPKH) || (scriptType == ScriptType.P2SH_P2WPKH)) {
// inputScriptType = toVarUintBuffer(0);
// } else {//(scriptType == ScriptType.P2WSH)
// inputScriptType = toVarUintBuffer(1);
// }
inputScriptType = bufferUtil.toUintBuffer(0, 1);
inputAmount = preparedInput.preValueBuf.reverse();
inputHash = cryptoUtil.hash160(preparedInput.pubkeyBuf);
return _context4.abrupt("return", Buffer.concat([SEPath, outPoint, inputScriptType, inputAmount, inputHash]).toString('hex'));
case 12:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return function (_x14) {
return _ref3.apply(this, arguments);
};
}());
actions = utxoArguments.map(function (utxoArgument) {
return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
return regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.t0 = _core.tx.command;
_context5.t1 = transport;
_context5.t2 = appId;
_context5.t3 = appPrivateKey;
_context5.next = 6;
return utxoArgument;
case 6:
_context5.t4 = _context5.sent;
_context5.t5 = scriptType === types.ScriptType.P2PKH ? "10" : "11";
return _context5.abrupt("return", _context5.t0.executeUtxoScript.call(_context5.t0, _context5.t1, _context5.t2, _context5.t3, _context5.t4, _context5.t5));
case 9:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
});
return _context6.abrupt("return", {
preActions: preActions,
actions: actions
});
case 13:
case "end":
return _context6.stop();
}
}
}, _callee6);
}));
return _getScriptSigningActions.apply(this, arguments);
}
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zY3JpcHRVdGlsLnRzIl0sIm5hbWVzIjpbImdldEFyZ3VtZW50Iiwic2NyaXB0VHlwZSIsImlucHV0cyIsIm91dHB1dCIsImNoYW5nZSIsInR4VXRpbCIsImFkZHJlc3NUb091dFNjcmlwdCIsImFkZHJlc3MiLCJvdXRwdXRUeXBlIiwib3V0cHV0U2NyaXB0Iiwib3V0U2NyaXB0Iiwib3V0cHV0SGFzaCIsIm91dEhhc2giLCJlcnJvciIsIlNES0Vycm9yIiwibmFtZSIsInR5cGVzIiwiU2NyaXB0VHlwZSIsIlAyUEtIIiwib3V0cHV0U2NyaXB0VHlwZSIsImJ1ZmZlclV0aWwiLCJ0b1VpbnRCdWZmZXIiLCJvdXRwdXRIYXNoQnVmIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiUDJTSF9QMldQS0giLCJQMldQS0giLCJvdXRwdXRBbW91bnQiLCJ0b05vblJldmVyc2VVaW50QnVmZmVyIiwidmFsdWUiLCJwdWJrZXlCdWYiLCJoYXZlQ2hhbmdlIiwiY2hhbmdlU2NyaXB0VHlwZSIsImNoYW5nZUFtb3VudCIsInV0aWxzIiwiZ2V0UGF0aCIsInBhcmFtcyIsIkNPSU5fVFlQRSIsImFkZHJlc3NJbmRleCIsImNoYW5nZVBhdGgiLCJwcmV2b3V0cyIsIm1hcCIsImlucHV0IiwiY29uY2F0IiwicHJlVHhIYXNoIiwicmV2ZXJzZSIsInByZUluZGV4IiwiaGFzaFByZXZvdXRzIiwiY3J5cHRvVXRpbCIsImhhc2gyNTYiLCJzZXF1ZW5jZXMiLCJzZXF1ZW5jZSIsImhhc2hTZXF1ZW5jZSIsInN0YXJ0c1dpdGgiLCJNYWRkcmVzcyIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwidHJhbnNwb3J0IiwiYXBwSWQiLCJhcHBQcml2YXRlS2V5IiwicHJlcGFyZWREYXRhIiwiY29pblR5cGUiLCJzY3JpcHQiLCJUUkFOU0ZFUiIsInNpZ25hdHVyZSIsImFyZ3VtZW50IiwicHJlQWN0aW9ucyIsInNlbmRTY3JpcHQiLCJ0eCIsImNvbW1hbmQiLCJwdXNoIiwic2VuZEFyZ3VtZW50IiwiZXhlY3V0ZVNjcmlwdCIsInV0eG9Bcmd1bWVudHMiLCJwcmVwYXJlZElucHV0cyIsInByZXBhcmVkSW5wdXQiLCJTRVBhdGgiLCJvdXRQb2ludCIsInByZU91dFBvaW50QnVmIiwiaW5wdXRTY3JpcHRUeXBlIiwiaW5wdXRBbW91bnQiLCJwcmVWYWx1ZUJ1ZiIsImlucHV0SGFzaCIsImhhc2gxNjAiLCJhY3Rpb25zIiwidXR4b0FyZ3VtZW50IiwiZXhlY3V0ZVV0eG9TY3JpcHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztTQUlzQkEsVzs7Ozs7eUVBQWYsaUJBQ0xDLFVBREssRUFFTEMsTUFGSyxFQUdMQyxNQUhLLEVBSUxDLE1BSks7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9DQVVEQyxNQUFNLENBQUNDLGtCQUFQLENBQTBCSCxNQUFNLENBQUNJLE9BQWpDLENBVkMsRUFPU0MsVUFQVCx5QkFPSFAsVUFQRyxFQVFRUSxZQVJSLHlCQVFIQyxTQVJHLEVBU01DLFVBVE4seUJBU0hDLE9BVEc7O0FBQUEsZ0JBV0FELFVBWEE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0JBWUcsSUFBSUUsWUFBTUMsUUFBVixDQUFtQmQsV0FBVyxDQUFDZSxJQUEvQix5QkFaSDs7QUFBQTtBQUFBLGtCQWlCRFAsVUFBVSxJQUFJUSxLQUFLLENBQUNDLFVBQU4sQ0FBaUJDLEtBakI5QjtBQUFBO0FBQUE7QUFBQTs7QUFrQkhDLFlBQUFBLGdCQUFnQixHQUFHQyxVQUFVLENBQUNDLFlBQVgsQ0FBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsQ0FBbkI7QUFDQUMsWUFBQUEsYUFBYSxHQUFHQyxNQUFNLENBQUNDLElBQVAsbUNBQXVDYixVQUFVLENBQUNjLFFBQVgsQ0FBb0IsS0FBcEIsQ0FBdkMsR0FBcUUsS0FBckUsQ0FBaEI7QUFuQkc7QUFBQTs7QUFBQTtBQUFBLGtCQW9CTWpCLFVBQVUs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cURXWCxhQUFhLENBQUMvQixHQUFkLENBQ2QsVUFBQzJDLFlBQUQ7QUFBQSwwRkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVDQUNUakIsU0FBR0MsT0FETTtBQUFBLHVDQUNvQlosU0FEcEI7QUFBQSx1Q0FDK0JDLEtBRC9CO0FBQUEsdUNBQ3NDQyxhQUR0QztBQUFBO0FBQUEsK0JBQzJEMEIsWUFEM0Q7O0FBQUE7QUFBQTtBQUFBLHVDQUMwRXBGLFVBQVUsS0FBS2UsS0FBSyxDQUFDQyxVQUFOLENBQWlCQyxLQUFqQyxHQUEwQyxJQUExQyxHQUFpRCxJQUQxSDtBQUFBLHVFQUNFb0UsaUJBREY7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBbEI7QUFBQSxhQURjLENBckRYO0FBQUEsOENBeURFO0FBQUVwQixjQUFBQSxVQUFVLEVBQVZBLFVBQUY7QUFBY2tCLGNBQUFBLE9BQU8sRUFBUEE7QUFBZCxhQXpERjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHOzs7O0FBMEROIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3IsIHV0aWxzLCB0eCB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0ICogYXMgcGFyYW1zIGZyb20gXCIuLi9jb25maWcvcGFyYW1zXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG9VdGlsIGZyb20gXCIuL2NyeXB0b1V0aWxcIjtcbmltcG9ydCAqIGFzIHR4VXRpbCBmcm9tIFwiLi90cmFuc2FjdGlvblV0aWxcIjtcbmltcG9ydCAqIGFzIGJ1ZmZlclV0aWwgZnJvbSBcIi4vYnVmZmVyVXRpbFwiO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcblxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcmd1bWVudChcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZSxcbiAgaW5wdXRzOiBBcnJheTx0eXBlcy5JbnB1dD4sXG4gIG91dHB1dDogdHlwZXMuT3V0cHV0LFxuICBjaGFuZ2U/OiB0eXBlcy5DaGFuZ2UsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgc2NyaXB0VHlwZTogb3V0cHV0VHlwZSxcbiAgICBvdXRTY3JpcHQ6IG91dHB1dFNjcmlwdCxcbiAgICBvdXRIYXNoOiBvdXRwdXRIYXNoXG4gIH0gPSB0eFV0aWwuYWRkcmVzc1RvT3V0U2NyaXB0KG91dHB1dC5hZGRyZXNzKTtcbiAgaWYgKCFvdXRwdXRIYXNoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9yLlNES0Vycm9yKGdldEFyZ3VtZW50Lm5hbWUsIGBPdXRwdXRIYXNoIFVuZGVmaW5lZGApO1xuICB9XG4gIGxldCBvdXRwdXRTY3JpcHRUeXBlO1xuICBsZXQgb3V0cHV0SGFzaEJ1ZjtcblxuICBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSB7XG4gICAgb3V0cHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDAsIDEpO1xuICAgIG91dHB1dEhhc2hCdWYgPSBCdWZmZXIuZnJvbShgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtvdXRwdXRIYXNoLnRvU3RyaW5nKCdoZXgnKX1gLCAnaGV4Jyk7XG4gIH0gZWxzZSBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyU0hfUDJXUEtIKSB7XG4gICAgb3V0cHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDEsIDEpO1xuICAgIG91dHB1dEhhc2hCdWYgPSBCdWZmZXIuZnJvbShgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtvdXRwdXRIYXNoLnRvU3RyaW5nKCdoZXgnKX1gLCAnaGV4Jyk7XG4gIH0gZWxzZSBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyV1BLSCkge1xuICAgIG91dHB1dFNjcmlwdFR5cGUgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigyLCAxKTtcbiAgICBvdXRwdXRIYXNoQnVmID0gQnVmZmVyLmZyb20oYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7b3V0cHV0SGFzaC50b1N0cmluZygnaGV4Jyl9YCwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihnZXRBcmd1bWVudC5uYW1lLCBgVW5zdXBwb3J0IFNjcmlwdFR5cGUgOiAke291dHB1dFR5cGV9YCk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gYnVmZmVyVXRpbC50b05vblJldmVyc2VVaW50QnVmZmVyKG91dHB1dC52YWx1ZSwgOCk7XG4gIC8vW2hhdmVDaGFuZ2UoMUIpXSBbY2hhbmdlU2NyaXB0VHlwZSgxQildIFtjaGFuZ2VBbW91bnQoOEIpXSBbY2hhbmdlUGF0aCgyMUIpXVxuICBsZXQgaGF2ZUNoYW5nZTtcbiAgbGV0IGNoYW5nZVNjcmlwdFR5cGU7XG4gIGxldCBjaGFuZ2VBbW91bnQ7XG4gIGxldCBjaGFuZ2VQYXRoO1xuICBpZiAoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UucHVia2V5QnVmKSB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoZ2V0QXJndW1lbnQubmFtZSwgJ1B1YmxpYyBLZXkgbm90IGV4aXN0cyAhIScpO1xuICAgIGhhdmVDaGFuZ2UgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigxLCAxKTtcbiAgICBjaGFuZ2VTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoc2NyaXB0VHlwZSwgMSk7XG5cbiAgICBjaGFuZ2VBbW91bnQgPSBidWZmZXJVdGlsLnRvTm9uUmV2ZXJzZVVpbnRCdWZmZXIoY2hhbmdlLnZhbHVlLCA4KTtcbiAgICBjaGFuZ2VQYXRoID0gQnVmZmVyLmZyb20oYXdhaXQgdXRpbHMuZ2V0UGF0aChwYXJhbXMuQ09JTl9UWVBFLCBjaGFuZ2UuYWRkcmVzc0luZGV4KSwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIGhhdmVDaGFuZ2UgPSBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlU2NyaXB0VHlwZSA9IEJ1ZmZlci5mcm9tKCcwMCcsICdoZXgnKTtcbiAgICBjaGFuZ2VBbW91bnQgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigwLCA4KS8vKUJ1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwJywgJ2hleCcpO1xuICAgIGNoYW5nZVBhdGggPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigwLCAyMSkvL0J1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgcHJldm91dHMgPSBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oaW5wdXQucHJlVHhIYXNoLCAnaGV4JykucmV2ZXJzZSgpLFxuICAgICAgYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoaW5wdXQucHJlSW5kZXgsIDQpXSlcbiAgfSlcbiAgY29uc3QgaGFzaFByZXZvdXRzID0gY3J5cHRvVXRpbC5oYXNoMjU2KEJ1ZmZlci5jb25jYXQocHJldm91dHMpKTtcbiAgY29uc3Qgc2VxdWVuY2VzID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgKGlucHV0LnNlcXVlbmNlKSA/IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKGlucHV0LnNlcXVlbmNlLCA0KSA6IEJ1ZmZlci5mcm9tKCdmZmZmZmZmZicsICdoZXgnKSxcbiAgICAgIC8vQnVmZmVyLmZyb20oaW5wdXQuc2VxdWVuY2UsICdoZXgnKS5yZXZlcnNlKCksXG4gICAgICAvLyB0b1VpbnRCdWZmZXIoaW5wdXQucHJlSW5kZXgsIDQpXG4gICAgXSlcbiAgfSlcbiAgY29uc3QgaGFzaFNlcXVlbmNlID0gY3J5cHRvVXRpbC5oYXNoMjU2KEJ1ZmZlci5jb25jYXQoc2VxdWVuY2VzKSk7XG5cbiAgY29uc3QgYWRkcmVzcyA9IG91dHB1dC5hZGRyZXNzXG4gIGxldCBNYWRkcmVzcztcbiAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgnTScpKSB7XG4gICAgTWFkZHJlc3MgPSBCdWZmZXIuZnJvbSgnMDEnLCAnaGV4Jyk7XG4gIH0gZWxzZSB7XG4gICAgTWFkZHJlc3MgPSBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4Jyk7XG4gIH1cblxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICBvdXRwdXRTY3JpcHRUeXBlLFxuICAgIG91dHB1dEFtb3VudCxcbiAgICBvdXRwdXRIYXNoQnVmLFxuICAgIGhhdmVDaGFuZ2UsXG4gICAgY2hhbmdlU2NyaXB0VHlwZSxcbiAgICBjaGFuZ2VBbW91bnQsXG4gICAgY2hhbmdlUGF0aCxcbiAgICBoYXNoUHJldm91dHMsXG4gICAgaGFzaFNlcXVlbmNlLFxuICAgIE1hZGRyZXNzXG4gIF0pLnRvU3RyaW5nKCdoZXgnKTtcbn07XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmlwdFNpZ25pbmdBY3Rpb25zKFxuICB0cmFuc3BvcnQ6IHR5cGVzLlRyYW5zcG9ydCxcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZSxcbiAgYXBwSWQ6IHN0cmluZyxcbiAgYXBwUHJpdmF0ZUtleTogc3RyaW5nLFxuICBpbnB1dHM6IEFycmF5PHR5cGVzLklucHV0PixcbiAgcHJlcGFyZWREYXRhOiB0eXBlcy5QcmVwYXJlZERhdGEsXG4gIG91dHB1dDogdHlwZXMuT3V0cHV0LFxuICBjaGFuZ2U6IHR5cGVzLkNoYW5nZSB8IHVuZGVmaW5lZCxcbiAgY29pblR5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHByZUFjdGlvbnM6IEFycmF5PEZ1bmN0aW9uPixcbiAgYWN0aW9uczogQXJyYXk8RnVuY3Rpb24+XG59PiB7XG4gIGNvbnN0IHNjcmlwdCA9IHBhcmFtcy5UUkFOU0ZFUi5zY3JpcHQgKyBwYXJhbXMuVFJBTlNGRVIuc2lnbmF0dXJlO1xuICBjb25zdCBhcmd1bWVudCA9IFwiMDBcIiArIGF3YWl0IGdldEFyZ3VtZW50KHNjcmlwdFR5cGUsIGlucHV0cywgb3V0cHV0LCBjaGFuZ2UpOy8vIGtleWxlbmd0aCB6ZXJvXG5cbiAgY29uc3QgcHJlQWN0aW9ucyA9IFtdO1xuICBjb25zdCBzZW5kU2NyaXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHR4LmNvbW1hbmQuc2VuZFNjcmlwdCh0cmFuc3BvcnQsIHNjcmlwdCk7XG4gIH1cbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIGNvbnN0IHNlbmRBcmd1bWVudCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0eC5jb21tYW5kLmV4ZWN1dGVTY3JpcHQoXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICBhcHBJZCxcbiAgICAgIGFwcFByaXZhdGVLZXksXG4gICAgICBhcmd1bWVudFxuICAgICk7XG4gIH1cbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRBcmd1bWVudCk7XG5cbiAgY29uc3QgdXR4b0FyZ3VtZW50cyA9IHByZXBhcmVkRGF0YS5wcmVwYXJlZElucHV0cy5tYXAoXG4gICAgYXN5bmMgKHByZXBhcmVkSW5wdXQpID0+IHtcbiAgICAgIC8vIGNvbnN0IGFkZHJlc3NJZEhleCA9IFwiMDBcIi5jb25jYXQocHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDYsIFwiMFwiKSk7XG4gICAgICBjb25zdCBTRVBhdGggPSBCdWZmZXIuZnJvbShgMTUke2F3YWl0IHV0aWxzLmdldFBhdGgocGFyYW1zLkNPSU5fVFlQRSwgcHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgpfWAsICdoZXgnKVxuICAgICAgY29uc3Qgb3V0UG9pbnQgPSBwcmVwYXJlZElucHV0LnByZU91dFBvaW50QnVmO1xuXG4gICAgICAvLyBsZXQgaW5wdXRTY3JpcHRUeXBlO1xuICAgICAgLy8gaWYgKChzY3JpcHRUeXBlID09IFNjcmlwdFR5cGUuUDJQS0gpIHx8IChzY3JpcHRUeXBlID09IFNjcmlwdFR5cGUuUDJXUEtIKSB8fCAoc2NyaXB0VHlwZSA9PSBTY3JpcHRUeXBlLlAyU0hfUDJXUEtIKSkge1xuICAgICAgLy8gXHRpbnB1dFNjcmlwdFR5cGUgPSB0b1ZhclVpbnRCdWZmZXIoMCk7XG4gICAgICAvLyB9IGVsc2Ugey8vKHNjcmlwdFR5cGUgPT0gU2NyaXB0VHlwZS5QMldTSClcbiAgICAgIC8vIFx0aW5wdXRTY3JpcHRUeXBlID0gdG9WYXJVaW50QnVmZmVyKDEpO1xuICAgICAgLy8gfVxuXG5cbiAgICAgIGNvbnN0IGlucHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDAsIDEpO1xuICAgICAgY29uc3QgaW5wdXRBbW91bnQgPSBwcmVwYXJlZElucHV0LnByZVZhbHVlQnVmLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGlucHV0SGFzaCA9IGNyeXB0b1V0aWwuaGFzaDE2MChwcmVwYXJlZElucHV0LnB1YmtleUJ1Zik7XG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbU0VQYXRoLCBvdXRQb2ludCwgaW5wdXRTY3JpcHRUeXBlLCBpbnB1dEFtb3VudCwgaW5wdXRIYXNoXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIH0pO1xuXG4gIGNvbnN0IGFjdGlvbnMgPSB1dHhvQXJndW1lbnRzLm1hcChcbiAgICAodXR4b0FyZ3VtZW50KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gdHguY29tbWFuZC5leGVjdXRlVXR4b1NjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhd2FpdCB1dHhvQXJndW1lbnQsIChzY3JpcHRUeXBlID09PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSA/IFwiMTBcIiA6IFwiMTFcIik7XG4gICAgfSk7XG4gIHJldHVybiB7IHByZUFjdGlvbnMsIGFjdGlvbnMgfTtcbn07XG4iXX0=