PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-stx/dist/src/lib
Просмотр файла: transaction.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Transaction = void 0;
const transactions_1 = require("@stacks/transactions");
const sdk_core_1 = require("@bitgo/sdk-core");
const bn_js_1 = __importDefault(require("bn.js"));
const utils_1 = require("./utils");
const constants_1 = require("./constants");
class Transaction extends sdk_core_1.BaseTransaction {
constructor(_coinConfig) {
super(_coinConfig);
}
/** @inheritdoc */
canSign(key) {
return true;
}
async sign(keyPair, sigHash) {
const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
const signer = new transactions_1.TransactionSigner(this._stxTransaction);
signer.checkOversign = false;
signer.sigHash = sigHash ?? this._sigHash ?? this._stxTransaction.verifyBegin();
for (const kp of keyPairs) {
const keys = kp.getKeys(kp.getCompressed());
if (!keys.prv) {
throw new sdk_core_1.SigningError('Missing private key');
}
const privKey = (0, transactions_1.createStacksPrivateKey)(keys.prv);
signer.signOrigin(privKey);
this._sigHash = signer.sigHash;
}
}
async appendOrigin(pubKeyString) {
const pubKeyStrings = pubKeyString instanceof Array ? pubKeyString : [pubKeyString];
const signer = new transactions_1.TransactionSigner(this._stxTransaction);
pubKeyStrings.forEach((pubKey) => {
signer.appendOrigin((0, transactions_1.createStacksPublicKey)(pubKey));
});
}
async signWithSignatures(signature, isMultiSig) {
if (!signature) {
throw new sdk_core_1.SigningError('Missing signatures');
}
const signatures = signature instanceof Array ? signature : [signature];
if (!isMultiSig) {
this._stxTransaction = this._stxTransaction.createTxWithSignature(signatures[0].data);
}
else {
const authFields = signatures.map((sig) => (0, transactions_1.createTransactionAuthField)(transactions_1.PubKeyEncoding.Compressed, sig));
this._stxTransaction.auth.spendingCondition.fields = this._stxTransaction.auth.spendingCondition.fields.concat(authFields);
}
if (signatures.length > 0) {
this._sigHash = signatures[signatures.length - 1].sigHash;
}
}
get signature() {
if (this._stxTransaction && this._stxTransaction.auth.spendingCondition) {
if ((0, transactions_1.isSingleSig)(this._stxTransaction.auth.spendingCondition)) {
return [this._stxTransaction.auth.spendingCondition.signature.data];
}
else {
const signatures = [];
this._stxTransaction.auth.spendingCondition.fields.forEach((field) => {
if (field.contents.type === transactions_1.StacksMessageType.MessageSignature) {
signatures.push(field.contents.data);
}
});
return signatures;
}
}
return [];
}
/** @inheritdoc */
toJson() {
if (!this._stxTransaction) {
throw new sdk_core_1.ParseTransactionError('Empty transaction');
}
const result = {
id: this._stxTransaction.txid(),
fee: this._stxTransaction.auth.getFee().toString(10),
from: (0, utils_1.getTxSenderAddress)(this._stxTransaction),
nonce: this.getNonce(),
payload: this.getPayloadData(),
};
return result;
}
getPayloadData() {
if (this._stxTransaction.payload.payloadType === transactions_1.PayloadType.TokenTransfer) {
const payload = this._stxTransaction.payload;
const txPayload = {
payloadType: transactions_1.PayloadType.TokenTransfer,
// result.payload.memo will be padded with \u0000 up to
// MEMO_MAX_LENGTH_BYTES as defined in @stacks/transactions
memo: (0, utils_1.unpadMemo)(payload.memo.content),
to: (0, transactions_1.addressToString)({
type: transactions_1.StacksMessageType.Address,
version: payload.recipient.address.version,
hash160: payload.recipient.address.hash160.toString(),
}),
amount: payload.amount.toString(),
};
return txPayload;
}
else if (this._stxTransaction.payload.payloadType === transactions_1.PayloadType.ContractCall) {
const payload = this._stxTransaction.payload;
const contractPayload = {
payloadType: transactions_1.PayloadType.ContractCall,
contractAddress: (0, transactions_1.addressToString)(payload.contractAddress),
contractName: payload.contractName.content,
functionName: payload.functionName.content,
functionArgs: payload.functionArgs.map(utils_1.stringifyCv),
};
return contractPayload;
}
else {
throw new sdk_core_1.NotSupported('payload type not supported');
}
}
/**
* Return the length of a transaction. This is needed to calculate
* the transaction fee.
*
* @returns {number} size in bytes of the serialized transaction
*/
transactionSize() {
return this._stxTransaction.serialize().length;
}
toBroadcastFormat() {
if (!this._stxTransaction) {
throw new sdk_core_1.ParseTransactionError('Empty transaction');
}
return this._stxTransaction.serialize().toString('hex');
}
get stxTransaction() {
return this._stxTransaction;
}
set stxTransaction(t) {
this._stxTransaction = t;
}
getNonce() {
if (this._stxTransaction.auth.spendingCondition) {
return Number(this._stxTransaction.auth.spendingCondition.nonce);
}
else {
throw new sdk_core_1.InvalidTransactionError('spending condition is null');
}
}
/**
* Sets this transaction payload
*
* @param rawTransaction
*/
fromRawTransaction(rawTransaction) {
const raw = (0, utils_1.removeHexPrefix)(rawTransaction);
try {
this._stxTransaction = (0, transactions_1.deserializeTransaction)(transactions_1.BufferReader.fromBuffer(Buffer.from(raw, 'hex')));
}
catch (e) {
throw new sdk_core_1.ParseTransactionError('Error parsing the raw transaction');
}
this.loadInputsAndOutputs();
}
/**
* Set the transaction type
*
* @param {TransactionType} transactionType The transaction type to be set
*/
setTransactionType(transactionType) {
this._type = transactionType;
}
/**
* Load the input and output data on this transaction using the transaction json
* if there are outputs.
*/
loadInputsAndOutputs() {
const txJson = this.toJson();
if (txJson.payload.payloadType === transactions_1.PayloadType.TokenTransfer) {
if (txJson.payload.to && txJson.payload.amount) {
this._outputs = [
{
address: txJson.payload.to,
value: txJson.payload.amount,
coin: this._coinConfig.name,
},
];
this._inputs = [
{
address: txJson.from,
value: txJson.payload.amount,
coin: this._coinConfig.name,
},
];
}
}
else if (txJson.payload.payloadType === transactions_1.PayloadType.ContractCall) {
if (txJson.payload.contractAddress === this._coinConfig.network.sendmanymemoContractAddress) {
const sendParams = (0, utils_1.functionArgsToSendParams)(this.stxTransaction.payload.functionArgs);
const coin = this._coinConfig.name;
const sum = sendParams.reduce((current, next) => current.add(new bn_js_1.default(next.amount)), new bn_js_1.default(0));
this._outputs = sendParams.map((sendParam) => ({ address: sendParam.address, value: sendParam.amount, coin }));
this._inputs = [{ address: txJson.from, value: sum.toString(), coin }];
}
else if (txJson.payload.functionName === constants_1.FUNCTION_NAME_TRANSFER && txJson.payload.functionArgs.length >= 3) {
this._outputs = [
{
address: (0, transactions_1.cvToString)(txJson.payload.functionArgs[2]),
value: (0, transactions_1.cvToValue)(txJson.payload.functionArgs[0]).toString(),
coin: this._coinConfig.name,
},
];
this._inputs = [
{
address: (0, transactions_1.cvToString)(txJson.payload.functionArgs[1]),
value: (0, transactions_1.cvToValue)(txJson.payload.functionArgs[0]).toString(),
coin: this._coinConfig.name,
},
];
}
else {
this._outputs = [
{
address: txJson.payload.contractAddress,
value: '0',
coin: this._coinConfig.name,
},
];
this._inputs = [
{
address: txJson.from,
value: '0',
coin: this._coinConfig.name,
},
];
}
}
}
}
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQWlCOEI7QUFJOUIsOENBUXlCO0FBRXpCLGtEQUEyQjtBQUczQixtQ0FBZ0g7QUFFaEgsMkNBQXFEO0FBRXJELE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBSzlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUE0QixFQUFFLE9BQWdCO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLE9BQU8sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGdDQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM3QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEYsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLHVCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBQSxx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LEVBQUUsSUFBQSx3QkFBUyxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO3dCQUMzRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO3FCQUM1QjtpQkFDRixDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxRQUFRLEdBQUc7b0JBQ2Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZTt3QkFDdkMsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtxQkFDNUI7aUJBQ0YsQ0FBQztnQkFFRixJQUFJLENBQUMsT0FBTyxHQUFHO29CQUNiO3dCQUNFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDcEIsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtxQkFDNUI7aUJBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbFBELGtDQWtQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFkZHJlc3NUb1N0cmluZyxcbiAgQnVmZmVyUmVhZGVyLFxuICBDb250cmFjdENhbGxQYXlsb2FkLFxuICBjcmVhdGVTdGFja3NQcml2YXRlS2V5LFxuICBjcmVhdGVTdGFja3NQdWJsaWNLZXksXG4gIGNyZWF0ZVRyYW5zYWN0aW9uQXV0aEZpZWxkLFxuICBjdlRvU3RyaW5nLFxuICBjdlRvVmFsdWUsXG4gIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24sXG4gIGlzU2luZ2xlU2lnLFxuICBNdWx0aVNpZ1NwZW5kaW5nQ29uZGl0aW9uLFxuICBQYXlsb2FkVHlwZSxcbiAgUHViS2V5RW5jb2RpbmcsXG4gIFN0YWNrc01lc3NhZ2VUeXBlLFxuICBTdGFja3NUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25TaWduZXIsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcblxuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZywgU3RhY2tzTmV0d29yayB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgQmlnTnVtIGZyb20gJ2JuLmpzJztcblxuaW1wb3J0IHsgU2lnbmF0dXJlRGF0YSwgU3RhY2tzQ29udHJhY3RQYXlsb2FkLCBTdGFja3NUcmFuc2FjdGlvblBheWxvYWQsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZnVuY3Rpb25BcmdzVG9TZW5kUGFyYW1zLCBnZXRUeFNlbmRlckFkZHJlc3MsIHJlbW92ZUhleFByZWZpeCwgc3RyaW5naWZ5Q3YsIHVucGFkTWVtbyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBGVU5DVElPTl9OQU1FX1RSQU5TRkVSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9zdHhUcmFuc2FjdGlvbjogU3RhY2tzVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcml2YXRlIF9zaWdIYXNoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXJbXSB8IEtleVBhaXIsIHNpZ0hhc2g/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBrZXlQYWlycyA9IGtleVBhaXIgaW5zdGFuY2VvZiBBcnJheSA/IGtleVBhaXIgOiBba2V5UGFpcl07XG4gICAgY29uc3Qgc2lnbmVyID0gbmV3IFRyYW5zYWN0aW9uU2lnbmVyKHRoaXMuX3N0eFRyYW5zYWN0aW9uKTtcbiAgICBzaWduZXIuY2hlY2tPdmVyc2lnbiA9IGZhbHNlO1xuICAgIHNpZ25lci5zaWdIYXNoID0gc2lnSGFzaCA/PyB0aGlzLl9zaWdIYXNoID8/IHRoaXMuX3N0eFRyYW5zYWN0aW9uLnZlcmlmeUJlZ2luKCk7XG4gICAgZm9yIChjb25zdCBrcCBvZiBrZXlQYWlycykge1xuICAgICAgY29uc3Qga2V5cyA9IGtwLmdldEtleXMoa3AuZ2V0Q29tcHJlc3NlZCgpKTtcbiAgICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJpdktleSA9IGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXkoa2V5cy5wcnYpO1xuICAgICAgc2lnbmVyLnNpZ25PcmlnaW4ocHJpdktleSk7XG4gICAgICB0aGlzLl9zaWdIYXNoID0gc2lnbmVyLnNpZ0hhc2g7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXBwZW5kT3JpZ2luKHB1YktleVN0cmluZzogc3RyaW5nW10gfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwdWJLZXlTdHJpbmdzID0gcHViS2V5U3RyaW5nIGluc3RhbmNlb2YgQXJyYXkgPyBwdWJLZXlTdHJpbmcgOiBbcHViS2V5U3RyaW5nXTtcbiAgICBjb25zdCBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyID0gbmV3IFRyYW5zYWN0aW9uU2lnbmVyKHRoaXMuX3N0eFRyYW5zYWN0aW9uKTtcbiAgICBwdWJLZXlTdHJpbmdzLmZvckVhY2goKHB1YktleSkgPT4ge1xuICAgICAgc2lnbmVyLmFwcGVuZE9yaWdpbihjcmVhdGVTdGFja3NQdWJsaWNLZXkocHViS2V5KSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaWduV2l0aFNpZ25hdHVyZXMoc2lnbmF0dXJlOiBTaWduYXR1cmVEYXRhW10gfCBTaWduYXR1cmVEYXRhLCBpc011bHRpU2lnOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlcycpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmVzID0gc2lnbmF0dXJlIGluc3RhbmNlb2YgQXJyYXkgPyBzaWduYXR1cmUgOiBbc2lnbmF0dXJlXTtcblxuICAgIGlmICghaXNNdWx0aVNpZykge1xuICAgICAgdGhpcy5fc3R4VHJhbnNhY3Rpb24gPSB0aGlzLl9zdHhUcmFuc2FjdGlvbi5jcmVhdGVUeFdpdGhTaWduYXR1cmUoc2lnbmF0dXJlc1swXS5kYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYXV0aEZpZWxkcyA9IHNpZ25hdHVyZXMubWFwKChzaWcpID0+IGNyZWF0ZVRyYW5zYWN0aW9uQXV0aEZpZWxkKFB1YktleUVuY29kaW5nLkNvbXByZXNzZWQsIHNpZykpO1xuICAgICAgKHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24gYXMgTXVsdGlTaWdTcGVuZGluZ0NvbmRpdGlvbikuZmllbGRzID0gKFxuICAgICAgICB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uIGFzIE11bHRpU2lnU3BlbmRpbmdDb25kaXRpb25cbiAgICAgICkuZmllbGRzLmNvbmNhdChhdXRoRmllbGRzKTtcbiAgICB9XG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fc2lnSGFzaCA9IHNpZ25hdHVyZXNbc2lnbmF0dXJlcy5sZW5ndGggLSAxXS5zaWdIYXNoO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLl9zdHhUcmFuc2FjdGlvbiAmJiB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uKSB7XG4gICAgICBpZiAoaXNTaW5nbGVTaWcodGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLnNpZ25hdHVyZS5kYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkLmNvbnRlbnRzLnR5cGUgPT09IFN0YWNrc01lc3NhZ2VUeXBlLk1lc3NhZ2VTaWduYXR1cmUpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChmaWVsZC5jb250ZW50cy5kYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fc3R4VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuX3N0eFRyYW5zYWN0aW9uLnR4aWQoKSxcbiAgICAgIGZlZTogdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5nZXRGZWUoKS50b1N0cmluZygxMCksXG4gICAgICBmcm9tOiBnZXRUeFNlbmRlckFkZHJlc3ModGhpcy5fc3R4VHJhbnNhY3Rpb24pLFxuICAgICAgbm9uY2U6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIHBheWxvYWQ6IHRoaXMuZ2V0UGF5bG9hZERhdGEoKSxcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldFBheWxvYWREYXRhKCk6IFN0YWNrc1RyYW5zYWN0aW9uUGF5bG9hZCB8IFN0YWNrc0NvbnRyYWN0UGF5bG9hZCB7XG4gICAgaWYgKHRoaXMuX3N0eFRyYW5zYWN0aW9uLnBheWxvYWQucGF5bG9hZFR5cGUgPT09IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLl9zdHhUcmFuc2FjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3QgdHhQYXlsb2FkOiBTdGFja3NUcmFuc2FjdGlvblBheWxvYWQgPSB7XG4gICAgICAgIHBheWxvYWRUeXBlOiBQYXlsb2FkVHlwZS5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAvLyByZXN1bHQucGF5bG9hZC5tZW1vIHdpbGwgYmUgcGFkZGVkIHdpdGggXFx1MDAwMCB1cCB0b1xuICAgICAgICAvLyBNRU1PX01BWF9MRU5HVEhfQllURVMgYXMgZGVmaW5lZCBpbiBAc3RhY2tzL3RyYW5zYWN0aW9uc1xuICAgICAgICBtZW1vOiB1bnBhZE1lbW8ocGF5bG9hZC5tZW1vLmNvbnRlbnQpLFxuICAgICAgICB0bzogYWRkcmVzc1RvU3RyaW5nKHtcbiAgICAgICAgICB0eXBlOiBTdGFja3NNZXNzYWdlVHlwZS5BZGRyZXNzLFxuICAgICAgICAgIHZlcnNpb246IHBheWxvYWQucmVjaXBpZW50LmFkZHJlc3MudmVyc2lvbixcbiAgICAgICAgICBoYXNoMTYwOiBwYXlsb2FkLnJlY2lwaWVudC5hZGRyZXNzLmhhc2gxNjAudG9TdHJpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGFtb3VudDogcGF5bG9hZC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdHhQYXlsb2FkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZDtcbiAgICAgIGNvbnN0IGNvbnRyYWN0UGF5bG9hZDogU3RhY2tzQ29udHJhY3RQYXlsb2FkID0ge1xuICAgICAgICBwYXlsb2FkVHlwZTogUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsLFxuICAgICAgICBjb250cmFjdEFkZHJlc3M6IGFkZHJlc3NUb1N0cmluZyhwYXlsb2FkLmNvbnRyYWN0QWRkcmVzcyksXG4gICAgICAgIGNvbnRyYWN0TmFtZTogcGF5bG9hZC5jb250cmFjdE5hbWUuY29udGVudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBwYXlsb2FkLmZ1bmN0aW9uTmFtZS5jb250ZW50LFxuICAgICAgICBmdW5jdGlvbkFyZ3M6IHBheWxvYWQuZnVuY3Rpb25BcmdzLm1hcChzdHJpbmdpZnlDdiksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNvbnRyYWN0UGF5bG9hZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgncGF5bG9hZCB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgYSB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZVxuICAgKiB0aGUgdHJhbnNhY3Rpb24gZmVlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB0cmFuc2FjdGlvblNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb24uc2VyaWFsaXplKCkubGVuZ3RoO1xuICB9XG5cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3N0eFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb24uc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgZ2V0IHN0eFRyYW5zYWN0aW9uKCk6IFN0YWNrc1RyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc3R4VHJhbnNhY3Rpb24odDogU3RhY2tzVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl9zdHhUcmFuc2FjdGlvbiA9IHQ7XG4gIH1cblxuICBwcml2YXRlIGdldE5vbmNlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBOdW1iZXIodGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5ub25jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignc3BlbmRpbmcgY29uZGl0aW9uIGlzIG51bGwnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJhdyA9IHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihCdWZmZXJSZWFkZXIuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShyYXcsICdoZXgnKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGhlIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSB0cmFuc2FjdGlvbiBqc29uXG4gICAqIGlmIHRoZXJlIGFyZSBvdXRwdXRzLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBpZiAodHhKc29uLnBheWxvYWQucGF5bG9hZFR5cGUgPT09IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgIGlmICh0eEpzb24ucGF5bG9hZC50byAmJiB0eEpzb24ucGF5bG9hZC5hbW91bnQpIHtcbiAgICAgICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0eEpzb24ucGF5bG9hZC50byxcbiAgICAgICAgICAgIHZhbHVlOiB0eEpzb24ucGF5bG9hZC5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdHhKc29uLmZyb20sXG4gICAgICAgICAgICB2YWx1ZTogdHhKc29uLnBheWxvYWQuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eEpzb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsKSB7XG4gICAgICBpZiAodHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzID09PSAodGhpcy5fY29pbkNvbmZpZy5uZXR3b3JrIGFzIFN0YWNrc05ldHdvcmspLnNlbmRtYW55bWVtb0NvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBjb25zdCBzZW5kUGFyYW1zID0gZnVuY3Rpb25BcmdzVG9TZW5kUGFyYW1zKCh0aGlzLnN0eFRyYW5zYWN0aW9uLnBheWxvYWQgYXMgQ29udHJhY3RDYWxsUGF5bG9hZCkuZnVuY3Rpb25BcmdzKTtcbiAgICAgICAgY29uc3QgY29pbiA9IHRoaXMuX2NvaW5Db25maWcubmFtZTtcbiAgICAgICAgY29uc3Qgc3VtOiBCaWdOdW0gPSBzZW5kUGFyYW1zLnJlZHVjZSgoY3VycmVudCwgbmV4dCkgPT4gY3VycmVudC5hZGQobmV3IEJpZ051bShuZXh0LmFtb3VudCkpLCBuZXcgQmlnTnVtKDApKTtcbiAgICAgICAgdGhpcy5fb3V0cHV0cyA9IHNlbmRQYXJhbXMubWFwKChzZW5kUGFyYW0pID0+ICh7IGFkZHJlc3M6IHNlbmRQYXJhbS5hZGRyZXNzLCB2YWx1ZTogc2VuZFBhcmFtLmFtb3VudCwgY29pbiB9KSk7XG4gICAgICAgIHRoaXMuX2lucHV0cyA9IFt7IGFkZHJlc3M6IHR4SnNvbi5mcm9tLCB2YWx1ZTogc3VtLnRvU3RyaW5nKCksIGNvaW4gfV07XG4gICAgICB9IGVsc2UgaWYgKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uTmFtZSA9PT0gRlVOQ1RJT05fTkFNRV9UUkFOU0ZFUiAmJiB0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBjdlRvU3RyaW5nKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJnc1syXSksXG4gICAgICAgICAgICB2YWx1ZTogY3ZUb1ZhbHVlKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJnc1swXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogY3ZUb1N0cmluZyh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0pLFxuICAgICAgICAgICAgdmFsdWU6IGN2VG9WYWx1ZSh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0eEpzb24uZnJvbSxcbiAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!