PHP WebShell

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

Просмотр файла: transferBuilder.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 should_1 = __importDefault(require("should"));
const network_1 = require("@stacks/network");
const sdk_core_1 = require("@bitgo/sdk-core");
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"));
const { KeyPair } = src_1.StxLib;
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 Transfer 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.getTransferBuilder();
            txBuilder.fee({ fee: '180' });
            txBuilder.nonce(0);
            txBuilder.to(testData.TX_RECIEVER.address);
            txBuilder.amount('1000');
            return txBuilder;
        };
        describe('transfer builder environment', function () {
            it('should select the right network', function () {
                should_1.default.equal(factory.getTransferBuilder().coinName(), 'tstx');
                should_1.default.equal(factoryProd.getTransferBuilder().coinName(), 'stx');
                // used type any to access protected properties
                const txBuilder = factory.getTransferBuilder();
                const txBuilderProd = factoryProd.getTransferBuilder();
                txBuilder._network.should.deepEqual(new network_1.StacksTestnet());
                txBuilderProd._network.should.deepEqual(new network_1.StacksMainnet());
            });
        });
        describe('should build ', () => {
            it('a signed transfer transaction', async () => {
                const builder = initTxBuilder();
                builder.fromPubKey(testData.TX_SENDER.pub);
                builder.sign({ key: testData.TX_SENDER.prv });
                const tx = await builder.build();
                const txJson = tx.toJson();
                // should.deepEqual(tx.signature.length, 1);
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.amount, '1000');
                should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
                should_1.default.deepEqual(txJson.nonce, 0);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
                should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
                tx.type.should.equal(sdk_core_1.TransactionType.Send);
                tx.outputs.length.should.equal(1);
                tx.outputs[0].address.should.equal(testData.TX_RECIEVER.address);
                tx.outputs[0].value.should.equal('1000');
                tx.inputs.length.should.equal(1);
                tx.inputs[0].address.should.equal(testData.TX_SENDER.address);
                tx.inputs[0].value.should.equal('1000');
            });
            it('a transfer transaction with memo', async () => {
                const builder = initTxBuilder();
                builder.fromPubKey(testData.TX_SENDER.pub);
                builder.memo('This is an example');
                builder.sign({ key: testData.TX_SENDER.prv });
                const tx = await builder.build();
                const txJson = tx.toJson();
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.amount, '1000');
                should_1.default.deepEqual(txJson.payload.memo, 'This is an example');
                should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
                should_1.default.deepEqual(txJson.nonce, 0);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
            });
            it('an unsigned multisig signed and verified', async () => {
                const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
                const amount = '1000';
                const memo = 'test';
                const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
                const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
                const txBuilder = factory.getTransferBuilder();
                txBuilder.fee({
                    fee: '180',
                });
                txBuilder.to(destination);
                txBuilder.amount(amount);
                txBuilder.nonce(1);
                txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
                txBuilder.numberSignatures(2);
                txBuilder.memo(memo);
                const tx = await txBuilder.build(); // unsigned multisig tx
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(tx.toBroadcastFormat());
                txBuilder2.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
                txBuilder.fromPubKey([kp.getKeys().pub, kp1.getKeys().pub, kp2.getKeys().pub]);
                const signedTx = await txBuilder2.build(); // signed multisig tx
                const txBuilder3 = factory.getTransferBuilder();
                txBuilder3.from(signedTx.toBroadcastFormat());
                const remake = await txBuilder3.build();
                should_1.default.deepEqual(remake.toBroadcastFormat(), signedTx.toBroadcastFormat());
            });
            it('an half signed tx', async () => {
                const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
                const amount = '1000';
                const memo = 'test';
                const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
                const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
                const txBuilder = factory.getTransferBuilder();
                txBuilder.fee({
                    fee: '180',
                });
                txBuilder.to(destination);
                txBuilder.amount(amount);
                txBuilder.nonce(1);
                txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
                txBuilder.numberSignatures(2);
                txBuilder.memo(memo);
                const tx = await txBuilder.build(); // half signed multisig tx
                should_1.default.deepEqual(tx.signature.length, 1);
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(tx.toBroadcastFormat());
                txBuilder2.sign({ key: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
                txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
                const signedTx = await txBuilder2.build();
                should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
                should_1.default.deepEqual(signedTx.signature.length, 2);
            });
            it('an half signed tx with xprv', async () => {
                const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
                const amount = '1000';
                const memo = 'test';
                const kp = new KeyPair({ prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                const kp1 = new KeyPair({ prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01' });
                const kp2 = new KeyPair({ prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01' });
                const txBuilder = factory.getTransferBuilder();
                txBuilder.fee({
                    fee: '180',
                });
                txBuilder.to(destination);
                txBuilder.amount(amount);
                txBuilder.nonce(1);
                txBuilder.sign({ key: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601' });
                txBuilder.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
                txBuilder.numberSignatures(2);
                txBuilder.memo(memo);
                const tx = await txBuilder.build(); // half signed multisig tx
                should_1.default.deepEqual(tx.signature.length, 1);
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(tx.toBroadcastFormat());
                txBuilder2.fromPubKey([kp.getKeys(true).pub, kp1.getKeys(true).pub, kp2.getKeys(true).pub]);
                const extendedKey = (0, sdk_core_1.rawPrvToExtendedKeys)(kp1.getKeys(false).prv);
                txBuilder2.sign({ key: extendedKey.xprv });
                const signedTx = await txBuilder2.build();
                should_1.default.deepEqual(signedTx.toBroadcastFormat(), '808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000100000000000000b4000000030201091538373641a50a4ebd6f653bb7b477489aceec50eff963072a838d2eaf50e4784c7c6d1490f57b899f0f04c215fce9176d9bb4ce19bfb07499c48878675a1f02008074202e04a7c777b4cdd26ad3fd35194311536113666d81a3840148e59eb43f274d88768ef1202d55633bfdcde8c6057932107354f406af6c378b6ea6b75d1a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d000203020000000000051a1ae3f911d8f1d46d7416bfbe4b593fd41eac19cb00000000000003e874657374000000000000000000000000000000000000000000000000000000000000');
                should_1.default.deepEqual(signedTx.signature.length, 2);
            });
            it('a multisig transfer transaction', async () => {
                const builder = initTxBuilder();
                builder.memo('test memo');
                builder.sign({ key: testData.prv1 });
                builder.sign({ key: testData.prv2 });
                builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
                const tx = await builder.build();
                should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
                should_1.default.deepEqual(tx.signature.length, 2);
            });
            it('a multisig serialized transfer transaction', async () => {
                const builder = factory.from(testData.MULTI_SIG_SIGNED_TRANSACTION);
                const tx = await builder.build();
                should_1.default.deepEqual(tx.toBroadcastFormat(), testData.MULTI_SIG_SIGNED_TRANSACTION);
            });
            it('a transfer transaction signed multiple times', async () => {
                const builder = initTxBuilder();
                builder.memo('test memo');
                builder.sign({ key: testData.prv1 });
                builder.sign({ key: testData.prv2 });
                builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
                builder.numberSignatures(2);
                const tx = await builder.build();
                const txJson = tx.toJson();
                should_1.default.deepEqual(tx.signature.length, 2);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.memo, 'test memo');
                should_1.default.deepEqual(txJson.payload.amount, '1000');
            });
            it('a transfer transaction with amount 0', async () => {
                const builder = initTxBuilder();
                builder.amount('0');
                builder.fromPubKey(testData.TX_SENDER.pub);
                builder.sign({ key: testData.TX_SENDER.prv });
                const tx = await builder.build();
                const txJson = tx.toJson();
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.amount, '0');
                should_1.default.deepEqual(txJson.from, testData.TX_SENDER.address);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
            });
            it('get pubkey of a transfer transaction signed 1', async () => {
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(testData.SIGNED_TRANSACTION_PK_1_3);
                should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
            });
            it('get pubkey of a transfer transaction signed 2', async () => {
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(testData.SIGNED_TRANSACTION_PK_2_3);
                should_1.default.deepEqual(txBuilder2._fromPubKeys, [testData.pub1, testData.pub2, testData.pub3]);
            });
            it('a transfer transaction signed multiple times with mid key no signer', async () => {
                const builder = initTxBuilder();
                builder.memo('test');
                builder.sign({ key: testData.prv1 });
                builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
                builder.numberSignatures(2);
                const tx = await builder.build();
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(tx.toBroadcastFormat());
                txBuilder2.sign({ key: testData.prv3 });
                const signedTx = await txBuilder2.build();
                const txJson = signedTx.toJson();
                should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
                should_1.default.deepEqual(signedTx.signature.length, 2);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.memo, 'test');
                should_1.default.deepEqual(txJson.payload.amount, '1000');
            });
            it('a transfer transaction signed multiple times with first key no signer', async () => {
                const builder = initTxBuilder();
                builder.memo('test');
                builder.sign({ key: testData.prv2 });
                builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
                builder.numberSignatures(2);
                const tx = await builder.build();
                const txBuilder2 = factory.getTransferBuilder();
                txBuilder2.from(tx.toBroadcastFormat());
                txBuilder2.sign({ key: testData.prv3 });
                const signedTx = await txBuilder2.build();
                const txJson = signedTx.toJson();
                should_1.default.deepEqual(signedTx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
                should_1.default.deepEqual(signedTx.signature.length, 2);
                should_1.default.deepEqual(txJson.fee.toString(), '180');
                should_1.default.deepEqual(txJson.payload.to, testData.TX_RECIEVER.address);
                should_1.default.deepEqual(txJson.payload.memo, 'test');
                should_1.default.deepEqual(txJson.payload.amount, '1000');
            });
            describe('serialized transactions', () => {
                it('a non signed transfer transaction from serialized', async () => {
                    const builder = factory.from(testData.RAW_TX_UNSIGNED);
                    builder.sign({ key: testData.TX_SENDER.prv });
                    const tx2 = await builder.build();
                    should_1.default.deepEqual(tx2.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
                    tx2.type.should.equal(sdk_core_1.TransactionType.Send);
                });
                it('a signed transfer transaction from serialized', async () => {
                    const txBuilder = factory.from(testData.SIGNED_TRANSACTION);
                    const tx = await txBuilder.build();
                    should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION);
                    tx.type.should.equal(sdk_core_1.TransactionType.Send);
                });
                it('a signed transfer transaction from serilaized 1', async () => {
                    const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_2_3);
                    const tx = await txBuilder.build();
                    should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_2_3);
                    tx.type.should.equal(sdk_core_1.TransactionType.Send);
                });
                it('a signed transfer transaction from serilaized 2', async () => {
                    const txBuilder = factory.from(testData.SIGNED_TRANSACTION_PK_1_3);
                    const tx = await txBuilder.build();
                    should_1.default.deepEqual(tx.toBroadcastFormat(), testData.SIGNED_TRANSACTION_PK_1_3);
                    tx.type.should.equal(sdk_core_1.TransactionType.Send);
                });
            });
            describe('should fail', () => {
                it('a transfer transaction with an invalid key', () => {
                    const builder = initTxBuilder();
                    assert_1.default.throws(() => builder.sign({ key: 'invalidKey' }), /Unsupported private key/);
                });
                it('a transfer transaction with an invalid destination address', () => {
                    const txBuilder = factory.getTransferBuilder();
                    assert_1.default.throws(() => txBuilder.to('invalidaddress'), /Invalid address/);
                });
                it('a transfer transaction with an invalid amount: text value', () => {
                    const txBuilder = factory.getTransferBuilder();
                    assert_1.default.throws(() => txBuilder.amount('invalidamount'), /Invalid amount/);
                });
                it('a transfer transaction with an invalid amount: negative value', () => {
                    const txBuilder = factory.getTransferBuilder();
                    assert_1.default.throws(() => txBuilder.amount('-5'), /Invalid amount/);
                });
                it('a transfer transaction with an invalid memo', async () => {
                    const txBuilder = factory.getTransferBuilder();
                    assert_1.default.throws(() => txBuilder.memo('This is a memo that is too long for a transaction'), /Memo is too long/);
                });
            });
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErRDtBQUMvRCw4Q0FBd0U7QUFFeEUsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyw0Q0FBdUM7QUFFdkMsc0NBQWlEO0FBQ2pELHVEQUF5QztBQUV6QyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBTSxDQUFDO0FBRTNCLFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtJQUNwQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUV4QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQU0sQ0FBQyx5QkFB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LENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgU3RhY2tzTWFpbm5ldCwgU3RhY2tzVGVzdG5ldCB9IGZyb20gJ0BzdGFja3MvbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIHJhd1BydlRvRXh0ZW5kZWRLZXlzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHsgU3R4LCBUc3R4LCBTdHhMaWIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuY29uc3QgeyBLZXlQYWlyIH0gPSBTdHhMaWI7XG5cbmRlc2NyaWJlKCdTdGFja3M6IFNlbmQgTWFueSBCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luTmFtZSA9ICdzdHgnO1xuICBjb25zdCBjb2luTmFtZVRlc3QgPSAndHN0eCc7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3R4JywgU3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdHgnLCBUc3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdTdHggVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZVRlc3QpKTtcbiAgICBjb25zdCBmYWN0b3J5UHJvZCA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWUpKTtcblxuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzE4MCcgfSk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UoMCk7XG4gICAgICB0eEJ1aWxkZXIudG8odGVzdERhdGEuVFhfUkVDSUVWRVIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuYW1vdW50KCcxMDAwJyk7XG4gICAgICByZXR1cm4gdHhCdWlsZGVyO1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgndHJhbnNmZXIgYnVpbGRlciBlbnZpcm9ubWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKS5jb2luTmFtZSgpLCAndHN0eCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeVByb2QuZ2V0VHJhbnNmZXJCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ3N0eCcpO1xuICAgICAgICAvLyB1c2VkIHR5cGUgYW55IHRvIGFjY2VzcyBwcm90ZWN0ZWQgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlclByb2Q6IGFueSA9IGZhY3RvcnlQcm9kLmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgICAgIHR4QnVpbGRlci5fbmV0d29yay5zaG91bGQuZGVlcEVxdWFsKG5ldyBTdGFja3NUZXN0bmV0KCkpO1xuICAgICAgICB0eEJ1aWxkZXJQcm9kLl9uZXR3b3JrLnNob3VsZC5kZWVwRXF1YWwobmV3IFN0YWNrc01haW5uZXQoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgICAgaXQoJ2Egc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuVFhfU0VOREVSLnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIC8vIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmFtb3VudCwgJzEwMDAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5UWF9SRUNJRVZFUi5hZGRyZXNzKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5tZW1vKCdUaGlzIGlzIGFuIGV4YW1wbGUnKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmFtb3VudCwgJzEwMDAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5tZW1vLCAnVGhpcyBpcyBhbiBleGFtcGxlJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiB1bnNpZ25lZCBtdWx0aXNpZyBzaWduZWQgYW5kIHZlcmlmaWVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVERFN1k4SFYzUlg4VkJNMlRaVldKVFM3WkExWEIwU1NDM05FVkgwJztcbiAgICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAnO1xuICAgICAgICBjb25zdCBtZW1vID0gJ3Rlc3QnO1xuICAgICAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyB9KTtcbiAgICAgICAgY29uc3Qga3AxID0gbmV3IEtleVBhaXIoeyBwcnY6ICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnIH0pO1xuICAgICAgICBjb25zdCBrcDIgPSBuZXcgS2V5UGFpcih7IHBydjogJ2U3NWRjYjY2Zjg0Mjg3ZWFmMzQ3OTU1ZTk0ZmEwNDMzNzI5OGRiZDk1YWEwZGJiOTg1NzcxMTA0ZWYxOTEzZGIwMScgfSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICAgIGZlZTogJzE4MCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIudG8oZGVzdGluYXRpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIHR4QnVpbGRlci5ub25jZSgxKTtcbiAgICAgICAgdHhCdWlsZGVyLmZyb21QdWJLZXkoW2twLmdldEtleXMoKS5wdWIsIGtwMS5nZXRLZXlzKCkucHViLCBrcDIuZ2V0S2V5cygpLnB1Yl0pO1xuICAgICAgICB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7IC8vIHVuc2lnbmVkIG11bHRpc2lnIHR4XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyB9KTtcbiAgICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyB9KTtcbiAgICAgICAgdHhCdWlsZGVyLmZyb21QdWJLZXkoW2twLmdldEtleXMoKS5wdWIsIGtwMS5nZXRLZXlzKCkucHViLCBrcDIuZ2V0S2V5cygpLnB1Yl0pO1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTsgLy8gc2lnbmVkIG11bHRpc2lnIHR4XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMyA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjMuZnJvbShzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgcmVtYWtlID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHJlbWFrZS50b0Jyb2FkY2FzdEZvcm1hdCgpLCBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gaGFsZiBzaWduZWQgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgICBjb25zdCBhbW91bnQgPSAnMTAwMCc7XG4gICAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCc7XG4gICAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICBjb25zdCBrcDEgPSBuZXcgS2V5UGFpcih7IHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScgfSk7XG4gICAgICAgIGNvbnN0IGtwMiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyB9KTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgICAgZmVlOiAnMTgwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4QnVpbGRlci50byhkZXN0aW5hdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScgfSk7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KFtrcC5nZXRLZXlzKHRydWUpLnB1Yiwga3AxLmdldEtleXModHJ1ZSkucHViLCBrcDIuZ2V0S2V5cyh0cnVlKS5wdWJdKTtcbiAgICAgICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpOyAvLyBoYWxmIHNpZ25lZCBtdWx0aXNpZyB0eFxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6ICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb21QdWJLZXkoW2twLmdldEtleXModHJ1ZSkucHViLCBrcDEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMi5nZXRLZXlzKHRydWUpLnB1Yl0pO1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICAgICc4MDgwMDAwMDAwMDQwMTJmZTUwN2MwOWRiYjIzYzNiN2U1ZDE2NmM4MWZjNGI4NzY5MjUxMGIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDBiNDAwMDAwMDAzMDIwMTA5MTUzODM3MzY0MWE1MGE0ZWJkNmY2NTNiYjdiNDc3NDg5YWNlZWM1MGVmZjk2MzA3MmE4MzhkMmVhZjUwZTQ3ODRjN2M2ZDE0OTBmNTdiODk5ZjBmMDRjMjE1ZmNlOTE3NmQ5YmI0Y2UxOWJmYjA3NDk5YzQ4ODc4Njc1YTFmMDIwMDgwNzQyMDJlMDRhN2M3NzdiNGNkZDI2YWQzZmQzNTE5NDMxMTUzNjExMzY2NmQ4MWEzODQwMTQ4ZTU5ZWI0M2YyNzRkODg3NjhlZjEyMDJkNTU2MzNiZmRjZGU4YzYwNTc5MzIxMDczNTRmNDA2YWY2YzM3OGI2ZWE2Yjc1ZDFhMDAwMzhlM2M0NTI5Mzk1NjExYmU5YWJmNmZhM2I2OTg3ZTgxZDQwMjM4NWUzZDYwNWEwNzNmNDJmNDA3NTY1YTRhM2QwMDAyMDMwMjAwMDAwMDAwMDAwNTFhMWFlM2Y5MTFkOGYxZDQ2ZDc0MTZiZmJlNGI1OTNmZDQxZWFjMTljYjAwMDAwMDAwMDAwMDAzZTg3NDY1NzM3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLCAyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gaGFsZiBzaWduZWQgdHggd2l0aCB4cHJ2JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVERFN1k4SFYzUlg4VkJNMlRaVldKVFM3WkExWEIwU1NDM05FVkgwJztcbiAgICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAnO1xuICAgICAgICBjb25zdCBtZW1vID0gJ3Rlc3QnO1xuICAgICAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyB9KTtcbiAgICAgICAgY29uc3Qga3AxID0gbmV3IEtleVBhaXIoeyBwcnY6ICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnIH0pO1xuICAgICAgICBjb25zdCBrcDIgPSBuZXcgS2V5UGFpcih7IHBydjogJ2U3NWRjYjY2Zjg0Mjg3ZWFmMzQ3OTU1ZTk0ZmEwNDMzNzI5OGRiZDk1YWEwZGJiOTg1NzcxMTA0ZWYxOTEzZGIwMScgfSk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICAgIGZlZTogJzE4MCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0eEJ1aWxkZXIudG8oZGVzdGluYXRpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIHR4QnVpbGRlci5ub25jZSgxKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShba3AuZ2V0S2V5cyh0cnVlKS5wdWIsIGtwMS5nZXRLZXlzKHRydWUpLnB1Yiwga3AyLmdldEtleXModHJ1ZSkucHViXSk7XG4gICAgICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTsgLy8gaGFsZiBzaWduZWQgbXVsdGlzaWcgdHhcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAxKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tUHViS2V5KFtrcC5nZXRLZXlzKHRydWUpLnB1Yiwga3AxLmdldEtleXModHJ1ZSkucHViLCBrcDIuZ2V0S2V5cyh0cnVlKS5wdWJdKTtcbiAgICAgICAgY29uc3QgZXh0ZW5kZWRLZXkgPSByYXdQcnZUb0V4dGVuZGVkS2V5cyhrcDEuZ2V0S2V5cyhmYWxzZSkucHJ2ISk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogZXh0ZW5kZWRLZXkueHBydiB9KTtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgICAnODA4MDAwMDAwMDA0MDEyZmU1MDdjMDlkYmIyM2MzYjdlNWQxNjZjODFmYzRiODc2OTI1MTBiMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwYjQwMDAwMDAwMzAyMDEwOTE1MzgzNzM2NDFhNTBhNGViZDZmNjUzYmI3YjQ3NzQ4OWFjZWVjNTBlZmY5NjMwNzJhODM4ZDJlYWY1MGU0Nzg0YzdjNmQxNDkwZjU3Yjg5OWYwZjA0YzIxNWZjZTkxNzZkOWJiNGNlMTliZmIwNzQ5OWM0ODg3ODY3NWExZjAyMDA4MDc0MjAyZTA0YTdjNzc3YjRjZGQyNmFkM2ZkMzUxOTQzMTE1MzYxMTM2NjZkODFhMzg0MDE0OGU1OWViNDNmMjc0ZDg4NzY4ZWYxMjAyZDU1NjMzYmZkY2RlOGM2MDU3OTMyMTA3MzU0ZjQwNmFmNmMzNzhiNmVhNmI3NWQxYTAwMDM4ZTNjNDUyOTM5NTYxMWJlOWFiZjZmYTNiNjk4N2U4MWQ0MDIzODVlM2Q2MDVhMDczZjQyZjQwNzU2NWE0YTNkMDAwMjAzMDIwMDAwMDAwMDAwMDUxYTFhZTNmOTExZDhmMWQ0NmQ3NDE2YmZiZTRiNTkzZmQ0MWVhYzE5Y2IwMDAwMDAwMDAwMDAwM2U4NzQ2NTczNzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIubWVtbygndGVzdCBtZW1vJyk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcnYyIH0pO1xuICAgICAgICBidWlsZGVyLmZyb21QdWJLZXkoW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuTVVMVElfU0lHX1NJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgbXVsdGlzaWcgc2VyaWFsaXplZCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5NVUxUSV9TSUdfU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuTVVMVElfU0lHX1NJR05FRF9UUkFOU0FDVElPTik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbycpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjEgfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJ2MiB9KTtcbiAgICAgICAgYnVpbGRlci5mcm9tUHViS2V5KFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICAgIGJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLnRvLCB0ZXN0RGF0YS5UWF9SRUNJRVZFUi5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bG9hZC5tZW1vLCAndGVzdCBtZW1vJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW1vdW50IDAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KCcwJyk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5UWF9TRU5ERVIucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLmFtb3VudCwgJzAnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuVFhfU0VOREVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUudG9TdHJpbmcoKSwgJzE4MCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnZXQgcHVia2V5IG9mIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjI6IGFueSA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuZnJvbSh0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMV8zKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEJ1aWxkZXIyLl9mcm9tUHViS2V5cywgW3Rlc3REYXRhLnB1YjEsIHRlc3REYXRhLnB1YjIsIHRlc3REYXRhLnB1YjNdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZ2V0IHB1YmtleSBvZiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHNpZ25lZCAyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyOiBhbnkgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIyLmZyb20odGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzJfMyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhCdWlsZGVyMi5fZnJvbVB1YktleXMsIFt0ZXN0RGF0YS5wdWIxLCB0ZXN0RGF0YS5wdWIyLCB0ZXN0RGF0YS5wdWIzXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzIHdpdGggbWlkIGtleSBubyBzaWduZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIubWVtbygndGVzdCcpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjEgfSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleShbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjMgfSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHNpZ25lZFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICd0ZXN0Jyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHNpZ25lZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGZpcnN0IGtleSBubyBzaWduZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIubWVtbygndGVzdCcpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjIgfSk7XG4gICAgICAgIGJ1aWxkZXIuZnJvbVB1YktleShbdGVzdERhdGEucHViMSwgdGVzdERhdGEucHViMiwgdGVzdERhdGEucHViM10pO1xuICAgICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnBydjMgfSk7XG4gICAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHNpZ25lZFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18yXzMpO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aCwgMik7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZS50b1N0cmluZygpLCAnMTgwJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQudG8sIHRlc3REYXRhLlRYX1JFQ0lFVkVSLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5wYXlsb2FkLm1lbW8sICd0ZXN0Jyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheWxvYWQuYW1vdW50LCAnMTAwMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzZXJpYWxpemVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICAgICAgaXQoJ2Egbm9uIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuVFhfU0VOREVSLnBydiB9KTtcbiAgICAgICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OKTtcbiAgICAgICAgICB0eDIudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2Egc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWxhaXplZCAxJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMl8zKTtcbiAgICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuU0lHTkVEX1RSQU5TQUNUSU9OX1BLXzJfMyk7XG4gICAgICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpbGFpemVkIDInLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNJR05FRF9UUkFOU0FDVElPTl9QS18xXzMpO1xuICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5TSUdORURfVFJBTlNBQ1RJT05fUEtfMV8zKTtcbiAgICAgICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzaG91bGQgZmFpbCcsICgpID0+IHtcbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGtleScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5zaWduKHsga2V5OiAnaW52YWxpZEtleScgfSksIC9VbnN1cHBvcnRlZCBwcml2YXRlIGtleS8pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgZGVzdGluYXRpb24gYWRkcmVzcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvKCdpbnZhbGlkYWRkcmVzcycpLCAvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBhbW91bnQ6IHRleHQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5hbW91bnQoJ2ludmFsaWRhbW91bnQnKSwgL0ludmFsaWQgYW1vdW50Lyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBhbW91bnQ6IG5lZ2F0aXZlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuYW1vdW50KCctNScpLCAvSW52YWxpZCBhbW91bnQvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5tZW1vKCdUaGlzIGlzIGEgbWVtbyB0aGF0IGlzIHRvbyBsb25nIGZvciBhIHRyYW5zYWN0aW9uJyksIC9NZW1vIGlzIHRvbyBsb25nLyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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