PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxp/dist/test/unit/lib
Просмотр файла: transactionBuilderFactory.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 assert_1 = __importDefault(require("assert"));
const testData = __importStar(require("../../resources/avaxp"));
const errorMessage = __importStar(require("../../resources/errors"));
const lib_1 = require("../../../src/lib");
const statics_1 = require("@bitgo/statics");
const sdk_core_1 = require("@bitgo/sdk-core");
const importP_1 = require("../../resources/tx/importP");
const importC_1 = require("../../resources/tx/importC");
const exportC_1 = require("../../resources/tx/exportC");
const avaxp_1 = require("../../resources/avaxp");
describe('AvaxP Transaction Builder Factory', () => {
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp'));
describe('should validate', () => {
it('an empty raw transaction', () => {
assert_1.default.throws(() => {
factory.from('');
}, (e) => e.message === errorMessage.ERROR_EMPTY_RAW_TRANSACTION);
});
it('an invalid raw transfer transaction', () => {
assert_1.default.throws(() => {
factory.from(testData.INVALID_RAW_TRANSACTION);
}, (e) => e.message === errorMessage.ERROR_RAW_PARSING);
});
it('Should validate a correct raw tx', () => {
factory.from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
// should not throw a error!
});
it("Shouldn't get a wallet initialization builder", () => {
assert_1.default.throws(() => {
factory.getWalletInitializationBuilder();
}, (e) => e.message === errorMessage.ERROR_WALLET_INITIALIZATION);
});
});
describe('Transaction readable', () => {
const rawTxs = [
testData.ADD_VALIDATOR_ID_SAMPLE.fullsigntxHex,
testData.EXPORT_P_2_C.fullsigntxHex,
testData.EXPORT_P_2_C.halfsigntxHex,
testData.EXPORT_P_2_C.unsignedTxHex,
importP_1.IMPORT_P.fullsigntxHex,
importP_1.IMPORT_P.halfsigntxHex,
importP_1.IMPORT_P.unsignedTxHex,
];
let tx;
before(async () => {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADD_VALIDATOR_ID_SAMPLE.fullsigntxHex);
tx = await txBuilder.build();
});
it('Should json stringifiy any transaction object', async () => {
for (const rawTx of rawTxs) {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(rawTx);
const tx = await txBuilder.build();
const txJson = tx.toJson();
(0, assert_1.default)(typeof JSON.stringify(txJson), 'string');
}
});
it('Should json stringifiy addValidator transaction', async () => {
const txJson = tx.toJson();
(0, assert_1.default)(typeof JSON.stringify(tx.toJson()), 'string');
txJson.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
});
it('Should get a txid', async () => {
tx.id.should.equal(testData.ADD_VALIDATOR_ID_SAMPLE.txid);
});
});
describe('should explains transaction', () => {
it('should explains a Signed AddValidatorTx', async () => {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.fullsigntxHex);
const tx = await txBuilder.build();
const txExplain = tx.explainTransaction();
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
});
it('should explains a Half Signed AddValidatorTx', async () => {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.halfsigntxHex);
const tx = await txBuilder.build();
const txExplain = tx.explainTransaction();
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
});
it('should explains a unsigned AddValidatorTx', async () => {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(testData.ADDVALIDATOR_SAMPLES.unsignedTxHex);
const tx = await txBuilder.build();
const txExplain = tx.explainTransaction();
txExplain.outputAmount.should.equal(testData.ADDVALIDATOR_SAMPLES.minValidatorStake);
txExplain.type.should.equal(sdk_core_1.TransactionType.AddValidator);
txExplain.outputs[0].address.should.equal(testData.ADDVALIDATOR_SAMPLES.nodeID);
});
});
describe('Cross chain transfer has source and destination chains', () => {
const p2cTxs = [
importP_1.IMPORT_P.fullsigntxHex,
importP_1.IMPORT_P.halfsigntxHex,
importP_1.IMPORT_P.unsignedTxHex,
exportC_1.EXPORT_C.fullsigntxHex,
exportC_1.EXPORT_C.unsignedTxHex,
];
const c2pTxs = [
importC_1.IMPORT_C.fullsigntxHex,
importC_1.IMPORT_C.halfsigntxHex,
importC_1.IMPORT_C.unsignedTxHex,
testData.EXPORT_P_2_C.fullsigntxHex,
testData.EXPORT_P_2_C.halfsigntxHex,
testData.EXPORT_P_2_C.unsignedTxHex,
];
const noCrossChainTxs = [
avaxp_1.ADDVALIDATOR_SAMPLES.fullsigntxHex,
avaxp_1.ADDVALIDATOR_SAMPLES.halfsigntxHex,
avaxp_1.ADDVALIDATOR_SAMPLES.unsignedTxHex,
];
async function toJson(txHex) {
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tavaxp')).from(txHex);
const tx = await txBuilder.build();
return tx.toJson();
}
it('Should json have sourceChain C and destinationChain P', async () => {
for (const rawTx of p2cTxs) {
const txJson = await toJson(rawTx);
txJson.sourceChain.should.equal('C');
txJson.destinationChain.should.equal('P');
}
});
it('Should json have sourceChain P and destinationChain C', async () => {
for (const rawTx of c2pTxs) {
const txJson = await toJson(rawTx);
txJson.sourceChain.should.equal('P');
txJson.destinationChain.should.equal('C');
}
});
it('Should json have not sourceChain either destinationChain ', async () => {
for (const rawTx of noCrossChainTxs) {
const txJson = await toJson(rawTx);
txJson.should.property('sourceChain').be.undefined();
txJson.should.property('destinationChain').be.undefined();
}
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnRUFBa0Q7QUFDbEQscUVBQXVEO0FBQ3ZELDBDQUFxRTtBQUNyRSw0Q0FBdUM7QUFDdkMsOENBQW1FO0FBQ25FLHdEQUFzRDtBQUN0RCx3REFBc0Q7QUFDdEQsd0RBQXNEO0FBQ3RELGlEQUE2RDtBQUU3RCxRQUFRLENBQUMsbUNBQW1DLEVBQUUsR0FBRyxFQUFFO0lBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRW5FLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtZQUNsQyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLDJCQUEyQixDQUNuRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFO1lBQzdDLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pELENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxZQUFZLENB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SUFBSSxFQUFFO1lBQ3JFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLENBQUMsV0FBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxnQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6RSxLQUFLLE1BQU0sS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2F2YXhwJztcbmltcG9ydCAqIGFzIGVycm9yTWVzc2FnZSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZXJyb3JzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFR4RGF0YSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBJTVBPUlRfUCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90eC9pbXBvcnRQJztcbmltcG9ydCB7IElNUE9SVF9DIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3R4L2ltcG9ydEMnO1xuaW1wb3J0IHsgRVhQT1JUX0MgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHgvZXhwb3J0Qyc7XG5pbXBvcnQgeyBBRERWQUxJREFUT1JfU0FNUExFUyB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdmF4cCc7XG5cbmRlc2NyaWJlKCdBdmF4UCBUcmFuc2FjdGlvbiBCdWlsZGVyIEZhY3RvcnknLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhbiBlbXB0eSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgZmFjdG9yeS5mcm9tKCcnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfRU1QVFlfUkFXX1RSQU5TQUNUSU9OXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGludmFsaWQgcmF3IHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5JTlZBTElEX1JBV19UUkFOU0FDVElPTik7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1JBV19QQVJTSU5HXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCB2YWxpZGF0ZSBhIGNvcnJlY3QgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgZmFjdG9yeS5mcm9tKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgLy8gc2hvdWxkIG5vdCB0aHJvdyBhIGVycm9yIVxuICAgIH0pO1xuXG4gICAgaXQoXCJTaG91bGRuJ3QgZ2V0IGEgd2FsbGV0IGluaXRpYWxpemF0aW9uIGJ1aWxkZXJcIiwgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1dBTExFVF9JTklUSUFMSVpBVElPTlxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHJlYWRhYmxlJywgKCkgPT4ge1xuICAgIGNvbnN0IHJhd1R4cyA9IFtcbiAgICAgIHRlc3REYXRhLkFERF9WQUxJREFUT1JfSURfU0FNUExFLmZ1bGxzaWdudHhIZXgsXG4gICAgICB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuZnVsbHNpZ250eEhleCxcbiAgICAgIHRlc3REYXRhLkVYUE9SVF9QXzJfQy5oYWxmc2lnbnR4SGV4LFxuICAgICAgdGVzdERhdGEuRVhQT1JUX1BfMl9DLnVuc2lnbmVkVHhIZXgsXG4gICAgICBJTVBPUlRfUC5mdWxsc2lnbnR4SGV4LFxuICAgICAgSU1QT1JUX1AuaGFsZnNpZ250eEhleCxcbiAgICAgIElNUE9SVF9QLnVuc2lnbmVkVHhIZXgsXG4gICAgXTtcbiAgICBsZXQgdHg6IEJhc2VUcmFuc2FjdGlvbjtcbiAgICBiZWZvcmUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREX1ZBTElEQVRPUl9JRF9TQU1QTEUuZnVsbHNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGpzb24gc3RyaW5naWZpeSBhbnkgdHJhbnNhY3Rpb24gb2JqZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCByYXdUeCBvZiByYXdUeHMpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShyYXdUeCk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBhc3NlcnQodHlwZW9mIEpTT04uc3RyaW5naWZ5KHR4SnNvbiksICdzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQganNvbiBzdHJpbmdpZml5IGFkZFZhbGlkYXRvciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgYXNzZXJ0KHR5cGVvZiBKU09OLnN0cmluZ2lmeSh0eC50b0pzb24oKSksICdzdHJpbmcnKTtcbiAgICAgIHR4SnNvbi5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREX1ZBTElEQVRPUl9JRF9TQU1QTEUudHhpZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBhIHR4aWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREX1ZBTElEQVRPUl9JRF9TQU1QTEUudHhpZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgZXhwbGFpbnMgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWlucyBhIFNpZ25lZCBBZGRWYWxpZGF0b3JUeCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20oXG4gICAgICAgIHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLmZ1bGxzaWdudHhIZXhcbiAgICAgICk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5taW5WYWxpZGF0b3JTdGFrZSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy5ub2RlSUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWlucyBhIEhhbGYgU2lnbmVkIEFkZFZhbGlkYXRvclR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShcbiAgICAgICAgdGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm1pblZhbGlkYXRvclN0YWtlKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yKTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERFZBTElEQVRPUl9TQU1QTEVTLm5vZGVJRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW5zIGEgdW5zaWduZWQgQWRkVmFsaWRhdG9yVHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKS5mcm9tKFxuICAgICAgICB0ZXN0RGF0YS5BRERWQUxJREFUT1JfU0FNUExFUy51bnNpZ25lZFR4SGV4XG4gICAgICApO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubWluVmFsaWRhdG9yU3Rha2UpO1xuICAgICAgdHhFeHBsYWluLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuQUREVkFMSURBVE9SX1NBTVBMRVMubm9kZUlEKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Nyb3NzIGNoYWluIHRyYW5zZmVyIGhhcyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGNoYWlucycsICgpID0+IHtcbiAgICBjb25zdCBwMmNUeHMgPSBbXG4gICAgICBJTVBPUlRfUC5mdWxsc2lnbnR4SGV4LFxuICAgICAgSU1QT1JUX1AuaGFsZnNpZ250eEhleCxcbiAgICAgIElNUE9SVF9QLnVuc2lnbmVkVHhIZXgsXG4gICAgICBFWFBPUlRfQy5mdWxsc2lnbnR4SGV4LFxuICAgICAgRVhQT1JUX0MudW5zaWduZWRUeEhleCxcbiAgICBdO1xuXG4gICAgY29uc3QgYzJwVHhzID0gW1xuICAgICAgSU1QT1JUX0MuZnVsbHNpZ250eEhleCxcbiAgICAgIElNUE9SVF9DLmhhbGZzaWdudHhIZXgsXG4gICAgICBJTVBPUlRfQy51bnNpZ25lZFR4SGV4LFxuICAgICAgdGVzdERhdGEuRVhQT1JUX1BfMl9DLmZ1bGxzaWdudHhIZXgsXG4gICAgICB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuaGFsZnNpZ250eEhleCxcbiAgICAgIHRlc3REYXRhLkVYUE9SVF9QXzJfQy51bnNpZ25lZFR4SGV4LFxuICAgIF07XG5cbiAgICBjb25zdCBub0Nyb3NzQ2hhaW5UeHMgPSBbXG4gICAgICBBRERWQUxJREFUT1JfU0FNUExFUy5mdWxsc2lnbnR4SGV4LFxuICAgICAgQUREVkFMSURBVE9SX1NBTVBMRVMuaGFsZnNpZ250eEhleCxcbiAgICAgIEFERFZBTElEQVRPUl9TQU1QTEVTLnVuc2lnbmVkVHhIZXgsXG4gICAgXTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRvSnNvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUeERhdGE+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLmZyb20odHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJldHVybiB0eC50b0pzb24oKTtcbiAgICB9XG5cbiAgICBpdCgnU2hvdWxkIGpzb24gaGF2ZSBzb3VyY2VDaGFpbiBDIGFuZCBkZXN0aW5hdGlvbkNoYWluIFAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJhd1R4IG9mIHAyY1R4cykge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBhd2FpdCB0b0pzb24ocmF3VHgpO1xuICAgICAgICB0eEpzb24uc291cmNlQ2hhaW4hLnNob3VsZC5lcXVhbCgnQycpO1xuICAgICAgICB0eEpzb24uZGVzdGluYXRpb25DaGFpbiEuc2hvdWxkLmVxdWFsKCdQJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGpzb24gaGF2ZSBzb3VyY2VDaGFpbiBQIGFuZCBkZXN0aW5hdGlvbkNoYWluIEMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJhd1R4IG9mIGMycFR4cykge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBhd2FpdCB0b0pzb24ocmF3VHgpO1xuICAgICAgICB0eEpzb24uc291cmNlQ2hhaW4hLnNob3VsZC5lcXVhbCgnUCcpO1xuICAgICAgICB0eEpzb24uZGVzdGluYXRpb25DaGFpbiEuc2hvdWxkLmVxdWFsKCdDJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGpzb24gaGF2ZSBub3Qgc291cmNlQ2hhaW4gZWl0aGVyIGRlc3RpbmF0aW9uQ2hhaW4gJywgYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCByYXdUeCBvZiBub0Nyb3NzQ2hhaW5UeHMpIHtcbiAgICAgICAgY29uc3QgdHhKc29uID0gYXdhaXQgdG9Kc29uKHJhd1R4KTtcbiAgICAgICAgdHhKc29uLnNob3VsZC5wcm9wZXJ0eSgnc291cmNlQ2hhaW4nKS5iZS51bmRlZmluZWQoKTtcbiAgICAgICAgdHhKc29uLnNob3VsZC5wcm9wZXJ0eSgnZGVzdGluYXRpb25DaGFpbicpLmJlLnVuZGVmaW5lZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!