PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sgb/dist/test/unit
Просмотр файла: sgb.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const should = __importStar(require("should"));
const sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const index_1 = require("../../src/index");
const resources_1 = require("../resources");
const nock_1 = __importDefault(require("nock"));
const sdk_core_1 = require("@bitgo/sdk-core");
const tx_1 = require("@ethereumjs/tx");
const util_1 = require("@ethereumjs/util");
const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
describe('sgb', function () {
before(function () {
bitgo.safeRegister('sgb', index_1.Sgb.createInstance);
bitgo.safeRegister('tsgb', index_1.Tsgb.createInstance);
bitgo.initializeTestVars();
});
describe('Basic Coin Info', function () {
it('should return the right info for sgb', function () {
const sgb = bitgo.coin('sgb');
sgb.should.be.an.instanceof(index_1.Sgb);
sgb.getChain().should.equal('sgb');
sgb.getFamily().should.equal('sgb');
sgb.getFullName().should.equal('Songbird');
sgb.getBaseFactor().should.equal(1e18);
sgb.supportsTss().should.equal(true);
sgb.allowsAccountConsolidations().should.equal(false);
});
it('should return the right info for tsgb', function () {
const tsgb = bitgo.coin('tsgb');
tsgb.should.be.an.instanceof(index_1.Tsgb);
tsgb.getChain().should.equal('tsgb');
tsgb.getFamily().should.equal('sgb');
tsgb.getFullName().should.equal('Testnet songbird');
tsgb.getBaseFactor().should.equal(1e18);
tsgb.supportsTss().should.equal(true);
tsgb.allowsAccountConsolidations().should.equal(false);
});
});
});
describe('Build Unsigned Sweep for Self-Custody Cold Wallets - (MPCv2)', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].sgbExplorerBaseUrl;
it('should generate an unsigned sweep without derivation path', async () => {
(0, nock_1.default)(explorerUrl)
.get('/api')
.twice()
.query(resources_1.mockDataUnsignedSweep.getTxListRequest)
.reply(200, resources_1.mockDataUnsignedSweep.getTxListResponse);
(0, nock_1.default)(explorerUrl)
.get('/api')
.query(resources_1.mockDataUnsignedSweep.getBalanceRequest)
.reply(200, resources_1.mockDataUnsignedSweep.getBalanceResponse);
const baseCoin = bitgo.coin('tsgb');
const transaction = (await baseCoin.recover({
userKey: resources_1.mockDataUnsignedSweep.userKey,
backupKey: resources_1.mockDataUnsignedSweep.backupKey,
walletContractAddress: resources_1.mockDataUnsignedSweep.walletBaseAddress,
recoveryDestination: resources_1.mockDataUnsignedSweep.recoveryDestination,
isTss: true,
eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
gasLimit: 500000,
replayProtectionOptions: {
chain: 16,
hardfork: 'london',
},
}));
should.exist(transaction);
transaction.should.have.property('txRequests');
transaction.txRequests.length.should.equal(1);
const txRequest = transaction.txRequests[0];
txRequest.should.have.property('walletCoin');
txRequest.walletCoin.should.equal('tsgb');
txRequest.should.have.property('transactions');
txRequest.transactions.length.should.equal(1);
const tx = txRequest.transactions[0];
tx.should.have.property('nonce');
tx.should.have.property('unsignedTx');
tx.unsignedTx.should.have.property('serializedTxHex');
tx.unsignedTx.should.have.property('signableHex');
tx.unsignedTx.should.have.property('derivationPath');
tx.unsignedTx.should.have.property('feeInfo');
tx.unsignedTx.feeInfo?.should.have.property('fee');
tx.unsignedTx.feeInfo?.should.have.property('feeString');
tx.unsignedTx.should.have.property('parsedTx');
tx.unsignedTx.parsedTx?.should.have.property('spendAmount');
tx.unsignedTx.parsedTx?.should.have.property('outputs');
});
});
describe('Non Bitgo Recovery for Hot Wallets', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
const explorerUrl = sdk_core_1.common.Environments[bitgo.getEnv()].sgbExplorerBaseUrl;
const maxFeePerGasvalue = 20000000000;
const maxPriorityFeePerGasValue = 10000000000;
const chain_id = 16;
const gasLimitvalue = 500000;
it('should generate a signed non-bitgo recovery tx', async () => {
(0, nock_1.default)(explorerUrl)
.get('/api')
.twice()
.query(resources_1.mockDataNonBitGoRecovery.getTxListRequest)
.reply(200, resources_1.mockDataNonBitGoRecovery.getTxListResponse);
(0, nock_1.default)(explorerUrl)
.get('/api')
.query(resources_1.mockDataNonBitGoRecovery.getBalanceRequest)
.reply(200, resources_1.mockDataNonBitGoRecovery.getBalanceResponse);
const baseCoin = bitgo.coin('tsgb');
const transaction = await baseCoin.recover({
userKey: resources_1.mockDataNonBitGoRecovery.userKeyData,
backupKey: resources_1.mockDataNonBitGoRecovery.backupKeyData,
walletContractAddress: resources_1.mockDataNonBitGoRecovery.walletRootAddress,
walletPassphrase: resources_1.mockDataNonBitGoRecovery.walletPassphrase,
recoveryDestination: resources_1.mockDataNonBitGoRecovery.recoveryDestination,
isTss: true,
eip1559: { maxFeePerGas: maxFeePerGasvalue, maxPriorityFeePerGas: maxPriorityFeePerGasValue },
gasLimit: gasLimitvalue,
replayProtectionOptions: {
chain: chain_id,
hardfork: 'london',
},
});
should.exist(transaction);
transaction.should.have.property('id');
transaction.should.have.property('tx');
const tx = tx_1.FeeMarketEIP1559Transaction.fromSerializedTx(Buffer.from((0, util_1.stripHexPrefix)(transaction.tx), 'hex'));
tx.getSenderAddress().toString().should.equal(resources_1.mockDataNonBitGoRecovery.walletRootAddress);
const jsonTx = tx.toJSON();
jsonTx.to?.should.equal(resources_1.mockDataNonBitGoRecovery.recoveryDestination);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2diLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3NnYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUVqQyw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBRTFDLDJDQUE0QztBQUU1Qyw0Q0FBK0U7QUFDL0UsZ0RBQXdCO0FBQ3hCLDhDQUF5QztBQUN6Qyx1Q0FBNkQ7QUFDN0QsMkNBQWtEO0FBRWxELE1BQU0sS0FBSyxHQUFpQixvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUUsUUFBUSxDQUFDLEtBQUssRUFBRTtJQUNkLE1BQU0sQ0FBQztRQUNMLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFHLENBQUMsQ0FBQztZQUNqQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLDhEQUE4RCxFQUFFO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1RCxNQUFNLFdBQVcsR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxrQkFBNEIsQ0FBQztJQUVyRixFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekUsSUFBQSxjQUFJLEVBQUMsV0FBVyxDQUFDO2FBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQzthQUNYLEtBQUssRUFBRTthQUNQLEtBQUssQ0FBQyxpQ0FBcUIsQ0FBQyxnQkFBZ0IsQ0FBQzthQUM3QyxLQUFLLENBQUMsR0FBRyxFQUFFLGlDQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkQsSUFBQSxjQUFJLEVBQUMsV0FBVyxDQUFDO2FBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQzthQUNYLEtBQUssQ0FBQyxpQ0FBcUIsQ0FBQyxpQkFBaUIsQ0FBQzthQUM5QyxLQUFLLENBQUMsR0FBRyxFQUFFLGlDQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFeEQsTUFBTSxRQUFRLEdBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUMxQyxPQUFPLEVBQUUsaUNBQXFCLENBQUMsT0FBTztZQUN0QyxTQUFTLEVBQUUsaUNBQXFCLENBQUMsU0FBUztZQUMxQyxxQkFBcUIsRUFBRSxpQ0FBcUIsQ0FBQyxpQkFBaUI7WUFDOUQsbUJBQW1CLEVBQUUsaUNBQXFCLENBQUMsbUJBQW1CO1lBQzlELEtBQUssRUFBRSxJQUFJO1lBQ1gsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUU7WUFDekUsUUFBUSxFQUFFLE1BQU07WUFDaEIsdUJBQXVCLEVBQUU7Z0JBQ3ZCLEtBQUssRUFBRSxFQUFFO2dCQUNULFFBQVEsRUFBRSxRQUFRO2FBQ25CO1NBQ0YsQ0FBQyxDQUF5QixDQUFDO1FBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0QyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsb0NBQW9DLEVBQUU7SUFDN0MsTUFBTSxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE1BQU0sV0FBVyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUE0QixDQUFDO0lBQ3JGLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDO0lBQ3RDLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFFN0IsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlELElBQUEsY0FBSSxFQUFDLFdBQVcsQ0FBQzthQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxLQUFLLEVBQUU7YUFDUCxLQUFLLENBQUMsb0NBQXdCLENBQUMsZ0JBQWdCLENBQUM7YUFDaEQsS0FBSyxDQUFDLEdBQUcsRUFBRSxvQ0FBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFELElBQUEsY0FBSSxFQUFDLFdBQVcsQ0FBQzthQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxLQUFLLENBQUMsb0NBQXdCLENBQUMsaUJBQWlCLENBQUM7YUFDakQsS0FBSyxDQUFDLEdBQUcsRUFBRSxvQ0FBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRTNELE1BQU0sUUFBUSxHQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxvQ0FBd0IsQ0FBQyxXQUFXO1lBQzdDLFNBQVMsRUFBRSxvQ0FBd0IsQ0FBQyxhQUFhO1lBQ2pELHFCQUFxQixFQUFFLG9DQUF3QixDQUFDLGlCQUFpQjtZQUNqRSxnQkFBZ0IsRUFBRSxvQ0FBd0IsQ0FBQyxnQkFBZ0I7WUFDM0QsbUJBQW1CLEVBQUUsb0NBQXdCLENBQUMsbUJBQW1CO1lBQ2pFLEtBQUssRUFBRSxJQUFJO1lBQ1gsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLHlCQUF5QixFQUFFO1lBQzdGLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLHVCQUF1QixFQUFFO2dCQUN2QixLQUFLLEVBQUUsUUFBUTtnQkFDZixRQUFRLEVBQUUsUUFBUTthQUNuQjtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxnQ0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUEscUJBQWMsRUFBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1RyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUF3QixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5cbmltcG9ydCB7IFNnYiwgVHNnYiB9IGZyb20gJy4uLy4uL3NyYy9pbmRleCc7XG5pbXBvcnQgeyBVbnNpZ25lZFN3ZWVwVHhNUEN2MiB9IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHsgbW9ja0RhdGFVbnNpZ25lZFN3ZWVwLCBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkgfSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgeyBjb21tb24gfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmVlTWFya2V0RUlQMTU1OVRyYW5zYWN0aW9uIH0gZnJvbSAnQGV0aGVyZXVtanMvdHgnO1xuaW1wb3J0IHsgc3RyaXBIZXhQcmVmaXggfSBmcm9tICdAZXRoZXJldW1qcy91dGlsJztcblxuY29uc3QgYml0Z286IFRlc3RCaXRHb0FQSSA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcblxuZGVzY3JpYmUoJ3NnYicsIGZ1bmN0aW9uICgpIHtcbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3NnYicsIFNnYi5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0c2diJywgVHNnYi5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXNpYyBDb2luIEluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8gZm9yIHNnYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNnYiA9IGJpdGdvLmNvaW4oJ3NnYicpO1xuXG4gICAgICBzZ2Iuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoU2diKTtcbiAgICAgIHNnYi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnc2diJyk7XG4gICAgICBzZ2IuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdzZ2InKTtcbiAgICAgIHNnYi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnU29uZ2JpcmQnKTtcbiAgICAgIHNnYi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlMTgpO1xuICAgICAgc2diLnN1cHBvcnRzVHNzKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgc2diLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgcmlnaHQgaW5mbyBmb3IgdHNnYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRzZ2IgPSBiaXRnby5jb2luKCd0c2diJyk7XG5cbiAgICAgIHRzZ2Iuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHNnYik7XG4gICAgICB0c2diLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0c2diJyk7XG4gICAgICB0c2diLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnc2diJyk7XG4gICAgICB0c2diLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IHNvbmdiaXJkJyk7XG4gICAgICB0c2diLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWUxOCk7XG4gICAgICB0c2diLnN1cHBvcnRzVHNzKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgdHNnYi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQnVpbGQgVW5zaWduZWQgU3dlZXAgZm9yIFNlbGYtQ3VzdG9keSBDb2xkIFdhbGxldHMgLSAoTVBDdjIpJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgY29uc3QgZXhwbG9yZXJVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS5zZ2JFeHBsb3JlckJhc2VVcmwgYXMgc3RyaW5nO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYW4gdW5zaWduZWQgc3dlZXAgd2l0aG91dCBkZXJpdmF0aW9uIHBhdGgnLCBhc3luYyAoKSA9PiB7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnR3aWNlKClcbiAgICAgIC5xdWVyeShtb2NrRGF0YVVuc2lnbmVkU3dlZXAuZ2V0VHhMaXN0UmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRUeExpc3RSZXNwb25zZSk7XG4gICAgbm9jayhleHBsb3JlclVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRCYWxhbmNlUmVxdWVzdClcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhVW5zaWduZWRTd2VlcC5nZXRCYWxhbmNlUmVzcG9uc2UpO1xuXG4gICAgY29uc3QgYmFzZUNvaW46IGFueSA9IGJpdGdvLmNvaW4oJ3RzZ2InKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChhd2FpdCBiYXNlQ29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IG1vY2tEYXRhVW5zaWduZWRTd2VlcC51c2VyS2V5LFxuICAgICAgYmFja3VwS2V5OiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAuYmFja3VwS2V5LFxuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAud2FsbGV0QmFzZUFkZHJlc3MsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBtb2NrRGF0YVVuc2lnbmVkU3dlZXAucmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwMDAwMDAwMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTAwMDAwMDAwMDAgfSxcbiAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICByZXBsYXlQcm90ZWN0aW9uT3B0aW9uczoge1xuICAgICAgICBjaGFpbjogMTYsXG4gICAgICAgIGhhcmRmb3JrOiAnbG9uZG9uJyxcbiAgICAgIH0sXG4gICAgfSkpIGFzIFVuc2lnbmVkU3dlZXBUeE1QQ3YyO1xuICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbik7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4UmVxdWVzdHMnKTtcbiAgICB0cmFuc2FjdGlvbi50eFJlcXVlc3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgY29uc3QgdHhSZXF1ZXN0ID0gdHJhbnNhY3Rpb24udHhSZXF1ZXN0c1swXTtcbiAgICB0eFJlcXVlc3Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldENvaW4nKTtcbiAgICB0eFJlcXVlc3Qud2FsbGV0Q29pbi5zaG91bGQuZXF1YWwoJ3RzZ2InKTtcbiAgICB0eFJlcXVlc3Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgIHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBjb25zdCB0eCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF07XG4gICAgdHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ25vbmNlJyk7XG4gICAgdHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Vuc2lnbmVkVHgnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdzZXJpYWxpemVkVHhIZXgnKTtcbiAgICB0eC51bnNpZ25lZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdzaWduYWJsZUhleCcpO1xuICAgIHR4LnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Rlcml2YXRpb25QYXRoJyk7XG4gICAgdHgudW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZmVlSW5mbycpO1xuICAgIHR4LnVuc2lnbmVkVHguZmVlSW5mbz8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZScpO1xuICAgIHR4LnVuc2lnbmVkVHguZmVlSW5mbz8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZVN0cmluZycpO1xuICAgIHR4LnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhcnNlZFR4Jyk7XG4gICAgdHgudW5zaWduZWRUeC5wYXJzZWRUeD8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3NwZW5kQW1vdW50Jyk7XG4gICAgdHgudW5zaWduZWRUeC5wYXJzZWRUeD8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ291dHB1dHMnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ05vbiBCaXRnbyBSZWNvdmVyeSBmb3IgSG90IFdhbGxldHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBjb25zdCBleHBsb3JlclVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnNnYkV4cGxvcmVyQmFzZVVybCBhcyBzdHJpbmc7XG4gIGNvbnN0IG1heEZlZVBlckdhc3ZhbHVlID0gMjAwMDAwMDAwMDA7XG4gIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzVmFsdWUgPSAxMDAwMDAwMDAwMDtcbiAgY29uc3QgY2hhaW5faWQgPSAxNjtcbiAgY29uc3QgZ2FzTGltaXR2YWx1ZSA9IDUwMDAwMDtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgc2lnbmVkIG5vbi1iaXRnbyByZWNvdmVyeSB0eCcsIGFzeW5jICgpID0+IHtcbiAgICBub2NrKGV4cGxvcmVyVXJsKVxuICAgICAgLmdldCgnL2FwaScpXG4gICAgICAudHdpY2UoKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5nZXRUeExpc3RSZXF1ZXN0KVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LmdldFR4TGlzdFJlc3BvbnNlKTtcbiAgICBub2NrKGV4cGxvcmVyVXJsKVxuICAgICAgLmdldCgnL2FwaScpXG4gICAgICAucXVlcnkobW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LmdldEJhbGFuY2VSZXF1ZXN0KVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGFOb25CaXRHb1JlY292ZXJ5LmdldEJhbGFuY2VSZXNwb25zZSk7XG5cbiAgICBjb25zdCBiYXNlQ29pbjogYW55ID0gYml0Z28uY29pbigndHNnYicpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZUNvaW4ucmVjb3Zlcih7XG4gICAgICB1c2VyS2V5OiBtb2NrRGF0YU5vbkJpdEdvUmVjb3ZlcnkudXNlcktleURhdGEsXG4gICAgICBiYWNrdXBLZXk6IG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5iYWNrdXBLZXlEYXRhLFxuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBtb2NrRGF0YU5vbkJpdEdvUmVjb3Zlcnkud2FsbGV0Um9vdEFkZHJlc3MsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBtb2NrRGF0YU5vbkJpdEdvUmVjb3Zlcnkud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgaXNUc3M6IHRydWUsXG4gICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogbWF4RmVlUGVyR2FzdmFsdWUsIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc1ZhbHVlIH0sXG4gICAgICBnYXNMaW1pdDogZ2FzTGltaXR2YWx1ZSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiB7XG4gICAgICAgIGNoYWluOiBjaGFpbl9pZCxcbiAgICAgICAgaGFyZGZvcms6ICdsb25kb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eCcpO1xuICAgIGNvbnN0IHR4ID0gRmVlTWFya2V0RUlQMTU1OVRyYW5zYWN0aW9uLmZyb21TZXJpYWxpemVkVHgoQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgodHJhbnNhY3Rpb24udHgpLCAnaGV4JykpO1xuICAgIHR4LmdldFNlbmRlckFkZHJlc3MoKS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtb2NrRGF0YU5vbkJpdEdvUmVjb3Zlcnkud2FsbGV0Um9vdEFkZHJlc3MpO1xuICAgIGNvbnN0IGpzb25UeCA9IHR4LnRvSlNPTigpO1xuICAgIGpzb25UeC50bz8uc2hvdWxkLmVxdWFsKG1vY2tEYXRhTm9uQml0R29SZWNvdmVyeS5yZWNvdmVyeURlc3RpbmF0aW9uKTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!