PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-stx/dist/test/unit/transactionBuilder

Просмотр файла: sendmanyBuilder.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_1 = __importDefault(require("should"));
const network_1 = require("@stacks/network");
const transactions_1 = require("@stacks/transactions");
const principalCV_1 = require("@stacks/transactions/dist/clarity/types/principalCV");
const sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const statics_1 = require("@bitgo/statics");
const src_1 = require("../../../src");
const testData = __importStar(require("../resources"));
describe('Stacks: Send Many Builder', function () {
    const coinName = 'stx';
    const coinNameTest = 'tstx';
    let bitgo;
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
            env: 'mock',
        });
        bitgo.initializeTestVars();
        bitgo.safeRegister('stx', src_1.Stx.createInstance);
        bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
    });
    describe('Stx Send Many Builder', () => {
        const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinNameTest));
        const factoryProd = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
        const initTxBuilder = () => {
            const txBuilder = factory.getSendmanyBuilder();
            txBuilder.fee({ fee: '532' });
            txBuilder.nonce(45);
            return txBuilder;
        };
        it('should select the right network', function () {
            should_1.default.equal(factory.getSendmanyBuilder().coinName(), 'tstx');
            should_1.default.equal(factoryProd.getSendmanyBuilder().coinName(), 'stx');
            // used type any to access protected properties
            const txBuilder = factory.getSendmanyBuilder();
            const txBuilderProd = factoryProd.getSendmanyBuilder();
            txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
            txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
        });
        describe('should build ', function () {
            it('a multisig send many transaction with memo', async () => {
                const builder = initTxBuilder();
                // corresponding public keys
                const pubKeys = testData.prvKeysString.map(transactions_1.pubKeyfromPrivKey);
                const pubKeyStrings = pubKeys.map(transactions_1.publicKeyToString);
                builder.fromPubKey(pubKeyStrings);
                for (const recipient of testData.sendManyRecipients) {
                    builder.send(recipient);
                }
                builder.sign({ key: testData.prvKeysString[0] });
                builder.sign({ key: testData.prvKeysString[1] });
                const tx = await builder.build();
                const txJson = tx.toJson();
                txJson.id.should.equal('01793eeb993d15791ea9af8910d867407803fe4c7d1db2dac592a2e8200de12a');
                txJson.fee.should.equal('532');
                txJson.from.should.equal('SN3KT9DVM9TCTAHV0S9VEAKTDG7JBC0K26ZMWEBNT');
                txJson.nonce.should.equal(45);
                const { contractName, contractAddress, functionName, functionArgs } = txJson.payload;
                contractAddress.should.equal(testData.SEND_MANY_CONTRACT_ADDRESS_WITH_MEMO);
                contractName.should.equal(testData.SEND_MANY_CONTRACT_NAME_WITH_MEMO);
                functionName.should.equal(testData.SEND_MANY_CONTRACT_FUNCTION_NAME_WITH_MEMO);
                functionArgs.length.should.equal(1);
                functionArgs[0].should.have.property('list');
                const { list } = functionArgs[0];
                list.length.should.equal(testData.sendManyRecipients.length);
                for (let i = 0; i < testData.sendManyRecipients.length; i++) {
                    list[i].data.should.have.properties(['to', 'ustx', 'memo']);
                    (0, principalCV_1.principalToString)(list[i].data.to).should.equal(testData.sendManyRecipients[i].address);
                    list[i].data.memo.buffer.toString('ascii').should.equal(testData.sendManyRecipients[i].memo);
                    list[i].data.ustx.value.should.equal(testData.sendManyRecipients[i].amount);
                }
                tx.outputs.length.should.equal(testData.sendManyRecipients.length);
                for (let i = 0; i < testData.sendManyRecipients.length; i++) {
                    tx.outputs[i].address.should.equal(testData.sendManyRecipients[i].address);
                    tx.outputs[i].value.should.equal(testData.sendManyRecipients[i].amount);
                }
                tx.inputs.length.should.equal(1);
                tx.inputs[0].address.should.equal('SN3KT9DVM9TCTAHV0S9VEAKTDG7JBC0K26ZMWEBNT');
                tx.inputs[0].value.should.equal('6000000');
                should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_SEND_MANY_WITH_MEMO);
            });
            it('a multisig send-many unsigned transfer transaction with memo from raw tx', async () => {
                const builder = factory.from(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
                const tx = await builder.build();
                tx.toBroadcastFormat().should.equal(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
            });
            it('a unsigned send-many signed transfer transaction with memo from raw tx', async () => {
                const builder = factory.from(testData.SIGNED_SEND_MANY_WITH_MEMO);
                const tx = await builder.build();
                tx.toBroadcastFormat().should.equal(testData.SIGNED_SEND_MANY_WITH_MEMO);
            });
            it('sign an unsigned tx from a raw tx', async () => {
                const builder = factory.from(testData.UNSIGNED_SEND_MANY_WITH_MEMO);
                builder.sign({ key: testData.prvKeysString[0] });
                builder.sign({ key: testData.prvKeysString[1] });
                const tx = await builder.build();
                tx.toBroadcastFormat().should.equal(testData.SIGNED_SEND_MANY_WITH_MEMO);
            });
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZG1hbnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9zZW5kbWFueUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQStEO0FBQy9ELHVEQUE0RTtBQUM1RSxxRkFBd0Y7QUFFeEYsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyw0Q0FBdUM7QUFFdkMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxRQUFRLENBQUMsMkJBQTJCLEVBQUU7SUFDcEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM1QixJQUFJLEtBQW1CLENBQUM7SUFFeEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUU7WUFDbkMsR0FBRyxFQUFFLE1BQU07U0FDWixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQU0sQ0FBQyx5QkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFNLENBQUMseUJBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FB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Q0FBQztnQkFDakMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFN0YWNrc1Rlc3RuZXQsIFN0YWNrc01haW5uZXQgfSBmcm9tICdAc3RhY2tzL25ldHdvcmsnO1xuaW1wb3J0IHsgcHViS2V5ZnJvbVByaXZLZXksIHB1YmxpY0tleVRvU3RyaW5nIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgcHJpbmNpcGFsVG9TdHJpbmcgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucy9kaXN0L2NsYXJpdHkvdHlwZXMvcHJpbmNpcGFsQ1YnO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBTdHgsIFRzdHgsIFN0eExpYiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnU3RhY2tzOiBTZW5kIE1hbnkgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnc3R4JztcbiAgY29uc3QgY29pbk5hbWVUZXN0ID0gJ3RzdHgnO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7XG4gICAgICBlbnY6ICdtb2NrJyxcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3N0eCcsIFN0eC5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0c3R4JywgVHN0eC5jcmVhdGVJbnN0YW5jZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdHggU2VuZCBNYW55IEJ1aWxkZXInLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWVUZXN0KSk7XG4gICAgY29uc3QgZmFjdG9yeVByb2QgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG5cbiAgICBjb25zdCBpbml0VHhCdWlsZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTZW5kbWFueUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICc1MzInIH0pO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKDQ1KTtcbiAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhY3RvcnkuZ2V0U2VuZG1hbnlCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ3RzdHgnKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWN0b3J5UHJvZC5nZXRTZW5kbWFueUJ1aWxkZXIoKS5jb2luTmFtZSgpLCAnc3R4Jyk7XG4gICAgICAvLyB1c2VkIHR5cGUgYW55IHRvIGFjY2VzcyBwcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBmYWN0b3J5LmdldFNlbmRtYW55QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyUHJvZDogYW55ID0gZmFjdG9yeVByb2QuZ2V0U2VuZG1hbnlCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NUZXN0bmV0KCkpO1xuICAgICAgdHhCdWlsZGVyUHJvZC5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NNYWlubmV0KCkpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZW5kIG1hbnkgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuXG4gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleXNcbiAgICAgICAgY29uc3QgcHViS2V5cyA9IHRlc3REYXRhLnBydktleXNTdHJpbmcubWFwKHB1YktleWZyb21Qcml2S2V5KTtcbiAgICAgICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleXMubWFwKHB1YmxpY0tleVRvU3RyaW5nKTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleVN0cmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudCBvZiB0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHMpIHtcbiAgICAgICAgICBidWlsZGVyLnNlbmQocmVjaXBpZW50KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydktleXNTdHJpbmdbMF0gfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2S2V5c1N0cmluZ1sxXSB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICB0eEpzb24uaWQuc2hvdWxkLmVxdWFsKCcwMTc5M2VlYjk5M2QxNTc5MWVhOWFmODkxMGQ4Njc0MDc4MDNmZTRjN2QxZGIyZGFjNTkyYTJlODIwMGRlMTJhJyk7XG4gICAgICAgIHR4SnNvbi5mZWUuc2hvdWxkLmVxdWFsKCc1MzInKTtcbiAgICAgICAgdHhKc29uLmZyb20uc2hvdWxkLmVxdWFsKCdTTjNLVDlEVk05VENUQUhWMFM5VkVBS1RERzdKQkMwSzI2Wk1XRUJOVCcpO1xuICAgICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDQ1KTtcbiAgICAgICAgY29uc3QgeyBjb250cmFjdE5hbWUsIGNvbnRyYWN0QWRkcmVzcywgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkFyZ3MgfSA9IHR4SnNvbi5wYXlsb2FkO1xuICAgICAgICBjb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLlNFTkRfTUFOWV9DT05UUkFDVF9BRERSRVNTX1dJVEhfTUVNTyk7XG4gICAgICAgIGNvbnRyYWN0TmFtZS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0VORF9NQU5ZX0NPTlRSQUNUX05BTUVfV0lUSF9NRU1PKTtcbiAgICAgICAgZnVuY3Rpb25OYW1lLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5TRU5EX01BTllfQ09OVFJBQ1RfRlVOQ1RJT05fTkFNRV9XSVRIX01FTU8pO1xuICAgICAgICBmdW5jdGlvbkFyZ3MubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgZnVuY3Rpb25BcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdsaXN0Jyk7XG4gICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gZnVuY3Rpb25BcmdzWzBdO1xuICAgICAgICBsaXN0Lmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGlzdFtpXS5kYXRhLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWyd0bycsICd1c3R4JywgJ21lbW8nXSk7XG4gICAgICAgICAgcHJpbmNpcGFsVG9TdHJpbmcobGlzdFtpXS5kYXRhLnRvKS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLmFkZHJlc3MpO1xuICAgICAgICAgIGxpc3RbaV0uZGF0YS5tZW1vLmJ1ZmZlci50b1N0cmluZygnYXNjaWknKS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLm1lbW8pO1xuICAgICAgICAgIGxpc3RbaV0uZGF0YS51c3R4LnZhbHVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHNbaV0uYW1vdW50KTtcbiAgICAgICAgfVxuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdHgub3V0cHV0c1tpXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kTWFueVJlY2lwaWVudHNbaV0uYWRkcmVzcyk7XG4gICAgICAgICAgdHgub3V0cHV0c1tpXS52YWx1ZS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZE1hbnlSZWNpcGllbnRzW2ldLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU04zS1Q5RFZNOVRDVEFIVjBTOVZFQUtUREc3SkJDMEsyNlpNV0VCTlQnKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNjAwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9TRU5EX01BTllfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBtdWx0aXNpZyBzZW5kLW1hbnkgdW5zaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBtZW1vIGZyb20gcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlVOU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuVU5TSUdORURfU0VORF9NQU5ZX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdW5zaWduZWQgc2VuZC1tYW55IHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1lbW8gZnJvbSByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaWduIGFuIHVuc2lnbmVkIHR4IGZyb20gYSByYXcgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVU5TSUdORURfU0VORF9NQU5ZX1dJVEhfTUVNTyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2S2V5c1N0cmluZ1swXSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnZLZXlzU3RyaW5nWzFdIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuU0lHTkVEX1NFTkRfTUFOWV9XSVRIX01FTU8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!