PHP WebShell

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

Просмотр файла: sendNFT.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 sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const testData = __importStar(require("../../resources/eth"));
const ethers_1 = require("ethers");
const should_1 = __importDefault(require("should"));
const erc1155Abi_1 = require("../../resources/erc1155Abi");
const walletSimpleAbi_1 = require("../../resources/walletSimpleAbi");
const erc721Abi_1 = require("../../resources/erc721Abi");
const nftEncodings_1 = require("../../resources/nftEncodings");
const getBuilder_1 = require("../getBuilder");
describe('Eth transaction builder sendNFT', () => {
    // dummy addresses
    const owner = '0x19645032c7f1533395d44a629462e751084d3e4d';
    const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
    const contractAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
    // ens erc721
    const erc721ContractAddress = '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85';
    // opensea erc1155
    const erc1155ContractAddress = '0x495f947276749ce646f68ac8c248420045cb7b5e';
    const coin = statics_1.coins.get('hteth');
    let key;
    beforeEach(() => {
        key = testData.KEYPAIR_PRV.getKeys().prv;
    });
    it('should sign ERC721 properly', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC721);
        // Dummy addresses
        const expireTime = 1590066728;
        const sequenceId = 5;
        const tokenId = '1';
        const erc721Transfer = txBuilder.transfer();
        erc721Transfer
            .from(owner)
            .to(recipient)
            .expirationTime(expireTime)
            .tokenContractAddress(erc721ContractAddress)
            .contractSequenceId(sequenceId)
            .tokenId(tokenId)
            .key(key);
        txBuilder.sign({ key: testData.PRIVATE_KEY });
        await txBuilder.build();
    });
    it('should sign and build ERC721 transfer with Builder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC721);
        // Dummy addresses
        const expireTime = 1590066728;
        const sequenceId = 5;
        const tokenId = '1';
        const erc721Transfer = txBuilder.transfer();
        erc721Transfer
            .from(owner)
            .to(recipient)
            .expirationTime(expireTime)
            .tokenContractAddress(erc721ContractAddress)
            .contractSequenceId(sequenceId)
            .tokenId(tokenId)
            .key(key);
        const sendMultisigCallData = erc721Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc721Abi_1.erc721ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[2], tokenId);
    });
    it('should sign and build ERC721 transfer with Decoder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC721);
        const tokenId = '1';
        const erc721Transfer = txBuilder.transfer(nftEncodings_1.erc721Encoding);
        const sendMultisigCallData = erc721Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc721Abi_1.erc721ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[2], tokenId);
    });
    it('should sign and build ERC1155 single transfer with Builder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC1155);
        const expireTime = 1590066728;
        const sequenceId = 5;
        const tokenId = 1;
        const value = 10;
        const erc1155Transfer = txBuilder.transfer();
        erc1155Transfer
            .from(owner)
            .to(recipient)
            .expirationTime(expireTime)
            .tokenContractAddress(erc1155ContractAddress)
            .contractSequenceId(sequenceId)
            .entry(tokenId, value)
            .key(key);
        const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc1155Abi_1.ERC1155ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[2], tokenId);
        should_1.default.equal(decodedSafeTransferFromCallData.args[3], value);
        txBuilder.sign({ key: testData.PRIVATE_KEY });
        await txBuilder.build();
    });
    it('should sign and build ERC1155 single transfer with Decoder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC1155);
        const tokenId = '1';
        const value = '10';
        const erc1155Transfer = txBuilder.transfer(nftEncodings_1.erc1155SafeTransferEncoding);
        const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc1155Abi_1.ERC1155ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[2], tokenId);
        should_1.default.equal(decodedSafeTransferFromCallData.args[3], value);
    });
    it('should sign and build ERC1155 batch transfer with Builder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC1155);
        const expireTime = 1590066728;
        const sequenceId = 5;
        const tokenIds = [1, 2, 3];
        const values = [10, 10, 10];
        const erc1155Transfer = txBuilder.transfer();
        erc1155Transfer
            .from(owner)
            .to(recipient)
            .expirationTime(expireTime)
            .tokenContractAddress(erc1155ContractAddress)
            .contractSequenceId(sequenceId)
            .entry(tokenIds[0], values[0])
            .entry(tokenIds[1], values[1])
            .entry(tokenIds[2], values[2])
            .key(key);
        const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc1155Abi_1.ERC1155ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.deepEqual(decodedSafeTransferFromCallData.args[2].map((x) => x.toNumber()), tokenIds);
        should_1.default.deepEqual(decodedSafeTransferFromCallData.args[3].map((x) => x.toNumber()), values);
    });
    it('should sign and build ERC1155 batch transfer with Decoder pattern', async () => {
        const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.contract(contractAddress);
        txBuilder.type(sdk_core_1.TransactionType.SendERC1155);
        const tokenIds = [1, 2, 3];
        const values = [10, 10, 10];
        const erc1155Transfer = txBuilder.transfer(nftEncodings_1.erc1155BatchTransferEncoding);
        const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
        const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleAbi_1.walletSimpleABI), sendMultisigCallData);
        const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
        const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc1155Abi_1.ERC1155ABI), safeTransferFromCallData);
        should_1.default.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
        should_1.default.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
        should_1.default.deepEqual(decodedSafeTransferFromCallData.args[2].map((x) => x.toNumber()), tokenIds);
        should_1.default.deepEqual(decodedSafeTransferFromCallData.args[3].map((x) => x.toNumber()), values);
    });
});
function decodeTransaction(abi, calldata) {
    const contractInterface = new ethers_1.ethers.utils.Interface(abi);
    return contractInterface.parseTransaction({ data: calldata });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZE5GVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc2VuZE5GVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFrRDtBQUNsRCw0Q0FBMEU7QUFFMUUsOERBQWdEO0FBQ2hELG1DQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsMkRBQXdEO0FBQ3hELHFFQUFrRTtBQUNsRSx5REFBc0Q7QUFDdEQsK0RBSXNDO0FBQ3RDLDhDQUEyQztBQUUzQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO0lBQy9DLGtCQUFrQjtJQUNsQixNQUFNLEtBQUssR0FBRyw0Q0FBNEMsQ0FBQztJQUMzRCxNQUFNLFNBQVMsR0FBRyw0Q0FBNEMsQ0FBQztJQUMvRCxNQUFNLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztJQUVyRSxhQUFhO0lBQ2IsTUFBTSxxQkFBcUIsR0FBRyw0Q0FBNEMsQ0FBQztJQUMzRSxrQkFBa0I7SUFDbEIsTUFBTSxzQkFBc0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUM1RSxNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBOEIsQ0FBQztJQUM3RCxJQUFJLEdBQUcsQ0FBQztJQUVSLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFhLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztRQUM1RCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLFlBQVk7WUFDakIsUUFBUSxFQUFFLFVBQVU7U0FDckIs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LGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQVUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFFaEgsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLGdCQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM3RixnQkFBTSxDQUFDLFNBQVMsQ0FDZCwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDaEUsUUFBUSxDQUNULENBQUM7UUFDRixnQkFBTSxDQUFDLFNBQVMsQ0FDZCwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDaEUsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7SUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGVBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE9BQU8saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBFdGhlcmV1bU5ldHdvcmsgYXMgRXRoTGlrZU5ldHdvcmsgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBFUkMxMTU1VHJhbnNmZXJCdWlsZGVyLCBFUkM3MjFUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZXRoJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBFUkMxMTU1QUJJIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VyYzExNTVBYmknO1xuaW1wb3J0IHsgd2FsbGV0U2ltcGxlQUJJIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3dhbGxldFNpbXBsZUFiaSc7XG5pbXBvcnQgeyBlcmM3MjFBQkkgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZXJjNzIxQWJpJztcbmltcG9ydCB7XG4gIGVyYzExNTVCYXRjaFRyYW5zZmVyRW5jb2RpbmcsXG4gIGVyYzExNTVTYWZlVHJhbnNmZXJFbmNvZGluZyxcbiAgZXJjNzIxRW5jb2RpbmcsXG59IGZyb20gJy4uLy4uL3Jlc291cmNlcy9uZnRFbmNvZGluZ3MnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXRoIHRyYW5zYWN0aW9uIGJ1aWxkZXIgc2VuZE5GVCcsICgpID0+IHtcbiAgLy8gZHVtbXkgYWRkcmVzc2VzXG4gIGNvbnN0IG93bmVyID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0ZCc7XG4gIGNvbnN0IHJlY2lwaWVudCA9ICcweDE5NjQ1MDMyYzdmMTUzMzM5NWQ0NGE2Mjk0NjJlNzUxMDg0ZDNlNGMnO1xuICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcblxuICAvLyBlbnMgZXJjNzIxXG4gIGNvbnN0IGVyYzcyMUNvbnRyYWN0QWRkcmVzcyA9ICcweDU3ZjE4ODdhOGJmMTliMTRmYzBkZjZmZDliMmFjYzlhZjE0N2VhODUnO1xuICAvLyBvcGVuc2VhIGVyYzExNTVcbiAgY29uc3QgZXJjMTE1NUNvbnRyYWN0QWRkcmVzcyA9ICcweDQ5NWY5NDcyNzY3NDljZTY0NmY2OGFjOGMyNDg0MjAwNDVjYjdiNWUnO1xuICBjb25zdCBjb2luID0gY29pbnMuZ2V0KCdodGV0aCcpIGFzIHVua25vd24gYXMgRXRoTGlrZU5ldHdvcms7XG4gIGxldCBrZXk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAga2V5ID0gdGVzdERhdGEuS0VZUEFJUl9QUlYuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2lnbiBFUkM3MjEgcHJvcGVybHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgIGdhc0xpbWl0OiAnMTIxMDAwMDAnLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDIpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdChjb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kRVJDNzIxKTtcblxuICAgIC8vIER1bW15IGFkZHJlc3Nlc1xuICAgIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICAgIGNvbnN0IHNlcXVlbmNlSWQgPSA1O1xuICAgIGNvbnN0IHRva2VuSWQgPSAnMSc7XG5cbiAgICBjb25zdCBlcmM3MjFUcmFuc2ZlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIEVSQzcyMVRyYW5zZmVyQnVpbGRlcjtcbiAgICBlcmM3MjFUcmFuc2ZlclxuICAgICAgLmZyb20ob3duZXIpXG4gICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAudG9rZW5Db250cmFjdEFkZHJlc3MoZXJjNzIxQ29udHJhY3RBZGRyZXNzKVxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5rZXkoa2V5KTtcblxuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGFuZCBidWlsZCBFUkM3MjEgdHJhbnNmZXIgd2l0aCBCdWlsZGVyIHBhdHRlcm4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgIGdhc0xpbWl0OiAnMTIxMDAwMDAnLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDIpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdChjb250cmFjdEFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kRVJDNzIxKTtcblxuICAgIC8vIER1bW15IGFkZHJlc3Nlc1xuICAgIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICAgIGNvbnN0IHNlcXVlbmNlSWQgPSA1O1xuICAgIGNvbnN0IHRva2VuSWQgPSAnMSc7XG5cbiAgICBjb25zdCBlcmM3MjFUcmFuc2ZlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIEVSQzcyMVRyYW5zZmVyQnVpbGRlcjtcbiAgICBlcmM3MjFUcmFuc2ZlclxuICAgICAgLmZyb20ob3duZXIpXG4gICAgICAudG8ocmVjaXBpZW50KVxuICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAudG9rZW5Db250cmFjdEFkZHJlc3MoZXJjNzIxQ29udHJhY3RBZGRyZXNzKVxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5rZXkoa2V5KTtcblxuICAgIGNvbnN0IHNlbmRNdWx0aXNpZ0NhbGxEYXRhID0gZXJjNzIxVHJhbnNmZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICBjb25zdCBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh3YWxsZXRTaW1wbGVBQkkpLCBzZW5kTXVsdGlzaWdDYWxsRGF0YSk7XG5cbiAgICBjb25zdCBzYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEgPSBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEuYXJnc1syXTtcbiAgICBjb25zdCBkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkoZXJjNzIxQUJJKSwgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhKTtcblxuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMF0udG9Mb3dlckNhc2UoKSwgb3duZXIudG9Mb3dlckNhc2UoKSk7XG4gICAgc2hvdWxkLmVxdWFsKGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1sxXS50b0xvd2VyQ2FzZSgpLCByZWNpcGllbnQudG9Mb3dlckNhc2UoKSk7XG4gICAgc2hvdWxkLmVxdWFsKGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1syXSwgdG9rZW5JZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2lnbiBhbmQgYnVpbGQgRVJDNzIxIHRyYW5zZmVyIHdpdGggRGVjb2RlciBwYXR0ZXJuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzcyMSk7XG5cbiAgICBjb25zdCB0b2tlbklkID0gJzEnO1xuXG4gICAgY29uc3QgZXJjNzIxVHJhbnNmZXIgPSB0eEJ1aWxkZXIudHJhbnNmZXIoZXJjNzIxRW5jb2RpbmcpIGFzIEVSQzcyMVRyYW5zZmVyQnVpbGRlcjtcbiAgICBjb25zdCBzZW5kTXVsdGlzaWdDYWxsRGF0YSA9IGVyYzcyMVRyYW5zZmVyLnNpZ25BbmRCdWlsZChgJHtjb2luLmNoYWluSWR9YCk7XG4gICAgY29uc3QgZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkod2FsbGV0U2ltcGxlQUJJKSwgc2VuZE11bHRpc2lnQ2FsbERhdGEpO1xuXG4gICAgY29uc3Qgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhLmFyZ3NbMl07XG4gICAgY29uc3QgZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSA9IGRlY29kZVRyYW5zYWN0aW9uKEpTT04uc3RyaW5naWZ5KGVyYzcyMUFCSSksIHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSk7XG5cbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzBdLnRvTG93ZXJDYXNlKCksIG93bmVyLnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMV0udG9Mb3dlckNhc2UoKSwgcmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMl0sIHRva2VuSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gYW5kIGJ1aWxkIEVSQzExNTUgc2luZ2xlIHRyYW5zZmVyIHdpdGggQnVpbGRlciBwYXR0ZXJuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzExNTUpO1xuXG4gICAgY29uc3QgZXhwaXJlVGltZSA9IDE1OTAwNjY3Mjg7XG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IDU7XG4gICAgY29uc3QgdG9rZW5JZCA9IDE7XG4gICAgY29uc3QgdmFsdWUgPSAxMDtcblxuICAgIGNvbnN0IGVyYzExNTVUcmFuc2ZlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIEVSQzExNTVUcmFuc2ZlckJ1aWxkZXI7XG4gICAgZXJjMTE1NVRyYW5zZmVyXG4gICAgICAuZnJvbShvd25lcilcbiAgICAgIC50byhyZWNpcGllbnQpXG4gICAgICAuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSlcbiAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyhlcmMxMTU1Q29udHJhY3RBZGRyZXNzKVxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgLmVudHJ5KHRva2VuSWQsIHZhbHVlKVxuICAgICAgLmtleShrZXkpO1xuXG4gICAgY29uc3Qgc2VuZE11bHRpc2lnQ2FsbERhdGEgPSBlcmMxMTU1VHJhbnNmZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICBjb25zdCBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh3YWxsZXRTaW1wbGVBQkkpLCBzZW5kTXVsdGlzaWdDYWxsRGF0YSk7XG5cbiAgICBjb25zdCBzYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEgPSBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEuYXJnc1syXTtcbiAgICBjb25zdCBkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkoRVJDMTE1NUFCSSksIHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSk7XG5cbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzBdLnRvTG93ZXJDYXNlKCksIG93bmVyLnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMV0udG9Mb3dlckNhc2UoKSwgcmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMl0sIHRva2VuSWQpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbM10sIHZhbHVlKTtcblxuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGFuZCBidWlsZCBFUkMxMTU1IHNpbmdsZSB0cmFuc2ZlciB3aXRoIERlY29kZXIgcGF0dGVybicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzEwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMjEwMDAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMik7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkMxMTU1KTtcblxuICAgIGNvbnN0IHRva2VuSWQgPSAnMSc7XG4gICAgY29uc3QgdmFsdWUgPSAnMTAnO1xuXG4gICAgY29uc3QgZXJjMTE1NVRyYW5zZmVyID0gdHhCdWlsZGVyLnRyYW5zZmVyKGVyYzExNTVTYWZlVHJhbnNmZXJFbmNvZGluZykgYXMgRVJDMTE1NVRyYW5zZmVyQnVpbGRlcjtcbiAgICBjb25zdCBzZW5kTXVsdGlzaWdDYWxsRGF0YSA9IGVyYzExNTVUcmFuc2Zlci5zaWduQW5kQnVpbGQoYCR7Y29pbi5jaGFpbklkfWApO1xuXG4gICAgY29uc3QgZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkod2FsbGV0U2ltcGxlQUJJKSwgc2VuZE11bHRpc2lnQ2FsbERhdGEpO1xuXG4gICAgY29uc3Qgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhLmFyZ3NbMl07XG4gICAgY29uc3QgZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSA9IGRlY29kZVRyYW5zYWN0aW9uKEpTT04uc3RyaW5naWZ5KEVSQzExNTVBQkkpLCBzYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEpO1xuXG4gICAgc2hvdWxkLmVxdWFsKGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1swXS50b0xvd2VyQ2FzZSgpLCBvd25lci50b0xvd2VyQ2FzZSgpKTtcbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzFdLnRvTG93ZXJDYXNlKCksIHJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKTtcbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzJdLCB0b2tlbklkKTtcbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzNdLCB2YWx1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2lnbiBhbmQgYnVpbGQgRVJDMTE1NSBiYXRjaCB0cmFuc2ZlciB3aXRoIEJ1aWxkZXIgcGF0dGVybicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzEwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMjEwMDAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMik7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkMxMTU1KTtcblxuICAgIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICAgIGNvbnN0IHNlcXVlbmNlSWQgPSA1O1xuICAgIGNvbnN0IHRva2VuSWRzID0gWzEsIDIsIDNdO1xuICAgIGNvbnN0IHZhbHVlcyA9IFsxMCwgMTAsIDEwXTtcblxuICAgIGNvbnN0IGVyYzExNTVUcmFuc2ZlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIEVSQzExNTVUcmFuc2ZlckJ1aWxkZXI7XG4gICAgZXJjMTE1NVRyYW5zZmVyXG4gICAgICAuZnJvbShvd25lcilcbiAgICAgIC50byhyZWNpcGllbnQpXG4gICAgICAuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSlcbiAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyhlcmMxMTU1Q29udHJhY3RBZGRyZXNzKVxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgLmVudHJ5KHRva2VuSWRzWzBdLCB2YWx1ZXNbMF0pXG4gICAgICAuZW50cnkodG9rZW5JZHNbMV0sIHZhbHVlc1sxXSlcbiAgICAgIC5lbnRyeSh0b2tlbklkc1syXSwgdmFsdWVzWzJdKVxuICAgICAgLmtleShrZXkpO1xuXG4gICAgY29uc3Qgc2VuZE11bHRpc2lnQ2FsbERhdGEgPSBlcmMxMTU1VHJhbnNmZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICBjb25zdCBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeSh3YWxsZXRTaW1wbGVBQkkpLCBzZW5kTXVsdGlzaWdDYWxsRGF0YSk7XG5cbiAgICBjb25zdCBzYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEgPSBkZWNvZGVkU2VuZE11bHRpc2lnQ2FsbERhdGEuYXJnc1syXTtcbiAgICBjb25zdCBkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkoRVJDMTE1NUFCSSksIHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSk7XG5cbiAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5hcmdzWzBdLnRvTG93ZXJDYXNlKCksIG93bmVyLnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMV0udG9Mb3dlckNhc2UoKSwgcmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICBkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMl0ubWFwKCh4KSA9PiB4LnRvTnVtYmVyKCkpLFxuICAgICAgdG9rZW5JZHNcbiAgICApO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICBkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbM10ubWFwKCh4KSA9PiB4LnRvTnVtYmVyKCkpLFxuICAgICAgdmFsdWVzXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGFuZCBidWlsZCBFUkMxMTU1IGJhdGNoIHRyYW5zZmVyIHdpdGggRGVjb2RlciBwYXR0ZXJuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzExNTUpO1xuXG4gICAgY29uc3QgdG9rZW5JZHMgPSBbMSwgMiwgM107XG4gICAgY29uc3QgdmFsdWVzID0gWzEwLCAxMCwgMTBdO1xuXG4gICAgY29uc3QgZXJjMTE1NVRyYW5zZmVyID0gdHhCdWlsZGVyLnRyYW5zZmVyKGVyYzExNTVCYXRjaFRyYW5zZmVyRW5jb2RpbmcpIGFzIEVSQzExNTVUcmFuc2ZlckJ1aWxkZXI7XG5cbiAgICBjb25zdCBzZW5kTXVsdGlzaWdDYWxsRGF0YSA9IGVyYzExNTVUcmFuc2Zlci5zaWduQW5kQnVpbGQoYCR7Y29pbi5jaGFpbklkfWApO1xuICAgIGNvbnN0IGRlY29kZWRTZW5kTXVsdGlzaWdDYWxsRGF0YSA9IGRlY29kZVRyYW5zYWN0aW9uKEpTT04uc3RyaW5naWZ5KHdhbGxldFNpbXBsZUFCSSksIHNlbmRNdWx0aXNpZ0NhbGxEYXRhKTtcblxuICAgIGNvbnN0IHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YSA9IGRlY29kZWRTZW5kTXVsdGlzaWdDYWxsRGF0YS5hcmdzWzJdO1xuICAgIGNvbnN0IGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihKU09OLnN0cmluZ2lmeShFUkMxMTU1QUJJKSwgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhKTtcblxuICAgIHNob3VsZC5lcXVhbChkZWNvZGVkU2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhLmFyZ3NbMF0udG9Mb3dlckNhc2UoKSwgb3duZXIudG9Mb3dlckNhc2UoKSk7XG4gICAgc2hvdWxkLmVxdWFsKGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1sxXS50b0xvd2VyQ2FzZSgpLCByZWNpcGllbnQudG9Mb3dlckNhc2UoKSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgIGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1syXS5tYXAoKHgpID0+IHgudG9OdW1iZXIoKSksXG4gICAgICB0b2tlbklkc1xuICAgICk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgIGRlY29kZWRTYWZlVHJhbnNmZXJGcm9tQ2FsbERhdGEuYXJnc1szXS5tYXAoKHgpID0+IHgudG9OdW1iZXIoKSksXG4gICAgICB2YWx1ZXNcbiAgICApO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBkZWNvZGVUcmFuc2FjdGlvbihhYmk6IHN0cmluZywgY2FsbGRhdGE6IHN0cmluZykge1xuICBjb25zdCBjb250cmFjdEludGVyZmFjZSA9IG5ldyBldGhlcnMudXRpbHMuSW50ZXJmYWNlKGFiaSk7XG4gIHJldHVybiBjb250cmFjdEludGVyZmFjZS5wYXJzZVRyYW5zYWN0aW9uKHsgZGF0YTogY2FsbGRhdGEgfSk7XG59XG4iXX0=

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


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