PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-vet/dist/src/lib
Просмотр файла: utils.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Utils = void 0;
const sdk_core_1 = require("@vechain/sdk-core");
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
const ethereumjs_util_1 = require("ethereumjs-util");
const sdk_core_2 = require("@bitgo/sdk-core");
const abstract_eth_1 = require("@bitgo/abstract-eth");
const constants_1 = require("./constants");
const keyPair_1 = require("./keyPair");
class Utils {
isValidAddress(address) {
return this.isValidHex(address, constants_1.VET_ADDRESS_LENGTH);
}
isValidBlockId(hash) {
return this.isValidHex(hash, constants_1.VET_BLOCK_ID_LENGTH);
}
isValidPrivateKey(key) {
try {
new keyPair_1.KeyPair({ prv: key });
return true;
}
catch (e) {
return false;
}
}
isValidPublicKey(key) {
try {
new keyPair_1.KeyPair({ pub: key });
return true;
}
catch (e) {
return false;
}
}
isValidSignature(signature) {
throw new Error('Method not implemented');
}
isValidTransactionId(txId) {
return this.isValidHex(txId, constants_1.VET_TRANSACTION_ID_LENGTH);
}
isValidHex(value, length) {
const regex = new RegExp(`^(0x|0X)[a-fA-F0-9]{${length}}$`);
return regex.test(value);
}
deserializeTransaction(serializedTransaction) {
const txBytes = sdk_core_1.HexUInt.of(serializedTransaction).bytes;
try {
return sdk_core_1.Transaction.decode(txBytes, false);
}
catch (err) {
if (err.message?.includes('Expected 9 items, but got 10')) {
// Likely signed, so retry with isSigned = true
return sdk_core_1.Transaction.decode(txBytes, true);
}
throw err;
}
}
getTransactionTypeFromClause(clauses) {
if (clauses[0].data === '0x') {
return sdk_core_2.TransactionType.Send;
}
else if (clauses[0].data.startsWith(abstract_eth_1.v4CreateForwarderMethodId)) {
return sdk_core_2.TransactionType.AddressInitialization;
}
else if (clauses[0].data.startsWith(abstract_eth_1.flushForwarderTokensMethodIdV4)) {
return sdk_core_2.TransactionType.FlushTokens;
}
else if (clauses[0].data.startsWith(constants_1.TRANSFER_TOKEN_METHOD_ID)) {
return sdk_core_2.TransactionType.SendToken;
}
else if (clauses[0].data.startsWith(constants_1.STAKING_METHOD_ID)) {
return sdk_core_2.TransactionType.ContractCall;
}
else if (clauses[0].data.startsWith(constants_1.EXIT_DELEGATION_METHOD_ID)) {
return sdk_core_2.TransactionType.StakingUnlock; // Using StakingUnlock for exit delegation
}
else if (clauses[0].data.startsWith(constants_1.BURN_NFT_METHOD_ID)) {
return sdk_core_2.TransactionType.StakingWithdraw; // Using StakingWithdraw for burn NFT
}
else if (clauses[0].data.startsWith(constants_1.TRANSFER_NFT_METHOD_ID)) {
return sdk_core_2.TransactionType.SendNFT;
}
else {
return sdk_core_2.TransactionType.SendToken;
}
}
getTransferTokenData(toAddress, amountWei) {
const methodName = 'transfer';
const types = ['address', 'uint256'];
const params = [toAddress, new ethereumjs_util_1.BN(amountWei)];
const method = ethereumjs_abi_1.default.methodID(methodName, types);
const args = ethereumjs_abi_1.default.rawEncode(types, params);
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
}
getTransferNFTData(from, to, tokenId) {
const methodName = 'transferFrom';
const types = ['address', 'address', 'uint256'];
const params = [from, to, new ethereumjs_util_1.BN(tokenId)];
const method = ethereumjs_abi_1.default.methodID(methodName, types);
const args = ethereumjs_abi_1.default.rawEncode(types, params);
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
}
/**
* Encodes staking transaction data using ethereumjs-abi
*
* @param {string} stakingAmount - The amount to stake in wei
* @returns {string} - The encoded transaction data
*/
getStakingData(stakingAmount) {
const methodName = 'stake';
const types = ['uint256'];
const params = [new ethereumjs_util_1.BN(stakingAmount)];
const method = ethereumjs_abi_1.default.methodID(methodName, types);
const args = ethereumjs_abi_1.default.rawEncode(types, params);
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
}
decodeTransferTokenData(data) {
const [address, amount] = (0, abstract_eth_1.getRawDecoded)(['address', 'uint256'], (0, abstract_eth_1.getBufferedByteCode)(constants_1.TRANSFER_TOKEN_METHOD_ID, data));
const recipientAddress = (0, ethereumjs_util_1.addHexPrefix)(address.toString()).toLowerCase();
return {
address: recipientAddress,
amount: amount.toString(),
};
}
decodeTransferNFTData(data) {
const [from, to, tokenIdBN] = (0, abstract_eth_1.getRawDecoded)(['address', 'address', 'uint256'], (0, abstract_eth_1.getBufferedByteCode)(constants_1.TRANSFER_NFT_METHOD_ID, data));
const recipientAddress = (0, ethereumjs_util_1.addHexPrefix)(to.toString()).toLowerCase();
const recipient = {
address: recipientAddress,
amount: '1',
};
const sender = (0, ethereumjs_util_1.addHexPrefix)(from.toString()).toLowerCase();
const tokenId = tokenIdBN.toString();
return {
recipients: [recipient],
sender,
tokenId,
};
}
}
exports.Utils = Utils;
const utils = new Utils();
exports.default = utils;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUE0RTtBQUM1RSxvRUFBeUM7QUFDekMscURBQW1EO0FBQ25ELDhDQUFtRjtBQUNuRixzREFLNkI7QUFDN0IsMkNBU3FCO0FBQ3JCLHVDQUFvQztBQUVwQyxNQUFhLEtBQUs7SUFDaEIsY0FBYyxDQUFDLE9BQWU7UUFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSw4QkFBa0IsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN6QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLCtCQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsSUFBSSxpQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXO1FBQzFCLElBQUksQ0FBQztZQUNILElBQUksaUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFD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QXlCO1lBQ3RDLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsTUFBTSxFQUFFLEdBQUc7U0FDWixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBWSxFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxPQUFPO1lBQ0wsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3ZCLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXBKRCxzQkFvSkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhleFVJbnQsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkNsYXVzZSB9IGZyb20gJ0B2ZWNoYWluL3Nkay1jb3JlJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBhZGRIZXhQcmVmaXgsIEJOIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCB7IEJhc2VVdGlscywgVHJhbnNhY3Rpb25SZWNpcGllbnQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQge1xuICB2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICBmbHVzaEZvcndhcmRlclRva2Vuc01ldGhvZElkVjQsXG4gIGdldFJhd0RlY29kZWQsXG4gIGdldEJ1ZmZlcmVkQnl0ZUNvZGUsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHtcbiAgVFJBTlNGRVJfVE9LRU5fTUVUSE9EX0lELFxuICBTVEFLSU5HX01FVEhPRF9JRCxcbiAgRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCxcbiAgQlVSTl9ORlRfTUVUSE9EX0lELFxuICBWRVRfQUREUkVTU19MRU5HVEgsXG4gIFZFVF9CTE9DS19JRF9MRU5HVEgsXG4gIFZFVF9UUkFOU0FDVElPTl9JRF9MRU5HVEgsXG4gIFRSQU5TRkVSX05GVF9NRVRIT0RfSUQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KGFkZHJlc3MsIFZFVF9BRERSRVNTX0xFTkdUSCk7XG4gIH1cblxuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KGhhc2gsIFZFVF9CTE9DS19JRF9MRU5HVEgpO1xuICB9XG5cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBrZXkgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEhleCh0eElkLCBWRVRfVFJBTlNBQ1RJT05fSURfTEVOR1RIKTtcbiAgfVxuXG4gIGlzVmFsaWRIZXgodmFsdWU6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4oMHh8MFgpW2EtZkEtRjAtOV17JHtsZW5ndGh9fSRgKTtcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4Qnl0ZXMgPSBIZXhVSW50Lm9mKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbikuYnl0ZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvbi5kZWNvZGUodHhCeXRlcywgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlPy5pbmNsdWRlcygnRXhwZWN0ZWQgOSBpdGVtcywgYnV0IGdvdCAxMCcpKSB7XG4gICAgICAgIC8vIExpa2VseSBzaWduZWQsIHNvIHJldHJ5IHdpdGggaXNTaWduZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvbi5kZWNvZGUodHhCeXRlcywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbUNsYXVzZShjbGF1c2VzOiBUcmFuc2FjdGlvbkNsYXVzZVtdKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBpZiAoY2xhdXNlc1swXS5kYXRhID09PSAnMHgnKSB7XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aCh2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkKSkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb247XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChmbHVzaEZvcndhcmRlclRva2Vuc01ldGhvZElkVjQpKSB7XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkZsdXNoVG9rZW5zO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoVFJBTlNGRVJfVE9LRU5fTUVUSE9EX0lEKSkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW47XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChTVEFLSU5HX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jazsgLy8gVXNpbmcgU3Rha2luZ1VubG9jayBmb3IgZXhpdCBkZWxlZ2F0aW9uXG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChCVVJOX05GVF9NRVRIT0RfSUQpKSB7XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzsgLy8gVXNpbmcgU3Rha2luZ1dpdGhkcmF3IGZvciBidXJuIE5GVFxuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoVFJBTlNGRVJfTkZUX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZE5GVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW47XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhbnNmZXJUb2tlbkRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGFtb3VudFdlaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gJ3RyYW5zZmVyJztcbiAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J107XG4gICAgY29uc3QgcGFyYW1zID0gW3RvQWRkcmVzcywgbmV3IEJOKGFtb3VudFdlaSldO1xuXG4gICAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQobWV0aG9kTmFtZSwgdHlwZXMpO1xuICAgIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUodHlwZXMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH1cblxuICBnZXRUcmFuc2Zlck5GVERhdGEoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCB0b2tlbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAndHJhbnNmZXJGcm9tJztcbiAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICdhZGRyZXNzJywgJ3VpbnQyNTYnXTtcbiAgICBjb25zdCBwYXJhbXMgPSBbZnJvbSwgdG8sIG5ldyBCTih0b2tlbklkKV07XG5cbiAgICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRChtZXRob2ROYW1lLCB0eXBlcyk7XG4gICAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZSh0eXBlcywgcGFyYW1zKTtcblxuICAgIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIHN0YWtpbmcgdHJhbnNhY3Rpb24gZGF0YSB1c2luZyBldGhlcmV1bWpzLWFiaVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Rha2luZ0Ftb3VudCAtIFRoZSBhbW91bnQgdG8gc3Rha2UgaW4gd2VpXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKi9cbiAgZ2V0U3Rha2luZ0RhdGEoc3Rha2luZ0Ftb3VudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gJ3N0YWtlJztcbiAgICBjb25zdCB0eXBlcyA9IFsndWludDI1NiddO1xuICAgIGNvbnN0IHBhcmFtcyA9IFtuZXcgQk4oc3Rha2luZ0Ftb3VudCldO1xuXG4gICAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQobWV0aG9kTmFtZSwgdHlwZXMpO1xuICAgIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUodHlwZXMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH1cblxuICBkZWNvZGVUcmFuc2ZlclRva2VuRGF0YShkYXRhOiBzdHJpbmcpOiBUcmFuc2FjdGlvblJlY2lwaWVudCB7XG4gICAgY29uc3QgW2FkZHJlc3MsIGFtb3VudF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgWydhZGRyZXNzJywgJ3VpbnQyNTYnXSxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoVFJBTlNGRVJfVE9LRU5fTUVUSE9EX0lELCBkYXRhKVxuICAgICk7XG4gICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IGFkZEhleFByZWZpeChhZGRyZXNzLnRvU3RyaW5nKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgIH07XG4gIH1cblxuICBkZWNvZGVUcmFuc2Zlck5GVERhdGEoZGF0YTogc3RyaW5nKToge1xuICAgIHJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgc2VuZGVyOiBzdHJpbmc7XG4gICAgdG9rZW5JZDogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBbZnJvbSwgdG8sIHRva2VuSWRCTl0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAndWludDI1NiddLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShUUkFOU0ZFUl9ORlRfTUVUSE9EX0lELCBkYXRhKVxuICAgICk7XG4gICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IGFkZEhleFByZWZpeCh0by50b1N0cmluZygpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlY2lwaWVudDogVHJhbnNhY3Rpb25SZWNpcGllbnQgPSB7XG4gICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgYW1vdW50OiAnMScsXG4gICAgfTtcbiAgICBjb25zdCBzZW5kZXIgPSBhZGRIZXhQcmVmaXgoZnJvbS50b1N0cmluZygpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRva2VuSWQgPSB0b2tlbklkQk4udG9TdHJpbmcoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVjaXBpZW50czogW3JlY2lwaWVudF0sXG4gICAgICBzZW5kZXIsXG4gICAgICB0b2tlbklkLFxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!